1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-06-30 12:26:37 +02:00
Files
unrealircd/src/modules/rpc/user.c
T

111 lines
2.1 KiB
C

/* user.* RPC calls
* (C) Copyright 2022-.. Bram Matthys (Syzop) and the UnrealIRCd team
* License: GPLv2 or later
*/
#include "unrealircd.h"
ModuleHeader MOD_HEADER
= {
"rpc/user",
"1.0.0",
"user.* RPC calls",
"UnrealIRCd Team",
"unrealircd-6",
};
/* Forward declarations */
RPC_CALL_FUNC(rpc_user_list);
RPC_CALL_FUNC(rpc_user_get);
MOD_INIT()
{
RPCHandlerInfo r;
MARK_AS_OFFICIAL_MODULE(modinfo);
memset(&r, 0, sizeof(r));
r.method = "user.list";
r.call = rpc_user_list;
if (!RPCHandlerAdd(modinfo->handle, &r))
{
config_error("[rpc/user] Could not register RPC handler");
return MOD_FAILED;
}
memset(&r, 0, sizeof(r));
r.method = "user.get";
r.call = rpc_user_get;
if (!RPCHandlerAdd(modinfo->handle, &r))
{
config_error("[rpc/user] Could not register RPC handler");
return MOD_FAILED;
}
return MOD_SUCCESS;
}
MOD_LOAD()
{
return MOD_SUCCESS;
}
MOD_UNLOAD()
{
return MOD_SUCCESS;
}
#define RPC_USER_LIST_EXPAND_NONE 0
#define RPC_USER_LIST_EXPAND_SELECT 1
#define RPC_USER_LIST_EXPAND_ALL 2
// TODO: right now returns everything for everyone,
// give the option to return a list of names only or
// certain options (hence the placeholder #define's above)
RPC_CALL_FUNC(rpc_user_list)
{
json_t *result, *list, *item;
Client *acptr;
result = json_object();
list = json_array();
json_object_set_new(result, "list", list);
list_for_each_entry(acptr, &client_list, client_node)
{
if (!IsUser(acptr))
continue;
item = json_object();
json_expand_client(item, NULL, acptr, 1);
json_array_append_new(list, item);
}
rpc_response(client, request, result);
json_decref(result);
}
RPC_CALL_FUNC(rpc_user_get)
{
json_t *result, *list, *item;
const char *nick;
Client *acptr;
nick = json_object_get_string(params, "nick");
if (!nick)
{
rpc_error(client, request, JSON_RPC_ERROR_INVALID_PARAMS, "Missing parameter: 'nick'");
return;
}
if (!(acptr = find_user(nick, NULL)))
{
rpc_error(client, request, JSON_RPC_ERROR_NOT_FOUND, "Nickname not found");
return;
}
result = json_object();
json_expand_client(result, "client", acptr, 1);
rpc_response(client, request, result);
json_decref(result);
}