; ======================
; = 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 *:nick:{
  var %n = 1,%chans
  while ($comchan($nick,%n)) {
    var %chans = $addtok(%chans,$v1,44)

  }
}
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,qoha)) || (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
        return Successfully banished $numtok(%nick,0) user(s)
      }
      else return There are no matches
    }
    else return Error, insufficient status to preform actions
  }
  else return Error, you're not on $qt($1)
}

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 == update) {
    var %r = $b.update($2)
    %c * %r
  }
  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
      %c update <channel> : Checks the channel for blacklisted users
    }
    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, reliabe, and a fast-acting blacklist.
      %c Contact: Klash240@gmail.com
    }
  }
  %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)
}
