feat: Implement XEP-0444
This commit is contained in:
68
packages/moxxmpp/lib/src/xeps/xep_0444.dart
Normal file
68
packages/moxxmpp/lib/src/xeps/xep_0444.dart
Normal file
@@ -0,0 +1,68 @@
|
||||
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<String> emojis;
|
||||
|
||||
XMLNode toXml() {
|
||||
return XMLNode.xmlns(
|
||||
tag: 'reactions',
|
||||
xmlns: messageReactionsXmlns,
|
||||
attributes: <String, String>{
|
||||
'id': messageId,
|
||||
},
|
||||
children: emojis.map((emoji) {
|
||||
return XMLNode(
|
||||
tag: 'reaction',
|
||||
text: emoji,
|
||||
);
|
||||
}).toList(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class MessageReactionsManager extends XmppManagerBase {
|
||||
@override
|
||||
List<String> getDiscoFeatures() => [ messageReactionsXmlns ];
|
||||
|
||||
@override
|
||||
String getName() => 'MessageReactionsManager';
|
||||
|
||||
@override
|
||||
String getId() => messageReactionsManager;
|
||||
|
||||
@override
|
||||
List<StanzaHandler> getIncomingStanzaHandlers() => [
|
||||
StanzaHandler(
|
||||
stanzaTag: 'message',
|
||||
tagName: 'reactions',
|
||||
tagXmlns: messageReactionsXmlns,
|
||||
callback: _onReactionsReceived,
|
||||
// Before the message handler
|
||||
priority: -99,
|
||||
),
|
||||
];
|
||||
|
||||
@override
|
||||
Future<bool> isSupported() async => true;
|
||||
|
||||
Future<StanzaHandlerData> _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(),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user