Hashtable Blacklist v1.5

By Pass on Aug 26, 2007

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.

  • Updates [Newest>Oldest]-
  • Updated the $b.check alias

  • Created the console
  • Implemented tab-completion in the console, for easy blacklist searching

The following is a list of the aliases within the script and how to use them:

  • Using the alias as an IDENTIFIER will return confirmations

/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)
}

Comments

Sign in to comment.
Are you sure you want to unfollow this person?
Are you sure you want to delete this?
Click "Unsubscribe" to stop receiving notices pertaining to this post.
Click "Subscribe" to resume notices pertaining to this post.