/** * Handle kick/k fantasy commands. * @param argc Argument count * @param argv Argument list * @return MOD_CONT or MOD_STOP **/ int do_fantasy(int argc, char **argv) { User *u, *u2; ChannelInfo *ci; char *target = NULL; char *reason = NULL; if (argc < 3) return MOD_CONT; if ((stricmp(argv[0], "kick") == 0) || (stricmp(argv[0], "k") == 0)) { u = finduser(argv[1]); ci = cs_findchan(argv[2]); if (!u || !ci) return MOD_CONT; if (argc >= 4) { target = myStrGetToken(argv[3], ' ', 0); reason = myStrGetTokenRemainder(argv[3], ' ', 1); } if (!target && check_access(u, ci, CA_KICKME)) { bot_raw_kick(u, ci, u->nick, "Requested"); } else if (target && check_access(u, ci, CA_KICK)) { if (!stricmp(target, ci->bi->nick)) bot_raw_kick(u, ci, u->nick, "Oops!"); else { u2 = finduser(target); if (u2 && ci->c && is_on_chan(ci->c, u2)) { if (!reason && !is_protected(u2)) bot_raw_kick(u, ci, target, "Requested"); else if (!is_protected(u2)) bot_raw_kick(u, ci, target, reason); } } } } if (target) free(target); if (reason) free(reason); return MOD_CONT; }
int fantasy_defkick(int argc, char **argv) { User *u, *u2; ChannelInfo *ci; char *target = NULL; char *reason = NULL; if (argc < 3) return MOD_CONT; if (!stricmp(argv[0], "help")) { u = finduser(argv[1]); if (argc >= 4) { int ret = MOD_CONT; char *cmd, *param; cmd = myStrGetToken(argv[3],' ',0); param = myStrGetToken(argv[3],' ',1); if (!stricmp(cmd, "kickr")) { notice(s_BotServ, u->nick, "\037Syntax\037: \002!kickr [NICK] [TRIGGER]\002 or"); notice(s_BotServ, u->nick, "\037Syntax\037: \002!kr [NICK] [TRIGGER]\002"); notice(s_BotServ, u->nick, "(For example: !kr VisioN idling or !kickr VisioN idling)"); notice(s_BotServ, u->nick, "\n"); notice(s_BotServ, u->nick, "----------------------------------------------------------------------------------------------------------"); notice(s_BotServ, u->nick, "\n"); notice(s_BotServ, u->nick, "\037Description\037: This command allows you to kick a user from a channel, using the bot's default kick reasons."); notice(s_BotServ, u->nick, "The bot supports multipule kick reasons for each of the basic abuses for channels, a list of which"); notice(s_BotServ, u->nick, "you can find below."); notice(s_BotServ, u->nick, "\n"); notice(s_BotServ, u->nick, "List of triggers:"); notice(s_BotServ, u->nick, "\037\002Name\002\037 \037\002Description\002\037"); notice(s_BotServ, u->nick, "badlang Kicks for bad language (insults etc)"); notice(s_BotServ, u->nick, "caps Kicks for capital letters "); notice(s_BotServ, u->nick, "flood Kicks for channel flooding "); notice(s_BotServ, u->nick, "bold Kicks for bold letters "); notice(s_BotServ, u->nick, "advertise Kicks for Spam/Advertising "); notice(s_BotServ, u->nick, "repeat Kicks for repetition "); notice(s_BotServ, u->nick, "idle Kicks for idling (mostly for help chans) "); notice(s_BotServ, u->nick, "badnick Kicks for bad nicknames "); ret = MOD_CONT; } free(cmd); if (param) free(param); return ret; } } else if ((stricmp(argv[0], "kickr") == 0) || (stricmp(argv[0], "kr") == 0)) { u = finduser(argv[1]); ci = cs_findchan(argv[2]); if (!u || !ci) return MOD_CONT; if (argc >= 4) { target = myStrGetToken(argv[3], ' ', 0); reason = myStrGetTokenRemainder(argv[3], ' ', 1); } if (!check_access(u, ci, CA_KICK)) { notice(s_BotServ, u->nick, "You are not authorised to kick the selected user."); } else if (!target && check_access(u, ci, CA_KICKME)) { notice(s_BotServ, u->nick, "\037Syntax\037: \002!kickr [NICK] [TRIGGER]\002 or"); notice(s_BotServ, u->nick, "\037Syntax\037: \002!kr [NICK] [TRIGGER]\002"); notice(s_BotServ, u->nick, "For detailed information about this command and"); notice(s_BotServ, u->nick, "for a list of triggers, type \002!help kickr\002"); } else if (target && check_access(u, ci, CA_KICK)) { if (!stricmp(target, ci->bi->nick)) bot_raw_kick(u, ci, u->nick, "Wrong Move!"); else { u2 = finduser(target); if (u2 && ci->c && is_on_chan(ci->c, u2)) { if (!reason && !is_protected(u2)) bot_raw_kick(u, ci, target, "Requested"); else if (!is_protected(u2)) { if ((stricmp(reason , "badlang") == 0)) bot_raw_kick(u, ci, target, BADLANG); else if ((stricmp(reason , "caps") == 0)) bot_raw_kick(u, ci, target, CAPS); else if ((stricmp(reason , "flood") == 0)) bot_raw_kick(u, ci, target, FLOOD); else if ((stricmp(reason , "bold") == 0)) bot_raw_kick(u, ci, target, BOLD); else if ((stricmp(reason , "advertise") == 0)) bot_raw_kick(u, ci, target, ADVERTISE); else if ((stricmp(reason , "repeat") == 0)) bot_raw_kick(u, ci, target, REPEAT); else if ((stricmp(reason , "idle") == 0)) bot_raw_kick(u, ci, target, IDLE); else if ((stricmp(reason , "badnick") == 0)) bot_raw_kick(u, ci, target, BADNICK); else { notice(s_BotServ, u->nick, "The number you chose does not correspond to a kick reason."); notice(s_BotServ, u->nick, "If you want to kick with your own custom reason , use !kick trigger"); } } } } } } if (target) free(target); if (reason) free(reason); return MOD_CONT; }
int do_core_kick(User * u, Channel *c, char *target, char *reason) { ChannelInfo *ci = c->ci; User *u2; int is_same, exists; if (!target) target = u->nick; is_same = (target == u->nick) ? 1 : (stricmp(target, u->nick) == 0); if (is_same) { u2 = u; exists = 1; } else exists = ((u2 = finduser(target)) ? 1 : 0); if (!is_same ? !check_access(u, ci, CA_KICK) : !check_access(u, ci, CA_KICKME)) { notice_lang(ci->bi->nick, u, ACCESS_DENIED); } else if (!is_same && exists && (ci->flags & CI_PEACE) && (get_access(u2, ci) >= get_access(u, ci))) { notice_lang(ci->bi->nick, u, PERMISSION_DENIED); } else if (exists && ((ircd->protectedumode && is_protected(u2)) && !is_founder(u, ci))) { notice_lang(ci->bi->nick, u, PERMISSION_DENIED); } else if (exists && RestrictKB && ((!is_founder(u, ci) && is_services_oper(u2)) || (is_founder(u, ci) && is_services_admin(u2)))) { notice_lang(ci->bi->nick, u, PERMISSION_DENIED); } else if (stricmp(target, ci->bi->nick) == 0) { bot_raw_kick(u, ci, u->nick, "Oops!"); } else { if (exists) { if (is_on_chan(ci->c, u2)) { if (!reason) bot_raw_kick(u, ci, target, "Requested"); else bot_raw_kick(u, ci, target, reason); } } else { char mask[BUFSIZE]; struct c_userlist *cu = NULL, *next = NULL; if (my_match_wild_nocase("*!*@*", target)) snprintf(mask, BUFSIZE, "%s", target); /* If we get a *@* target we need to add the *!... */ else if (my_match_wild_nocase("*@*", target)) snprintf(mask, BUFSIZE, "*!%s", target); else if (my_match_wild_nocase("*!*", target)) snprintf(mask, BUFSIZE, "%s@*", target); /* If we get a * target we need to add the !*@* (assume nick)... */ else snprintf(mask, BUFSIZE, "%s!*@*", target); cu = c->users; while (cu) { next = cu->next; /* This only checks against the cloacked host & vhost for normal users. * IPs are only checked when triggered by an oper.. */ if (is_oper(u) ? match_usermask_full(mask, cu->user, true) : match_usermask(mask, cu->user)) { /* Check whether we are allowed to kick this matching user.. */ if (!((ircd->protectedumode && is_protected(cu->user) && !is_founder(u, ci)) || ((ci->flags & CI_PEACE) && (get_access(cu->user, ci) >= get_access(u, ci))) || (RestrictKB && ((!is_founder(u, ci) && is_services_oper(cu->user)) || (is_founder(u, ci) && is_services_admin(cu->user)))))) { if (!reason) bot_raw_kick(u, ci, cu->user->nick, "Requested"); else bot_raw_kick(u, ci, cu->user->nick, reason); } } cu = next; } } } return MOD_CONT; }
int do_core_kickban(User * u, Channel *c, char *target, char *reason) { ChannelInfo *ci = c->ci; User *u2; int is_same, exists; char *av[2]; if (!target) target = u->nick; is_same = (target == u->nick) ? 1 : (stricmp(target, u->nick) == 0); if (is_same) { u2 = u; exists = 1; } else exists = ((u2 = finduser(target)) ? 1 : 0); if (!is_same ? !check_access(u, ci, CA_BAN) : !check_access(u, ci, CA_BANME)) { notice_lang(ci->bi->nick, u, ACCESS_DENIED); } else if (!is_same && exists && (ci->flags & CI_PEACE) && (get_access(u2, ci) >= get_access(u, ci))) { notice_lang(ci->bi->nick, u, PERMISSION_DENIED); } else if (exists && ((ircd->protectedumode && is_protected(u2)) && !is_founder(u, ci))) { notice_lang(ci->bi->nick, u, PERMISSION_DENIED); /** * Dont ban the user on channels where he is excepted * to prevent services <-> server wars. **/ } else if (exists && (ircd->except && is_excepted(ci, u2))) { notice_lang(ci->bi->nick, u, CHAN_EXCEPTED, u2->nick, ci->name); } else if (!exists && (ircd->except && is_excepted_mask(ci, target))) { notice_lang(ci->bi->nick, u, CHAN_EXCEPTED, target, ci->name); } else if (exists && RestrictKB && ((!is_founder(u, ci) && is_services_oper(u2)) || (is_founder(u, ci) && is_services_admin(u2)))) { notice_lang(ci->bi->nick, u, PERMISSION_DENIED); } else if (stricmp(target, ci->bi->nick) == 0) { bot_raw_ban(u, ci, u->nick, "Oops!"); } else { if (exists) { if (is_on_chan(ci->c, u2)) { if (!reason) bot_raw_ban(u, ci, target, "Requested"); else bot_raw_ban(u, ci, target, reason); } } else if (my_match_wild_nocase("*@*", target)) { char mask[BUFSIZE]; /* If we get a *@* target we need to add the *!... */ if (!my_match_wild_nocase("*!*@*", target)) snprintf(mask, BUFSIZE, "*!%s", target); else snprintf(mask, BUFSIZE, "%s", target); /* Only continue if the mask doesn't match an exception or is otherwise prohibited.. */ if (check_banmask(u, c, mask)) { struct c_userlist *cu = NULL, *next = NULL; av[0] = "+b"; av[1] = mask; anope_cmd_mode(ci->bi->nick, c->name, "+b %s", av[1]); chan_set_modes(ci->bi->nick, c, 2, av, 1); cu = c->users; while (cu) { next = cu->next; /* This only checks against the cloacked host & vhost for normal users. * IPs are only checked when triggered by an oper.. */ if (is_oper(u) ? match_usermask_full(mask, cu->user, true) : match_usermask(mask, cu->user)) { if (!reason) bot_raw_kick(u, ci, cu->user->nick, "Requested"); else bot_raw_kick(u, ci, cu->user->nick, reason); } cu = next; } } } else noticeLang(ci->bi->nick, u, LANG_REQ_NICK_OR_MASK); } return MOD_CONT; }