void check_kicksay(Chan *chan, ChanUser *doer, char *text) { KickSay *kick,*save; char *mask; int action; save = NULL; action = -1; for(kick=current->kicklist;kick;kick=kick->next) { if (*kick->chan == '*' || !Strcasecmp(chan->name,kick->chan)) { if (!matches(kick->mask,text)) { if (kick->action > action) { action = kick->action; save = kick; } } } } if (save) { if (!action) { if (doer->flags & CU_KSWARN) action = 1; if (!(doer->flags & CU_KSWARN)) { doer->flags |= CU_KSWARN; to_server("NOTICE %s :%s\n",doer->nick,save->reason); } } if (action > 1) { mask = format_uh(get_nuh(doer),FUH_USERHOST); if (action > 2) { add_shit("Auto KS",chan->name,mask,save->reason,2,now+3600); } if (!(doer->flags & CU_BANNED)) { doer->flags |= CU_BANNED; send_mode(chan,90,QM_RAWMODE,'+','b',mask); } } if (action && !(doer->flags & CU_KICKED)) { doer->flags |= CU_KICKED; send_kick(chan,CurrentNick,FMT_PLAIN,save->reason); } } }
/* * SHIT <channel|*> <nick|mask> <action> [expire] <reason> */ void do_shit(COMMAND_ARGS) { /* * on_msg checks CARGS */ char *channel,*nick,*nuh; int shitlevel,days,uaccess,shitaccess; if (CurrentCmd->name == C_QSHIT) { channel = MATCH_ALL; } else { channel = chop(&rest); if (!ischannel(channel) && *channel != '*') { usage: usage(from); /* usage for CurrentCmd->name */ return; } } if ((uaccess = get_useraccess(from,channel)) < cmdaccess) return; if ((nick = chop(&rest)) == NULL) goto usage; if (CurrentCmd->name == C_QSHIT) { shitlevel = DEFAULTSHITLEVEL; days = 86400 * DEFAULTSHITLENGTH; if (*rest == 0) rest = TEXT_DEFAULTSHIT; } else { shitlevel = asc2int(chop(&rest)); if (errno) goto usage; if (shitlevel < 1 || shitlevel > MAXSHITLEVEL) { to_user(from,"Valid levels are from 1 thru " MAXSHITLEVELSTRING); return; } /* * option: expire in XXX days */ days = 86400 * 30; if (*rest >= '1' && *rest <= '9') { days = 86400 * asc2int(chop(&rest)); if (errno) goto usage; } if (*rest == 0) goto usage; } #ifdef CHANBAN if (shitlevel == SHIT_CHANBAN) { nuh = nick; } else #endif /* CHANBAN */ { if ((nuh = nick2uh(from,nick)) == NULL) return; if (find_shit(nuh,channel)) { to_user(from,TEXT_ALREADYSHITTED,nuh); return; } if (uaccess != OWNERLEVEL) { shitaccess = get_useraccess(nuh,channel); if (shitaccess > uaccess) { to_user(from,TEXT_SHITLOWACCESS,nuh); return; } } format_uh(nuh,FUH_USERHOST); } #ifdef DEBUG debug("(do_shit) adding %s to %s (Level %i)\n",nuh,channel,shitlevel); #endif /* DEBUG */ add_shit(from,channel,nuh,rest,shitlevel,now + days); to_user(from,TEXT_HASSHITTED,nuh,channel); to_user(from,TEXT_SHITEXPIRES,time2str(now + days)); check_shit(); }