import 'package:moxxmpp/src/managers/base.dart'; import 'package:moxxmpp/src/managers/data.dart'; import 'package:moxxmpp/src/managers/handlers.dart'; import 'package:moxxmpp/src/managers/namespaces.dart'; import 'package:moxxmpp/src/namespaces.dart'; import 'package:moxxmpp/src/stanza.dart'; import 'package:moxxmpp/src/stringxml.dart'; class MessageReactions { const MessageReactions(this.messageId, this.emojis); final String messageId; final List emojis; XMLNode toXml() { return XMLNode.xmlns( tag: 'reactions', xmlns: messageReactionsXmlns, attributes: { 'id': messageId, }, children: emojis.map((emoji) { return XMLNode( tag: 'reaction', text: emoji, ); }).toList(), ); } } class MessageReactionsManager extends XmppManagerBase { MessageReactionsManager() : super(messageReactionsManager); @override List getDiscoFeatures() => [messageReactionsXmlns]; @override List getIncomingStanzaHandlers() => [ StanzaHandler( stanzaTag: 'message', tagName: 'reactions', tagXmlns: messageReactionsXmlns, callback: _onReactionsReceived, // Before the message handler priority: -99, ), ]; @override Future isSupported() async => true; Future _onReactionsReceived( Stanza message, StanzaHandlerData state, ) async { final reactionsElement = message.firstTag('reactions', xmlns: messageReactionsXmlns)!; return state.copyWith( messageReactions: MessageReactions( reactionsElement.attributes['id']! as String, reactionsElement.children .where((c) => c.tag == 'reaction') .map((c) => c.innerText()) .toList(), ), ); } }