[MOD/ADD] Separate AS code, XMPP reactions removal

This commit is contained in:
LDA 2024-08-21 13:51:52 +02:00
commit fb511b4df0
16 changed files with 1183 additions and 1029 deletions

View file

@ -9,6 +9,62 @@
#include <string.h>
static void
ProcessChatstates(ParseeData *args, XMLElement *stanza)
{
char *from_matrix, *mroom_id;
#define CHAT_STATES "http://jabber.org/protocol/chatstates"
if (XMLookForTKV(stanza, "composing", "xmlns", CHAT_STATES))
{
from_matrix = ParseeGetBridgedUser(args, stanza);
mroom_id = ParseeGetBridgedRoom(args, stanza);
ASType(args->config, from_matrix, mroom_id, true);
Free(from_matrix);
Free(mroom_id);
mroom_id = NULL;
from_matrix = NULL;
}
if (XMLookForTKV(stanza, "active", "xmlns", CHAT_STATES))
{
char *latest = NULL;
from_matrix = ParseeGetBridgedUser(args, stanza);
mroom_id = ParseeGetBridgedRoom(args, stanza);
latest = ParseeLookupHead(mroom_id);
ASType(args->config, from_matrix, mroom_id, false);
ASPresence(args->config, from_matrix, mroom_id, latest);
Free(from_matrix);
Free(latest);
Free(mroom_id);
mroom_id = NULL;
from_matrix = NULL;
}
if (XMLookForTKV(stanza, "paused", "xmlns", CHAT_STATES) ||
XMLookForTKV(stanza, "received", "xmlns", "urn:xmpp:receipts") ||
XMLookForTKV(stanza, "displayed", "xmlns", "urn:xmpp:chat-markers:0"))
{
/* TODO: Use stanza ID if possible */
char *latest = NULL;
from_matrix = ParseeGetBridgedUser(args, stanza);
mroom_id = ParseeGetBridgedRoom(args, stanza);
latest = ParseeLookupHead(mroom_id);
ASPresence(args->config, from_matrix, mroom_id, latest);
Free(from_matrix);
Free(latest);
Free(mroom_id);
mroom_id = NULL;
from_matrix = NULL;
}
#undef CHAT_STATES
}
bool
MessageStanza(ParseeData *args, XMLElement *stanza, XMPPThread *thr)
{
@ -107,57 +163,7 @@ end_error:
PEPManagerHandle(thr->info->pep_manager, stanza);
/* TODO: Separate the chatstate processing code. */
#define CHAT_STATES "http://jabber.org/protocol/chatstates"
if (XMLookForTKV(stanza, "composing", "xmlns", CHAT_STATES))
{
from_matrix = ParseeGetBridgedUser(args, stanza);
mroom_id = ParseeGetBridgedRoom(args, stanza);
ASType(args->config, from_matrix, mroom_id, true);
Free(from_matrix);
Free(mroom_id);
mroom_id = NULL;
from_matrix = NULL;
}
if (XMLookForTKV(stanza, "active", "xmlns", CHAT_STATES))
{
char *latest = NULL;
from_matrix = ParseeGetBridgedUser(args, stanza);
mroom_id = ParseeGetBridgedRoom(args, stanza);
latest = ParseeLookupHead(mroom_id);
ASType(args->config, from_matrix, mroom_id, false);
ASPresence(args->config, from_matrix, mroom_id, latest);
Free(from_matrix);
Free(latest);
Free(mroom_id);
mroom_id = NULL;
from_matrix = NULL;
}
if (XMLookForTKV(stanza, "paused", "xmlns", CHAT_STATES) ||
XMLookForTKV(stanza, "received", "xmlns", "urn:xmpp:receipts") ||
XMLookForTKV(stanza, "displayed", "xmlns", "urn:xmpp:chat-markers:0"))
{
/* TODO: Use stanza ID if possible */
char *latest = NULL;
from_matrix = ParseeGetBridgedUser(args, stanza);
mroom_id = ParseeGetBridgedRoom(args, stanza);
latest = ParseeLookupHead(mroom_id);
ASPresence(args->config, from_matrix, mroom_id, latest);
Free(from_matrix);
Free(latest);
Free(mroom_id);
mroom_id = NULL;
from_matrix = NULL;
}
#undef CHAT_STATES
ProcessChatstates(args, stanza);
to = ParseeDecodeMXID(HashMapGet(stanza->attrs, "to"));
decode_from = ParseeLookupJID(from);
@ -283,8 +289,28 @@ end_error:
else if (reactions)
{
Array *react_child = reactions->children;
Array *to_redact;
size_t reacts = ArraySize(react_child);
event_id = ParseeGetReactedEvent(args, stanza);
to_redact = ASGetRelations(
args->config, 30, mroom_id, event_id,
"m.reaction"
);
for (i = 0; i < ArraySize(to_redact); i++)
{
HashMap *e = ArrayGet(to_redact, i);
char *e_sender = GrabString(e, 1, "sender");
char *e_id = GrabString(e, 1, "event_id");
if (!StrEquals(e_sender, encoded))
{
continue;
}
ASRedact(args->config, mroom_id, encoded, e_id);
}
ASFreeRelations(to_redact);
for (i = 0; i < reacts; i++)
{
XMLElement *reaction, *react_data;