[ADD/WIP] Basic moderation

You now can ban people, yoohoo!
This commit is contained in:
LDA 2024-06-28 13:11:33 +02:00
commit 46489b50e6
5 changed files with 140 additions and 6 deletions

View file

@ -4,6 +4,7 @@
#include <Cytoplasm/Json.h>
#include <Cytoplasm/Str.h>
#include <Cytoplasm/Log.h>
#include <string.h>
#include <Matrix.h>
#include <AS.h>
@ -17,6 +18,7 @@ ParseeMemberHandler(ParseeData *data, HashMap *event)
char *room_id = GrabString(event, 1, "room_id");
char *sender = GrabString(event, 1, "sender");
char *chat_id;
char *local = data->config->sender_localpart;
const ParseeConfig *conf = data->config;
if (StrEquals(membership, "invite") && ParseeIsPuppet(conf, state_key))
@ -24,13 +26,14 @@ ParseeMemberHandler(ParseeData *data, HashMap *event)
DbRef *ref;
HashMap *json;
char *jid;
bool bot = !strncmp(sender + 1, local, strlen(local));
ASJoin(conf, room_id, state_key);
jid = ParseeDecodeLocalJID(conf, state_key);
ref = DbCreate(data->db, 3, "rooms", room_id, "data");
json = DbJson(ref);
HashMapSet(json, "is_direct", JsonValueBoolean(true));
HashMapSet(json, "is_direct", JsonValueBoolean(!bot));
HashMapSet(json, "xmpp_user", JsonValueString(jid));
DbUnlock(data->db, ref);
@ -59,6 +62,74 @@ ParseeMemberHandler(ParseeData *data, HashMap *event)
}
}
static void
ParseeBotHandler(ParseeData *data, HashMap *event)
{
char *msgtype = GrabString(event, 2, "content", "msgtype");
char *body = GrabString(event, 2, "content", "body");
char *id = GrabString(event, 1, "room_id");
char *ev_id = GrabString(event, 1, "event_id");
char *sender = GrabString(event, 1, "sender");
char *profile = StrConcat(4,
"@", data->config->sender_localpart,
":", data->config->homeserver_host
);
if (StrEquals(msgtype, "m.notice"))
{
Free(profile);
return;
}
if (*body != '!')
{
/* All commands are to be marked with a ! */
Free(ASSend(
data->config, id, profile,
"m.room.message",
MatrixCreateNotice("Please enter a valid command")
));
Free(profile);
return;
}
/* TODO: Make an improvment. This is the bare minimum */
if (!StrEquals(sender, data->config->matrix_admin))
{
Free(ASSend(
data->config, id, profile,
"m.room.message",
MatrixCreateNotice("You are not the admin")
));
Free(profile);
return;
}
body++;
#define BAN_USER "ban-user "
if (!strncmp(body, BAN_USER, strlen(BAN_USER)))
{
char user[256] = { 0 };
char room[256] = { 0 };
char *msg;
body += strlen(BAN_USER);
if (sscanf(body, "%255s %255s", &user, &room) != 2)
{
goto end;
}
ASBan(data->config, room, user);
msg = StrConcat(3, "Banning '", user, "'...");
Free(ASSend(
data->config, id, profile,
"m.room.message",
MatrixCreateNotice(msg)
));
Free(msg);
}
end:
Free(profile);
}
static void
ParseeMessageHandler(ParseeData *data, HashMap *event)
{
XMPPComponent *jabber = data->jabber;
@ -73,21 +144,36 @@ ParseeMessageHandler(ParseeData *data, HashMap *event)
char *chat_id, *muc_id, *jid;
char *reply_id = MatrixGetReply(event);
char *xepd = ParseeXMPPify(event);
char *cmd_lp = data->config->sender_localpart;
bool direct = false;
if (ParseeIsPuppet(data->config, sender))
{
Free(reply_id);
Free(xepd);
return;
}
chat_id = ParseeGetFromRoomID(data, id);
ref = DbLock(data->db, 3, "rooms", id, "data");
json = DbJson(ref);
direct = JsonValueAsBoolean(HashMapGet(json, "is_direct"));
DbUnlock(data->db, ref);
if (ParseeIsPuppet(data->config, sender))
{
Free(chat_id);
Free(reply_id);
Free(xepd);
return;
}
if (!direct && !chat_id)
{
ParseeBotHandler(data, event);
Free(chat_id);
Free(reply_id);
Free(xepd);
return;
}
if (direct)
{
char *user = GrabString(json, 1, "xmpp_user");
@ -95,6 +181,7 @@ ParseeMessageHandler(ParseeData *data, HashMap *event)
XMPPSendPlain(jabber, local, user, body, NULL, NULL, NULL, ev_id, NULL);
Free(chat_id);
Free(local);
Free(reply_id);
Free(xepd);
@ -102,7 +189,6 @@ ParseeMessageHandler(ParseeData *data, HashMap *event)
}
/* Try to find the chat ID */
chat_id = ParseeGetFromRoomID(data, id);
muc_id = ParseeGetMUCID(data, chat_id);
if (!chat_id)
{