request history since last known messages (#110)

request history since last known messages
when rejoining a room at startup
This commit is contained in:
Max Weller 2017-08-05 12:56:32 +02:00 committed by fiaxh
parent ea174ab632
commit 4aee95703d
2 changed files with 15 additions and 2 deletions

View File

@ -35,7 +35,15 @@ public class MucManager : StreamInteractionModule, Object {
if (stream == null) return;
string nick_ = nick ?? account.bare_jid.localpart ?? account.bare_jid.domainpart;
set_autojoin(stream, jid, nick_, password);
stream.get_module(Xep.Muc.Module.IDENTITY).enter(stream, jid.bare_jid.to_string(), nick_, password);
string history_since = null;
Conversation? conversation = stream_interactor.get_module(ConversationManager.IDENTITY).get_conversation(jid, account);
if (conversation != null) {
Entities.Message? last_message = stream_interactor.get_module(MessageStorage.IDENTITY).get_last_message(conversation);
if (last_message != null) history_since = last_message.time.to_string();
}
stream.get_module(Xep.Muc.Module.IDENTITY).enter(stream, jid.bare_jid.to_string(), nick_, password, history_since);
}
public void part(Account account, Jid jid) {

View File

@ -69,13 +69,18 @@ public class Module : XmppStreamModule {
public signal void self_removed_from_room(XmppStream stream, string jid, StatusCode code);
public signal void removed_from_room(XmppStream stream, string jid, StatusCode? code);
public void enter(XmppStream stream, string bare_jid, string nick, string? password) {
public void enter(XmppStream stream, string bare_jid, string nick, string? password, string? history_since) {
Presence.Stanza presence = new Presence.Stanza();
presence.to = bare_jid + "/" + nick;
StanzaNode x_node = new StanzaNode.build("x", NS_URI).add_self_xmlns();
if (password != null) {
x_node.put_node(new StanzaNode.build("password", NS_URI).put_node(new StanzaNode.text(password)));
}
if (history_since != null) {
StanzaNode history_node = new StanzaNode.build("history", NS_URI);
history_node.set_attribute("since", history_since);
x_node.put_node(history_node);
}
presence.stanza.put_node(x_node);
stream.get_flag(Flag.IDENTITY).start_muc_enter(bare_jid, presence.id);