1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-07-08 01:03:12 +02:00
Files
unrealircd/src/modules/mdex.c
T
Bram Matthys 23116d344a Give structs the same name as the typedefs. Rename aClient to Client,
aChannel to Channel, and some more. Third party module coders will
love this. But.. it makes things more logical and the doxygen output
will look more clean and logical as well.
(More changes will follow)
2019-09-11 09:48:00 +02:00

321 lines
6.8 KiB
C

/*
* Example module for ModData usage
* NEVER LOAD THIS ON A LIVE SERVER!!
*
* (C) Copyright 2014 Bram Matthys and the UnrealIRCd team
* License: GPLv2
*/
#include "unrealircd.h"
CMD_FUNC(m_mdex);
ModuleHeader MOD_HEADER(mdex)
= {
"mdex",
"5.0",
"Command /MDEX",
"UnrealIRCd Team",
"unrealircd-5",
};
ModDataInfo *mdex_cli = NULL, *mdex_chan = NULL, *mdex_member = NULL, *mdex_membership = NULL;
void mdex_free(ModData *m);
char *mdex_serialize(ModData *m);
void mdex_unserialize(char *str, ModData *m);
MOD_INIT(mdex)
{
ModDataInfo mreq;
memset(&mreq, 0, sizeof(mreq));
mreq.name = "mdex";
mreq.free = mdex_free;
mreq.serialize = mdex_serialize;
mreq.unserialize = mdex_unserialize;
mreq.sync = 1;
mreq.type = MODDATATYPE_CLIENT;
mdex_cli = ModDataAdd(modinfo->handle, mreq);
if (!mdex_cli)
abort();
mreq.type = MODDATATYPE_CHANNEL;
mdex_chan = ModDataAdd(modinfo->handle, mreq);
if (!mdex_cli)
abort();
mreq.type = MODDATATYPE_MEMBER;
mdex_member = ModDataAdd(modinfo->handle, mreq);
if (!mdex_cli)
abort();
mreq.type = MODDATATYPE_MEMBERSHIP;
mdex_membership = ModDataAdd(modinfo->handle, mreq);
if (!mdex_cli)
abort();
CommandAdd(modinfo->handle, "MDEX", m_mdex, MAXPARA, M_USER);
return MOD_SUCCESS;
}
MOD_LOAD(mdex)
{
return MOD_SUCCESS;
}
MOD_UNLOAD(mdex)
{
return MOD_SUCCESS;
}
CMD_FUNC(m_mdex)
{
char *action, *type, *objname, *varname, *value;
ModDataInfo *md;
if (!IsOper(sptr) || (parc < 5) || BadPtr(parv[4]))
return 0;
action = parv[1]; /* get / set */
type = parv[2];
objname = parv[3];
#ifdef DEBUGMODE
varname = parv[4];
#else
varname = "mdex";
#endif
value = parv[5]; /* may be NULL */
if (!strcmp(action, "set"))
{
if (!strcmp(type, "client"))
{
Client *acptr = find_client(objname, NULL);
md = findmoddata_byname(varname, MODDATATYPE_CLIENT);
if (!md || !md->unserialize || !md->free || !acptr)
return 0;
if (value)
md->unserialize(value, &moddata_client(acptr, md));
else
{
md->free(&moddata_client(acptr, md));
memset(&moddata_client(acptr, md), 0, sizeof(ModData));
}
broadcast_md_client(md, acptr, &moddata_client(acptr, md));
} else
if (!strcmp(type, "channel"))
{
Channel *chptr = find_channel(objname, NULL);
md = findmoddata_byname(varname, MODDATATYPE_CHANNEL);
if (!md || !md->unserialize || !md->free || !chptr)
return 0;
if (value)
md->unserialize(value, &moddata_channel(chptr, md));
else
{
md->free(&moddata_channel(chptr, md));
memset(&moddata_channel(chptr, md), 0, sizeof(ModData));
}
broadcast_md_channel(md, chptr, &moddata_channel(chptr, md));
} else
if (!strcmp(type, "member"))
{
Client *acptr;
Channel *chptr;
Member *m;
char *p;
/* for member the object name is like '#channel/Syzop' */
p = strchr(objname, ':');
if (!p)
return 0;
*p++ = '\0';
chptr = find_channel(objname, NULL);
if (!chptr)
return 0;
acptr = find_person(p, NULL);
if (!acptr)
return 0;
m = find_member_link(chptr->members, acptr);
if (!m)
return 0;
md = findmoddata_byname(varname, MODDATATYPE_MEMBER);
if (!md || !md->unserialize || !md->free)
return 0;
if (value)
md->unserialize(value, &moddata_member(m, md));
else
{
md->free(&moddata_member(m, md));
memset(&moddata_member(m, md), 0, sizeof(ModData));
}
broadcast_md_member(md, chptr, m, &moddata_member(m, md));
} else
if (!strcmp(type, "membership"))
{
Client *acptr;
Channel *chptr;
Membership *m;
char *p;
/* for membership the object name is like 'Syzop/#channel' */
p = strchr(objname, ':');
if (!p)
return 0;
*p++ = '\0';
acptr = find_person(objname, NULL);
if (!acptr)
return 0;
chptr = find_channel(p, NULL);
if (!chptr)
return 0;
m = find_membership_link(acptr->user->channel, chptr);
if (!m)
return 0;
md = findmoddata_byname(varname, MODDATATYPE_MEMBERSHIP);
if (!md || !md->unserialize || !md->free)
return 0;
if (value)
md->unserialize(value, &moddata_membership(m, md));
else
{
md->free(&moddata_membership(m, md));
memset(&moddata_membership(m, md), 0, sizeof(ModData));
}
broadcast_md_membership(md, acptr, m, &moddata_membership(m, md));
}
} else
if (!strcmp(action, "get"))
{
if (!strcmp(type, "client"))
{
Client *acptr = find_client(objname, NULL);
char *str;
md = findmoddata_byname(varname, MODDATATYPE_CLIENT);
if (!md || !md->serialize || !acptr)
return 0;
str = md->serialize(&moddata_client(acptr, md));
if (str)
sendnotice(sptr, "Value: %s", str ? str : "<null>");
else
sendnotice(sptr, "No value set");
} else
if (!strcmp(type, "channel"))
{
Channel *chptr = find_channel(objname, NULL);
char *str;
md = findmoddata_byname(varname, MODDATATYPE_CHANNEL);
if (!md || !md->serialize || !chptr)
return 0;
str = md->serialize(&moddata_channel(chptr, md));
if (str)
sendnotice(sptr, "Value: %s", str ? str : "<null>");
else
sendnotice(sptr, "No value set");
} else
if (!strcmp(type, "member"))
{
Client *acptr;
Channel *chptr;
Member *m;
char *p, *str;
/* for member the object name is like '#channel/Syzop' */
p = strchr(objname, ':');
if (!p)
return 0;
*p++ = '\0';
chptr = find_channel(objname, NULL);
if (!chptr)
return 0;
acptr = find_person(p, NULL);
if (!acptr)
return 0;
m = find_member_link(chptr->members, acptr);
if (!m)
return 0;
md = findmoddata_byname(varname, MODDATATYPE_MEMBER);
if (!md || !md->serialize)
return 0;
str = md->serialize(&moddata_member(m, md));
if (str)
sendnotice(sptr, "Value: %s", str ? str : "<null>");
else
sendnotice(sptr, "No value set");
} else
if (!strcmp(type, "membership"))
{
Client *acptr;
Channel *chptr;
Membership *m;
char *p, *str;
/* for membership the object name is like 'Syzop/#channel' */
p = strchr(objname, ':');
if (!p)
return 0;
*p++ = '\0';
acptr = find_person(objname, NULL);
if (!acptr)
return 0;
chptr = find_channel(p, NULL);
if (!chptr)
return 0;
m = find_membership_link(acptr->user->channel, chptr);
if (!m)
return 0;
md = findmoddata_byname(varname, MODDATATYPE_MEMBERSHIP);
if (!md || !md->serialize)
return 0;
str = md->serialize(&moddata_membership(m, md));
if (str)
sendnotice(sptr, "Value: %s", str ? str : "<null>");
else
sendnotice(sptr, "No value set");
}
}
return 0;
}
void mdex_free(ModData *m)
{
if (m->str)
MyFree(m->str);
}
char *mdex_serialize(ModData *m)
{
if (!m->str)
return NULL;
return m->str;
}
void mdex_unserialize(char *str, ModData *m)
{
if (m->str)
MyFree(m->str);
m->str = strdup(str);
}