69 lines
1.8 KiB
Dart
69 lines
1.8 KiB
Dart
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(),
|
|
),
|
|
);
|
|
}
|
|
}
|