/* ------------------------------------------------------------------------- * Name : ircd_init.c * Author : n00bie [n00bie@rediffmail.com] * Version : 3.0.0 * Date : 23rd Sept, 2006 * Update : 20th May, 2008 * ------------------------------------------------------------------------- * Tested : Anope-1.7.21 * ------------------------------------------------------------------------- * Supported IRCd's: * All IRCd's listed on services.conf are supported by this module. * ------------------------------------------------------------------------- * Installation / Usage: * Add this file 'ircd_init' on the 'ModuleDelayedAutoload' section * in your services.conf making sure that you enable ModuleDelayedAutoload. * ------------------------------------------------------------------------- * Description / Features: * * 1) This module will automatically turned ON or ENABLE log channel * when services get restarted or as soon as this module is loaded. * * 2) ChanServ will join all registered channels as soon as this module * is loaded or whenever services get restarted. (settable on services.conf) * (except for suspended or forbidden channels) * * 3) All services clients (ChanServ, NickServ, BotServ, OperServ etc.) * will join services log channel (e.g. #Services) as soon as this * module is loaded or whenever services get restarted. * * 4) All BotServ bots (if available) will join services log channel * as soon as this module is loaded or whenever services get restarted. * * 5) If some stupid oper KICK ChanServ from a Channel, ChanServ will * rejoin the channel and kick/banned the user. * ----------------------------------------------------------------------- * Changes: * v1.0.0 : First Public Release. * v1.0.1 : Fixed a missing correct mode. * v2.0.0 : * • Cleaned up minor codes. * • Services clients and botserv bots will not join anymore * if LogChannel is not defined on services.conf * v3.0.0 : Added conf directives for ChanServ whether to join or not * all registered channel(s) on startup/init (requested by ziggyjr ) * ----------------------------------------------------------------------- * This module have 1 configurable option. * Copy/paste below on services.conf * # IRCDINITChanServ [OPTIONAL] # Module: ircd_init # # If this option is enabled, ChanServ will join # all registered channels on startup (except for # suspended or forbidden channels). # Comment this to disable it. # IRCDINITChanServ # End of module: ircd_init */ #include "module.h" #define AUTHOR "n00bie" #define VERSION "$Id: ircd_init.c v3.0.0 20-5-2008 n00bie $" void load_chanserv(); void load_services(); void load_bots(); int IRCDINITChanServ; int mLoadConfig(void); int mEventReload(int argc, char **argv); int cs_kick_rejoin(char *source, int ac, char **av); int AnopeInit(int argc, char **argv) { Message *msg = NULL; EvtHook *hook = NULL; int status; msg = createMessage("KICK", cs_kick_rejoin); moduleAddMessage(msg, MOD_TAIL); hook = createEventHook(EVENT_RELOAD, mEventReload); status = moduleAddEventHook(hook); if (status != MOD_ERR_OK) { alog("ircd_init: Cannot hook to EVENT_RELOAD."); return MOD_STOP; } if (LogChannel) { logchan = 1; load_services(); load_bots(); } mLoadConfig(); if (IRCDINITChanServ) { load_chanserv(); } moduleAddAuthor(AUTHOR); moduleAddVersion(VERSION); alog("ircd_init%s: Successfully loaded module.", MODULE_EXT); return MOD_CONT; } void load_chanserv() { ChannelInfo *ci; int i = 0; for (i = 0; i < 256; i++) { for (ci = chanlists[i]; ci; ci = ci->next) { if ((ci->flags & CI_VERBOTEN) || (ci->flags & CI_SUSPENDED)) { continue; } anope_cmd_join(s_ChanServ, ci->name, time(NULL)); anope_cmd_bot_chan_mode(s_ChanServ, ci->name); } } return; } int cs_kick_rejoin(char *source, int ac, char **av) { if ((!(stricmp(av[1], s_ChanServ) == 0))) { return MOD_CONT; } if (LogChannel) { alog("%s got kicked from '%s' by %s (Auto re-joining)", s_ChanServ, av[0], source); } anope_cmd_join(s_ChanServ, av[0], time(NULL)); anope_cmd_bot_chan_mode(s_ChanServ, av[0]); anope_cmd_mode(s_ChanServ, av[0], "+b %s", source); anope_cmd_kick(s_ChanServ, av[0], source, "Abusing Services"); return MOD_CONT; } void load_services() { if (s_ChanServ) { anope_cmd_join(s_ChanServ, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_ChanServ, LogChannel); } if (s_MemoServ) { anope_cmd_join(s_MemoServ, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_MemoServ, LogChannel); } if (s_NickServ) { anope_cmd_join(s_NickServ, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_NickServ, LogChannel); } if (s_BotServ) { anope_cmd_join(s_BotServ, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_BotServ, LogChannel); } if (s_HostServ) { anope_cmd_join(s_HostServ, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_HostServ, LogChannel); } if (s_OperServ) { anope_cmd_join(s_OperServ, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_OperServ, LogChannel); } if (s_DevNull) { // Do we really need DevNull? anyway, carry on... anope_cmd_join(s_DevNull, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_DevNull, LogChannel); } if (s_HelpServ) { anope_cmd_join(s_HelpServ, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_HelpServ, LogChannel); } if (s_GlobalNoticer) { // Global? anope_cmd_join(s_GlobalNoticer, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_GlobalNoticer, LogChannel); } if (s_NickServAlias) { anope_cmd_join(s_NickServAlias, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_NickServAlias, LogChannel); } if (s_ChanServAlias) { anope_cmd_join(s_ChanServAlias, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_ChanServAlias, LogChannel); } if (s_BotServAlias) { anope_cmd_join(s_BotServAlias, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_BotServAlias, LogChannel); } if (s_MemoServAlias) { anope_cmd_join(s_MemoServAlias, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_MemoServAlias, LogChannel); } if (s_HelpServAlias) { anope_cmd_join(s_HelpServAlias, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_HelpServAlias, LogChannel); } if (s_OperServAlias) { anope_cmd_join(s_OperServAlias, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_OperServAlias, LogChannel); } if (s_NickServAlias) { anope_cmd_join(s_NickServAlias, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_NickServAlias, LogChannel); } if (s_DevNullAlias) { // Again DevNull? nevermind... anope_cmd_join(s_DevNullAlias, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_DevNullAlias, LogChannel); } if (s_HostServAlias) { anope_cmd_join(s_HostServAlias, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_HostServAlias, LogChannel); } if (s_GlobalNoticerAlias) { // At last... anope_cmd_join(s_GlobalNoticerAlias, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(s_GlobalNoticerAlias, LogChannel); } } void load_bots() { int i; BotInfo *bi; if (!nbots) { return; } else { for (i = 0; i < 256; i++) { for (bi = botlists[i]; bi; bi = bi->next) { anope_cmd_join(bi->nick, LogChannel, time(NULL)); anope_cmd_bot_chan_mode(bi->nick, LogChannel); } } } } void AnopeFini(void) { alog("ircd_init%s: module unloaded.", MODULE_EXT); } int mLoadConfig(void) { Directive d[] = { {"IRCDINITChanServ", {{PARAM_SET, PARAM_RELOAD, &IRCDINITChanServ}}}, }; moduleGetConfigDirective(d); return MOD_CONT; } int mEventReload(int argc, char **argv) { mLoadConfig(); return MOD_CONT; } /* EOF */