From 53739dd42da7e5d54b0681c4014cb2fffa53a534 Mon Sep 17 00:00:00 2001 From: LDA Date: Sat, 7 Sep 2024 18:37:45 +0200 Subject: [PATCH] [FIX] Leaves now actually do matter on Matrix --- src/MatrixEventHandler.c | 18 ++++++++++++++++++ src/Parsee/User.c | 16 ++++++++++++++++ src/XMPPThread/Stanzas/Message.c | 2 ++ src/include/Parsee.h | 11 ++++++++++- 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/MatrixEventHandler.c b/src/MatrixEventHandler.c index 247f907..82d4cf8 100644 --- a/src/MatrixEventHandler.c +++ b/src/MatrixEventHandler.c @@ -13,6 +13,9 @@ #include +static const char * +GetXMPPInformation(ParseeData *data, HashMap *event, char **from, char **to); + static void JoinMUC(ParseeData *data, HashMap *event, char *jid, char *muc, char *name) { @@ -121,6 +124,21 @@ ParseeMemberHandler(ParseeData *data, HashMap *event) muc_id = ParseeGetMUCID(data, chat_id); if (!chat_id) { + /* If it can't be found, try to see if it's as a DM */ + char *info_from = NULL, *info_to = NULL; + const char *type = GetXMPPInformation(data, event, &info_from, &info_to); + + if (StrEquals(type, "chat")) + { + char *jid_to = ParseeTrimJID(info_to); + Log(LOG_DEBUG, "('%s'->'%s') is gone.", state_key, info_to); + /* TODO: Send a last DM, signifying that all is gone. */ + ParseeDeleteDM(data, state_key, jid_to); + Free(jid_to); + } + + Free(info_from); + Free(info_to); goto end; } diff --git a/src/Parsee/User.c b/src/Parsee/User.c index 79c8a55..c751731 100644 --- a/src/Parsee/User.c +++ b/src/Parsee/User.c @@ -353,6 +353,22 @@ ParseePushDMRoom(ParseeData *d, char *mxid, char *jid, char *r) Free(dmid); return; } +void +ParseeDeleteDM(ParseeData *d, char *mxid, char *jid) +{ + DbRef *ref; + HashMap *j; + char *dmid; + if (!d || !mxid || !jid) + { + return; + } + + dmid = ParseeGetDMID(mxid, jid); + DbDelete(d->db, 2, "users", dmid); + Free(dmid); + return; +} char * ParseeTrimJID(char *jid) diff --git a/src/XMPPThread/Stanzas/Message.c b/src/XMPPThread/Stanzas/Message.c index f49697a..6516509 100644 --- a/src/XMPPThread/Stanzas/Message.c +++ b/src/XMPPThread/Stanzas/Message.c @@ -192,6 +192,7 @@ end_error: /* TODO: CLEAN THAT UP INTO A CREATEDM FUNCTION */ mroom_id = ParseeGetBridgedRoom(args, stanza); + Log(LOG_DEBUG, "Bridging to '%s'", mroom_id); if (!mroom_id && !room && !XMPPIsParseeStanza(stanza) && to && *to == '@') { @@ -202,6 +203,7 @@ end_error: ASRegisterUser(args->config, from_matrix); room = ASCreateDM(args->config, from_matrix, to); mroom_id = StrDuplicate(room); + Log(LOG_INFO, "Creating a DM to '%s'(%s)", to, mroom_id); if (room) { room_ref = DbCreate(args->db, 3, "rooms", room, "data"); diff --git a/src/include/Parsee.h b/src/include/Parsee.h index a795fbb..e19fd42 100644 --- a/src/include/Parsee.h +++ b/src/include/Parsee.h @@ -223,9 +223,18 @@ extern char * ParseeFindDMRoom(ParseeData *data, char *mxid, char *jid); /* Gets a DM ID from a Matrix and Jabber user */ extern char * ParseeGetDMID(char *mxid, char *jid); -/* Creates a DM mapping in the database */ +/** Creates a DM mapping in the database. + * ------------------------- + * Modifies: the Parsee database + * See-Also: ParseeDeleteDM */ extern void ParseePushDMRoom(ParseeData *, char *mxid, char *jid, char *r); +/** Destroys a DM mapping from the database, making it effectively non-existant. + * --------------------- + * Modifies: the Parsee database + * See-Also: ParseePushDMRoom */ +extern void ParseeDeleteDM(ParseeData *data, char *mxid, char *jid); + /* Trims the component from a JID */ extern char * ParseeTrimJID(char *jid);