[MOD] Multiple-option choices for lists.

You can now mass-remove admins!
This commit is contained in:
LDA 2024-07-15 12:33:39 +02:00
commit 308dfd500d
3 changed files with 59 additions and 16 deletions

View file

@ -160,7 +160,12 @@ XMPPOptionToXML(XMPPOption *opt)
case XMPP_OPTION_BOOL: XMLAddAttr(elem, "type", "boolean"); break; case XMPP_OPTION_BOOL: XMLAddAttr(elem, "type", "boolean"); break;
/* TODO */ /* TODO */
case XMPP_OPTION_LIST: XMLAddAttr(elem, "type", "list-single"); break; case XMPP_OPTION_LIST:
XMLAddAttr(elem,
"type",
opt->data.as_arr.single ? "list-single" : "list-multi"
);
break;
case XMPP_OPTION_FIXED: XMLAddAttr(elem, "type", "fixed"); break; case XMPP_OPTION_FIXED: XMLAddAttr(elem, "type", "fixed"); break;
} }
XMLAddAttr(elem, "var", opt->id); XMLAddAttr(elem, "var", opt->id);

View file

@ -11,6 +11,25 @@
#include <XMPP.h> #include <XMPP.h>
#include <XML.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 void
DelAdminCallback(XMPPCommandManager *m, char *from, XMLElement *form, XMLElement *out) DelAdminCallback(XMPPCommandManager *m, char *from, XMLElement *form, XMLElement *out)
{ {
@ -20,10 +39,10 @@ DelAdminCallback(XMPPCommandManager *m, char *from, XMLElement *form, XMLElement
DbRef *admins; DbRef *admins;
Array *admin_list; Array *admin_list;
size_t i; size_t i, globs;
bool removed = false; bool removed = true;
GetFieldValue(glob, "glob", form); GFVCount(globs, "glob", form);
if (!ParseeIsAdmin(data, trimmed)) if (!ParseeIsAdmin(data, trimmed))
{ {
@ -32,26 +51,26 @@ DelAdminCallback(XMPPCommandManager *m, char *from, XMLElement *form, XMLElement
Free(trimmed); Free(trimmed);
return; return;
} }
if (!glob) if (!globs)
{ {
SetNote("error", "No glob found."); SetNote("error", "No glob found.");
Free(trimmed); Free(trimmed);
return; return;
} }
Log(LOG_INFO, "glob=%s", glob);
admins = DbLock(data->db, 1, "admins"); admins = DbLock(data->db, 1, "admins");
admin_list = GrabArray(DbJson(admins), 1, "admins"); admin_list = GrabArray(DbJson(admins), 1, "admins");
for (i = 0; i < ArraySize(admin_list); i++) for (i = 0; i < globs; i++)
{ {
char *admin = JsonValueAsString(ArrayGet(admin_list, i)); GFVMulti(glob, "glob", form, i);
if (StrEquals(admin, glob)) if (!glob)
{ {
SetNote("info", "Admin sucessfully removed."); continue;
removed = true; }
JsonValueFree(ArrayDelete(admin_list, i)); if (!DelAdmin(admin_list, glob))
break; {
removed = false;
} }
} }
@ -60,8 +79,10 @@ DelAdminCallback(XMPPCommandManager *m, char *from, XMLElement *form, XMLElement
if (!removed) if (!removed)
{ {
SetNote("warn", "Glob wasn't in list."); SetNote("warn", "Couldn't remove some globrules.");
return;
} }
SetNote("info", "Sucessfully removed admins");
/* TODO */ /* TODO */
} }
void void
@ -77,13 +98,13 @@ FormDelAdminCallback(XMPPCommandManager *m, XMPPCommand *cmd, char *from)
if (!ParseeIsAdmin(data, trimmed)) if (!ParseeIsAdmin(data, trimmed))
{ {
Free(trimmed); Free(trimmed);
admin_opt = XMPPCreateList(true, true, "glob", "[NOT AUTHORIZED!]"); admin_opt = XMPPCreateList(true, false, "glob", "[NOT AUTHORIZED!]");
XMPPAddOption(cmd, admin_opt); XMPPAddOption(cmd, admin_opt);
return; return;
} }
Free(trimmed); Free(trimmed);
admin_opt = XMPPCreateList(true, true, "glob", "[NVM!]"); admin_opt = XMPPCreateList(true, false, "glob", "[NVM!]");
admins = DbLock(data->db, 1, "admins"); admins = DbLock(data->db, 1, "admins");
admin_list = GrabArray(DbJson(admins), 1, "admins"); admin_list = GrabArray(DbJson(admins), 1, "admins");

View file

@ -46,6 +46,23 @@
} \ } \
} \ } \
while(0) while(0)
#define GFVMulti(to,id,form,n) do \
{ \
XMLElement *field_content = XMLookForTKV(form, "field", "var", id); \
XMLElement *value = field_content ? ArrayGet(field_content->children, n) : NULL; \
XMLElement *val_data = value ? ArrayGet(value->children, 0) : NULL; \
if (val_data && val_data->data) \
{ \
to = val_data->data; \
} \
} \
while(0)
#define GFVCount(to,id,form) do \
{ \
XMLElement *field_content = XMLookForTKV(form, "field", "var", id); \
to = field_content ? ArraySize(field_content->children) : 0; \
} \
while(0)
#define SetNote(type, text) do \ #define SetNote(type, text) do \
{ \ { \