aIRC — File Browser
aIRCv0.8.69 / aIRCv0.8.69 / script / bans.mrc
bans.mrc — 10.36 KB — Download this file
;/**********************************************************************
; *
; * aIRC
; * Bans
; *
; **********************************************************************/
ON *:CONNECT:{ hdel -w _aircjunk clearchanbans_* }
ON *:DISCONNECT:{ hdel -w _aircjunk clearchanbans_* }
ON ME:*:JOIN:#:{ _setd junk clearchanbans $chan 0 }
raw 367:*:{
if ($istok(%c.rebans.c,$2,32)) { halt }
}
raw 368:*:{
if ($istok(%c.rebans.c,$2,32)) {
%c.rebans.c = $remtok(%c.rebans.c,$2,32)
if (%c.rebans.c == $null) { unset %c.rebans.c }
_ban.chexpire $2
if ($me isop $2) {
var %chan = $2,%win = @__banscheck $+ $2,%file = $_baninifile,%i,%line,%hostmask,%seton,%duration,%bantime,%dynamicbans = $iif($_rchini(dynamicbans,%chan),1,0)
_openwins %win
filter -fw $"(%file) %win %chan *
filter -fw $"(%file) %win global *
%i = $line(%win,0)
while (%i) {
var %line = $line(%win,%i),%hostmask = $gettok(%line,2,32),%seton = $gettok(%line,4,32),%duration = $gettok(%line,5,32),%reason = $gettok(%line,8-,32),%bantime = $calc(%seton + %duration - $ctime)
if (%bantime > 9999999) { %bantime = 9999999 }
if (%duration) && (%bantime > 0) {
if ($_ischanban(%hostmask,%chan)) { .timer_UNBAN $+ %chan $+ , $+ %hostmask 1 %bantime _raw.unban %chan %hostmask }
else { _addbaninchanbutcheckdynamic %dynamicbans %chan %hostmask %bantime %reason }
}
elseif ($_not($_ischanban(%hostmask,%chan))) { _addbaninchanbutcheckdynamic %dynamicbans %chan %hostmask 0 %reason }
dec %i
}
close -@ %win
if ($_prot.chansetting(cuenforcebans,30,1,%chan)) { enforcebans %chan }
if ($_rchini(clearbans,%chan)) && ($_not($_get(junk,clearchanbans,%chan))) { _clearchanbans %chan }
}
halt
}
}
; _addbaninchanbutcheckdynamic <dynamic? 1|0> <chan> <hostmask> <bantime> <reason>
alias _addbaninchanbutcheckdynamic {
if ($1 == 0) || (($1) && ($ialchan($3,$2,0))) {
if ($4) { kb -u $+ $4 $2 $3 $5- }
else { kb $2 $3 $5- }
}
}
; /_clearchanbans #channel
alias _clearchanbans {
var %chan = $1,%i,%t
if ($me !isop %chan) { return }
%i = $ibl(%chan,0)
while (%i) {
%t = $ibl(%chan,%i)
if ($gettok($ibl(%chan,%i).by,1,33) !isop %chan) && ($_not($_isban(%t,%chan))) { ban -r %chan %t }
dec %i
}
_setd junk clearchanbans %chan 1
}
; /enforcebans #channel
alias enforcebans {
if ($_disconnected) { return }
var %chan = $_parameter($iif($1,$1,#),1,Enforce Channel Bans [/enforcebans],ischan,$null,Channel:),%banmask,%banner,%i,%nick,%fulladdress,%k,%bans
if ($_iamnotop4com(%chan,enforcebans)) { return }
if ($chan(%chan).ial != $true) {
error.a IAL for %chan is not full yet... Please try again later.
return
}
if ($_not($ibl(%chan,0))) {
if ($show) { info.w %chan No bans to enforce in %chan }
return
}
%bans = $ibl(%chan,0)
while (%bans) {
var %banmask = $ibl(%chan,%bans),%banner = $gettok($ibl(%chan,%bans).by,1,33)
%i = $ialchan(%banmask,%chan,0)
while (%i) {
inc %k
var %fulladdress = $ialchan(%banmask,%chan,%i),%nick = $gettok(%fulladdress,1,33)
.timerENFORCEBAN $+ , $+ %chan $+ , $+ %banmask $+ , $+ %nick 1 $r(3,5) _prot.enforceban %chan %banmask %banner %nick %fulladdress
dec %i
}
dec %bans
}
%bans = $ibl(%chan,0)
if (%k) { info.w %chan Enforcing bans in %chan $+ : $_nsingoplur(%bans,ban,bans) found, kicking $_nsingoplur(%k,user,users) }
else { info.w %chan Enforcing bans in %chan $+ : $_nsingoplur(%bans,ban,bans) found, no users to kick }
}
ON me:*:PART:#:{ .timer_UNBAN $+ $chan $+ ,* off }
ON *:KICK:#:{
if ($knick == $me) { .timer_UNBAN $+ $chan $+ ,* off }
}
ON *:BAN:#:{
var %line,%index,%file = $_baninifile
%index = $chan $banmask
%line = $read -ns" $+ %index $+ " %file
if (%line) { write -l $+ $readn $"(%file) $chan $puttok(%line,$ctime,5,32) }
%index = global $banmask
%line = $read -ns" $+ %index $+ " %file
if (%line) { write -l $+ $readn $"(%file) global $puttok(%line,$ctime,5,32) }
}
ON *:UNBAN:#:{ .timer_UNBAN $+ $chan $+ , $+ $banmask off }
ON *:DISCONNECT:{ .timer_UNBAN* off }
alias _ban.chexpire {
var %win = @__banchexpire,%file = $_baninifile,%line,%seton,%duration,%changlobal,%hostmask,%chan
_openwins %win
filter -fw $"(%file) %win $1 *
if ($_ischan($1)) { filter -fw $"(%file) %win global * }
var %i = $line(%win,0)
while (%i) {
%line = $line(%win,%i)
%chan = $iif($_ischan($gettok(%line,1,32)),$gettok(%line,1,32))
%hostmask = $gettok(%line,2,32)
%seton = $gettok(%line,4,32)
%duration = $gettok(%line,5,32)
if (%duration) {
if ($ctime > $calc(%seton + %duration)) { .-ban %hostmask $iif(%chan,%chan) }
}
dec %i
}
close -@ %win
}
alias _start.bans {
var %win = @__banstart,%file = $_baninifile,%line,%seton,%duration,%changlobal,%hostmask,%chan
_ban.chexpire *
_openwins %win
filter -fw $"(%file) %win *
var %i = $line(%win,0)
while (%i) {
%line = $line(%win,%i)
%chan = $iif($_ischan($gettok(%line,1,32)),$gettok(%line,1,32))
%hostmask = $gettok(%line,2,32)
%seton = $gettok(%line,4,32)
%duration = $gettok(%line,5,32)
if (%duration) && (%bantime > 0) { .timer_-ban $+ $iif(%chan,%chan,global) $+ , $+ %hostmask 1 %bantime -ban %hostmask %chan }
dec %i
}
close -@ %win
_rehashbaninifile
}
;;
;
; /unban [#channel] [mask] [-n[ick] banner] [-f[irst] N] [-l[ast] N] [-b[efore] ctime] [-a[fter] ctime]
;
alias unban {
var %d = _unban,%chan,%banner,%first,%last,%after,%before,%mask,%i = 1,%n,%ban,%by,%date,%win1 = @__unban1,%win2 = @__unban2,%win3 = @__unban3,%fff = 1
if ($_ischan($1)) {
%chan = #$1
tokenize 32 $2-
}
else { %chan = $chan }
if (-* !iswm $1) {
%mask = $1
tokenize 32 $2-
}
if (%chan != $null) {
if ($_iamnotop4com(%chan,unban)) { return }
if ($chan(%chan).ibl != $true) {
error.a Ban list for $^'(%chan) isn´t full yet...
return
}
}
%banner = $gettok($1-,$calc($findtok($1-,$wildtok($1-,-n*,1,32),1,32) + 1),32)
%first = $gettok($1-,$calc($findtok($1-,$wildtok($1-,-f*,1,32),1,32) + 1),32)
%last = $gettok($1-,$calc($findtok($1-,$wildtok($1-,-l*,1,32),1,32) + 1),32)
%after = $gettok($1-,$calc($findtok($1-,$wildtok($1-,-a*,1,32),1,32) + 1),32)
%before = $gettok($1-,$calc($findtok($1-,$wildtok($1-,-b*,1,32),1,32) + 1),32)
if (-* iswm %banner) || (%banner == $null) { %banner = * }
if (-* iswm %first) || ($_not($_isint(%first))) { var %first }
if (-* iswm %last) || ($_not($_isint(%last))) { var %last }
if (-* iswm %after) || ($_not($_isint(%after))) { var %after }
if (-* iswm %before) || ($_not($_isint(%before))) { var %before }
if (%chan == $null) || (($_not($_ismask(%mask))) && ($_not(%first)) && ($_not(%last)) && ($_not(%after)) && ($_not(%before))) {
if ($_not($_ismask(%mask))) { %mask = * }
_dialog -m %d %d
did -o %d 1002 1 %chan
did -o %d 1004 1 $_fixmask(%mask)
did -o %d 1006 1 %banner
did -o %d 1012 1 %first
did -o %d 1014 1 %last
_unban.rdialog
return
}
if (%last) || (%first) || (%after) || (%before) { %fff = 0 }
if ($_not($_ismask(%mask))) { %mask = * }
%mask = $_fixmask(%mask)
%n = $ibl(%chan,0)
close -@ %win1
window -hls %win1
_openwins %win2 %win3
while (%i <= %n) {
var %ban = $_fixmask($ibl(%chan,%i)),%by = $ibl(%chan,%i).by,%date = $ibl(%chan,%i).ctime
if ($_not($_isnum(%date))) { %date = $ctime }
if (%banner iswm %by) && (%mask iswm %ban) { aline %win1 %fff %date %by %ban }
inc %i
}
filter -ww %win1 %win2 *
if ($_not(%fff)) {
%n = $line(%win2,0)
if (%first) {
%i = 1
while (%i <= %n) && (%i <= %first) {
rline %win2 %i 1 $gettok($line(%win2,%i),2-,32)
inc %i
}
}
if (%last) {
%i = %n
while (%i) && (%i >= $calc(%n - %last + 1)) {
rline %win2 %i 1 $gettok($line(%win2,%i),2-,32)
dec %i
}
}
if (%after) || (%before) {
%i = 1
while (%i <= %n) {
%date = $gettok($line(%win2,%i),2,32)
if ((%after) && (%date > %after)) || ((%before) && (%date < %before)) { rline %win2 %i 1 $gettok($line(%win2,%i),2-,32) }
inc %i
}
}
}
filter -ww %win2 %win3 1 *
%i = 1
%n = $line(%win3,0)
if (0) { }
else {
while (%i <= %n) {
if ($gettok($line(%win3,%i),4,32) != $null) { _raw.unban %chan $ifmatch }
inc %i
}
}
close -@ %win1 %win2 %win3
}
dialog _unban {
size -1 -1 120 127
title "Remove Bans [/unban]"
option dbu
box "Remove Bans...",1000,5 5 110 55
text "in channel:",1001,10 15 30 10
edit "",1002,40 13 70 10,autohs
text "matching:",1003,10 30 30 10
edit "",1004,40 28 70 10,autohs
text "set by:",1005,10 45 30 10
edit "",1006,40 43 70 10,autohs
box "Options",1010,5 65 110 40
text "First:",1011,10 75 30 10
edit "",1012,40 73 70 10,autohs
text "Last:",1013,10 90 30 10
edit "",1014,40 88 70 10,autohs
button "Help",2991,5 110 30 15,disable
button "Unban",2992,45 110 30 15,ok
button "Cancel",2993,85 110 30 15,cancel
}
ON *:DIALOG:_unban:*:*:{
if ($devent == init) {
_mdx.init $_icofile(unban.ico)
_dummy $_lang.loaddialog($dname,$dname,00086969,main.lang,$scriptdir)
}
elseif ($devent == sclick) && ($did == 2992) {
var %d = _unban,%chan = $did(%d,1002,1),%match = $did(%d,1004,1),%banner = $did(%d,1006,1),%first = $did(%d,1012,1),%last = $did(%d,1014,1),%parms
if ($me isop %chan) && ($_ismask(%match)) {
%parms = %chan $_fixmask(%match)
if (-* !iswm $gettok(%banner,1,32)) && ($gettok(%banner,1,32) != $null) { %parms = %parms -n $ifmatch }
if ($_isint(%first)) { %parms = %parms -f $ifmatch }
if ($_isint(%last)) { %parms = %parms -l $ifmatch }
unban %parms
}
}
_unban.rdialog
}
alias _unban.rdialog {
var %d = _unban
if ($dialog(%d)) {
if ($me !isop $did(%d,1002,1)) || ($_not($_ismask($did(%d,1004)))) { did -b %d 2992 }
else { did -e %d 2992 }
}
}
alias _rehashbaninifile {
_hmake _aircinternalbanlist 30
var %i = 1,%n,%win = @__rehashbaninifile
_openwins %win
loadbuf %win " $+ $_baninifile $+ "
%n = $line(%win,0)
while (%i <= %n) {
hadd _aircinternalbanlist %i $gettok($line(%win,%i),1-2,32)
inc %i
}
close -@ %win
}