1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-07-09 02:03:14 +02:00
Files
unrealircd/src/modules/m_chmodetst.c
T
2003-09-21 19:59:50 +00:00

202 lines
4.7 KiB
C

/*
* Test for modulized channelmode system, adds 2 modes:
* +w (paramless)
* +y <0-100> (1 parameter)
*
* It's incomplete (like error signaling) but for testing purposes only.
*/
#include "config.h"
#include "struct.h"
#include "common.h"
#include "sys.h"
#include "numeric.h"
#include "msg.h"
#include "proto.h"
#include "channel.h"
#include <time.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef _WIN32
#include <io.h>
#endif
#include <fcntl.h>
#include "h.h"
#ifdef STRIPBADWORDS
#include "badwords.h"
#endif
#ifdef _WIN32
#include "version.h"
#endif
ModuleHeader MOD_HEADER(m_chmodetst)
= {
"chmodetst", /* Name of module */
"channelmode test", /* Version */
"channelmode +w", /* Short description of module */
"3.2-b8-1",
NULL,
};
Cmode_t EXTCMODE_TEST = 0L; /* Just for testing */
Cmode_t EXTCMODE_TEST2 = 0L; /* Just for testing */
int modey_is_ok(aClient *sptr, aChannel *chptr, char *para, int checkt, int what);
CmodeParam * modey_put_param(CmodeParam *lst, char *para);
char *modey_get_param(CmodeParam *lst);
char *modey_conv_param(char *param);
void modey_free_param(CmodeParam *lst);
CmodeParam *modey_dup_struct(CmodeParam *src);
int modey_sjoin_check(aChannel *chptr, CmodeParam *ourx, CmodeParam *theirx);
CmodeParam *modey_dup_struct(CmodeParam *src);
typedef struct {
EXTCM_PAR_HEADER
short val;
} aModewentry;
/* The purpose of these ifdefs, are that we can "static" link the ircd if we
* want to
*/
Cmode *ModeTest = NULL, *ModeTest2 = NULL;
/* This is called on module init, before Server Ready */
DLLFUNC int MOD_INIT(m_dummy)(ModuleInfo *modinfo)
{
CmodeInfo req;
ircd_log(LOG_ERROR, "debug: mod_init called from chmodetst module");
ModuleSetOptions(modinfo->handle, MOD_OPT_PERM);
sendto_realops("chmodetst loading...");
/* TODO: load mode here */
/* +w doesn't do anything, it's just for testing */
memset(&req, 0, sizeof(req));
req.paracount = 0;
req.is_ok = extcmode_default_requirechop;
req.flag = 'w';
ModeTest = CmodeAdd(modinfo->handle, req, &EXTCMODE_TEST);
/* +y doesn't do anything except that you can set/unset it with a
* numeric parameter (1-100)
*/
memset(&req, 0, sizeof(req));
req.paracount = 1;
req.is_ok = modey_is_ok;
req.put_param = modey_put_param;
req.get_param = modey_get_param;
req.conv_param = modey_conv_param;
req.free_param = modey_free_param;
req.sjoin_check = modey_sjoin_check;
req.dup_struct = modey_dup_struct;
req.flag = 'y';
ModeTest2 = CmodeAdd(modinfo->handle, req, &EXTCMODE_TEST2);
return MOD_SUCCESS;
}
/* Is first run when server is 100% ready */
DLLFUNC int MOD_LOAD(m_dummy)(int module_load)
{
return MOD_SUCCESS;
}
/* Called when module is unloaded */
DLLFUNC int MOD_UNLOAD(m_dummy)(int module_unload)
{
/* Aaaaaaaargh... we are assumed to be a permanent module */
sendto_realops("Mod_Unload was called??? Arghhhhhh..");
return MOD_FAILED;
}
int modey_is_ok(aClient *sptr, aChannel *chptr, char *para, int checkt, int what)
{
short t;
if ((checkt == EXCHK_ACCESS) || (checkt == EXCHK_ACCESS_ERR))
{
if (!is_chan_op(sptr, chptr))
{
if (checkt == EXCHK_ACCESS_ERR)
sendto_one(sptr, err_str(ERR_CHANOPRIVSNEEDED), me.name, sptr->name, chptr->chname);
return 0;
} else {
return 1;
}
} else
if (checkt == EXCHK_PARAM)
{
t = (short)atoi(para);
if ((t < 0) || (t > 100))
{
sendto_one(sptr, ":%s NOTICE %s :chanmode +y requires a parameter in the range 0..100",
me.name, sptr->name);
return 0;
}
return 1;
}
return 0;
}
CmodeParam * modey_put_param(CmodeParam *ypara, char *para)
{
aModewentry *r = (aModewentry *)ypara;
if (!r)
{
/* Need to create one */
r = (aModewentry *)malloc(sizeof(aModewentry));
memset(r, 0, sizeof(aModewentry));
r->flag = 'y';
}
r->val = (short)atoi(para);
return (CmodeParam *)r;
}
char *modey_get_param(CmodeParam *ypara)
{
aModewentry *r = (aModewentry *)ypara;
static char tmpret[16];
if (!r)
return NULL;
sprintf(tmpret, "%hu", r->val);
return tmpret;
}
/* no this is not useless, imagine the parameter "1blah" :P */
char *modey_conv_param(char *param)
{
short i;
static char tmpret2[16];
i = (short)atoi(param);
sprintf(tmpret2, "%hu", i);
return tmpret2;
}
void modey_free_param(CmodeParam *ypara)
{
aModewentry *r = (aModewentry *)ypara;
free(r);
}
CmodeParam *modey_dup_struct(CmodeParam *src)
{
aModewentry *n = (aModewentry *)malloc(sizeof(aModewentry));
memcpy(n, src, sizeof(aModewentry));
return (CmodeParam *)n;
}
int modey_sjoin_check(aChannel *chptr, CmodeParam *ourx, CmodeParam *theirx)
{
aModewentry *our = (aModewentry *)ourx;
aModewentry *their = (aModewentry *)theirx;
if (our->val == their->val)
return EXSJ_SAME;
if (our->val > their->val)
return EXSJ_WEWON;
else
return EXSJ_THEYWON;
}