Add the complete='true' attribute only when appropriate
This commit is contained in:
@@ -1,3 +1,8 @@
|
|||||||
|
Version 8.0
|
||||||
|
===========
|
||||||
|
|
||||||
|
- Add a complete='true' in MAM’s iq result when appropriate
|
||||||
|
|
||||||
Version 7.2 - 2018-01-24
|
Version 7.2 - 2018-01-24
|
||||||
========================
|
========================
|
||||||
|
|
||||||
|
|||||||
@@ -721,13 +721,25 @@ bool BiboumiComponent::handle_mam_request(const Stanza& stanza)
|
|||||||
if (max)
|
if (max)
|
||||||
limit = std::atoi(max->get_inner().data());
|
limit = std::atoi(max->get_inner().data());
|
||||||
}
|
}
|
||||||
// If the archive is really big, and the client didn’t specify any
|
// Do send more than 100 messages, even if the client asked for more,
|
||||||
// limit, we avoid flooding it: we set an arbitrary max limit.
|
// or if it didn’t specify any limit.
|
||||||
if (limit == -1 && start.empty() && end.empty())
|
// 101 is just a trick to know if there are more available messages.
|
||||||
|
// If our query returns 101 message, we know it’s incomplete, but we
|
||||||
|
// still send only 100
|
||||||
|
if ((limit == -1 && start.empty() && end.empty())
|
||||||
|
|| limit > 100)
|
||||||
|
limit = 101;
|
||||||
|
log_debug("limit: ", limit);
|
||||||
|
auto lines = Database::get_muc_logs(from.bare(), iid.get_local(), iid.get_server(), limit, start, end);
|
||||||
|
bool complete = true;
|
||||||
|
if (lines.size() > 100)
|
||||||
{
|
{
|
||||||
limit = 100;
|
log_debug("incomplete");
|
||||||
|
complete = false;
|
||||||
|
log_debug("size of lines before erase: ", lines.size());
|
||||||
|
lines.erase(lines.begin(), std::prev(lines.end(), 100));
|
||||||
|
log_debug("size of lines after erase: ", lines.size());
|
||||||
}
|
}
|
||||||
const auto lines = Database::get_muc_logs(from.bare(), iid.get_local(), iid.get_server(), limit, start, end);
|
|
||||||
for (const Database::MucLogLine& line: lines)
|
for (const Database::MucLogLine& line: lines)
|
||||||
{
|
{
|
||||||
if (!line.col<Database::Nick>().empty())
|
if (!line.col<Database::Nick>().empty())
|
||||||
@@ -738,7 +750,8 @@ bool BiboumiComponent::handle_mam_request(const Stanza& stanza)
|
|||||||
{
|
{
|
||||||
XmlNode& fin = *(fin_ptr.get());
|
XmlNode& fin = *(fin_ptr.get());
|
||||||
fin["xmlns"] = MAM_NS;
|
fin["xmlns"] = MAM_NS;
|
||||||
fin["complete"] = "true";
|
if (complete)
|
||||||
|
fin["complete"] = "true";
|
||||||
XmlSubNode set(fin, "set");
|
XmlSubNode set(fin, "set");
|
||||||
set["xmlns"] = RSM_NS;
|
set["xmlns"] = RSM_NS;
|
||||||
if (!lines.empty())
|
if (!lines.empty())
|
||||||
|
|||||||
@@ -1861,7 +1861,8 @@ if __name__ == '__main__':
|
|||||||
partial(expect_stanza,
|
partial(expect_stanza,
|
||||||
("/iq[@type='result'][@id='id1'][@from='#foo%{irc_server_one}'][@to='{jid_one}/{resource_one}']",
|
("/iq[@type='result'][@id='id1'][@from='#foo%{irc_server_one}'][@to='{jid_one}/{resource_one}']",
|
||||||
"/iq/mam:fin/rms:set/rsm:last",
|
"/iq/mam:fin/rms:set/rsm:last",
|
||||||
"/iq/mam:fin/rsm:set/rsm:first")),
|
"/iq/mam:fin/rsm:set/rsm:first",
|
||||||
|
"/iq/mam:fin[@complete='true']")),
|
||||||
|
|
||||||
# Retrieve an empty archive by specifying an early “end” date
|
# Retrieve an empty archive by specifying an early “end” date
|
||||||
partial(send_stanza, """<iq to='#foo%{irc_server_one}' from='{jid_one}/{resource_one}' type='set' id='id2'>
|
partial(send_stanza, """<iq to='#foo%{irc_server_one}' from='{jid_one}/{resource_one}' type='set' id='id2'>
|
||||||
@@ -1873,7 +1874,8 @@ if __name__ == '__main__':
|
|||||||
</query></iq>"""),
|
</query></iq>"""),
|
||||||
|
|
||||||
partial(expect_stanza,
|
partial(expect_stanza,
|
||||||
"/iq[@type='result'][@id='id2'][@from='#foo%{irc_server_one}'][@to='{jid_one}/{resource_one}']"),
|
("/iq[@type='result'][@id='id2'][@from='#foo%{irc_server_one}'][@to='{jid_one}/{resource_one}']",
|
||||||
|
"/iq/mam:fin[@complete='true']/rsm:set",)),
|
||||||
|
|
||||||
# Retrieve an empty archive by specifying a late “start” date
|
# Retrieve an empty archive by specifying a late “start” date
|
||||||
# (note that this test will break in ~1000 years)
|
# (note that this test will break in ~1000 years)
|
||||||
@@ -1886,7 +1888,8 @@ if __name__ == '__main__':
|
|||||||
</query></iq>"""),
|
</query></iq>"""),
|
||||||
|
|
||||||
partial(expect_stanza,
|
partial(expect_stanza,
|
||||||
"/iq[@type='result'][@id='id3'][@from='#foo%{irc_server_one}'][@to='{jid_one}/{resource_one}']"),
|
("/iq[@type='result'][@id='id3'][@from='#foo%{irc_server_one}'][@to='{jid_one}/{resource_one}']",
|
||||||
|
"/iq/mam:fin[@complete='true']/rsm:set")),
|
||||||
|
|
||||||
# Retrieve a limited archive
|
# Retrieve a limited archive
|
||||||
partial(send_stanza, "<iq to='#foo%{irc_server_one}' from='{jid_one}/{resource_one}' type='set' id='id4'><query xmlns='urn:xmpp:mam:2' queryid='qid4'><set xmlns='http://jabber.org/protocol/rsm'><max>1</max></set></query></iq>"),
|
partial(send_stanza, "<iq to='#foo%{irc_server_one}' from='{jid_one}/{resource_one}' type='set' id='id4'><query xmlns='urn:xmpp:mam:2' queryid='qid4'><set xmlns='http://jabber.org/protocol/rsm'><max>1</max></set></query></iq>"),
|
||||||
@@ -1897,7 +1900,8 @@ if __name__ == '__main__':
|
|||||||
),
|
),
|
||||||
|
|
||||||
partial(expect_stanza,
|
partial(expect_stanza,
|
||||||
"/iq[@type='result'][@id='id4'][@from='#foo%{irc_server_one}'][@to='{jid_one}/{resource_one}']"),
|
("/iq[@type='result'][@id='id4'][@from='#foo%{irc_server_one}'][@to='{jid_one}/{resource_one}']",
|
||||||
|
"/iq/mam:fin[@complete='true']/rsm:set")),
|
||||||
|
|
||||||
]),
|
]),
|
||||||
Scenario("mam_with_timestamps",
|
Scenario("mam_with_timestamps",
|
||||||
@@ -1957,7 +1961,8 @@ if __name__ == '__main__':
|
|||||||
),
|
),
|
||||||
|
|
||||||
partial(expect_stanza,
|
partial(expect_stanza,
|
||||||
"/iq[@type='result'][@id='id8'][@from='#foo%{irc_server_one}'][@to='{jid_one}/{resource_one}']"),
|
("/iq[@type='result'][@id='id8'][@from='#foo%{irc_server_one}'][@to='{jid_one}/{resource_one}']",
|
||||||
|
"/iq/mam:fin[@complete='true']/rsm:set")),
|
||||||
]),
|
]),
|
||||||
|
|
||||||
|
|
||||||
@@ -2151,8 +2156,11 @@ if __name__ == '__main__':
|
|||||||
("/message/mam:result[@queryid='qid1']/forward:forwarded/delay:delay",
|
("/message/mam:result[@queryid='qid1']/forward:forwarded/delay:delay",
|
||||||
"/message/mam:result[@queryid='qid1']/forward:forwarded/client:message[@from='#foo%{irc_server_one}/{nick_one}'][@type='groupchat']/client:body[text()='149']")
|
"/message/mam:result[@queryid='qid1']/forward:forwarded/client:message[@from='#foo%{irc_server_one}/{nick_one}'][@type='groupchat']/client:body[text()='149']")
|
||||||
),
|
),
|
||||||
|
# And it should not be marked as complete
|
||||||
partial(expect_stanza,
|
partial(expect_stanza,
|
||||||
"/iq[@type='result'][@id='id1'][@from='#foo%{irc_server_one}'][@to='{jid_one}/{resource_one}']"),
|
("/iq[@type='result'][@id='id1'][@from='#foo%{irc_server_one}'][@to='{jid_one}/{resource_one}']",
|
||||||
|
"!/iq//mam:fin[@complete='true']",
|
||||||
|
"/iq//mam:fin")),
|
||||||
|
|
||||||
]),
|
]),
|
||||||
Scenario("channel_history_on_fixed_server",
|
Scenario("channel_history_on_fixed_server",
|
||||||
|
|||||||
Reference in New Issue
Block a user