; #= P&P -rs ; ######################################## ; Peace and Protection ; Basic op commands ; ######################################## ; inline kick- won't kick same person many times (10 sec or until a join or you gain op/help) alias _kick if ($hget($+(pnp.flood.,$cid,.,$1),kicked. $+ $2)) return | hadd $+(pnp.flood.,$cid,.,$1) kicked. $+ $2 1 | if ($_getchopt($1,8)) _linedance .raw kick $1 $2 : $+ $3- | else .raw kick $1 $2 : $+ $3- ; ; Unset inline kick counters; strictmode/stricttopic when we are opped or join ; on *:JOIN:#:hdel $+(pnp.flood.,$cid,.,$chan) kicked. $+ $nick on *:OP:#:{ if ($opnick == $me) _onopstrict } on *:OWNER:#:{ if ($opnick == $me) _onopstrict } on *:HELP:#:{ if ($hnick == $me) _onopstrict } alias -l _onopstrict { var %hash = $+(pnp.flood.,$cid,.,$chan) hdel -w %hash kicked.* if ($hget(%hash,didstrict)) return ; Wait for MODE reply if we get opped when there's no mode during join or no key with +k (as mirc will issue a MODE now) if ($event == OP) { if (((k isincs $gettok($chan($chan).mode,1,32)) && ($chan($chan).key == $null)) || (($chan($chan).mode == $null) && ($hget(pnp. $+ $cid,-joining. $+ $chan)))) { hadd %hash strictmodewait 1 return } } _dostrict $chan } ; (does all 3 strict modes- "if none", "when opped", "always enforce") alias -l _dostrict { hadd -u10 $+(pnp.flood.,$cid,.,$1) didstrict 1 var %strict = $_getsm($1) if ($chan($1).mode == $null) { var %enforce = $gettok(%strict,4,44) if ((%enforce != +) && (%enforce != $null)) var %junk = $_enforcemode($1,%enforce,$null,1) } var %enforce = $gettok(%strict,3,44) if ((%enforce != +) && (%enforce != $null)) var %junk = $_enforcemode($1,%enforce,$_chmode($1),1) var %enforce = $gettok(%strict,2,44) if ((%enforce != +) && (%enforce != $null)) var %junk = $_enforcemode($1,%enforce,$_chmode($1),1) if (($gettok(%strict,1,44) isnum 1-2) || ($chan($1).topic == $null)) if ($_getst($1)) _linedance .raw topic $1 : $+ $msg.compile($ifmatch,&chan&,$1) } ; (does all 3 strict modes- end of names from join) raw 366:*:{ if (($me isop $2) && ($nick($2,0) == 1) && ($hget(pnp. $+ $cid,-joining. $+ $2))) { _dostrict $2 } } ; For waiting for mode reply when you get opped before receiving mode reply or with +k and no key (undernet) raw 324:*:{ var %hash = $+(pnp.flood.,$cid,.,$2) if ($hget(%hash,strictmodewait)) { hdel %hash strictmodewait if ($hget(%hash,didstrict)) return _dostrict $2 } } ; bans (just an alias for ban) alias bans ban $1- ; ban [-u#] [#chan] [who[ who][,who]] [n] alias ban _ssplit ban /ban $1- | if (%.targ.ban == $null) mode %.chan.ban b | elseif ($gettok(%.msg.ban,$numtok(%.msg.ban,32),32) isnum) _ban² %.opt.ban %.chan.ban $ifmatch %.targ.ban $remtok(%.msg.ban,$ifmatch,32) | else _ban² %.opt.ban %.chan.ban 3 %.targ.ban %.msg.ban alias _ban² _ban³ $1-3 $_c2s($4-) alias _ban³ { _operr $2 ban ; Must nick complete OUTSIDE loop var %total,%ban,%ban2,%usebot = %.usebot,%bans = $_nccs(32,$2,$4-),%num = 1 _init.mass $2 :loopB %ban = $gettok(%bans,%num,32) if (%ban) { %ban2 = $_ppmask(%ban,$_stmask($3,$2)) if (%ban2) { if (%usebot) $ifmatch ! $2 ban %ban2 else _add.mass $2 + b %ban2 %total = %total %ban2 } else { disprc $2 Looking up address of $:t(%ban) for ban... _notconnected _Q.userhost ban $+ $1 $+  $+ $2 $+ &n!&a $+ $3 disprc $+ $2 $+ User $+ $:t(%ban) $+ notfound %ban } inc %num | goto loopB } if ((-u* iswm $1) && ($remove($1,-u) isnum) && (%total != $null)) { if ($numtok(%total,32) > 1) .timer 1 $remove($1,-u) .unban $2 %total else .timer.unban. $+ $cid $+ . $+ $replace(%total,*,`,?,') 1 $remove($1,-u) .unban $2 %total } } ; reban [-u#] [#chan] [num[-num]] alias reban { _ssplit ban /reban $1- if (%.targ.ban == $null) set -u %.targ.ban 1 if ($gettok($hget($+(pnp.flood.,$cid,.,%.chan.ban),lastunban),%.targ.ban,32) == $null) _error No matching recent unban $+ $chr(40) $+ s $+ $chr(41) in %.chan.ban $+ !Use /ban to ban or view the banlist. ban %.opt.ban %.chan.ban $gettok($hget($+(pnp.flood.,$cid,.,%.chan.ban),lastunban),%.targ.ban,32) } ; banlast [-u#] [#chan] [num[-num]] alias banlast { _ssplit ban /banlast $1- if (%.targ.ban == $null) set -u %.targ.ban 1 if ($gettok($hget($+(pnp.flood.,$cid,.,%.chan.ban),lastleave),%.targ.ban,32) == $null) _error No matching recent parting user $+ $chr(40) $+ s $+ $chr(41) found!Use /ban to ban or view the banlist. ban %.opt.ban %.chan.ban $gettok($hget($+(pnp.flood.,$cid,.,%.chan.ban),lastleave),%.targ.ban,32) } ; unban [-s] [#chan] [who|num[-num] ...] alias unban { _ssplit ban /unban $1- var %targets = %.targ.ban %.msg.ban if (%.targ.ban == $null) %targets = 1 ; Replace numbers/ranges with recent bans var %tok = 1 while ($gettok(%targets,%tok,32)) { var %item = $ifmatch if ((%item isnum) || (($gettok(%item,1,45) isnum) && ($gettok(%item,2,45) isnum) && ($gettok(%item,3,45) == $null))) { %item = $gettok($hget($+(pnp.flood.,$cid,.,%.chan.ban),lastban),%item,32) if (%item == $null) _error No matching recent ban $+ $chr(40) $+ s $+ $chr(41) in %.chan.ban $+ !Specify a user to unban or use /ban to view the banlist. %targets = $puttok(%targets,%item,%tok,32) } inc %tok } _unban² %.opt.ban %.chan.ban %targets } alias _unban² _unban³ $1-2 $_c2s($3-) alias _unban³ { _operr $2 unban if ($1 == -s) { var %hash = $+(pnp.scanunban.,$cid,.,$chan) if ($hget(%hash)) hdel -w %hash * else hmake %hash 20 if ($hget($+(pnp.scanfound.,$cid,.,$chan))) hfree $+(pnp.scanfound.,$cid,.,$chan) hadd %hash miss 0 } else _init.mass $2 var %ban,%num = 1 :loopB %ban = $gettok($3-,%num,32) if (%ban) { if (%.usebot) $ifmatch ! $2 unban %ban elseif ($1 == -s) { if (($_ismask(%ban)) || (! isin %ban) || (@ isin %ban) || (. isin %ban)) hadd %hash %ban 1 elseif ($address(%ban,5)) hadd %hash $ifmatch 1 else { hinc %hash miss disprc $2 Looking up address of $:t(%ban) for unban... _notconnected _Q.userhost _scanu2&n!&a $+ $2 _scanu2 $+ %ban $+  $+ $2 %ban } } else _add.mass $2 - b $_fixmask(%ban) inc %num | goto loopB } if (($1 == -s) && ($hget(%hash,miss) == 0)) _scanu3 $2 } alias _scanu2 { var %hash = $+(pnp.scanunban.,$cid,.,$2) if (! isin $1) hadd %hash $1 1 else disprc $2 User $:t($1) not found hdec %hash miss if ($hget(%hash,miss) < 1) _scanu3 $2 } alias _scanu3 { var %hash = $+(pnp.scanunban.,$cid,.,$1) var %hashhit = $+(pnp.scanfound.,$cid,.,$1) hdel %hash miss if ($hget(%hash,0).item == 0) { hfree %hash disprc $1 No one to unban! } elseif ($chan($1).ibl == $true) { disprc $1 Scanning internal banlist to find matching bans... var %pos = $ibl($1,0) hmake %hashhit 20 while (%pos > 0) { var %ban = $ibl($1,%pos) var %num = $hget(%hash,0).item while (%num > 0) { var %item = $hget(%hash,%num).item if ((%item iswm %ban) || (%ban iswm %item)) { hadd %hashhit %ban 1 break } dec %num } dec %pos } _scanu4 $1 } else { disprc $1 Retrieving banlist to find matching bans... hmake %hashhit 20 .raw mode $1 b } } alias _scanu4 { var %hash = $+(pnp.scanunban.,$cid,.,$1) var %hashhit = $+(pnp.scanfound.,$cid,.,$1) if ($hget(%hashhit,0).item == $null) disprc $1 No matching bans found. else { _init.mass $1 var %num = $hget(%hashhit,0).item disprc $1 Unbanned $:t(%num) matching bans. while (%num > 0) { _add.mass $1 - b $hget(%hashhit,%num).item dec %num } } hfree %hash hfree %hashhit } ; kick [#chan] who[,who]|mask [comment] alias k kick $1- alias kick { if ($1 == $null) _qhelp /kick | _split k /kick $1- | if (%.targ.k == $null) _qhelp /kick $1- if ($_ismask(%.targ.k)) fk $1- else { _operr %.chan.k kick var %who,%chan = %.chan.k,%targ = %.targ.k,%msg = %.msg.k,%num = 1,%usebot = %.usebot _flush.mass %.chan.k :loop if ($gettok(%targ,%num,44)) { %who = $_ncc($gettok($ifmatch,1,33),%chan) %who = %who $msg.compile($_msgwrap(kwrap,kick,%msg),&chan&,%chan,&nick&,%who,&kickseq&,%num) if (%usebot) $ifmatch ! %chan kick %who else _kick %chan %who inc %num | goto loop } if ((%msg) && (%.punishwait == $null)) _recent2 kick 9 %msg } } ; fk [-qohvru] [#chan] mask [comment] ; -qohvr = only kick owners, ops, helps, vocs, regs; -u = don't kick known users alias fknop fk -vr $1- alias fk { if ($1 == $null) _qhelp /fk | _ssplit k /fk $1- | if (%.targ.k == $null) _qhelp /fk $1- _operr %.chan.k kick if ($ial == $false) _error The IAL is not enabled!You need the IAL for that command. if ($chan(%.chan.k).inwho) $_doerror(Please wait-,The IAL is not fully updated.Wait a few seconds and try again.) if ($chan(%.chan.k).ial == $false) _error The channel IAL has not been filled.You need IAL filling enabled for that command. if ($_ppmask(%.targ.k,$_stmask(2,%.chan.k))) %.targ.k = $ifmatch else %.targ.k = %.targ.k $+ !*@* _flush.mass %.chan.k var %nick,%count = 1,%num = 1 ; .opt.k needs a counterpart for scanning $nick()- ie if options are -vr then we need the opposite -qoh to 'exclude' var %optexclude = $iif(q isin %.opt.k,-,$iif(o isin %.opt.k,q,$iif(h isin %.opt.k,qo,$iif(v isin %.opt.k,qoh,$iif(r isin %.opt.k,qohv,-))))) :loop %nick = $ialchan(%.targ.k,%.chan.k,%num).nick if (%nick) { if ((u isin %.opt.k) && (($notify(%nick) != $null) || (($level($address(%nick,5)) > 1) && ($istok($level($address(%nick,5)),=black,44) == $false)))) { inc %num | goto loop } if (-?* iswm $remove(%.opt.k,u)) { if ($nick(%.chan.k,%nick,%.opt.k,%optexclude) == $null) { inc %num | goto loop } } if (%nick != $me) { %nick = $ifmatch $msg.compile($_msgwrap(kwrap,kick,%.msg.k),&chan&,%.chan.k,&nick&,$ifmatch,&kickseq&,%count,&mask&,%.targ.k) inc %count if (%.usebot) $ifmatch ! %.chan.k kick %nick else _kick %.chan.k %nick } inc %num | goto loop } if ((%.msg.k) && (%.punishwait == $null)) _recent2 kick 9 %.msg.k if (%num == 1) disprc %.chan.k No matching users found. $chr(40) $+ mask- %.targ.k $+ $chr(41) } ; tempban [-u#] [#chan] who|mask[,who|mask] [n] [comment] alias tempban { if (-u* iswm $1) _kb² 0 /tempban $1- else _kb² 0 /tempban -u $1- } dialog tempban { title "Tempban" icon script\pnp.ico option dbu size -1 -1 175 60 text "&Reason for tempban?", 203, 7 5 165 10 combo 1, 5 15 165 80, drop result edit text "&Tempban for:", 2, 7 30 35 10, right edit "", 3, 44 28 20 11 text "seconds", 4, 65 30 100 10 ; (time multiplier- 1 or 60) edit "1", 50, 1 1 1 1, hide autohs button "OK", 101, 15 43 40 12, OK default button "Cancel", 102, 70 43 40 12, cancel button "&Clear list", 103, 135 44 35 10, disable } on *:DIALOG:tempban:init:*:{ did -a $dname 3 $calc(%.time) if (*m iswm %.time) { did -a $dname 4 minutes did -ra $dname 50 60 } _fillrec $dname 1 103 $_cfg(kick.lis) 0 $_msg(kick) unset %.time } on *:DIALOG:tempban:sclick:101:{ %.time = $did(50) * $did(3) if (%.time isnum) set -u1 %.time -u $+ %.time else unset %.time } on *:DIALOG:tempban:sclick:103:{ did -b $dname 103 .remove $_cfg(kick.lis) :loop | if ($did(1,1) != $null) { did -d $dname 1 1 | goto loop } } ; kb/kb0/kb2/cb [-u[#]] [#chan] who|mask[,who|mask] [n] [comment] ; -u without # uses default tempban time alias bk kb $1- alias kb _kb² 3 /kb $1- alias bk0 kb0 $1- alias kb0 _kb² 2 /kb0 $1- alias bk2 kb2 $1- alias kb2 _kb² 4 /kb2 $1- alias bc cb $1- alias cb _kb² -1 /cb $1- alias _kb² { if ($3 == $null) _qhelp $2 _ssplit k $2 $3- if (%.targ.k == $null) _qhelp $iif($2 == /tempban,$deltok($2-,2,32),$2-) if ((-u* iswm %.opt.k) && ($remove(%.opt.k,-u) !isnum)) %.opt.k = -u $+ $_getchopt(%.chan.k,1) ; Passed a 0 for default bantype ($1) means use default tempban type _kb³ %.opt.k %.chan.k %.targ.k $iif($gettok(%.msg.k,1,32) !isnum,$iif($1 == 0,$_getchopt(%.chan.k,2),$1)) %.msg.k } alias _kb³ { _operr $2 ban var %targ.ban,%targ.kick,%who,%mask,%mask2,%num2,%wrap,%dur,%usebot = %.usebot,%num = $numtok($3,44) :loop1 %who = $_ncc($gettok($3,%num,44),$2) if ($4 >= 0) %mask = $_ppmask(%who,$_stmask($4,$2)) else { %mask = $_ppmask(%who,0,0,1) %mask2 = $_ppmask(%who,$_stmask(3,$2)) if ($ialchan(%mask,$2,0) == $ialchan(%mask2,$2,0)) %mask = %mask2 } if (%mask == $null) { if ($_ismask(%who)) { if ($ial == $false) _error The IAL is not enabled!You need the IAL for that command. if ($chan($2).inwho) $_doerror(Please wait-,The IAL is not fully updated.Wait a few seconds and try again.) if ($chan($2).ial == $false) _error The channel IAL has not been filled.You need IAL filling enabled for that command. } else { disprc $2 Looking up address of $:t(%who) for ban... _notconnected _Q.userhost kb $+ $1 $+  $+ $2 $+ &n!&a $+ $_s2p($4-) disprc $+ $2 $+ User $+ $:t(%who) $+ notfound %who } } else { %targ.ban = $addtok(%targ.ban,%mask,32) if (%usebot) $ifmatch ! $2 ban %mask $msg.compile($_msgwrap(kwrap,kick,$5-),&chan&,$2,&nick&,%who,&kickseq&,%num) else { ; After a userhost (exact addr given) we kick that user exactly if ((*!* iswm $gettok($3,%num,44)) && (* !isin $gettok($3,%num,44)) && (? !isin $gettok($3,%num,44))) { %targ.ban = $addtok(%targ.ban,%mask,32) %targ.kick = $addtok(%targ.kick,$gettok($gettok($3,%num,44),1,33),32) } else { if (%who == $me) %targ.kick = $addtok(%targ.kick,%who,32) %num2 = $ialchan(%mask,$2,0) :loopC if (%num2 >= 1) { if ($ialchan(%mask,$2,%num2).nick != $me) %targ.kick = $addtok(%targ.kick,$ifmatch,32) if (%num2 > 1) { dec %num2 | goto loopC } } } } } if (%num > 1) { dec %num | goto loop1 } if (%usebot) goto botdone _init.mass $2 %num = $numtok(%targ.kick,32) :loopD if ($gettok(%targ.kick,%num,32) isop $2) _add.mass $2 - o $ifmatch if ($gettok(%targ.kick,%num,32) ishop $2) _add.mass $2 - h $ifmatch if (%num > 1) { dec %num | goto loopD } %num = $numtok(%targ.ban,32) :loopB if (%num >= 1) { _add.mass $2 + b $gettok(%targ.ban,%num,32) if (%num > 1) { dec %num | goto loopB } } _flush.mass $2 %num = 1 if ((-u* iswm $1) && ($remove($1,-u) isnum) && (%targ.ban != $null)) { %wrap = tbwrap | %dur = $gettok($_dur($remove($1,-u)),1-2,32) } else %wrap = kwrap :loopK if ($gettok(%targ.kick,%num,32) ison $2) _kick $2 $ifmatch $msg.compile($_msgwrap(%wrap,kick,$5-),&chan&,$2,&nick&,$ifmatch,&kickseq&,%num,&dur&,%dur) if (%num < $numtok(%targ.kick,32)) { inc %num | goto loopK } if (%wrap = tbwrap) { if ($numtok(%targ.ban,32) > 1) .timer 1 $remove($1,-u) .unban $2 %targ.ban else .timer.unban. $+ $cid $+ . $+ $replace(%targ.ban,*,`,?,') 1 $remove($1,-u) .unban $2 %targ.ban } :botdone if (($5) && (%.punishwait == $null)) _recent2 kick 9 $5- } ; unop [#chan] who[ who][,who]|mask - deop AND/OR dehop as needed alias unop { if ($1 == $null) _qhelp /unop | _simsplit o /unop $1- | if (%.msg.o == $null) _qhelp /unop $1- if ($_ismask(%.msg.o)) funop $1- else { _operr %.chan.o deop ; Have to do nick completion OUTSIDE of loop var %chan = %.chan.o,%num = 1,%usebot = %.usebot,%who = $_nccs(32,%.chan.o,$_c2s(%.msg.o)) if (%usebot) $ifmatch ! %chan deop %who else { _init.mass %.chan.o :loop if ($gettok(%who,%num,32)) { var %nick = $ifmatch if (%nick ishop %.chan.o) _add.mass %.chan.o - h $ifmatch if (%nick isop %.chan.o) _add.mass %.chan.o - o $ifmatch inc %num goto loop } } } } ; op/deop/hfop/dehfop/voc/devoc [#chan] who[ who][,who]|mask alias opme op $1- $me alias op _op² /op fop op + o $1- alias deop _op² /deop fdeop deop - o $1- alias dop deop $1- alias hfop _op² /hfop fhfop halfop + h $1- alias halfop hfop $1- alias dehfop _op² /dehfop fdehfop dehalfop - h $1- alias dhfop dehfop $1- alias dehalfop dehfop $1- alias voc _op² /voc fvoc voice + v $1- alias voice voc $1- alias devoc _op² /devoc fdevoc devoice - v $1- alias dvoc devoc $1- alias devoice devoice $1- ; _op² /cmd filtercmd botcommand -|+ modechar [chan] who alias _op² { if ($6 == $null) _qhelp $1 | _simsplit o $1 $6- | if (%.msg.o == $null) _qhelp $1 $6- if ($_ismask(%.msg.o)) $2 $6- else { if ((%.msg.o == $me) && ($1 == /op)) _operr %.chan.o opme else _operr %.chan.o $3 ; Have to do nick completion OUTSIDE of loop var %chan = %.chan.o,%num = 1,%usebot = %.usebot,%who = $_nccs(32,%.chan.o,$_c2s(%.msg.o)) if (%usebot) $ifmatch ! %chan $3 %who else { _init.mass %.chan.o :loop if ($gettok(%who,%num,32)) { _add.mass %.chan.o $4-5 $ifmatch | inc %num | goto loop } } } } ; funop [#chan] who|mask - deop AND/OR dehop as needed alias funop _fop² /funop deop - oh oh q $1- ; fop/fdeop/fhfop/fdehfop/fvoc/fdevoc [#chan] who|mask alias fop _fop² /fop op + o rvh oq $1- alias fdop fdeop $1- alias fdeop _fop² /fdeop deop - o o q $1- alias fhfop _fop² /fhfop halfop + h rv hoq $1- alias fdhfop fdehfop $1- alias fdehfop _fop² /fdehfop dehalfop - h h oq $1- alias fvoc _fop² /fvoc voice + v r vhoq $1- alias fdvoc fdevoc $1- alias fdevoc _fop² /fdevoc devoice - v v hoq $1- ; _fop² /cmd botcommand -|+ modechar allow disalllow [chan] who alias _fop² { if ($7 == $null) _qhelp $1 | _split o $1 $7- | if (%.targ.o == $null) _qhelp $1 $7- if ($ial == $false) _error The IAL is not enabled!You need the IAL for that command. if ($chan(%.chan.o).inwho) $_doerror(Please wait-,The IAL is not fully updated.Wait a few seconds and try again.) if ($chan(%.chan.o).ial == $false) _error The channel IAL has not been filled.You need IAL filling enabled for that command. _operr %.chan.o $2 %.targ.o = $_ppmask(%.targ.o,0,2,$_getchopt(%.chan.o,4)) var %total,%num = $ialchan(%.targ.o,%.chan.o,0) if (%.usebot) { :loop1 var %nick = $ialchan(%.targ.o,%.chan.o,%num).nick if (($nick(%.chan.o,%nick,$5,$6)) && (%nick != $me)) %total = %total %nick if (%num > 1) { dec %num | goto loop1 } if (%total == $null) { disprc %.chan.o No matching users found. $chr(40) $+ mask- %.targ.o $+ $chr(41) | return } %.usebot ! %.chan.o $2 %total } else { _init.mass %.chan.o :loop2 var %nick = $ialchan(%.targ.o,%.chan.o,%num).nick if (($nick(%.chan.o,%nick,$5,$6)) && (%nick != $me)) { %total = 1 if ($3-4 == - oh) { if (%nick ishop %.chan.o) _add.mass %.chan.o - h %nick if (%nick isop %.chan.o) _add.mass %.chan.o - o %nick } else _add.mass %.chan.o $3-4 %nick } if (%num > 1) { dec %num | goto loop2 } if (%total == $null) { disprc %.chan.o No matching users found. $chr(40) $+ mask- %.targ.o $+ $chr(41) | return } } } ; topic [#chan] [topic] alias topic { _simsplit t /topic $1- if (%.msg.t) { _operr %.chan.t topic if (%.usebot) $ifmatch ! %.chan.t topic %.msg.t else .raw topic %.chan.t : $+ %.msg.t } else { .raw topic %.chan.t disprc %.chan.t Requesting topic... } } ; etopic [#chan] [topic] alias etopic _simsplit t /etopic $1- | topic %.chan.t $_rentry(topic,%.chan.t,$_s2p($iif(%.msg.t,%.msg.t,$chan(%.chan.t).topic)),New topic for %.chan.t $+ ?) ; rtopic [#chan] alias rtopic _simsplit t /rtopic $1- | topic %.chan.t $iif(%.msg.t,%.msg.t,$chan(%.chan.t).topic) ; atopic [#chan] alias atopic _simsplit t /atopic $1- | var %chan = %.chan.t | if (%.msg.t == $null) set -u %.msg.t $_entry(0,$null,Add what to topic? $chr(40) $+ no separator needed $+ $chr(41)) | topic %chan $chan(%chan).topic $iif($chan(%chan).topic != $null,$_cfgi(topic.sep)) %.msg.t ; mtn [#chan] alias mtn _simsplit m /mtn $1- | var %old = $gettok($chan(%.chan.m).mode,1,32) | if (%old != $null) var %old = $remove(%old,+,n,t) | if (%old != $null) %old = - $+ %old | mode %.chan.m %old $+ +tn $chan(%.chan.m).key ; _mtog #chan mode alias _mtog mode $1 $iif($2 isincs $gettok($chan($1).mode,1,32),-,+) $+ $2 ; mode [#chan] [modes] alias mode { if ($1 == $me) { umode $2- | return } _simsplit m /mode $1- if (%.msg.m) { if ($remove(%.msg.m,-,+) === b) { if ($chan(%.chan.m).ibl == $true) { _iblbanlist %.chan.m } else { .raw mode %.chan.m b disprc %.chan.m Requesting channel banlist... } } else { _operr %.chan.m mode 1 if (%.usebot) $ifmatch ! %.chan.m mode %.msg.m else .raw mode %.chan.m %.msg.m } } else { .raw mode %.chan.m disprc %.chan.m Requesting channel modes... } } ; Splitting for command parameters alias _ssplit if (-* iswm $3) { set -u %.opt. [ $+ [ $1 ] ] $3 | _split $1-2 $4- } | else { set -u %.opt. [ $+ [ $1 ] ] - | _split $1- } alias _simsplit { if ($left($3,1) isin $remove(& $+ $chantypes,+,-)) { set -u %.chan. [ $+ [ $1 ] ] $3 | set -u %.msg. [ $+ [ $1 ] ] $4- } elseif ($chan ischan) { set -u %.chan. [ $+ [ $1 ] ] $chan | set -u %.msg. [ $+ [ $1 ] ] $3- } elseif ($active ischan) { set -u %.chan. [ $+ [ $1 ] ] $active | set -u %.msg. [ $+ [ $1 ] ] $3- } else _error You must use $2 in a channel $+ $chr(40) $+ or specify a target channel $+ $chr(41) } alias _split { if ($left($3,1) isin $remove(& $+ $chantypes,+,-)) { set -u %.chan. [ $+ [ $1 ] ] $3 | set -u %.targ. [ $+ [ $1 ] ] $4 | set -u %.msg. [ $+ [ $1 ] ] $5- } elseif ($chan ischan) { set -u %.chan. [ $+ [ $1 ] ] $chan | set -u %.targ. [ $+ [ $1 ] ] $3 | set -u %.msg. [ $+ [ $1 ] ] $4- } elseif ($active ischan) { set -u %.chan. [ $+ [ $1 ] ] $active | set -u %.targ. [ $+ [ $1 ] ] $3 | set -u %.msg. [ $+ [ $1 ] ] $4- } else _error You must use $2 in a channel $+ $chr(40) $+ or specify a target channel $+ $chr(41) } ; Ops check and error message ; /_operr #chan type [skiperror] ; type is used for bot checks (use - for no check) ; skiperror = no error if no bot found alias _operr { unset %.usebot if (($2 == topic) && (t !isin $gettok($chan($1).mode,1,32))) return if (($me !isop $1) && ($me !ishop $1) && (o !isin $usermode)) { if (($2 != -) && ($hget(pnp,addon.i.bot))) { var %num = $numtok($ifmatch,44) :loop $gettok($hget(pnp,addon.i.bot),%num,44) ? $1 $2 if ($result) { set -u %.usebot $gettok($hget(pnp,addon.i.bot),%num,44) | return } if (%num > 1) { dec %num | goto loop } } if (($_getchopt($1,5)) && (!$3)) { if ($me ison $1) _error You are not opped on $1 $+ ! $+ $chr(40) $+ you must have ops for that command $+ $chr(41) else _error You are not on $1 $+ ! $+ $chr(40) $+ You must be on a channel and opped for that command $+ $chr(41) } } } ; mass mode aliases; work as groups and from routine to routine, even if the target channel changes ; call before a massmode set (if you specify $2 it is the amount of seconds to delay) alias _init.mass { .timer.massmode. $+ $cid $+ . $+ $1 1 $iif($2 isnum,$2,0) _flush.mass $1 } ; call to add to the modes- /_add.mass chan +|- o|v|b|etc [target] ; can specify a chunk of modes w/targets but not gaurunteed to work properly at all times alias _add.mass { var %hash = $+(pnp.flood.,$cid,.,$1) if ((m !isin $hget(pnp. $+ $cid,-feat)) && ($3 isincs ovh)) { if (($hget(%hash,mass.ovh) != $null) && ($hget(%hash,mass.ovh) !=== $3)) _flush.mass $1 hadd %hash mass.ovh $3 } hadd %hash mass.modes $hget(%hash,mass.modes) $+ $2 $+ $3 hadd %hash mass.who $hget(%hash,mass.who) $4- if ($numtok($hget(%hash,mass.who),32) >= $hget(pnp. $+ $cid,-modes)) _flush.mass $1 } ; finished alias _flush.mass { var %hash = $+(pnp.flood.,$cid,.,$1) if ($hget(%hash,mass.modes)) { .raw mode $1 $ifmatch $hget(%hash,mass.who) hdel -w %hash mass.* } } ; ; Recent topic remember, strict topic ; on *:TOPIC:#:{ if ($1) _recent2 topic 15 $replace($1-,$chan,&chan&) if (($nick == $me) || (($me !isop $chan) && ($me !ishop $chan)) || ($_level($chan,$level($fulladdress)) >= 25)) return var %enforce = $gettok($_getsm($chan),1,44) if ((%enforce == 1) && ($_getst($chan))) { var %topic = $msg.compile($ifmatch,&chan&,$chan) if (%topic != $1-) { _linedance .raw topic $chan : $+ %topic hinc -u20 $+(pnp.flood.,$cid,.,$chan) stricttopic if ($hget($+(pnp.flood.,$cid,.,$chan),stricttopic) > 2) { if ($nick isop $chan) .deop $chan $nick elseif ($nick ishop $chan) .dehop $chan $nick if (t !isin $chan($chan).mode) { _init.mass $chan | _add.mass $chan + t } } } } } raw 332:*:_recent2 topic 15 $replace($3-,$2,&chan&) ; ; Track recent kick/parts and ban/unbans, cancel unban timers, rejoin for ops ; on *:KICK:#:{ hadd $+(pnp.flood.,$cid,.,$chan) lastleave $address($knick,5) $gettok($hget($+(pnp.flood.,$cid,.,$chan),lastleave),1-9,32) if (($knick != $me) && ($_getchopt($chan,15)) && ($nick($chan,0) == 2) && ($me !isop $chan)) hop -cn $chan } on !*:PART:#:{ hadd $+(pnp.flood.,$cid,.,$chan) lastleave $fulladdress $gettok($hget($+(pnp.flood.,$cid,.,$chan),lastleave),1-9,32) if (($_getchopt($chan,15)) && ($nick($chan,0) == 2) && ($me !isop $chan)) hop -cn $chan } on *:QUIT:{ var %num = $comchan($nick,0) while (%num) { hadd $+(pnp.flood.,$cid,.,$comchan($nick,%num)) lastleave $fulladdress $gettok($hget($+(pnp.flood.,$cid,.,$comchan($nick,%num)),lastleave),1-9,32) if (($_getchopt($comchan($nick,%num),15)) && ($nick($comchan($nick,%num),0) == 2) && ($me !isop $comchan($nick,%num))) hop -cn $comchan($nick,%num) dec %num } } on *:BAN:#:{ hadd $+(pnp.flood.,$cid,.,$chan) lastban $banmask $gettok($hget($+(pnp.flood.,$cid,.,$chan),lastban),1-9,32) if ($nick != $me) .timer.unban. $+ $cid $+ . $+ $replace($banmask,*,`,?,') off } on *:UNBAN:#:{ hadd $+(pnp.flood.,$cid,.,$chan) lastunban $banmask $gettok($hget($+(pnp.flood.,$cid,.,$chan),lastunban),1-9,32) .timer.unban. $+ $cid $+ . $+ $replace($banmask,*,`,?,') off } ; ; Nicklist popups ; alias _banpop { if ($snick(#,1)) { if ($address($snick(#,1),5)) { set -u1 %.ban2 $_ppmask($snick(#,1),0,$_getchopt(#,3),2) if ($_ppmask($snick(#,1),0,$_getchopt(#,3),4) != %.ban2) set -u1 %.ban3 $ifmatch else unset %.ban3 set -u1 %.ban4 $_ppmask($snick(#,1),0,$_getchopt(#,3),3) if ((%.ban4 == %.ban2) || (%.ban4 == %.ban3)) unset %.ban4 set -u1 %.ban5 $_ppmask($snick(#,1),0,$_getchopt(#,3),6) if ((%.ban5 == %.ban2) || (%.ban5 == %.ban3) || (%.ban5 == %.ban4)) unset %.ban5 set -u1 %.banD $_ppmask($snick(#,1),$_stmask(4,#)) if ($_ppmask($snick(#,1),$_stmask(2,#)) != %.banD) set -u1 %.banS $ifmatch else unset %.banS set -u1 %.banN $snick(#,1) $+ !*@* } else { set -u1 %.ban2 Standard $chr(40) $+ *!ident@*.domain.com $+ $chr(41) set -u1 %.banD Full domain $chr(40) $+ *!*@*.domain.com $+ $chr(41) set -u1 %.banS Site $chr(40) $+ *!*@site.domain.com $+ $chr(41) set -u1 %.banN Nickname $chr(40) $+ nick!*@* $+ $chr(41) unset %.ban3 %.ban4 %.ban5 } } } alias _nurple var %num = $snick($1,0) | :loop | if (%num > 0) { $reptok($2-,**,$snick($1,%num),1,32) | dec %num | goto loop } ; ; Stricts ; ; (lock topic) alias ltopic { _simsplit t /ltopic $1- if ((%.msg.t != $null) || ($chan(%.chan.t).topic)) { `set stricttopic. $+ %.chan.t $ifmatch var %old = $hget(pnp.config,stricts. $+ %.chan.t) if (%old == $null) %old = $hget(pnp.config,stricts) `set stricts. $+ %.chan.t $puttok(%old,1,1,44) if ((%.msg.t != $chan(%.chan.t).topic) && ($me isop %.chan.t)) topic %.chan.t %.msg.t disprc %.chan.t Topic locked as $:q($hget(pnp.config,stricttopic. $+ %.chan.t)) $+ . } else disprc %.chan.t No topic to save- set a topic $+ $chr(44) then try again. } ; (unlock topic) alias utopic { _simsplit t /utopic $1- var %old = $hget(pnp.config,stricts. $+ %.chan.t) if ($gettok(%old,1,44) isnum 1-2) { `set stricts. $+ %.chan.t $puttok(%old,3,1,44) disprc %.chan.t Topic unlocked. } else disprc %.chan.t Topic not currently locked. $chr(40) $+ see popups or /strict to lock topic $+ $chr(41) } ; (save topic) alias stopic { _simsplit t /stopic $1- if (%.msg.t == 0) { `set stricttopic. $+ %.chan.t var %old = $hget(pnp.config,stricts. $+ %.chan.t) if ($gettok(%old,1,44) isnum 1-2) `set stricts. $+ %.chan.t $puttok(%old,3,1,44) disprc %.chan.t Topic forgotten. } elseif ((%.msg.t != $null) || ($chan(%.chan.t).topic)) { `set stricttopic. $+ %.chan.t $ifmatch disprc %.chan.t Topic saved- use popups or /otopic to restore. } else disprc %.chan.t No topic to save- set a topic $+ $chr(44) then try again. } ; (old topic) alias otopic { _simsplit t /otopic $1- if ($_getst(%.chan.t)) topic %.chan.t $msg.compile($ifmatch,&chan&,%.chan.t) else disprc %.chan.t No topic saved for channel. $chr(40) $+ see popups or /strict to set one $+ $chr(41) } alias strict { if ($_ischan($1)) set -u %.chan $1 elseif ($active ischan) set -u %.chan $active _dialog -am strictm strictm } dialog strictm { title "Strict Modes / Topics" icon script\pnp.ico option dbu size -1 -1 225 125 text "&View settings for:", 1, 3 5 65 10, right combo 2, 70 3 90 50, drop sort button "&Add...", 3, 162 3 25 10 button "&Remove", 4, 190 3 30 10 box "Modes:", 5, 5 20 215 49 text "&Always enforced:", 6, 10 29 66 10, right text "&Always set when opped:", 7, 10 42 66 10, right text "&Set if none set:", 8, 10 55 66 10, right edit "", 9, 77 27 60 11, autohs edit "", 10, 77 40 60 11, autohs edit "", 11, 77 53 60 11, autohs button "Use current", 109, 150 28 55 10, disable button "Use current", 110, 150 41 55 10, disable button "Use current", 111, 150 54 55 10, disable box "&Topics:", 12, 5 75 215 24 combo 13, 10 83 66 50, drop combo 14, 77 83 137 50, drop edit edit "", 15, 1 1 1 1, hide autohs button "Close", 100, 130 107 40 12, ok default button "&Help", 101, 175 107 40 12, disable } on *:DIALOG:strictm:init:*:{ did -ac $dname 2 ( $+ all other channels $+ ) window -hln @.vars filter -fw $_cfg(cfgvar.dat) @.vars stricts.* var %ln = $line(@.vars,0) :loop if (%ln) { var %chan = $right($gettok($line(@.vars,%ln),1,32),-8) did -a $+ $iif(%chan == %.chan,c) $dname 2 %chan dec %ln | goto loop } window -c @.vars loadbuf -otstrictm $dname 13 script\dlgtext.dat unset %.chan _loadsm } on *:DIALOG:strictm:sclick:109,110,111:did -ra $dname $calc($did - 100) $_chmode($did($dname,2).seltext) on *:DIALOG:strictm:sclick:2:_savesm | _loadsm on *:DIALOG:strictm:sclick:100:_savesm alias -l _loadsm { did -o strictm 15 1 $did(strictm,2,$did(strictm,2).sel) var %chan = . $+ $did(strictm,2,$did(strictm,2).sel) if ($mid(%chan,2,1) == $chr(40)) { var %chan did -b strictm 4,109,110,111 } else { did -e strictm 4 did $iif($right(%chan,-1) ischan,-e,-b) strictm 109,110,111 } var %opt = $hget(pnp.config,stricts $+ %chan) if (%opt == $null) %opt = 3,+,+tn,+ if ($gettok(%opt,1,44) isnum 1-3) did -c strictm 13 $ifmatch else did -c strictm 13 3 did -o strictm 9 1 $gettok(%opt,2,44) did -o strictm 10 1 $gettok(%opt,3,44) did -o strictm 11 1 $gettok(%opt,4,44) did -r strictm 14 _fillrec strictm 14 0 $_cfg(topic.lis) $iif($right(%chan,-1) ischan,$ifmatch,0) $hget(pnp.config,stricttopic $+ %chan) if ($hget(pnp.config,stricttopic $+ %chan) == $null) did -d strictm 14 0 } alias -l _savesm { var %chan = . $+ $did(strictm,15) if ($mid(%chan,2,1) == $chr(40)) var %chan var %opt = $iif($did(strictm,14) == $null,0,$did(strictm,13).sel),%num = 9 :loop if ($did(strictm,%num) != $null) %opt = %opt $+ , $+ $ifmatch else %opt = %opt $+ ,+ if (%num < 11) { inc %num | goto loop } `set stricts $+ %chan %opt `set stricttopic $+ %chan $did(strictm,14) } on *:DIALOG:strictm:sclick:3:{ var %chan = $_rentry($chr(35),0,$active,Channel to add?) if ($hget(pnp.config,stricts. $+ %chan)) return did -ac strictm 2 %chan `set stricts. $+ %chan 3,+,+tn,+ _loadsm } on *:DIALOG:strictm:sclick:4:{ var %chan = . $+ $did(strictm,2,$did(strictm,2).sel) `set stricts $+ %chan `set stricttopic $+ %chan did -d strictm 2 $did(strictm,2).sel did -c strictm 2 $did(strictm,2).lines _loadsm } alias _getsm if ($hget(pnp.config,stricts. $+ $1) != $null) return $ifmatch | return $hget(pnp.config,stricts) alias _getst if ($hget(pnp.config,stricttopic. $+ $1) != $null) return $ifmatch | return $hget(pnp.config,stricttopic) on @!*:MODE:#:{ if ($_level($chan,$level($fulladdress)) >= 25) return var %enforce = $gettok($_getsm($chan),2,44) if ((%enforce == +) || (%enforce == $null)) return if ($_enforcemode($chan,%enforce,$1-)) { hinc -u20 $+(pnp.flood.,$cid,.,$chan) strictmode if ($hget($+(pnp.flood.,$cid,.,$chan),strictmode) > 2) { if ($nick isop $chan) .deop $chan $nick elseif ($nick ishop $chan) .dehop $chan $nick } } } ; $1 = channel $2 = modes to enforce (include key/limit) ; $3 = current modes/changes (include key/limit) $4 = assume -mode if not given in $3 (IE, current modes) ; performs enforcement, returns 1 if any enforcement made ;;; change the following aliases to use $chanmodes. alias _enforcemode { var %enforce = $_fixmode($gettok($2,1,32)),%change = $replace($_fixmode($gettok($3,1,32)),+,/,-,+,/,-),%num = 1,%revert if ($3 == $null) var %change :loop var %bit = $mid(%enforce,%num,2) if (%bit isincs %change) %revert = %revert $+ %bit elseif (($4) && (+? iswm %bit) && ($right(%bit,1) !isincs %change)) %revert = %revert $+ %bit inc %num 2 if (%num < $len(%enforce)) goto loop ; -k here (and -l below) are really +k/+l (as we swapped them) if ((+k isincs %enforce) && (-k isincs %change)) { var %oldkey = $_whichkey($3),%forcekey = $_whichkey($2) if (%oldkey !=== %forcekey) { .raw mode $1 -k %oldkey %revert = %revert $+ +k } } if ((+l isincs %enforce) && (-l isincs %change)) { if ($_whichlimit($3) != $_whichlimit($2)) %revert = %revert $+ +l } elseif (+l isincs %revert) %revert = $removecs(%revert,+l) $+ +l if (+k isincs %revert) %revert = %revert $_whichkey($2) elseif (-k isincs %revert) %revert = %revert $_whichkey($3) if (+l isincs %revert) %revert = %revert $_whichlimit($2) if (%revert) { _init.mass $1 _add.mass $1 $left(%revert,1) $right(%revert,-1) return 1 } return 0 } ; reduces a set of modes to only those that take params alias _parammodes { var %set = $_fixmode($1),%num = 1 :loop if ($mid(%set,%num,2) !isincs +b-b+o-o+h-h+v-v+I-I+e-e+l+k-k) %set = $removecs(%set,$ifmatch) else inc %num 2 if (%num < $len(%set)) goto loop return %set } ; returns the key in a set of modes alias _whichkey { var %set = $_parammodes($gettok($1,1,32)) if (k !isincs %set) return return $gettok($1-,$calc($pos(%set,k,1) / 2 + 1),32) } ; returns the limit in a set of modes alias _whichlimit { var %set = $_parammodes($gettok($1,1,32)) if (+l !isincs %set) return return $gettok($1-,$calc(($pos(%set,+l,1) + 1) / 2 + 1),32) } ; ; Recent offenders ; alias f8 { if ($active !ischan) _error F8 can only be used in channel windows. $+ $chr(40) $+ to view and punish recent offenders. $+ $chr(41) if ($_grabrec(offend $+ $active,0) == $null) _error No recent offenders in $active $+ .F8 is used to view and punish recent channel offenders. _dialog -am recond recond } alias -l _rosel { did -c recond 2 $1 did -r recond 8 var %sel = $did(21,$did(2).sel) _ddaddm recond 8 $gettok(%sel,1,32) 022 030 002 001 111 did -c recond 8 1 did -d recond 4 1 did -ic recond 4 1 $replace($_protwarnmsg(k,$gettok(%sel,2,32)),&A&,$_p2s($gettok(%sel,3,32)),&B&,$_p2s($gettok(%sel,4,32))) did $iif($gettok(%sel,2,32) == clones,-c,-u) recond 9 } dialog recond { title "Recent Offenders" icon script\pnp.ico option dbu size -1 -1 240 141 box "", 1, 5 5 170 45 list 2, 10 15 160 35 box "&Kick reason:", 3, 5 55 170 27 combo 4, 10 65 159 75, drop edit box "Action:", 5, 5 86 170 49 button "&Kick", 6, 10 97 25 12, default check "&Kick clones also", 9, 40 99 129 8 button "&Ban:", 7, 10 115 25 12 combo 8, 40 116 129 75, drop edit text "1) Select a recent offender from the list.", 201, 180 15 55 50 text "2) Optionally change the kick reason.", 202, 180 65 55 24 text "3) Select Kick or Ban to punish.", 203, 180 95 55 35 button "Cancel", 101, 207 122 25 12, cancel edit "", 20, 1 1 1 1, hide autohs list 21, 1 1 1 1, hide edit $cid, 22, 1 1 1 1, hide autohs } on *:DIALOG:recond:sclick:2:_rosel $did(2).sel | did -t $dname 6 on *:DIALOG:recond:init:*:{ did -o $dname 20 1 $active did -o $dname 1 1 & $+ Recent offenders on $replace($active,&,&&) $+ : did -r $dname 2 var %token,%data,%total = $_grabrec(offend $+ $active,0),%num = 1 :loop %token = $_grabrec(offend $+ $active,%num) %data = $_sufnrec(offend $+ $active,%num) did -a $dname 2 $gettok(%token,1,33) - $gettok(%data,1,32) ( $+ $gettok(%token,2-,33) $+ ) did -a $dname 21 %token %data if (%num < %total) { inc %num | goto loop } _fillrec $dname 4 0 $_cfg(kick.lis) $active _rosel 1 } on *:DIALOG:recond:sclick:6:_cidexists $did(22) | scid $did(22) | $iif($did(9).state,fk,kick) $did(20) $gettok($did(2,$did(2).sel),1,32) $did(4) | dialog -x $dname on *:DIALOG:recond:sclick:7:if ($did(8) == $null) _error You must have a banmask selected. | _cidexists $did(22) | scid $did(22) | kb $did(20) $did(8) $did(4) | dialog -x $dname on *:DIALOG:recond:sclick:8:did -t $dname 7 on *:DIALOG:recond:edit:8:did -t $dname 7