mirror of
https://github.com/unrealircd/unrealircd.git
synced 2026-06-29 13:16:36 +02:00
321 lines
6.8 KiB
C
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(m_mdex)
|
|
= {
|
|
"m_mdex",
|
|
"4.0",
|
|
"Command /MDEX",
|
|
"3.2-b8-1",
|
|
NULL
|
|
};
|
|
|
|
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(m_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(m_mdex)
|
|
{
|
|
return MOD_SUCCESS;
|
|
}
|
|
|
|
|
|
MOD_UNLOAD(m_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"))
|
|
{
|
|
aClient *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"))
|
|
{
|
|
aChannel *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"))
|
|
{
|
|
aClient *acptr;
|
|
aChannel *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"))
|
|
{
|
|
aClient *acptr;
|
|
aChannel *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"))
|
|
{
|
|
aClient *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"))
|
|
{
|
|
aChannel *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"))
|
|
{
|
|
aClient *acptr;
|
|
aChannel *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"))
|
|
{
|
|
aClient *acptr;
|
|
aChannel *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);
|
|
}
|