Parsee/src/XMPPCommands/DelAdmin.c
LDA 308dfd500d [MOD] Multiple-option choices for lists.
You can now mass-remove admins!
2024-07-15 12:33:39 +02:00

120 lines
2.7 KiB
C

#include <Cytoplasm/HashMap.h>
#include <Cytoplasm/Memory.h>
#include <Cytoplasm/Json.h>
#include <Cytoplasm/Util.h>
#include <Cytoplasm/Str.h>
#include <Cytoplasm/Log.h>
#include <XMPPFormTool.h>
#include <XMPPCommand.h>
#include <Parsee.h>
#include <XMPP.h>
#include <XML.h>
/* Removes one admin user */
static bool
DelAdmin(Array *admin_list, char *glob)
{
size_t i;
bool removed = false;
for (i = 0; i < ArraySize(admin_list); i++)
{
char *admin = JsonValueAsString(ArrayGet(admin_list, i));
if (StrEquals(admin, glob))
{
removed = true;
JsonValueFree(ArrayDelete(admin_list, i));
break;
}
}
return removed;
}
void
DelAdminCallback(XMPPCommandManager *m, char *from, XMLElement *form, XMLElement *out)
{
ParseeData *data = XMPPGetManagerCookie(m);
char *trimmed = ParseeTrimJID(from);
char *glob = NULL;
DbRef *admins;
Array *admin_list;
size_t i, globs;
bool removed = true;
GFVCount(globs, "glob", form);
if (!ParseeIsAdmin(data, trimmed))
{
SetNote("error", "User is not authorised to execute command.");
Free(trimmed);
return;
}
if (!globs)
{
SetNote("error", "No glob found.");
Free(trimmed);
return;
}
admins = DbLock(data->db, 1, "admins");
admin_list = GrabArray(DbJson(admins), 1, "admins");
for (i = 0; i < globs; i++)
{
GFVMulti(glob, "glob", form, i);
if (!glob)
{
continue;
}
if (!DelAdmin(admin_list, glob))
{
removed = false;
}
}
DbUnlock(data->db, admins);
Free(trimmed);
if (!removed)
{
SetNote("warn", "Couldn't remove some globrules.");
return;
}
SetNote("info", "Sucessfully removed admins");
/* TODO */
}
void
FormDelAdminCallback(XMPPCommandManager *m, XMPPCommand *cmd, char *from)
{
ParseeData *data = XMPPGetManagerCookie(m);
DbRef *admins;
Array *admin_list;
size_t i;
XMPPOption *admin_opt;
char *trimmed = ParseeTrimJID(from);
if (!ParseeIsAdmin(data, trimmed))
{
Free(trimmed);
admin_opt = XMPPCreateList(true, false, "glob", "[NOT AUTHORIZED!]");
XMPPAddOption(cmd, admin_opt);
return;
}
Free(trimmed);
admin_opt = XMPPCreateList(true, false, "glob", "[NVM!]");
admins = DbLock(data->db, 1, "admins");
admin_list = GrabArray(DbJson(admins), 1, "admins");
for (i = 0; i < ArraySize(admin_list); i++)
{
char *glob = JsonValueAsString(ArrayGet(admin_list, i));
XMPPAddListOption(admin_opt, glob);
}
DbUnlock(data->db, admins);
XMPPAddOption(cmd, admin_opt);
}