87 lines
2.4 KiB
Dart
87 lines
2.4 KiB
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';
|
|
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';
|
|
|
|
XMLNode makeMessageDeliveryRequest() {
|
|
return XMLNode.xmlns(
|
|
tag: 'request',
|
|
xmlns: deliveryXmlns,
|
|
);
|
|
}
|
|
|
|
XMLNode makeMessageDeliveryResponse(String id) {
|
|
return XMLNode.xmlns(
|
|
tag: 'received',
|
|
xmlns: deliveryXmlns,
|
|
attributes: {'id': id},
|
|
);
|
|
}
|
|
|
|
class MessageDeliveryReceiptManager extends XmppManagerBase {
|
|
MessageDeliveryReceiptManager() : super(messageDeliveryReceiptManager);
|
|
|
|
@override
|
|
List<String> getDiscoFeatures() => [deliveryXmlns];
|
|
|
|
@override
|
|
List<StanzaHandler> getIncomingStanzaHandlers() => [
|
|
StanzaHandler(
|
|
stanzaTag: 'message',
|
|
tagName: 'received',
|
|
tagXmlns: deliveryXmlns,
|
|
callback: _onDeliveryReceiptReceived,
|
|
// Before the message handler
|
|
priority: -99,
|
|
),
|
|
StanzaHandler(
|
|
stanzaTag: 'message',
|
|
tagName: 'request',
|
|
tagXmlns: deliveryXmlns,
|
|
callback: _onDeliveryRequestReceived,
|
|
// Before the message handler
|
|
priority: -99,
|
|
)
|
|
];
|
|
|
|
@override
|
|
Future<bool> isSupported() async => true;
|
|
|
|
Future<StanzaHandlerData> _onDeliveryRequestReceived(
|
|
Stanza message,
|
|
StanzaHandlerData state,
|
|
) async {
|
|
return state.copyWith(deliveryReceiptRequested: true);
|
|
}
|
|
|
|
Future<StanzaHandlerData> _onDeliveryReceiptReceived(
|
|
Stanza message,
|
|
StanzaHandlerData state,
|
|
) async {
|
|
final received = message.firstTag('received', xmlns: deliveryXmlns)!;
|
|
for (final item in message.children) {
|
|
if (!['origin-id', 'stanza-id', 'delay', 'store', 'received']
|
|
.contains(item.tag)) {
|
|
logger.info(
|
|
"Won't handle stanza as delivery receipt because we found an '${item.tag}' element",
|
|
);
|
|
|
|
return state.copyWith(done: true);
|
|
}
|
|
}
|
|
|
|
getAttributes().sendEvent(
|
|
DeliveryReceiptReceivedEvent(
|
|
from: JID.fromString(message.attributes['from']! as String),
|
|
id: received.attributes['id']! as String,
|
|
),
|
|
);
|
|
return state.copyWith(done: true);
|
|
}
|
|
}
|