| author | Stephen Paul Weber
<singpolyma@singpolyma.net> 2023-09-12 17:47:07 UTC |
| committer | Stephen Paul Weber
<singpolyma@singpolyma.net> 2023-09-12 17:47:07 UTC |
| parent | fdf673c3cd05af05d963d629c6e6bfc7cb5ac2e5 |
| xmpp/Chat.hx | +1 | -0 |
| xmpp/Client.hx | +36 | -3 |
diff --git a/xmpp/Chat.hx b/xmpp/Chat.hx index fb5d406..bb9e5c9 100644 --- a/xmpp/Chat.hx +++ b/xmpp/Chat.hx @@ -61,6 +61,7 @@ class DirectChat extends Chat { } public function sendMessage(message:ChatMessage):Void { + client.chatActivity(this); client.sendStanza(message.asStanza()); } } diff --git a/xmpp/Client.hx b/xmpp/Client.hx index 8d0e388..7ea1947 100644 --- a/xmpp/Client.hx +++ b/xmpp/Client.hx @@ -4,6 +4,7 @@ import xmpp.Chat; import xmpp.EventEmitter; import xmpp.Stream; import xmpp.queries.GenericQuery; +import xmpp.queries.RosterGet; typedef ChatList = Array<Chat>; @@ -12,6 +13,7 @@ class Client extends xmpp.EventEmitter { private var stream:GenericStream; private var chatMessageHandlers: Array<(ChatMessage)->Void> = []; public var jid(default,null):String; + private var chats: ChatList = []; public function new(jid: String) { super(); @@ -34,6 +36,8 @@ class Client extends xmpp.EventEmitter { final stanza:Stanza = event.stanza; final chatMessage = ChatMessage.fromStanza(stanza, jid); if (chatMessage != null) { + var chat = getDirectChat(chatMessage.conversation()); + chatActivity(chat); for (handler in chatMessageHandlers) { handler(chatMessage); } @@ -43,6 +47,7 @@ class Client extends xmpp.EventEmitter { }); stream.sendStanza(new Stanza("presence")); // Set self to online + rosterGet(); return this.trigger("status/online", {}); } @@ -52,11 +57,28 @@ class Client extends xmpp.EventEmitter { /* Return array of chats, sorted by last activity */ public function getChats():ChatList { - return []; + return chats; } - public function getDirectChat(chatId:String):DirectChat { - return new DirectChat(this, this.stream, chatId); + public function getDirectChat(chatId:String, triggerIfNew:Bool = true):DirectChat { + for (chat in chats) { + if (Std.isOfType(chat, DirectChat) && chat.chatId == chatId) { + return Std.downcast(chat, DirectChat); + } + } + var chat = new DirectChat(this, this.stream, chatId); + chats.unshift(chat); + if (triggerIfNew) this.trigger("chats/update", [chat]); + return chat; + } + + public function chatActivity(chat: Chat) { + var idx = chats.indexOf(chat); + if (idx > 0) { + chats.splice(idx, 1); + chats.unshift(chat); + this.trigger("chats/update", []); + } } /* Internal-ish methods */ @@ -67,4 +89,15 @@ class Client extends xmpp.EventEmitter { public function sendStanza(stanza:Stanza) { stream.sendStanza(stanza); } + + private function rosterGet() { + var rosterGet = new RosterGet(); + rosterGet.onFinished(() -> { + for (item in rosterGet.getResult()) { + getDirectChat(item.jid, false); + } + this.trigger("chats/update", chats); + }); + sendQuery(rosterGet); + } }