#include "module.h" #define AUTHOR "SGR, ProjectDEAD" #define VERSION "1.05" /* * ------------------------------------------------------------------------ * This module has had many authors, though I, SGR, have done * the most work on it recently (*cough* written the entire * thing in a way that works *cough*) the original idea and code * has has come from ProjectDEAD, who in turn used help from Keeper * and GeniusDex. * ------------------------------------------------------------------------ * ChangeLog: * * 1: Some crap using loops that didn't loop and a few mode strings that * were never called, or when called referenced variables without data * in them. Seriously a mess. * /me slaps Keeper and GeniusDex for being so lazy. * * 2: By SGR: Most of the main function completely re-written with * exception of 5 send_cmd() calls. No more SegFaults. * Removed all strtok references as we are dealing with * a MOD_HEAD on a command that could return MOD_CONT; * * Added full working implementaion for up to 5 nicks for * !owner and !op. Added detection for wether to return * MOD_CONT; or MOD_STOP; from the main privmsg hander * function. * * Fixed minor issue with !op, and added support for !halfop, * !admin, and !voice. Limited them to IRCd's supporting those * modes only, and sorted out some access checks. * * Removed some useless code left over from the orignal module * attempt which was no longer needed. * * Updated the AnopeInit alogs. * * Tested module. * * Fixed a loop issue looping to 4 not 5. * * Added Deop, DeVoice, DeHalfop, DeAdmin. Changed AnopeInit * to use the new style error-returnable system. How did I * miss that 1st time? :| * * Fixed minor !devoice issue reported by ProjectDEAD. * * ------------------------------------------------------------------------ */ int my_privmsg(char *source, int ac, char **av); int mynewmsg(User * u, ChannelInfo * ci); char *mod_current_buffer = NULL; char *text=NULL; int AnopeInit(int argc, char **argv) { Message *msg = NULL; int status; msg = createMessage("PRIVMSG", my_privmsg); status = moduleAddMessage(msg, MOD_HEAD); moduleAddAuthor(AUTHOR); moduleAddVersion(VERSION); alog("[bs_moremodesperline] Loading module: [%d]", status); alog("[bs_moremodesperline] Upto 5 nicks can now be used with the following of BotServ's"); alog("[bs_moremodesperline] FANTASY commands: !voice, !devoice, !op, !deop," #ifdef HAS_HALFOP " !halfop, !dehalfop" #endif ); #if defined(IRC_ULTIMATE3) || defined(IRC_UNREAL) || defined(IRC_VIAGRA) alog("[bs_moremodesperline] !admin, !deadmin, !owner."); alog("[bs_moremodesperline] Please note not all commands may function, depending on the IRCd"); alog("[bs_moremodesperline] in use on this network."); #endif alog("[bs_moremodesperline] Yayness!(tm) - MODULE LOADED AND ACTIVE"); return MOD_CONT; } void AnopeFini(void) { alog("Unloading bs_moremodesperline.so"); } int my_privmsg(char *source, int ac, char **av) { User *u; ChannelInfo *ci; if (ac != 2) { return MOD_CONT; } if (!(u = finduser(source))) { return MOD_CONT; } if (*av[0] == '#') { if (s_BotServ && (ci = cs_findchan(av[0]))) { if (!(ci->flags & CI_VERBOTEN) && ci->c && ci->bi) { if (mod_current_buffer) { text = mod_current_buffer; if (text[0]=='!') { if (mynewmsg(u, ci) == MOD_STOP) { return MOD_STOP; } } } } } } return MOD_CONT; } int mynewmsg(User * u, ChannelInfo *ci) { char *cmd =NULL; char *text =NULL; char *param1=NULL; char *params=NULL; char dilim = ' '; int i =0; char *tmp; char *param[5]; int dowhat = 0; // 0 = Nothing [] // 1 = Owner [+qo] // 2 = Op [+o] // 3 = Halfop [+h] // 4 = Voice [+v] // 5 = Admin [+oa] // // 6 = Deop [-o] // 7 = DeHalfop [-h] // 8 = Devoice [-v] // 9 = DeAdmin [-a] //get the info we need if (mod_current_buffer) { text = mod_current_buffer; } cmd = myStrGetToken(text, dilim, 0); param1 = myStrGetToken(text, dilim, 1); params = moduleGetLastBuffer(); if (!cmd) { return MOD_CONT; } #if defined(IRC_UNREAL) || defined(IRC_VIAGRA) if ((is_founder(u, ci) && check_access(u, ci, CA_FANTASIA))) { if (!stricmp(cmd, "!owner")) { dowhat=1; } } #endif #if defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) if ((is_founder(u, ci) || check_access(u, ci, CA_PROTECT)) && check_access(u, ci, CA_FANTASIA)) { if (!stricmp(cmd, "!admin")) { dowhat=5; } if (!stricmp(cmd, "!deadmin")) { dowhat=9; } } #endif if (check_access(u, ci, CA_OPDEOP && check_access(u, ci, CA_FANTASIA))) { if (!stricmp(cmd, "!op")) { dowhat=2; } if (!stricmp(cmd, "!deop")) { dowhat=6; } } #ifdef HAS_HALFOP if (check_access(u, ci, CA_HALFOP) && check_access(u, ci, CA_FANTASIA)) { if (!stricmp(cmd, "!halfop")) { dowhat=3; } if (!stricmp(cmd, "!dehalfop")) { dowhat=7; } } #endif if (check_access(u, ci, CA_VOICE) && check_access(u, ci, CA_FANTASIA)) { if (!stricmp(cmd, "!voice")) { dowhat=4; } if (!stricmp(cmd, "!devoice")) { dowhat=8; } } // Add those for all necessary bits. if (dowhat == 1) { #if defined(IRC_UNREAL) || defined(IRC_VIAGRA) if (!param1) { send_cmd(ci->bi->nick, "MODE %s +oq: %s %s",ci->name, u->nick, u->nick); return MOD_STOP; } while (i < 5) { tmp = myStrGetToken(params, dilim, i); if (tmp) { if (!stricmp(ci->bi->nick, tmp)) { i++; continue; } param[i] = tmp; i++; continue; } break; } if (param[0] && param[1] && param[2] && param[3] && param[4]) { send_cmd(ci->bi->nick, "MODE %s +oooooqqqqq: %s %s %s %s %s %s %s %s %s %s",ci->name, param[0], param[1], param[2], param[3], param[4], param[0], param[1], param[2], param[3], param[4]); } else if (param[0] && param[1] && param[2] && param[3]) { send_cmd(ci->bi->nick, "MODE %s +ooooqqqq: %s %s %s %s %s %s %s %s", ci->name, param[0], param[1], param[2], param[3], param[0], param[1], param[2], param[3]); } else if (param[0] && param[1] && param[2]) { send_cmd(ci->bi->nick, "MODE %s +oooqqq: %s %s %s %s %s %s", ci->name, param[0], param[1], param[2], param[0], param[1], param[2]); } else if (param[0] && param[1]) { send_cmd(ci->bi->nick, "MODE %s +ooqq :%s %s %s %s", ci->name, param[0], param[1], param[0], param[1]); } else if (param[0]) { send_cmd(ci->bi->nick, "MODE %s +oq: %s %s", ci->name, param[0], param[0]); } else { send_cmd(ci->bi->nick, "MODE %s +oq: %s %s", ci->name, u->nick, u->nick); } return MOD_STOP; #endif } #if defined(IRC_UNREAL) || defined(IRC_ULTIMATE3) else if (dowhat == 5) { if (!param1) { send_cmd(ci->bi->nick, "MODE %s +oa: %s %s",ci->name, u->nick, u->nick); return MOD_STOP; } while (i < 5) { tmp = myStrGetToken(params, dilim, i); if (tmp) { if (!stricmp(ci->bi->nick, tmp)) { i++; continue; } param[i] = tmp; i++; continue; } break; } if (param[0] && param[1] && param[2] && param[3] && param[4]) { send_cmd(ci->bi->nick, "MODE %s +oooooaaaaa: %s %s %s %s %s %s %s %s %s %s",ci->name, param[0], param[1], param[2], param[3], param[4], param[0], param[1], param[2], param[3], param[4]); } else if (param[0] && param[1] && param[2] && param[3]) { send_cmd(ci->bi->nick, "MODE %s +ooooaaaa: %s %s %s %s %s %s %s %s", ci->name, param[0], param[1], param[2], param[3], param[0], param[1], param[2], param[3]); } else if (param[0] && param[1] && param[2]) { send_cmd(ci->bi->nick, "MODE %s +oooaaa: %s %s %s %s %s %s", ci->name, param[0], param[1], param[2], param[0], param[1], param[2]); } else if (param[0] && param[1]) { send_cmd(ci->bi->nick, "MODE %s +ooaa :%s %s %s %s", ci->name, param[0], param[1], param[0], param[1]); } else if (param[0]) { send_cmd(ci->bi->nick, "MODE %s +oa: %s %s", ci->name, param[0], param[0]); } else { send_cmd(ci->bi->nick, "MODE %s +oa: %s %s", ci->name, u->nick, u->nick); } return MOD_STOP; } else if (dowhat == 9) { if (!param1) { send_cmd(ci->bi->nick, "MODE %s -a: %s",ci->name, u->nick); return MOD_STOP; } while (i < 5) { tmp = myStrGetToken(params, dilim, i); if (tmp) { if (!stricmp(ci->bi->nick, tmp)) { i++; continue; } param[i] = tmp; i++; continue; } break; } if (param[0] && param[1] && param[2] && param[3] && param[4]) { send_cmd(ci->bi->nick, "MODE %s -aaaaa: %s %s %s %s %s",ci->name, param[0], param[1], param[2], param[3], param[4]); } else if (param[0] && param[1] && param[2] && param[3]) { send_cmd(ci->bi->nick, "MODE %s -aaaa: %s %s %s %s", ci->name, param[0], param[1], param[2], param[3]); } else if (param[0] && param[1] && param[2]) { send_cmd(ci->bi->nick, "MODE %s -aaa: %s %s %s", ci->name, param[0], param[1], param[2]); } else if (param[0] && param[1]) { send_cmd(ci->bi->nick, "MODE %s -aa :%s %s", ci->name, param[0], param[1]); } else if (param[0]) { send_cmd(ci->bi->nick, "MODE %s -a: %s ", ci->name, param[0]); } else { send_cmd(ci->bi->nick, "MODE %s -a: %s", ci->name, u->nick); } return MOD_STOP; } #endif else if (dowhat == 2) { if (!param1) { send_cmd(ci->bi->nick, "MODE %s +o: %s", ci->name, u->nick); return MOD_STOP; } while (i < 5) { tmp = myStrGetToken(params, dilim, i); if (tmp) { if (!stricmp(ci->bi->nick, tmp)) { i++; continue; } param[i] = tmp; i++; continue; } break; } if (param[0] && param[1] && param[2] && param[3] && param[4]) { send_cmd(ci->bi->nick, "MODE %s +ooooo: %s %s %s %s %s",ci->name, param[0], param[1], param[2], param[3], param[4]); } else if (param[0] && param[1] && param[2] && param[3]) { send_cmd(ci->bi->nick, "MODE %s +oooo: %s %s %s %s",ci->name, param[0], param[1], param[2], param[3]); } else if (param[0] && param[1] && param[2]) { send_cmd(ci->bi->nick, "MODE %s +ooo: %s %s %s",ci->name, param[0], param[1], param[2]); } else if (param[0] && param[1]) { send_cmd(ci->bi->nick, "MODE %s +oo :%s %s",ci->name, param[0], param[1]); } else if (param[0]) { send_cmd(ci->bi->nick, "MODE %s +o: %s",ci->name, param[0]); } else { send_cmd(ci->bi->nick, "MODE %s +o: %s",ci->name, u->nick); } return MOD_STOP; } #ifdef HAS_HALFOP else if (dowhat == 3) { if (!param1) { send_cmd(ci->bi->nick, "MODE %s +h: %s",ci->name, u->nick); return MOD_STOP; } while (i < 5) { tmp = myStrGetToken(params, dilim, i); if (tmp) { if (!stricmp(ci->bi->nick, tmp)) { i++; continue; } param[i] = tmp; i++; continue; } break; } if (param[0] && param[1] && param[2] && param[3] && param[4]) { send_cmd(ci->bi->nick, "MODE %s +hhhhh: %s %s %s %s %s", ci->name, param[0], param[1], param[2], param[3], param[4]); } else if (param[0] && param[1] && param[2] && param[3]) { send_cmd(ci->bi->nick, "MODE %s +hhhh: %s %s %s %s", ci->name, param[0], param[1], param[2], param[3]); } else if (param[0] && param[1] && param[2]) { send_cmd(ci->bi->nick, "MODE %s +hhh: %s %s %s", ci->name, param[0], param[1], param[2]); } else if (param[0] && param[1]) { send_cmd(ci->bi->nick, "MODE %s +hh :%s %s", ci->name, param[0], param[1]); } else if (param[0]) { send_cmd(ci->bi->nick, "MODE %s +h: %s", ci->name, param[0]); } else { send_cmd(ci->bi->nick, "MODE %s +h: %s", ci->name, u->nick); } return MOD_STOP; } else if (dowhat == 7) { if (!param1) { send_cmd(ci->bi->nick, "MODE %s -h: %s",ci->name, u->nick); return MOD_STOP; } while (i < 5) { tmp = myStrGetToken(params, dilim, i); if (tmp) { if (!stricmp(ci->bi->nick, tmp)) { i++; continue; } param[i] = tmp; i++; continue; } break; } if (param[0] && param[1] && param[2] && param[3] && param[4]) { send_cmd(ci->bi->nick, "MODE %s -hhhhh: %s %s %s %s %s", ci->name, param[0], param[1], param[2], param[3], param[4]); } else if (param[0] && param[1] && param[2] && param[3]) { send_cmd(ci->bi->nick, "MODE %s -hhhh: %s %s %s %s", ci->name, param[0], param[1], param[2], param[3]); } else if (param[0] && param[1] && param[2]) { send_cmd(ci->bi->nick, "MODE %s -hhh: %s %s %s", ci->name, param[0], param[1], param[2]); } else if (param[0] && param[1]) { send_cmd(ci->bi->nick, "MODE %s -hh :%s %s", ci->name, param[0], param[1]); } else if (param[0]) { send_cmd(ci->bi->nick, "MODE %s -h: %s", ci->name, param[0]); } else { send_cmd(ci->bi->nick, "MODE %s -h: %s", ci->name, u->nick); } return MOD_STOP; } #endif else if (dowhat == 4) { if (!param1) { send_cmd(ci->bi->nick, "MODE %s +v: %s",ci->name, u->nick); return MOD_STOP; } while (i < 5) { tmp = myStrGetToken(params, dilim, i); if (tmp) { if (!stricmp(ci->bi->nick, tmp)) { i++; continue; } param[i] = tmp; i++; continue; } break; } if (param[0] && param[1] && param[2] && param[3] && param[4]) { send_cmd(ci->bi->nick, "MODE %s +vvvvv: %s %s %s %s %s",ci->name, param[0], param[1], param[2], param[3], param[4]); } else if (param[0] && param[1] && param[2] && param[3]) { send_cmd(ci->bi->nick, "MODE %s +vvvv: %s %s %s %s",ci->name, param[0], param[1], param[2], param[3]); } else if (param[0] && param[1] && param[2]) { send_cmd(ci->bi->nick, "MODE %s +vvv: %s %s %s",ci->name, param[0], param[1], param[2]); } else if (param[0] && param[1]) { send_cmd(ci->bi->nick, "MODE %s +vv :%s %s",ci->name, param[0], param[1]); } else if (param[0]) { send_cmd(ci->bi->nick, "MODE %s +v: %s",ci->name, param[0]); } else { send_cmd(ci->bi->nick, "MODE %s +v: %s",ci->name, u->nick); } return MOD_STOP; } else if (dowhat == 8) { if (!param1) { send_cmd(ci->bi->nick, "MODE %s -v: %s",ci->name, u->nick); return MOD_STOP; } while (i < 5) { tmp = myStrGetToken(params, dilim, i); if (tmp) { if (!stricmp(ci->bi->nick, tmp)) { i++; continue; } param[i] = tmp; i++; continue; } break; } if (param[0] && param[1] && param[2] && param[3] && param[4]) { send_cmd(ci->bi->nick, "MODE %s -vvvvv: %s %s %s %s %s",ci->name, param[0], param[1], param[2], param[3], param[4]); } else if (param[0] && param[1] && param[2] && param[3]) { send_cmd(ci->bi->nick, "MODE %s -vvvv: %s %s %s %s",ci->name, param[0], param[1], param[2], param[3]); } else if (param[0] && param[1] && param[2]) { send_cmd(ci->bi->nick, "MODE %s -vvv: %s %s %s",ci->name, param[0], param[1], param[2]); } else if (param[0] && param[1]) { send_cmd(ci->bi->nick, "MODE %s -vv :%s %s",ci->name, param[0], param[1]); } else if (param[0]) { send_cmd(ci->bi->nick, "MODE %s -v: %s",ci->name, param[0]); } else { send_cmd(ci->bi->nick, "MODE %s -v: %s",ci->name, u->nick); } return MOD_STOP; } else if (dowhat == 6) { if (!param1) { send_cmd(ci->bi->nick, "MODE %s -o: %s",ci->name, u->nick); return MOD_STOP; } while (i < 5) { tmp = myStrGetToken(params, dilim, i); if (tmp) { if (!stricmp(ci->bi->nick, tmp)) { i++; continue; } param[i] = tmp; i++; continue; } break; } if (param[0] && param[1] && param[2] && param[3] && param[4]) { send_cmd(ci->bi->nick, "MODE %s -ooooo: %s %s %s %s %s",ci->name, param[0], param[1], param[2], param[3], param[4]); } else if (param[0] && param[1] && param[2] && param[3]) { send_cmd(ci->bi->nick, "MODE %s -oooo: %s %s %s %s",ci->name, param[0], param[1], param[2], param[3]); } else if (param[0] && param[1] && param[2]) { send_cmd(ci->bi->nick, "MODE %s -ooo: %s %s %s",ci->name, param[0], param[1], param[2]); } else if (param[0] && param[1]) { send_cmd(ci->bi->nick, "MODE %s -oo :%s %s",ci->name, param[0], param[1]); } else if (param[0]) { send_cmd(ci->bi->nick, "MODE %s -o: %s",ci->name, param[0]); } else { send_cmd(ci->bi->nick, "MODE %s -o: %s",ci->name, u->nick); } return MOD_STOP; } else { } return MOD_CONT; }