Skip to content

Commit

Permalink
Merge pull request #51 from rohan031/main
Browse files Browse the repository at this point in the history
`Inbox` plugin support for MongooseIM
  • Loading branch information
vsevex authored Jan 2, 2025
2 parents d1b2d4c + 7dd085e commit 0894dfb
Show file tree
Hide file tree
Showing 8 changed files with 379 additions and 9 deletions.
76 changes: 76 additions & 0 deletions example/inbox.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import 'package:whixp/src/plugins/inbox/inbox.dart';
import 'package:whixp/whixp.dart';

void main() {
final whixp = Whixp(
jabberID: 'asdf@localhost',
password: 'passwd',
logger: Log(
enableWarning: true,
enableError: true,
includeTimestamp: true,
),
internalDatabasePath: 'whixp',
);

whixp
..addEventHandler('streamNegotiated', (_) {
return getInbox();
})
..addEventHandler<Message>('message', (message) {
final result = message?.get<InboxResult>();
if (result?.isNotEmpty ?? false) {
for (final stanza in result!) {
final forwarded = stanza.forwarded;
if (forwarded?.delay?.stamp != null) {
Log.instance.info(forwarded!.delay!.stamp!);
}
Log.instance.info("marked: ${forwarded?.actual?.isMarked}");
Log.instance.info(
"box: ${stanza.box} \t archive: ${stanza.archive} \t mute: ${stanza.mute}");
Log.instance.info(
"from: ${forwarded?.actual?.from?.username} \t to: ${forwarded?.actual?.to?.username}",
);

Log.instance.info("unread: ${stanza.unread}");

Log.instance.info(
"type: ${forwarded?.actual?.subject} \t value: ${forwarded?.actual?.body}",
);
}
}
});
whixp.connect();
}

String? globalLast;

Future<void> getInbox({
String? lastItem,
}) async {
globalLast = null;
final result = await Inbox.queryInbox(
pagination: RSMSet(
max: 25,
after: lastItem,
),
);

final fin = result.payload as InboxFin?;
final last = fin?.last?.lastItem;
Log.instance.warning(
"active-conversations: ${fin?.activeConversation}",
);
Log.instance.warning(
"unread: ${fin?.unreadMessages}",
);
Log.instance.warning(
"cursor: $last",
);

if (last != null && last != globalLast) {
getInbox(
lastItem: last,
);
}
}
53 changes: 45 additions & 8 deletions example/mam.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,46 @@ import 'package:whixp/whixp.dart';

void main() {
final whixp = Whixp(
jabberID: 'vsevex@localhost',
jabberID: 'asdf@localhost',
password: 'passwd',
logger: Log(enableWarning: true, enableError: true, includeTimestamp: true),
logger: Log(
enableWarning: true,
enableError: true,
includeTimestamp: true,
),
internalDatabasePath: 'whixp',
);

whixp
..addEventHandler('streamNegotiated', (_) {
for (int i = 1; i <= 100; i++) {
whixp.sendMessage(JabberID('alyosha@loalhost'), body: 'Message no: $i');
}
// for (int i = 1; i <= 2; i++) {
// final message = Message(
// subject: "normal",
// body: "hmm trying something heehe * $i",
// )..to = JabberID("asdfasdf@localhost");
//
// whixp.send(message.makeMarkable);
// }

return paginationRequest();
})
..addEventHandler<Message>('message', (message) {
final result = message?.get<MAMResult>();

if (result?.isNotEmpty ?? false) {
for (final stanza in result!) {
final forwarded = stanza.forwarded;
if (forwarded?.delay?.stamp != null) {
Log.instance.info(forwarded!.delay!.stamp!);
}
Log.instance.info("marked: ${forwarded?.actual?.isMarked}");
Log.instance.info(
"from: ${forwarded?.actual?.from?.username} \t to: ${forwarded?.actual?.to?.username}",
);

Log.instance.info(
"type: ${forwarded?.actual?.subject} \t value: ${forwarded?.actual?.body}",
);
}
}
});
Expand All @@ -32,11 +50,30 @@ void main() {

/// Recursively request messages from the archive.
Future<void> paginationRequest({String? lastItem}) async {
final result =
await MAM.queryArchive(pagination: RSMSet(max: 20, after: lastItem));
const mam = MAM();
final result = await MAM.queryArchive(
pagination: RSMSet(
max: 25,
// after: lastItem,
before: lastItem ?? "",
),
filter: mam.createFilter(
wth: "asdfasdf@localhost",
),
flipPage: true,
);

final fin = result.payload as MAMFin?;
final last = fin?.last?.lastItem;
Log.instance.warning(
"complete: ${fin?.complete}",
);
Log.instance.info("first cursor: $last");
if (last?.isEmpty ?? true) return;
return paginationRequest(lastItem: last);
if (fin != null && !fin.complete && last != null) {
return paginationRequest(
lastItem: last,
);
}
// return paginationRequest(lastItem: last);
}
3 changes: 3 additions & 0 deletions lib/src/_static.dart
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ String get mamFinTag => '{urn:xmpp:mam:2}fin';
String get mamResultTag => '{urn:xmpp:mam:2}result';
String get mamMetadataTag => '{urn:xmpp:mam:2}metadata';
String get forwardedTag => '{urn:xmpp:forward:0}forwarded';
String get inboxQueryTag => '{erlang-solutions.com:xmpp:inbox:0}inbox';
String get inboxFinTag => '{erlang-solutions.com:xmpp:inbox:0}fin';
String get inboxResultTag => '{erlang-solutions.com:xmpp:inbox:0}result';

Set<String> get presenceTypes => <String>{
'subscribe',
Expand Down
34 changes: 34 additions & 0 deletions lib/src/plugins/inbox/inbox.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import 'dart:async';

import 'package:whixp/src/_static.dart';
import 'package:whixp/src/plugins/plugins.dart';
import 'package:whixp/src/stanza/forwarded.dart';
import 'package:whixp/src/stanza/iq.dart';
import 'package:whixp/src/stanza/stanza.dart';
import 'package:whixp/src/utils/src/utils.dart';
import 'package:xml/xml.dart';

part 'stanza.dart';

class Inbox {
const Inbox();

/// read here for all the options for the inbox querying
/// https://esl.github.io/MongooseDocs/latest/open-extensions/inbox/
static FutureOr<IQ> queryInbox<T>({
RSMSet? pagination,
int timeout = 5,
}) {
final query = InboxQuery(
rsm: pagination,
);

final iq = IQ(generateID: true)
..type = iqTypeSet
..payload = query;

return iq.send(
timeout: timeout,
);
}
}
Loading

0 comments on commit 0894dfb

Please sign in to comment.