Little fix and cleanup in the channels list code
This commit is contained in:
@@ -478,7 +478,7 @@ void Bridge::send_irc_nick_change(const Iid& iid, const std::string& new_nick, c
|
|||||||
void Bridge::send_irc_channel_list_request(const Iid& iid, const std::string& iq_id, const std::string& to_jid,
|
void Bridge::send_irc_channel_list_request(const Iid& iid, const std::string& iq_id, const std::string& to_jid,
|
||||||
ResultSetInfo rs_info)
|
ResultSetInfo rs_info)
|
||||||
{
|
{
|
||||||
auto& list = channel_list_cache[iid.get_server()];
|
auto& list = this->channel_list_cache[iid.get_server()];
|
||||||
|
|
||||||
// We fetch the list from the IRC server only if we have a complete
|
// We fetch the list from the IRC server only if we have a complete
|
||||||
// cached list that needs to be invalidated (that is, when the request
|
// cached list that needs to be invalidated (that is, when the request
|
||||||
@@ -501,7 +501,7 @@ void Bridge::send_irc_channel_list_request(const Iid& iid, const std::string& iq
|
|||||||
if (irc_hostname != iid.get_server())
|
if (irc_hostname != iid.get_server())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
auto& list = channel_list_cache[iid.get_server()];
|
auto& list = this->channel_list_cache[iid.get_server()];
|
||||||
|
|
||||||
if (message.command == "263" || message.command == "RPL_TRYAGAIN" || message.command == "ERR_TOOMANYMATCHES"
|
if (message.command == "263" || message.command == "RPL_TRYAGAIN" || message.command == "ERR_TOOMANYMATCHES"
|
||||||
|| message.command == "ERR_NOSUCHSERVER")
|
|| message.command == "ERR_NOSUCHSERVER")
|
||||||
@@ -579,7 +579,7 @@ bool Bridge::send_matching_channel_list(const ChannelList& channel_list, const R
|
|||||||
const std::string& id, const std::string& to_jid, const std::string& from)
|
const std::string& id, const std::string& to_jid, const std::string& from)
|
||||||
{
|
{
|
||||||
auto begin = channel_list.channels.begin();
|
auto begin = channel_list.channels.begin();
|
||||||
auto end = channel_list.channels.begin();
|
auto end = channel_list.channels.end();
|
||||||
if (channel_list.complete)
|
if (channel_list.complete)
|
||||||
{
|
{
|
||||||
begin = std::find_if(channel_list.channels.begin(), channel_list.channels.end(), [this, &rs_info](const ListElement& element)
|
begin = std::find_if(channel_list.channels.begin(), channel_list.channels.end(), [this, &rs_info](const ListElement& element)
|
||||||
|
|||||||
@@ -1938,21 +1938,27 @@ if __name__ == '__main__':
|
|||||||
partial(expect_stanza, "/presence"),
|
partial(expect_stanza, "/presence"),
|
||||||
partial(expect_stanza, "/message[@from='#coucou%{irc_server_one}'][@type='groupchat']/subject[not(text())]"),
|
partial(expect_stanza, "/message[@from='#coucou%{irc_server_one}'][@type='groupchat']/subject[not(text())]"),
|
||||||
|
|
||||||
|
# Ask for 0 item
|
||||||
partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><max>0</max></set></query></iq>"),
|
partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><max>0</max></set></query></iq>"),
|
||||||
|
|
||||||
|
# Get 0 item
|
||||||
partial(expect_stanza, (
|
partial(expect_stanza, (
|
||||||
"/iq[@type='result']/disco_items:query",
|
"/iq[@type='result']/disco_items:query",
|
||||||
)),
|
)),
|
||||||
|
|
||||||
|
# Ask for 2 (of 3) items We don’t have the count,
|
||||||
|
# because biboumi doesn’t have the complete list when
|
||||||
|
# it sends us the 2 items
|
||||||
partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><max>2</max></set></query></iq>"),
|
partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><max>2</max></set></query></iq>"),
|
||||||
partial(expect_stanza, (
|
partial(expect_stanza, (
|
||||||
"/iq[@type='result']/disco_items:query",
|
"/iq[@type='result']/disco_items:query",
|
||||||
"/iq/disco_items:query/disco_items:item[@jid='#bar%{irc_server_one}']",
|
"/iq/disco_items:query/disco_items:item[@jid='#bar%{irc_server_one}']",
|
||||||
"/iq/disco_items:query/disco_items:item[@jid='#coucou%{irc_server_one}']",
|
"/iq/disco_items:query/disco_items:item[@jid='#coucou%{irc_server_one}']",
|
||||||
"/iq/disco_items:query/rsm:set/rsm:first[text()='#bar%{irc_server_one}'][@index='0']",
|
"/iq/disco_items:query/rsm:set/rsm:first[text()='#bar%{irc_server_one}'][@index='0']",
|
||||||
"/iq/disco_items:query/rsm:set/rsm:last[text()='#coucou%{irc_server_one}']",
|
"/iq/disco_items:query/rsm:set/rsm:last[text()='#coucou%{irc_server_one}']"
|
||||||
"/iq/disco_items:query/rsm:set/rsm:count[text()='3']"
|
|
||||||
)),
|
)),
|
||||||
|
|
||||||
|
# Ask for 12 (of 3) items. We get the whole list, and thus we have the count included.
|
||||||
partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><max>12</max></set></query></iq>"),
|
partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><max>12</max></set></query></iq>"),
|
||||||
partial(expect_stanza, (
|
partial(expect_stanza, (
|
||||||
"/iq[@type='result']/disco_items:query",
|
"/iq[@type='result']/disco_items:query",
|
||||||
@@ -1964,6 +1970,10 @@ if __name__ == '__main__':
|
|||||||
"/iq/disco_items:query/rsm:set/rsm:count[text()='3']"
|
"/iq/disco_items:query/rsm:set/rsm:count[text()='3']"
|
||||||
)),
|
)),
|
||||||
|
|
||||||
|
# Ask for 1 item, AFTER the first item (so,
|
||||||
|
# the second). Since we don’t invalidate the cache
|
||||||
|
# with this request, we should have the count
|
||||||
|
# included.
|
||||||
partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><after>#bar%{irc_server_one}</after><max>1</max></set></query></iq>"),
|
partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><after>#bar%{irc_server_one}</after><max>1</max></set></query></iq>"),
|
||||||
partial(expect_stanza, (
|
partial(expect_stanza, (
|
||||||
"/iq[@type='result']/disco_items:query",
|
"/iq[@type='result']/disco_items:query",
|
||||||
@@ -1973,14 +1983,24 @@ if __name__ == '__main__':
|
|||||||
"/iq/disco_items:query/rsm:set/rsm:count[text()='3']"
|
"/iq/disco_items:query/rsm:set/rsm:count[text()='3']"
|
||||||
)),
|
)),
|
||||||
|
|
||||||
partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><after>#bar%{irc_server_one}</after><max>1</max></set></query></iq>"),
|
# Ask for 1 item, AFTER the second item (so,
|
||||||
|
# the third).
|
||||||
|
partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><after>#coucou%{irc_server_one}</after><max>1</max></set></query></iq>"),
|
||||||
partial(expect_stanza, (
|
partial(expect_stanza, (
|
||||||
"/iq[@type='result']/disco_items:query",
|
"/iq[@type='result']/disco_items:query",
|
||||||
"/iq/disco_items:query/disco_items:item[@jid='#coucou%{irc_server_one}']",
|
"/iq/disco_items:query/disco_items:item[@jid='#foo%{irc_server_one}']",
|
||||||
"/iq/disco_items:query/rsm:set/rsm:first[text()='#coucou%{irc_server_one}'][@index='1']",
|
"/iq/disco_items:query/rsm:set/rsm:first[text()='#foo%{irc_server_one}'][@index='2']",
|
||||||
"/iq/disco_items:query/rsm:set/rsm:last[text()='#coucou%{irc_server_one}']",
|
"/iq/disco_items:query/rsm:set/rsm:last[text()='#foo%{irc_server_one}']",
|
||||||
"/iq/disco_items:query/rsm:set/rsm:count[text()='3']"
|
"/iq/disco_items:query/rsm:set/rsm:count[text()='3']"
|
||||||
))
|
)),
|
||||||
|
|
||||||
|
# Ask for 1 item, AFTER the third item (so,
|
||||||
|
# the fourth). Since it doesn't exist, we get 0 item
|
||||||
|
partial(send_stanza, "<iq from='{jid_one}/{resource_one}' id='id1' to='{irc_server_one}' type='get'><query xmlns='http://jabber.org/protocol/disco#items'><set xmlns='http://jabber.org/protocol/rsm'><after>#foo%{irc_server_one}</after><max>1</max></set></query></iq>"),
|
||||||
|
partial(expect_stanza, (
|
||||||
|
"/iq[@type='result']/disco_items:query",
|
||||||
|
"/iq/disco_items:query/rsm:set/rsm:count[text()='3']"
|
||||||
|
)),
|
||||||
]),
|
]),
|
||||||
Scenario("complete_channel_list_with_pages_of_3",
|
Scenario("complete_channel_list_with_pages_of_3",
|
||||||
[
|
[
|
||||||
|
|||||||
Reference in New Issue
Block a user