Kod:
/*
*********************************************************************
*
**
*** Released from : C-IRC Modules
**** Description : Delays the joining process till the given time is up
**** Written by : srcmaster <[email protected]>
*** Web page : http://www.crypthon.org
**
*
** Changes:
*
** 1.0
* - Initial release
** 1.1
* - Fixed potential crashes on join and quit
* - [REQUEST] Nick changes are not permitted anymore (while users in delay)
*
*
** Configuration line: set { join-delay 5s; };
*
*********************************************************************
*/
#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
#define QUARANTINE_VIRUSCHAN "#Karantina"
#define J(x) auser[x->slot]
typedef struct _JEvent {
Event *event;
} JEvent;
static JEvent *auser[4096];
static Hook *JH, *PCH, *PCX, *QH = NULL;
ModuleInfo joindelay;
DLLFUNC int joindelay_ct(ConfigFile *, ConfigEntry *, int, int *);
DLLFUNC int joindelay_cr(ConfigFile *, ConfigEntry *, int);
DLLFUNC int joindelay_cpt(int *);
DLLFUNC int nickreover();
DLLFUNC int delay_msg(Cmdoverride *ovr, aClient *cptr, aClient *sptr, int parc, char *parv[]);
DLLFUNC int delay_notice(Cmdoverride *ovr, aClient *cptr, aClient *sptr, int parc, char *parv[]);
DLLFUNC int nickover(Cmdoverride *ovr, aClient *cptr, aClient *sptr, int parc, char *parv[]);
static int ptime = 0;
static int pre_connect_h(aClient *);
static int local_connect_h(aClient *);
static int quit_h(aClient *, char *);
static int join_h(aClient *, aChannel *, char *[]);
static void join_stuff(aClient *);
ModuleHeader MOD_HEADER(joindelay) = {
"joindelay",
"$Id: m_joindelay.c,v 1.1 2011/03/17 00:42:25 srcmaster Exp $",
"Event delay connected users and quarantine system. (srcmaster & Diablo)",
"3.2-b8-1",
NULL
};
ModuleInfo joindelay;
DLLFUNC int MOD_TEST(joindelay)(ModuleInfo *module)
{
bcopy(module, &joindelay, module->size);
HookAddEx(joindelay.handle, HOOKTYPE_CONFIGTEST, joindelay_ct);
HookAddEx(joindelay.handle, HOOKTYPE_CONFIGPOSTTEST, joindelay_cpt);
return MOD_SUCCESS;
}
DLLFUNC int MOD_INIT(joindelay)(ModuleInfo *module)
{
ModuleSetOptions(joindelay.handle, MOD_OPT_PERM);
JH = HookAddEx(joindelay.handle, HOOKTYPE_PRE_LOCAL_JOIN, join_h);
PCH = HookAddEx(joindelay.handle, HOOKTYPE_PRE_LOCAL_CONNECT, pre_connect_h);
PCX = HookAddEx(joindelay.handle, HOOKTYPE_LOCAL_CONNECT, local_connect_h);
QH = HookAddEx(joindelay.handle, HOOKTYPE_LOCAL_QUIT, quit_h);
HookAddEx(joindelay.handle, HOOKTYPE_CONFIGRUN, joindelay_cr);
HookAddEx(joindelay.handle, HOOKTYPE_REHASH_COMPLETE, nickreover);
if (!JH || !PCH || !QH || !PCX)
return MOD_FAILED;
return MOD_SUCCESS;
}
DLLFUNC int MOD_LOAD(joindelay)(int module_load)
{
CmdoverrideAdd(joindelay.handle, "NICK", nickover);
CmdoverrideAdd(joindelay.handle, "PRIVMSG", delay_msg);
CmdoverrideAdd(joindelay.handle, "NOTICE", delay_notice);
return MOD_SUCCESS;
}
DLLFUNC int MOD_UNLOAD(joindelay)(int module_unload)
{
HookDel(JH);
HookDel(PCH);
HookDel(PCX);
HookDel(QH);
return MOD_SUCCESS;
}
DLLFUNC int nickreover()
{
CmdoverrideAdd(joindelay.handle, "NICK", nickover);
CmdoverrideAdd(joindelay.handle, "PRIVMSG", delay_msg);
CmdoverrideAdd(joindelay.handle, "NOTICE", delay_notice);
return 1;
}
DLLFUNC int joindelay_ct(ConfigFile *cf, ConfigEntry *ce, int type, int *errs)
{
int errors = 0;
if (type != CONFIG_SET)
return 0;
if (!strcmp(ce->ce_varname, "join-delay"))
{
if (!ce->ce_vardata)
{
config_error("Make sure you have the join-delay set!");
errors++;
}
ptime = 1; // i know, i know...
*errs = errors;
return errors ? -1 : 1;
}
else return 0;
}
DLLFUNC int joindelay_cr(ConfigFile *cf, ConfigEntry *ce, int type)
{
if (type != CONFIG_SET)
return 0;
if (!strcmp(ce->ce_varname, "join-delay"))
{
ptime = config_checkval(ce->ce_vardata, CFG_TIME);
return 1;
}
else return 0;
}
DLLFUNC int joindelay_cpt(int *errs)
{
int errors = 0;
if (!ptime)
{
config_error("Make sure you have the join-delay set!");
errors++;
}
*errs = errors;
return errors ? -1 : 1;
}
static int join_h(aClient *cptr, aChannel *chptr, char *parv[])
{
if (!strcmp(chptr->chname, QUARANTINE_VIRUSCHAN))
return;
if (J(cptr) && !IsAnOper(cptr) && (TStime() - cptr->firsttime) < ptime)
if (cptr->listener->port != 7002)
return HOOK_DENY;
return HOOK_CONTINUE;
}
static void join_stuff(aClient *cptr)
{
if (IsAnOper(cptr))
return;
if (!BadPtr(AUTO_JOIN_CHANS) && strcmp(AUTO_JOIN_CHANS, "0") && cptr->listener->port != 7002)
{
char *chans[3] = {
cptr->name,
AUTO_JOIN_CHANS,
NULL
};
do_cmd(cptr, cptr, "JOIN", 3, chans);
}
if (!BadPtr(QUARANTINE_VIRUSCHAN) && strcmp(QUARANTINE_VIRUSCHAN, "0") && cptr->listener->port != 7002)
{
char *chans[3] = {
cptr->name,
QUARANTINE_VIRUSCHAN,
NULL
};
do_cmd(cptr, cptr, "PART", 3, chans);
sendnotice(cptr, "*** Güvenlik sebebiyle sistemimiz tarafından üzerinize uygulanan karantina kaldırıldı.");
}
}
static int pre_connect_h(aClient *cptr)
{
if (MyConnect(cptr))
{
J(cptr) = MyMallocEx(sizeof(JEvent));
J(cptr)->event = EventAddEx(joindelay.handle, "join-stuff", ptime, 1, join_stuff, cptr);
}
return HOOK_CONTINUE;
}
static int local_connect_h(aClient *cptr)
{
char *chans[3], quarantine[512];
if (IsAnOper(cptr))
return;
if (!BadPtr(QUARANTINE_VIRUSCHAN) && strcmp(QUARANTINE_VIRUSCHAN, "0") && cptr->listener->port != 7002)
{
strlcpy(quarantine, QUARANTINE_VIRUSCHAN, sizeof(quarantine));
chans[0] = cptr->name;
chans[1] = quarantine;
chans[2] = NULL;
if (do_cmd(cptr, cptr, "JOIN", 2, chans) == FLUSH_BUFFER)
return FLUSH_BUFFER;
sendnotice(cptr, "*** Güvenlik sebebiyle sistemimiz tarafından karantinaya alındınız.");
}
return HOOK_CONTINUE;
}
static int quit_h(aClient *cptr, char *comment)
{
if (MyConnect(cptr))
{
if (J(cptr))
{
EventDel(J(cptr)->event);
memset(J(cptr), 0, sizeof(JEvent));
MyFree(J(cptr));
J(cptr) = NULL;
}
}
return 0;
}
DLLFUNC int nickover(Cmdoverride *ovr, aClient *cptr, aClient *sptr, int parc, char *parv[])
{
if (MyConnect(sptr))
{
if (J(cptr) && !IsAnOper(cptr) && (TStime() - cptr->firsttime) < ptime)
if (cptr->listener->port != 7002)
return 0;
}
if (ovr->prev)
return ovr->prev->func(ovr->prev, cptr, sptr, parc, parv);
else
return ovr->command->func(cptr, sptr, parc, parv);
}
DLLFUNC int delay_msg(Cmdoverride *ovr, aClient *cptr, aClient *sptr, int parc, char *parv[])
{
if (MyConnect(sptr) && cptr->listener->port != 7002)
{
if (J(cptr) && !IsAnOper(cptr) && (TStime() - cptr->firsttime) < ptime)
{
sendto_one(cptr, ":%s NOTICE %s :*** Özel mesaj komutunu kullanabilmeniz için lütfen ( %d ) saniye bekleyiniz.",
me.name, cptr->name, ptime - (TStime() - cptr->firsttime));
return 0;
}
}
if (ovr->prev)
return ovr->prev->func(ovr->prev, cptr, sptr, parc, parv);
else
return ovr->command->func(cptr, sptr, parc, parv);
}
DLLFUNC int delay_notice(Cmdoverride *ovr, aClient *cptr, aClient *sptr, int parc, char *parv[])
{
if (MyConnect(sptr) && cptr->listener->port != 7002)
{
if (J(cptr) && !IsAnOper(cptr) && (TStime() - cptr->firsttime) < ptime)
{
sendto_one(cptr, ":%s NOTICE %s :*** NOTICE komutunu kullanabilmeniz için lütfen ( %d ) saniye bekleyiniz.",
me.name, cptr->name, ptime - (TStime() - cptr->firsttime));
return 0;
}
}
if (ovr->prev)
return ovr->prev->func(ovr->prev, cptr, sptr, parc, parv);
else
return ovr->command->func(cptr, sptr, parc, parv);
}
