Kod: Kodu kopyalamak için üzerine çift tıklayın!
/*
* JoinDelay – Karantina destekli JOIN geciktirme sistemi
* UnrealIRCd 3.2.10 uyumlu by Xadd1
*/
#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 "h.h"
#include <string.h>
#include <stdlib.h>
static int delay_time = 5;
static char *quarantine_chan = "#karantina";
typedef struct _JD {
time_t first;
int freed;
} JD;
static JD *userdata[4096];
#define U(x) userdata[(x)->slot]
static Cmdoverride *JOIN_OVR;
static Cmdoverride *NICK_OVR;
/* ---------------- MODULE HEADER ---------------- */
ModuleHeader MOD_HEADER(joindelay) = {
"joindelay",
"$Id: joindelay.c,v 1.0 Xadd1 Custom $",
"Join delay + quarantine (RAW JOIN Safe)",
"3.2-b8-1",
NULL
};
/* ---------------- CONFIG PARSER ---------------- */
DLLFUNC int joindelay_conf(ConfigFile *cf, ConfigEntry *ce, int type)
{
if (type != CONFIG_SET)
return 0;
if (!strcmp(ce->ce_varname, "join-delay"))
{
delay_time = config_checkval(ce->ce_vardata, CFG_TIME);
if (delay_time < 1) delay_time = 5;
return 1;
}
if (!strcmp(ce->ce_varname, "join-delay-quarantine"))
{
quarantine_chan = strdup(ce->ce_vardata);
return 1;
}
return 0;
}
/* ---------------- CONNECT HOOK ---------------- */
static int delay_connect(aClient *cptr)
{
if (MyConnect(cptr))
{
U(cptr) = MyMallocEx(sizeof(JD));
U(cptr)->first = TStime();
U(cptr)->freed = 0;
sendto_one(cptr, ":%s NOTICE %s :Sunucu güvenlik kontrolü aktif.",
me.name, cptr->name);
sendto_one(cptr, ":%s NOTICE %s :%s kanalına yönlendirildiniz. %d saniye sonra serbest kalacaksınız.",
me.name, cptr->name, quarantine_chan, delay_time);
char *args[3] = { cptr->name, quarantine_chan, NULL };
do_cmd(cptr, cptr, "JOIN", 3, args);
}
return HOOK_CONTINUE;
}
/* ---------------- JOIN OVERRIDE ---------------- */
static int delay_join(Cmdoverride *ovr, aClient *cptr, aClient *sptr, int parc, char *parv[])
{
if (MyConnect(sptr) && !IsAnOper(sptr))
{
if (U(sptr) && !U(sptr)->freed)
{
time_t now = TStime();
if ((now - U(sptr)->first) < delay_time)
{
if (stricmp(parv[1], quarantine_chan))
{
sendto_one(sptr,
":%s NOTICE %s :%d saniye daha sadece %s kanalında kalmalısın.",
me.name, sptr->name,
delay_time - (now - U(sptr)->first),
quarantine_chan
);
return 0;
}
}
else
{
U(sptr)->freed = 1;
sendto_one(sptr,
":%s NOTICE %s :Güvenlik kontrolü tamamlandı, global kanallara aktarılıyorsun.",
me.name, sptr->name
);
if (!BadPtr(AUTO_JOIN_CHANS))
{
char *args2[3] = { sptr->name, AUTO_JOIN_CHANS, NULL };
do_cmd(sptr, sptr, "JOIN", 3, args2);
}
}
}
}
if (ovr->prev)
return ovr->prev->func(ovr->prev, cptr, sptr, parc, parv);
return ovr->command->func(cptr, sptr, parc, parv);
}
/* ---------------- NICK OVERRIDE ---------------- */
static int delay_nick(Cmdoverride *ovr, aClient *cptr, aClient *sptr, int parc, char *parv[])
{
if (MyConnect(sptr) && !IsAnOper(sptr))
{
if (U(sptr) && !U(sptr)->freed)
{
if ((TStime() - U(sptr)->first) < delay_time)
return 0;
}
}
if (ovr->prev)
return ovr->prev->func(ovr->prev, cptr, sptr, parc, parv);
return ovr->command->func(cptr, sptr, parc, parv);
}
/* ---------------- QUIT HOOK ---------------- */
static int delay_quit(aClient *cptr, char *msg)
{
if (MyConnect(cptr))
{
if (U(cptr))
{
memset(U(cptr), 0, sizeof(JD));
MyFree(U(cptr));
U(cptr) = NULL;
}
}
return HOOK_CONTINUE;
}
/* ---------------- MODULE TEST ---------------- */
DLLFUNC int MOD_TEST(joindelay)(ModuleInfo *mi)
{
HookAddEx(mi->handle, HOOKTYPE_CONFIGTEST, joindelay_conf);
HookAddEx(mi->handle, HOOKTYPE_CONFIGPOSTTEST, joindelay_conf);
HookAddEx(mi->handle, HOOKTYPE_CONFIGRUN, joindelay_conf);
return MOD_SUCCESS;
}
/* ---------------- MODULE INIT ---------------- */
DLLFUNC int MOD_INIT(joindelay)(ModuleInfo *mi)
{
JOIN_OVR = CmdoverrideAdd(mi->handle, "JOIN", delay_join);
NICK_OVR = CmdoverrideAdd(mi->handle, "NICK", delay_nick);
HookAddEx(mi->handle, HOOKTYPE_PRE_LOCAL_CONNECT, delay_connect);
HookAddEx(mi->handle, HOOKTYPE_LOCAL_QUIT, delay_quit);
ModuleSetOptions(mi->handle, MOD_OPT_PERM);
return MOD_SUCCESS;
}
/* ---------------- MODULE LOAD ---------------- */
DLLFUNC int MOD_LOAD(joindelay)(int module_load)
{
return MOD_SUCCESS;
}
/* ---------------- MODULE UNLOAD ---------------- */
DLLFUNC int MOD_UNLOAD(joindelay)(int a)
{
return MOD_SUCCESS;
}