/* Sunucu ve Kanallara Giriş Çıkışları Mode Topic Değişikliklerini Size Bir Monitor Kanalda Veren Operleri Bilgilendiren Güzel Bir Modules Düzenleyen By oSSo osso_master@hotmail.com Daha Detayli Bilgi Almak ıcin Ve IRCd Ile Ilgili Bütün Sorunlariniz Icin Www.AvrupaSohbet.Net Forumlarindan Yardim Alabilirsiniz.. Lütfen Asagidaki Verecegim Codeleri unrealircd.conf Dosyaniza Ekleyiniz.. chansno { // msgtype privmsg; channel "#opers" { joins; parts; kicks; mode-changes; topics; }; channel "#opers" { nickchanges; connects; disconnects; server-connects; squits; }; }; */ #include "config.h" #include "struct.h" #include "common.h" #include "sys.h" #include "numeric.h" #include "msg.h" #include "channel.h" #include #include #include #include #include #ifdef _WIN32 #include #endif #include #include "h.h" #ifdef STRIPBADWORDS #include "badwords.h" #endif #ifdef _WIN32 #include "version.h" #endif typedef struct _conf_operflag OperFlag; typedef struct _chansnoflag ChanSnoFlag; struct _conf_operflag { long flag; char *name; }; struct _chansnoflag { ChanSnoFlag *prev, *next; char *channel; long flags; }; extern ConfigEntry *config_find_entry(ConfigEntry *, char *); extern OperFlag *config_binary_flags_search(OperFlag *table, char *cmd, int size); #define MSG_CHANSNO "CHANSNO" #define TOK_CHANSNO "CR" #define MyMod ModChanSno->handle #define CHSNO_TABLESIZE sizeof(_ChanSnoFlags)/sizeof(_ChanSnoFlags[0]) #define MaxSize (sizeof(msgbuf) - strlen(msgbuf) - 1) #define ircstrdup(x,y) if (x) MyFree(x); if (!y) x = NULL; else x = strdup(y) #define IsParam(x) (parc > (x) && !BadPtr(parv[(x)])) #define IsNotParam(x) (parc <= (x) || BadPtr(parv[(x)])) #define DelHook(x) if (x) HookDel(x); x = NULL #define DelCommand(x) if (x) CommandDel(x); x = NULL /* Messages types */ #define MT_PRIVMSG 0x00 #define MT_NOTICE 0x01 #define MsgType (msgtype == MT_PRIVMSG ? "PRIVMSG" : "NOTICE") /* Channel server notice masks */ #define CHSNO_CONNECT 0x0001 #define CHSNO_DISCONNECT 0x0002 #define CHSNO_NICKCHANGE 0x0004 #define CHSNO_JOIN 0x0008 #define CHSNO_PART 0x0010 #define CHSNO_KICK 0x0020 #define CHSNO_CHANMODE 0x0040 #define CHSNO_SCONNECT 0x0080 #define CHSNO_SQUIT 0x0100 #define CHSNO_TOPIC 0x0200 /* This MUST be alphabetized */ OperFlag _ChanSnoFlags[] = { { CHSNO_CONNECT, "connects" }, { CHSNO_DISCONNECT, "disconnects" }, { CHSNO_JOIN, "joins" }, { CHSNO_KICK, "kicks" }, { CHSNO_CHANMODE, "mode-changes" }, { CHSNO_NICKCHANGE, "nickchanges" }, { CHSNO_PART, "parts" }, { CHSNO_SCONNECT, "server-connects" }, { CHSNO_SQUIT, "squits" }, { CHSNO_TOPIC, "topics" } }; static Command *AddCommand(char *msg, char *token, int (*func)()); DLLFUNC int m_chansno(aClient *cptr, aClient *sptr, int parc, char *parv[]); DLLFUNC int test_chansno(ConfigFile *, ConfigEntry *, int, int *); DLLFUNC int conf_chansno(ConfigFile *, ConfigEntry *, int); DLLFUNC int rehash_chansno(); DLLFUNC int cb_mode(aClient *, aClient *, aChannel *, char *, char *, TS, int); DLLFUNC int cb_connect(aClient *); DLLFUNC int cb_quit(aClient *, char *); DLLFUNC int cb_join(aClient *, aClient *, aChannel *, char *[]); DLLFUNC int cb_kick(aClient *, aClient *, aClient *, aChannel *, char *); DLLFUNC int cb_nickchange(aClient *, char *); DLLFUNC int cb_part(aClient *, aClient *, aChannel *, char *); DLLFUNC int cb_server_connect(aClient *); DLLFUNC int cb_server_quit(aClient *); DLLFUNC int cb_topic(); ModuleInfo *ModChanSno = NULL; Command *CmdChanSno = NULL; ChanSnoFlag *ConfChanSno; Hook *HookConfTest, *HookConfRun, *HookConfRehash; Hook *HookMode, *HookConnect, *HookQuit, *HookJoin; Hook *HookKick, *HookNickChange, *HookPart, *HookServerConnect; Hook *HookServerQuit, *HookTopic; static char msgbuf[BUFSIZE+1]; u_int msgtype = MT_PRIVMSG; ModuleHeader MOD_HEADER(chansno) = { "Bilgi", "$Id: Edit : GarantiShell.Com - info@garantihell.com", "Giris - Cıkıs ..", "3.2-b8-1", NULL }; static Command *AddCommand(char *msg, char *token, int (*func)()) { Command *cmd; if (CommandExists(msg)) { config_error("Command %s already exists", msg); return NULL; } if (CommandExists(token)) { config_error("Token %s already exists", token); return NULL; } cmd = CommandAdd(MyMod, msg, token, func, MAXPARA, 0); #ifndef _WIN32 if (ModuleGetError(MyMod) != MODERR_NOERROR || !cmd) #else if (!cmd) #endif { #ifndef _WIN32 config_error("Error adding command %s: %s", msg, ModuleGetErrorStr(MyMod)); #else config_error("Error adding command %s", msg); #endif return NULL; /* just to be sure */ } return cmd; } // ================================================================= // Functions related to loading/unloading configuration // ================================================================= static void InitConf() { ConfChanSno = NULL; msgtype = MT_PRIVMSG; } static void FreeConf() { ChanSnoFlag *c; ListStruct *next; for (c = ConfChanSno; c; c = (ChanSnoFlag *) next) { next = (ListStruct *) c->next; DelListItem(c, ConfChanSno); MyFree(c->channel); MyFree(c); } } // ================================================================= // Module functions // ================================================================= DLLFUNC int MOD_TEST(chansno)(ModuleInfo *modinfo) { ModChanSno = modinfo; HookConfTest = HookAddEx(MyMod, HOOKTYPE_CONFIGTEST, test_chansno); return MOD_SUCCESS; } DLLFUNC int MOD_INIT(chansno)(ModuleInfo *modinfo) { ModChanSno = modinfo; InitConf(); CmdChanSno = AddCommand(MSG_CHANSNO, TOK_CHANSNO, m_chansno); HookConfRun = HookAddEx(MyMod, HOOKTYPE_CONFIGRUN, conf_chansno); HookConfRehash = HookAddEx(MyMod, HOOKTYPE_REHASH, rehash_chansno); if (!CmdChanSno) return MOD_FAILED; return MOD_SUCCESS; } DLLFUNC int MOD_LOAD(userauth)(int module_load) { HookMode = HookAddEx(MyMod, HOOKTYPE_LOCAL_CHANMODE, cb_mode); HookConnect = HookAddEx(MyMod, HOOKTYPE_LOCAL_CONNECT, cb_connect); HookQuit = HookAddEx(MyMod, HOOKTYPE_LOCAL_QUIT, cb_quit); HookJoin = HookAddEx(MyMod, HOOKTYPE_LOCAL_JOIN, cb_join); HookKick = HookAddEx(MyMod, HOOKTYPE_LOCAL_KICK, cb_kick); HookNickChange = HookAddEx(MyMod, HOOKTYPE_LOCAL_NICKCHANGE, cb_nickchange); HookPart = HookAddEx(MyMod, HOOKTYPE_LOCAL_PART, cb_part); HookServerConnect = HookAddEx(MyMod, HOOKTYPE_SERVER_CONNECT, cb_server_connect); HookServerQuit = HookAddEx(MyMod, HOOKTYPE_SERVER_QUIT, cb_server_quit); HookTopic = HookAddEx(MyMod, HOOKTYPE_LOCAL_TOPIC, cb_topic); return MOD_SUCCESS; } DLLFUNC int MOD_UNLOAD(m_chansno)(int module_unload) { DelHook(HookTopic); DelHook(HookServerQuit); DelHook(HookServerConnect); DelHook(HookPart); DelHook(HookNickChange); DelHook(HookKick); DelHook(HookJoin); DelHook(HookQuit); DelHook(HookConnect); DelHook(HookMode); DelHook(HookConfRehash); DelHook(HookConfRun); DelHook(HookConfTest); DelCommand(CmdChanSno); FreeConf(); return MOD_SUCCESS; } // ================================================================= // Config file interfacing // ================================================================= DLLFUNC int rehash_chansno() { FreeConf(); InitConf(); return 1; } DLLFUNC int test_chansno(ConfigFile *cf, ConfigEntry *ce, int type, int *errs) { ConfigEntry *cep, *cepp; int errors = 0; if (type != CONFIG_MAIN) return 0; if (!strcmp(ce->ce_varname, "chansno")) { for (cep = ce->ce_entries; cep; cep = cep->ce_next) { if (!cep->ce_varname) { config_error("%s:%i: blank chansno item", cep->ce_fileptr->cf_filename, cep->ce_varlinenum); errors++; continue; } if (!cep->ce_vardata) { config_error("%s:%i: chansno::%s item without value", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); errors++; continue; } if (!strcmp(cep->ce_varname, "channel")) { if (!cep->ce_entries) { config_error("%s:%i: chansno::channel without contents", cep->ce_fileptr->cf_filename, cep->ce_varlinenum); errors++; continue; } for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) { if (!cepp->ce_varname) { config_error("%s:%i: chansno::channel item without variable name", cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum); errors++; continue; } if (!config_binary_flags_search(_ChanSnoFlags, cepp->ce_varname, CHSNO_TABLESIZE)) { config_error("%s:%i: unknown chansno::channel flag '%s'", cepp->ce_fileptr->cf_filename, cepp->ce_varlinenum, cepp->ce_varname); errors++; } } } else if (!strcmp(cep->ce_varname, "msgtype")) { if (!strcmp(cep->ce_vardata, "privmsg")) ; else if (!strcmp(cep->ce_vardata, "notice")) ; else { config_error("%s:%i: unknown chansno::msgtype '%s'", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); errors++; } } else { config_error("%s:%i: unknown directive chansno::%s", cep->ce_fileptr->cf_filename, cep->ce_varlinenum, cep->ce_varname); errors++; } } *errs = errors; return errors ? -1 : 1; } else return 0; } DLLFUNC int conf_chansno(ConfigFile *cf, ConfigEntry *ce, int type) { ConfigEntry *cep, *cepp; OperFlag *ofp; ChanSnoFlag *ca; if (type != CONFIG_MAIN) return 0; if (!strcmp(ce->ce_varname, "chansno")) { for (cep = ce->ce_entries; cep; cep = cep->ce_next) { if (!strcmp(cep->ce_varname, "channel")) { ca = MyMallocEx(sizeof(ChanSnoFlag)); ircstrdup(ca->channel, cep->ce_vardata); for (cepp = cep->ce_entries; cepp; cepp = cepp->ce_next) { if ((ofp = config_binary_flags_search(_ChanSnoFlags, cepp->ce_varname, CHSNO_TABLESIZE))) ca->flags |= ofp->flag; } AddListItem(ca, ConfChanSno); } else if (!strcmp(cep->ce_varname, "msgtype")) { if (!strcmp(cep->ce_vardata, "privmsg")) msgtype = MT_PRIVMSG; else if (!strcmp(cep->ce_vardata, "notice")) msgtype = MT_NOTICE; } } return 1; } return 0; } // =============================================================== // Functions used by m_chansno // =============================================================== static char *get_flag_names(long flags) { u_int i, found = 0; memset(&msgbuf, 0, sizeof msgbuf); for (i = 0; i < CHSNO_TABLESIZE; i++) if (flags & _ChanSnoFlags[i].flag) { if (found) strncat(msgbuf, ", ", MaxSize); else found = 1; strncat(msgbuf, _ChanSnoFlags[i].name, MaxSize); } if (!strlen(msgbuf)) strcpy(msgbuf, ""); return msgbuf; } static void stats_chansno_channels(aClient *sptr) { ChanSnoFlag *c; for (c = ConfChanSno; c; c = c->next) sendto_one(sptr, "2:%s %i %s :Kanal %s: %s", me.name, RPL_TEXT, sptr->name, c->channel, get_flag_names(c->flags)); sendto_one(sptr, rpl_str(RPL_ENDOFSTATS), me.name, sptr->name, 'S'); } static void stats_chansno_config(aClient *sptr) { ChanSnoFlag *c; sendto_one(sptr, ":%s %i %s :msgtype: %s", me.name, RPL_TEXT, sptr->name, MsgType); sendto_one(sptr, rpl_str(RPL_ENDOFSTATS), me.name, sptr->name, 'S'); } // =============================================================== // m_chansno // parv[0]: sender prefix // parv[1]: option // parv[2]: server name (optional) // =============================================================== DLLFUNC int m_chansno(aClient *cptr, aClient *sptr, int parc, char *parv[]) { if (!IsPerson(sptr)) return -1; if (!IsAnOper(sptr)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return -1; } if (!IsParam(1)) { sendto_one(sptr, ":%s NOTICE %s :Usage:", me.name, sptr->name); sendto_one(sptr, ":%s NOTICE %s : /chansno