From afa3927720f17ef3865b315b063dd29f4221ef90 Mon Sep 17 00:00:00 2001 From: "Alexander \"PapaTutuWawa" Date: Fri, 22 Sep 2023 21:22:18 +0200 Subject: [PATCH] feat(xep): Rejoin groupchats on a new stream --- .../lib/src/xeps/xep_0045/xep_0045.dart | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/packages/moxxmpp/lib/src/xeps/xep_0045/xep_0045.dart b/packages/moxxmpp/lib/src/xeps/xep_0045/xep_0045.dart index 986df43..48d4e40 100644 --- a/packages/moxxmpp/lib/src/xeps/xep_0045/xep_0045.dart +++ b/packages/moxxmpp/lib/src/xeps/xep_0045/xep_0045.dart @@ -1,4 +1,5 @@ import 'package:moxlib/moxlib.dart'; +import 'package:moxxmpp/src/events.dart'; import 'package:moxxmpp/src/jid.dart'; import 'package:moxxmpp/src/managers/base.dart'; import 'package:moxxmpp/src/managers/data.dart'; @@ -45,6 +46,33 @@ class MUCManager extends XmppManagerBase { ), ]; + @override + Future onXmppEvent(XmppEvent event) async { + if (event is! StreamNegotiationsDoneEvent) { + return; + } + + // Only attempt rejoining if we did not resume the stream. + if (event.resumed) { + return; + } + + await _cacheLock.synchronized(() async { + // Mark all groupchats as not joined. + for (final jid in _mucRoomCache.keys) { + _mucRoomCache[jid]!.joined = false; + + // Re-join all MUCs. + final state = _mucRoomCache[jid]!; + await _sendMucJoin( + jid, + state.nick!, + 0, + ); + } + }); + } + /// Queries the information of a Multi-User Chat room. /// /// Retrieves the information about the specified MUC room by performing a @@ -94,6 +122,15 @@ class MUCManager extends XmppManagerBase { }, ); + await _sendMucJoin(roomJid, nick, maxHistoryStanzas); + return const Result(true); + } + + Future _sendMucJoin( + JID roomJid, + String nick, + int? maxHistoryStanzas, + ) async { await getAttributes().sendStanza( StanzaDetails( Stanza.presence( @@ -116,7 +153,6 @@ class MUCManager extends XmppManagerBase { ), ), ); - return const Result(true); } /// Leaves a Multi-User Chat room.