This blacklist uses hashtables to store the data in order to easily maintain the list. This updated version contains a console to control the blacklist in, although only touching the basic commands.
Updated the $b.check alias
The following is a list of the aliases within the script and how to use them:
/b.start & $b.start - Prompts the blacklist hashtable
/b.exit & $b.exit - Saves the blacklist hashtable to the file "Blacklist.hsh" in the same directory as the script.
/b.add
[msg] & $b.add(address[,msg]) - Adds addresses to the blacklist hashtable./b.del <address|N|-c> & $b.del(address|n|-c) - The "-c" switch CLEARS the hashtable; Entering an address will remove the matching address; Specifying N will delete the Nth line.
$b.check(address) - Checks to see if an address is blacklisted and returns the matching address & reason
/b.update - Clears the channel of blacklisted users
/b.cmd - Opens the Blacklist console
; ======================
; = Blacklist script by Pass
; ---------------------------------
; Options: $true/$false
alias keep.ban return $iif(%bl.keep.ban,$v1,$false)
alias part.ban return $iif(%bl.part.ban,$v1,$false)
; ---------------------------------
; = Do not edit below this line
; ======================
on *:start:b.start
on *:exit:b.exit
on !*:join:#:{
if ($b.check($address($nick,5))) {
if ($nick($chan,$me,qoh)) || (o isincs $usermode) {
var %data = $b.check($address($nick,5)),%addy = $gettok(%data,1,32),%msg = $gettok(%data,2-,32)
mode $chan +b %addy %msg
kick $chan $nick $gettok($b.check($nick),2-,32)
}
}
}
on *:unban:#:{
if ($b.check($banmask)) {
if ($nick($chan,$me,qoh)) || (o isincs $usermode) {
if ($keep.ban) {
if (!$timer($+(rb.,$chan))) {
if (!$+(%rb.,$chan)) set -u5 %rb. $+ $chan 1
else inc -u5 %rb. $+ $chan
}
.timer 1 2 $iif($($+(%,rb.,$chan),2) <= 3,mode $chan +b $banmask,return)
}
}
}
}
on !*:part:#:{
if ($b.check($address($nick,5))) {
if ($nick($chan,$me,qoh)) || (o isincs $usermode) {
var %data = $v1,%addy = $gettok(%data,1,32),%msg = $gettok(%data,2-,32)
if (%msg) && (%addy) mode $chan +b %addy %msg
}
}
}
alias b.start {
if ($hget(blacklist)) b.exit
hmake blacklist
if ($isfile($qt($+($scriptdir,blacklist.hsh)))) hload blacklist $qt($+($scriptdir,blacklist.hsh))
return Successful Start
}
alias b.exit {
if ($hget(blacklist)) {
hsave -o blacklist $qt($+($scriptdir,blacklist.hsh))
return Successful Exit
}
else return $false
}
alias b.add {
if (!$hget(blacklist)) b.start
if (!$b.check($1)) { hadd blacklist $1 $iif($2-,$2-,Blacklisted) | return Added $1 to blacklist }
else return
}
alias b.del {
if (!$hget(blacklist)) b.start
if ($1 === -c) { var %msg = Cleared $hget(blacklist,0).item blacklist entire(s) | hfree blacklist | return %msg }
if ($1 isnum $+(1-,$hget(blacklist,0).item)) {
var %item = $hget(blacklist,$1).item
hdel blacklist %item
return Deleted %item from blacklist
}
if ($b.check($1)) { hdel blacklist $1 | return Deleted $1 from blacklist }
else return
}
alias b.check {
if ($hfind(blacklist,$+($1,*),1,w).item) || ($hfind(blacklist,$1,1,W).item) {
var %r = $v1 $hget(blacklist,$hfind(blacklist,$+($v1,*),1,w))
return %r
}
}
alias b.list {
if (!$hget(blacklist)) b.start
if ($1 === -a) return $hget(blacklist,0).item
}
alias b.update {
if ($me ison $1) {
if (!$hget(blacklist)) b.start
if ($nick($1,$me,qoh)) || (o isincs $usermode) {
var %n = $nick($1,0),%nicks
while (%n) {
var %nick = $nick($1,%n)
if (!$address(%nick,5)) who %nick
if ($b.check($address(%nick,5))) $&
&& (%nick != $me) { var %nicks = %nicks $gettok($b.check($address(%nick,5)),1,32) | .kick $1 %nick $gettok($b.check($address(%nick,5)),2-,32) }
dec %n
}
if (%nicks) {
var %nicks = $remove(%nicks,$me)
mode $1 $+(+,$str(b,$numtok(%nicks,32))) %nicks
}
}
}
}
alias b.cmd {
if ($window(@bcmd)) close -@ @bcmd
window -daCek0w1 +ts @bcmd -1 -1 400 300
titlebar @bcmd - Blacklist console
var %c = aline -ip @bcmd
%c - Blacklist Console -
%c For help, or more information regarding the console, type help.
%c $crlf
}
on *:input:@bcmd:{
var %c = aline -ip @bcmd
if ($1 == list) {
var %n = 1,%x = $hget(blacklist,0).item
%c - %x $+(Entr,$iif(%x == 1,y,ies)) -
while ($hget(blacklist,%n).item) {
var %i = $v1,%d = $hget(blacklist,%i)
%c %n $+ . %i $+ : %d
inc %n
}
if (%n > 1) %c - End -
}
elseif ($1 == add) {
var %yn = $b.add($$2,$3-)
if (%yn) %c * Successfully added $qt($2) for $qt($hget(blacklist,$2))
else %c * Error, $qt($2) is already listed
}
elseif ($istok(rem del delete remove,$1,32)) {
var %yn = $b.del($$2)
if (%yn) %c * %yn
else %c * Error, $qt($2) is not listed
}
elseif ($1 == clear) {
clear @bcmd
%c - Blacklist Console -
%c For help, or more information regarding the console, type help.
}
elseif ($1 == set) {
if ($2 == stickyban) {
if ($istok(on off,$3,32)) {
set %bl.keep.ban $replace($3,on,$true,off,$false)
%c * Set stickyban to $3
}
else %c * Error, syntax: set stickyban ON/OFF
}
elseif ($2 == partban) {
if ($istok(on off,$3,32)) {
set %bl.part.ban $replace($3,on,$true,off,$false)
%c * Set parting ban to $3
}
else %c * Error, syntax: set partban ON/OFF
}
else %c * Error, invalid parameters
}
elseif ($1 == help) {
if ($2 == commands) {
%c - Commands -
%c clear : Clears the @BCMD window
%c list : Lists every blacklist entry
%c add <entry> <reason> : Adds a blacklist entry
%c delete <entry|N|-c> : Deletes from or clears the blacklist
}
elseif ($2 == settings) {
%c - Settings -
%c Syntax: set <option> <on/off>
%c stickyban : A ban that is reset everytime it's removed to help enforce it
%c partban : Parting ban that bans a user on /part. Something different.
}
else {
%c - Help -
%c Syntax: help <topic>; Topics are as follow: commands, settings
%c About: This project was designed to be friendly, reliable, and a fast-acting blacklist.
}
}
%c $crlf
else return
}
on *:tabcomp:@bcmd:{
var %item = $gettok($1-,$numtok($1-,32),32)
if ($hfind(blacklist,$+(%item,*),1,w)) {
var %m = $v1,%1 = $reptok($1-,%item,%m,1,32)
editbox @bcmd %1
}
}
menu menubar,channel,status,@bcmd {
Blacklist
.Console:b.cmd
.-
.$b.list(-a) $iif($b.list(-a) == 1,Entry,Entries) :return
.-
.$iif($keep.ban,$style(1)) Sticky ban:set %bl.keep.ban $iif($keep.ban,$false,$true)
.$iif($part.ban,$style(1)) Parting ban:set %bl.part.ban $iif($part.ban,$false,$true)
.-
.$iif($active !ischan || !$hget(blacklist,0).item,$style(2)) Update:b.update $chan
.-
.Add:b.add $$?="Address & Reason:"
.$iif(!$hget(blacklist,0).item,$style(2)) Delete:b.del $$?="Address (or entry number):"
.-
.$iif(!$hget(blacklist,0).item,$style(2)) Clear:b.del -c
}
menu nicklist {
.-
Blacklist
.Console:b.cmd
.-
.$iif(!$b.check($address($1,5)),$style(2)) Listed $iif($b.check($address($1,5)),( $+ $gettok($v1,2-,32) $+ )) :{
var %x = $?="New reason:"
if (%x) hadd blacklist $gettok($b.check($address($1,5)),1,32) %x
}
.-
.$iif($b.check($address($1,5)),$style(2)) Add:b.add $address($1,2) $?="Reason:"
.$iif(!$b.check($address($1,5)),$style(2)) Delete:b.del $gettok($b.check($address($1,5)),1,32)
}