/*
remove all bans affecting a user or a mask on a certain chan or the active channel
syntax: /remban <nick|mask> [#channel]
method used:
- nick entered: check for nick being in your ial, or try to get nick's address per /who.
- mask entered: complete that mask
(so it works with nick!ident@host but also for !ident or ident@host or @*.domain etc).
- remove on that chan all bans affecting that address/mask by looping the internal banlist.
*/
alias remban {
var %echo = echo -ac info [remove bans] $+($chr(3),$color(norm).dd,:)
; error checking feedback
if (!$1) {
%echo Syntax is /remban <nick or mask> [#channel]
return
}
var %chan = $iif(($2),#$2,$active)
if (%chan !ischan) { %echo No channel specified. Syntax: /remban <nick or mask> [#channel] }
elseif ($me !ison %chan) { %echo You have to be on channel $qt(%chan) to remove bans. }
elseif (($me !isop %chan) && ($me !ishop %chan)) {
%echo You have to be opped on channel $qt(%chan) to remove any bans.
}
elseif (!$chan(%chan).ibl) {
%echo Internal banlist of $qt(%chan) not up to date (retrieving the banlist now). $&
Try again in a second...
.mode %chan +b
}
; unban or get mask and unban (...further error checking)
else {
if ($ial($1)) { rb.unban $v1 %chan }
elseif ($regex($1,/!|@/)) {
var %mask = $rb.getmask($1)
if ((%mask == error) || (!$regex(%mask,/^[-\]\\_\*^[{}|`\w]+![\w\*~-]+@[\w\.\*-]+$/))) {
%echo $qt($1) cannot be a valid (partial) mask.
}
}
elseif (!$regex($1,/^[-\]\\_^[{}|`\w]+$/)) { %echo $qt($1) cannot be a valid nickname. }
else {
set -e %remban.nick $1
set -e %remban.chan %chan
.enable #who.remban
who $1
}
}
}
; return a 'wildcard fullmask' of a maybe partial mask input
; (this alias is pretty ugly but useful :X)
alias -l rb.getmask {
var %m = $strip($1)
; invalid input
if ($regex(%m,/!.*!|@.*@|!@|@.*!/)) { return error }
if ($remove($gettok(%m,2,64),$chr(42),$chr(45),$chr(46))) {
if ($v1 !isalnum) { return error }
}
if ($remove(%m,$chr(33),$chr(42),$chr(64)) == $null) { return *!*@* }
; input == nick
if (!$regex(%m,/!|@/)) { return $+(%m,!*@*) }
else {
if ($regex(%m,/!/)) {
; input contains only !
if (!$regex(%m,/@/)) {
if ($left(%m,1) == $chr(33)) { var %m = $+($chr(42),%m) }
if ($right(%m,1) == $chr(33)) { var %m = $+(%m,$chr(42)) }
return $+(%m,@*)
}
else {
; input contains ! and @
if ($istok(!•@,$left(%m,1),149)) { var %m = $+($chr(42),%m) }
if ($right(%m,1) == $chr(64)) { var %m = $+(%m,$chr(42)) }
return %m
}
}
else {
; input contains only @
if ($left(%m,1) == $chr(64)) { var %m = $+($chr(42),%m) }
if ($right(%m,1) == $chr(64)) { var %m = $+(%m,$chr(42)) }
return $+(*!,%m)
}
}
}
; parsing who replies
#who.remban off
RAW 352:*: {
if ($6 == %remban.nick) {
rb.unban $+($6,!,$3,@,$4) %remban.chan
set %remban.done 1
haltdef
}
}
RAW 315:*: {
if ($2 == %remban.nick) {
if (!%remban.done) {
echo -ac info [remove bans] $+($chr(3),$color(norm).dd,:) Did not find user $qt($2) on $network $+ . $&
You might remove bans matching the nick $qt($2) with: /remban $rb.getmask($2) %remban.chan
}
unset %remban.*
.disable #who.remban
haltdef
}
}
#who.remban end
; unban loop
alias -l rb.unban {
var %nr = 1, %bans
while ($ibl($2,%nr)) {
if ($v1 iswm $1) {
inc %bans
mode $2 -b $v1
}
inc %nr
}
if (%bans) { echo -ac info [remove bans] $+($chr(3),$color(norm).dd,:) removing %bans ban(s) matching $qt($1) on channel $2 $+ . }
else { echo -ac info [remove bans] $+($chr(3),$color(norm).dd,:) Found no bans matching $qt($1) on channel $2 $+ . }
}