/* * ================================================================= * Archivo: m_haxor.c * ================================================================= * Descripcion: El comando /haxor: hace que el objetivo hable con * las letras cambiadas a codigo Hax0r. Es decir, * "hola como estas" sera "h014 (0m0 35745" * ================================================================= * Autor: AngryWolf hizo la base con el modulo ELMER * yo lo he modificado: Octavio Rossell a.k.a. [TR0N] * Email: octavio@unplug.org.ve * ================================================================= * * ================================================================= * Uso: * ================================================================= * * Comando HAXOR: * -------------- * * Sintanxis: /haxor [+|-] * * Ejemplos: * * - Para hacer que alguien con el nick fulanito se haxorice: * /haxor fulanito * - Para hacer que alguien con el nick fulanito se DEShaxorice:: * /haxor -fulanito * ================================================================= * * Licencia: GPLv3 * */ #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 extern void sendto_one(aClient *to, char *pattern, ...); extern void sendto_realops(char *pattern, ...); #define MSG_HAXOR "HAXOR" #define TOK_HAXOR "HA" #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 static Command *AddCommand(Module *module, char *msg, char *token, iFP func); static int m_haxor(aClient *, aClient *, int, char *[]); static char *cb_privmsg(aClient *, aClient *, aClient *, char *, int); static char *cb_chanmsg(aClient *, aClient *, aChannel *, char *, int); static int cb_quit(aClient *, char *); static void free_haxorflags(); static Command *CmdHaxor; static Hook *HookPrivMsg = NULL, *HookChanMsg = NULL, *HookQuit = NULL; /* * Unoccupied flags are not trustable, they may become used anytime. * Therefore I use a separate list. */ typedef struct _haxorflag HaxorFlag; struct _haxorflag { HaxorFlag *prev, *next; aClient *cptr; }; static HaxorFlag *HaxorFlags; ModuleHeader MOD_HEADER(m_haxor) = { "m_haxor", "$Id: m_haxor.c,v 1.0 2008/05/18 14:50:00 [TR0N] Exp $", "Command /haxor", "3.2-b8-1", NULL }; DLLFUNC int MOD_INIT(m_haxor)(ModuleInfo *modinfo) { HaxorFlags = NULL; if (!(CmdHaxor = AddCommand(modinfo->handle, MSG_HAXOR, TOK_HAXOR, m_haxor))) return MOD_FAILED; HookPrivMsg = HookAddPCharEx(modinfo->handle, HOOKTYPE_USERMSG, cb_privmsg); HookChanMsg = HookAddPCharEx(modinfo->handle, HOOKTYPE_CHANMSG, cb_chanmsg); HookQuit = HookAddEx(modinfo->handle, HOOKTYPE_LOCAL_QUIT, cb_quit); return MOD_SUCCESS; } DLLFUNC int MOD_LOAD(m_haxor)(int module_load) { return MOD_SUCCESS; } DLLFUNC int MOD_UNLOAD(m_haxor)(int module_unload) { free_haxorflags(); DelHook(HookQuit); DelHook(HookChanMsg); DelHook(HookPrivMsg); DelCommand(CmdHaxor); return MOD_SUCCESS; } static Command *AddCommand(Module *module, char *msg, char *token, iFP 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(module, msg, token, func, MAXPARA, 0); #ifndef STATIC_LINKING if (ModuleGetError(module) != MODERR_NOERROR || !cmd) #else if (!cmd) #endif { #ifndef STATIC_LINKING config_error("Error adding command %s: %s", msg, ModuleGetErrorStr(module)); #else config_error("Error adding command %s", msg); #endif return NULL; } return cmd; } static HaxorFlag *find_haxor(aClient *cptr) { HaxorFlag *e; for (e = HaxorFlags; e; e = e->next) if (e->cptr == cptr) break; return e; } static void set_haxor(aClient *cptr) { HaxorFlag *e; e = (HaxorFlag *) MyMalloc(sizeof(cptr)); e->cptr = cptr; AddListItem(e, HaxorFlags); } static void clear_haxor(HaxorFlag *e) { DelListItem(e, HaxorFlags); MyFree(e); } static void free_haxorflags() { HaxorFlag *e; ListStruct *next; for (e = HaxorFlags; e; e = (HaxorFlag *) next) { next = (ListStruct *) e->next; DelListItem(e, HaxorFlags); MyFree(e); } } static char *convert_to_haxor(char *str) { char *p; for (p = str; *p; p++) switch(*p) { case 'a': *p = '4'; break; case 'b': *p = '8'; break; case 'e': *p = '3'; break; case 'i': *p = '1'; break; case 'l': *p = '|'; break; case 'o': *p = '0'; break; case 's': *p = '5'; break; case 't': *p = '7'; break; case 'c': *p = '('; break; case 'g': *p = '6'; break; } return str; } static int cb_quit(aClient *sptr, char *comment) { HaxorFlag *e; if ((e = find_haxor(sptr))) clear_haxor(e); return 0; } static char *cb_privmsg(aClient *cptr, aClient *from, aClient *to, char *str, int notice) { return find_haxor(cptr) ? convert_to_haxor(str) : str; } static char *cb_chanmsg(aClient *cptr, aClient *from, aChannel *to, char *str, int notice) { return find_haxor(cptr) ? convert_to_haxor(str) : str; } static int m_haxor(aClient *cptr, aClient *sptr, int parc, char *parv[]) { aClient *acptr = NULL; HaxorFlag *is_haxor = NULL; char *nick = NULL; int add = 1; if (IsPerson(sptr) && !IsAnOper(sptr)) { sendto_one(sptr, err_str(ERR_NOPRIVILEGES), me.name, parv[0]); return -1; } nick = IsParam(1) ? parv[1] : NULL; if (nick) { if (*nick == '+') nick++; else if (*nick == '-') { nick++; add = 0; } if (!*nick) nick = NULL; } if (!nick) { if (!IsServer(sptr)) sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), me.name, sptr->name, MSG_HAXOR); return -1; } acptr = find_person(nick, NULL); if (!acptr) { if (!IsServer(sptr)) sendto_one(sptr, err_str(ERR_NOSUCHNICK), me.name, sptr->name, nick); return 0; } if (!MyConnect(acptr)) { sendto_one(acptr->from, ":%s %s %c%s", sptr->name, IsToken(cptr) ? TOK_HAXOR : MSG_HAXOR, add ? '+' : '-', acptr->name); return 0; } is_haxor = find_haxor(acptr); if (add) { if (is_haxor) { if (!IsServer(sptr)) sendto_one(sptr, ":%s %s %s :*** %s is already set to talk like Haxor", me.name, IsWebTV(sptr) ? "PRIVMSG" : "NOTICE", sptr->name, acptr->name); return 0; } set_haxor(acptr); sendto_realops("*** %s made %s!%s@%s talk like Haxor", sptr->name, acptr->name, acptr->user->username, GetHost(acptr)); sendto_serv_butone(&me, ":%s SMO o :*** %s made %s!%s@%s talk like Haxor", me.name, sptr->name, acptr->name, acptr->user->username, GetHost(acptr)); sendto_one(acptr, ":%s %s %s :*** You are now talking like Haxor", me.name, IsWebTV(acptr) ? "PRIVMSG" : "NOTICE", acptr->name); if (MyConnect(sptr) && acptr != sptr) sendto_one(sptr, ":%s %s %s :*** %s is now talking like Haxor", me.name, IsWebTV(acptr) ? "PRIVMSG" : "NOTICE", sptr->name, acptr->name); } else { if (!is_haxor) { if (!IsServer(sptr)) sendto_one(sptr, ":%s %s %s :*** %s is not talking like Haxor", me.name, IsWebTV(sptr) ? "PRIVMSG" : "NOTICE", sptr->name, acptr->name); return 0; } clear_haxor(is_haxor); sendto_realops("*** %s made %s!%s@%s no longer talk like Haxor", sptr->name, acptr->name, acptr->user->username, GetHost(acptr)); sendto_serv_butone(&me, ":%s SMO o :*** %s made %s!%s@%s no longer talk like Haxor", me.name, sptr->name, acptr->name, acptr->user->username, GetHost(acptr)); sendto_one(acptr, ":%s %s %s :*** You are no longer talking like Haxor", me.name, IsWebTV(acptr) ? "PRIVMSG" : "NOTICE", acptr->name); if (MyConnect(sptr) && acptr != sptr) sendto_one(sptr, ":%s %s %s :*** %s is no longer talking like Haxor", me.name, IsWebTV(acptr) ? "PRIVMSG" : "NOTICE", sptr->name, acptr->name); } return 0; }