This is the new home of the egghelp.org community forum.
All data has been migrated (including user logins/passwords) to a new phpBB version.


For more information, see this announcement post. Click the X in the top right-corner of this box to dismiss this message.

Blacklist script by Sir_fz

Support & discussion of released scripts, and announcements of new releases.
A
AzOt
Voice
Posts: 8
Joined: Tue Oct 26, 2010 1:45 pm

Post by AzOt »

will there be a next version using namespace eval? including bind nick?

cordially

Sorry for my English
s
simo
Revered One
Posts: 1143
Joined: Sun Mar 22, 2015 2:41 pm

Re: Blacklist script by Sir_fz

Post by simo »

i have a strange issue when trying to remove a ban

Code: Select all


#############################################################################
#                                                                           #
# Coded by: Opposing (Fz_Egg@yahoo.com)                                     #
# Version : 1.4                                                             #
# Released: November 29, 2010                                               #
# Source  : http://Sir-Fz.blogspot.com/                                     #
##                                                                          #
# Description: A blacklist script that stores the banned masks in a db file #
#              and bans everyone who matches the blacklisted masks on join  #
#              or when the bot gets op.                                     #
#                                                                           #
# Available Commands:                                                       #
# - DCC: .addbl <nick>!<user>@<host> [reason] [bantime] : Adds ban.         #
#        .rembl <nick>!<user>@<host>                    : Deletes ban.      #
#        .listbl                                        : Lists bans.       #
# - PUB: addbl <nick>!<user>@<host> [reason] [bantime]  : Adds ban          #
#        rembl <nick>!<user>@<host>                     : Deletes ban.      #
#        listbl                                         : Lists bans.       #
#                                                                           #
# USE (DCC) .chanset #channel +blacklist to enable blacklist on a channel.  #
#                                                                           #
# Credits:                                                                  #
#         Thanks to strikelite and user (if I recall correctly) from the    #
#         egghelp.org forum for helping me with this script (back in 2003). #
#         Also used user's (egghelp.org forum) maskhost proc.               #
#                                                                           #
# History:                                                                  #
#         - 1.4: Fixed a bug when using the bansame option where nicknames  #
#           with special characters (\, [, ]) were not properly banned.     #
#         - 1.3: Added Flooding out protection, where the bot will start    #
#           using the slowest queue in case a number of blacklisted users   #
#           join in a certain period of seconds which can be defined by the #
#           user. + fixed a bug with brackets.                              #
#         - 1.2: Fixed a few bugs and made the script create the blacklist  #
#           file if it doesn't exist.                                       #
#         - 1.1: added the black list chan flag, and other features into    #
#           patterns of handling the blacklist.                             #
#         - 1.0: First release.                                             #
#                                                                           #
# Report bugs/suggestions to Fz_Egg@yahoo.com                               #
#                                                                           #
# Copyright © 2005 Opposing (aka Sir_Fz)                                    #
#                                                                           #
# This program is free software; you can redistribute it and/or modify      #
# it under the terms of the GNU General Public License as published by      #
# the Free Software Foundation; either version 2 of the License, or         #
# (at your option) any later version.                                       #
#                                                                           #
# This program is distributed in the hope that it will be useful,           #
# but WITHOUT ANY WARRANTY; without even the implied warranty of            #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             #
# GNU General Public License for more details.                              #
#                                                                           #
# You should have received a copy of the GNU General Public License         #
# along with this program; if not, write to the Free Software               #
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA #
#                                                                           #
#############################################################################
#
##############################
# Configurations start here: #
# __________________________ #

## Blacklist File:
#set blackl(file) "scripts/blacklist.txt"
set blackl(file) "test-scripts-6/blacklist.txt"


## Blacklist "Excess Flood" protection. Set here how many blacklisted users are allowed
## to join in how many seconds before using the slow queue in order for the bot not to
## flood out with reason "Excess Flood."
set blackl(punish) 4:2

## Do you want the bot to also check for blacklisted users on op ? (0: no / 1: yes)
set blackl(checkop) 1

## Do you want to ban the same ban from the blacklist file
## or do you want it to be spcific ? (0: specific / 1: same ban as the file) 
### example:
## Suppose that *!lamest@* is banned.
# .. joins lamer!lamest@lamer.org
# .. bot sets mode +b *!lamest@*
# .. lamer kicked by bot "Blacklisted user."
## This happens if this option is set to 1.
## but if you set it to 0, then you can choose what bantype you want to ban.
set blackl(bansame) 1

## if blackl(bansame) is set to 0:
## What ban type do you want to ban ?
# 0: *!user@full.host.tld 
# 1: *!*user@full.host.tld 
# 2: *!*@full.host.tld 
# 3: *!*user@*.host.tld 
# 4: *!*@*.host.tld 
# 5: nick!user@full.host.tld 
# 6: nick!*user@full.host.tld 
# 7: nick!*@full.host.tld 
# 8: nick!*user@*.host.tld 
# 9: nick!*@*.host.tld
set blackl(btype) 2

## Set default ban reason if not specified.
## NOTE: use %requester to use the nick of the one who set the ban.
set blackl(kmsg) "Banned: Requested by %requester"

## set default ban time (in minutes) if no bantime specified. (0 means no ban time)
set blackl(btime) 0

## Do you want the ban to be removed from the file after ban time expires ? (0: no / 1: yes)
## if set to 0, the bot will only remove the ban from the channel but not from the file.
set blackl(rbabt) 0

## Set here the trigger for public commands.
## example: set blackl(trig) "!"
## now using !listbl on main will show the blacklist.
set blackl(trig) "!"

## Set flags that are allowed to use these commands.
## <global flags>|<channel flags>
set blackl(flags) n|-

# Configurations end here. #
############################
#
######################################################################
# Code starts here, please do not edit anything unless you know TCL: #
# __________________________________________________________________ #


bind nick - * bl:ban
bind join - * bl:ban
bind dcc $blackl(flags) addbl bl:add
bind dcc $blackl(flags) rembl bl:rem
bind dcc $blackl(flags) listbl bl:list
bind pubm $blackl(flags) * bl:pub
bind mode - "* +o" bl:cop
setudef flag blacklist

if {[file exists $blackl(file)]} {
  set BLNicks [split [read [set inf [open $blackl(file)]]] "\n"][close $inf]
} {
 set BLNicks [list]
}

foreach {blackl(lim) blackl(secs)} [split $blackl(punish) :] {break}

proc bl:ban {nick uhost hand chan {nn ""}} {
 global BLNicks blackl blflood
 if {![botisop $chan] || ![channel get $chan blacklist]} {return 0}
 if {![info exists blflood([set chan [string tolower $chan]])]} { set blflood($chan) 0 }
 if {$nn != ""} { set nick $nn }
 foreach blnick $BLNicks {
  if {[string match -nocase [set ban [lindex [split $blnick] 0]] $nick!$uhost]} {
   set ban [string map {\\\\ \\ \\\[ \[ \\\] \]} $ban] 
   if {[blfollow $blackl(secs) blflood($chan)] < $blackl(lim)} {
    putquick "KICK $chan $nick :[string map [list %requester [lindex [split $blnick] 1]] [join [lrange [split $blnick] 2 end-1]]]"
  if {$blackl(bansame)} { 
   set ban [string map {\\\\ \\ \\\[ \[ \\\] \]} $ban]
   putquick "MODE $chan -o+b $nick $ban"
     if {!([set btime [lindex [split $blnick] end]] <= 0)} {
      timer $btime [list rem:blban $chan $ban]
     }
    } {
     putquick "MODE $chan -o+b $nick [set aban [blbtype $nick!$uhost $blackl(btype)]]"
     if {!([set btime [lindex [split $blnick] end]] <= 0)} {
      timer $btime [list rem:blban $chan $aban]
     }
    }
   } {
    puthelp "KICK $chan $nick :[string map [list %requester [lindex [split $blnick] 1]] [join [lrange [split $blnick] 2 end-1]]]"
  if {$blackl(bansame)} {
   set ban [string map {\\\\ \\ \\\[ \[ \\\] \]} $ban]
   pushmode $chan -o $nick
   pushmode $chan +b $ban
     if {!([set btime [lindex [split $blnick] end]] <= 0)} {
      timer $btime [list rem:blban $chan $ban]
     }
    } {
     pushmode $chan -o $nick
     pushmode $chan +b [set aban [blbtype $nick!$uhost $blackl(btype)]]
     if {!([set btime [lindex [split $blnick] end]] <= 0)} {
      timer $btime [list rem:blban $chan $aban]
     }
    }
   }
   putlog "\[\002BlackList\002\]: Banned \002$nick\002!\002$uhost\002 matching [string map {! \002!\002 @ \002@\002} \002$ban\002] on \002$chan\002"
   break
  }
 }
}

proc bl:add {hand idx arg} {
 if {$arg == ""} { putlog "SYNTAX: \003.addbl <nick!user@host> \[reason\] \[btime\]\003"; return 0 }
 if {![string match -nocase *!*@* [set blnick [lindex [split $arg] 0]]]} {
  putlog "SYNTAX: \003.addbl \002<nick>\002!\002<user>\002@\002<host>\002 \[reason\] \[bantime\]\003"
  return 0
 }
 if {[bl:do:add $hand $arg]} {
  foreach chan [channels] {
   if {![channel get $chan blacklist]} { continue }
   foreach ubchecked [chanlist $chan] {
    bl:ban $ubchecked [getchanhost $ubchecked $chan] [nick2hand $ubchecked] $chan
   }
  }
  putlog "[string map {! \002!\002 @ \002@\002} \002$blnick\002] has been \002added\002 to the blacklist."
 } {
  putlog "[string map {! \002!\002 @ \002@\002} \002$blnick\002] already \002exists\002 in the blacklist."
 }
}

proc bl:do:add {hand arg} {
 global blackl BLNicks
 set added 0
 if {[llength [lrange [split $arg] 1 end]] == 1} {
  if {[string is integer [lindex [split $arg] end]]} {
   set kreason "$blackl(kmsg)"
   set btime "[lindex [split $arg] end]"
  } else {
   set kreason "[lrange [split $arg] 1 end]"
   set btime "$blackl(btime)"
  }
 } elseif {[llength [lrange [split $arg] 1 end]] > 1} {
  if {[string is integer [lindex [split $arg] end]]} {
   set kreason "[join [lrange [split $arg] 1 end-1]]"
   set btime "[lindex [split $arg] end]"
  } else {
   set kreason "[join [lrange [split $arg] 1 end]]"
   set btime "$blackl(btime)"
  }
 } else {
  set kreason "$blackl(kmsg)"
  set btime "$blackl(btime)"
 }
 if {![file exists $blackl(file)]} { 
  set temp [open $blackl(file) w]
  close $temp
 }
 set blnick "[string map {\\ \\\\ \[ \\\[ \] \\\]} [lindex [split $arg] 0]]"
 if {![we:can:find:ban $blnick add]} {
  puts [set fs [open $blackl(file) a]] "$blnick $hand $kreason $btime"
  close $fs
  set BLNicks [split [read [set inf [open $blackl(file)]]] "\n"][close $inf]
  set added 1
 }
 set added
}

proc bl:rem {hand idx arg} {
 if {$arg == ""} { putlog "SYNTAX: \003.rembl <nick!user@host>\003"; return 0 }
 if {![string match -nocase *!*@* [set blnick [lindex [split $arg] 0]]]} { 
  putlog "SYNTAX: \003.rembl \002<nick>\002!\002<user>\002@\002<host>\002\003"
  return 0
 }
 if {[bl:do:rem $arg]} {
  foreach chan [channels] {
   if {![channel get $chan blacklist]} { continue }
   foreach ban [chanbans $chan] {
    if {[string match -nocase $blnick [set sban [lindex $ban 0]]]} {
     pushmode $chan -b $sban
    }
   }
  }
  putlog "[string map {! \002!\002 @ \002@\002} \002$blnick\002] was \002deleted\002 from the blacklist."
 } {
  putlog "[string map {! \002!\002 @ \002@\002} \002$blnick\002] was \002not\002 found in the blacklist."
 }
}

proc bl:do:rem arg {
 global blackl BLNicks
 set remmed 0
 set blnick [lindex [split $arg] 0]
 if {![file exists $blackl(file)]} { 
  set temp [open $blackl(file) w]
  close $temp
 }
 if {[we:can:find:ban $blnick rem]} {
  set z ""
  set a [open $blackl(file) r]
  while {![eof $a]} {
   set b [gets $a]
   if {![string equal -nocase [lindex $b 0] $blnick]} { lappend z ${b} }
  }
  close $a
  set n [open $blackl(file) w]
  foreach k $z {
   if {$k != ""} { puts $n $k }
  }
  close $n
  set BLNicks [split [read [set inf [open $blackl(file)]]] "\n"][close $inf]
  set remmed 1
 }
 set remmed
}

proc bl:list {hand idx arg} {
 global BLNicks
 if {[string equal "{} {}" $BLNicks] || [string equal "" $BLNicks]} {
  putlog "There are \002no\002 bans in the blacklist."
 } {
  set c 1
  foreach blnick $BLNicks {
   if {$blnick != ""} {
    putlog "\[\002$c\002\] - \002Mask\002: [lindex [split $blnick] 0] - \002Requester\002: [lindex [split $blnick] 1] - \002Bantime\002: [lindex [split $blnick] end]"
    incr c
   } {
    putlog "\[\002*\002\] - End of list."
   }
  }
 }
}

proc bl:pub {nick uhost hand chan arg} {
 global blackl BLNicks
 if {![string equal $blackl(trig) [string index $arg 0]]} {return 0}
 # switch -- [lindex [lindex [split $arg $blackl(trig)] 1] 0] {}
    switch -- [lindex [split [lindex [split $arg $blackl(trig)] 1]] 0] { 
  "xaddbl" {
   if {[join [lrange [split $arg] 1 end]] == ""} { puthelp "NOTICE $nick :SYNTAX: \003$blackl(trig)addbl <nick!user@host> \[reason\] \[btime\]\003"; return 0 }
   if {![string match -nocase *!*@* [set blnick [lindex [split $arg] 1]]]} {
    puthelp "NOTICE $nick :SYNTAX: \003$blackl(trig)addbl \002<nick>\002!\002<user>\002@\002<host>\002 \[reason\] \[bantime\]\003"
    return 0
   }
   if {[bl:do:add $hand [join [lrange [split $arg] 1 end]]]} {
    if {[channel get $chan blacklist]} {
     foreach ubchecked [chanlist $chan] {
      bl:ban $ubchecked [getchanhost $ubchecked $chan] [nick2hand $ubchecked] $chan
     }
    }
     pushmode $chan +b $blnick
    puthelp "NOTICE $nick :[string map {! \002!\002 @ \002@\002} \002$blnick\002] has been \002added\002 to the blacklist."
   } {
    puthelp "NOTICE $nick :[string map {! \002!\002 @ \002@\002} \002$blnick\002] already \002exists\002 in the blacklist."
   }
  }
  "xrembl" {
   #  putchan $chan "[join [lrange [split $arg] 1 end]]"
   if {[join [lrange [split $arg] 1 end]] == ""} { puthelp "NOTICE $nick :SYNTAX: \003$blackl(trig)rembl <nick!user@host>\003"; return 0 }
   if {![string match -nocase *!*@* [set blnick [lindex [split $arg] 1]]]} { 
    puthelp "NOTICE $nick :SYNTAX: \003$blackl(trig)rembl \002<nick>\002!\002<user>\002@\002<host>\002\003"
    return 0
   }
   if {[bl:do:rem [join [lrange [split $arg] 1 end]]]} { 
    if {[channel get $chan blacklist]} {
     foreach ban [chanbans $chan] {
      if {[string match -nocase $blnick [set sban [lindex $ban 0]]]} {
       pushmode $chan -b $sban
      }
     }
    }
    puthelp "NOTICE $nick :[string map {! \002!\002 @ \002@\002} \002$blnick\002] was \002deleted\002 from the blacklist."
   } {
    puthelp "NOTICE $nick :[string map {! \002!\002 @ \002@\002} \002$blnick\002] was \002not\002 found in the blacklist."
   }
  }
  "xlistbl" {
   if {[string equal "{} {}" $BLNicks] || [string equal "" $BLNicks]} {
    puthelp "NOTICE $nick :There are \002no\002 bans in the blacklist."
   } {
    set c 1
    foreach blnick $BLNicks {
     if {$blnick != ""} {
      puthelp "NOTICE $nick :\[\002$c\002\] - \002Mask\002: [lindex [split $blnick] 0] - \002Requester\002: [lindex [split $blnick] 1] - \002Bantime\002: [lindex [split $blnick] end]"
      incr c
     } {
      puthelp "NOTICE $nick :\[\002*\002\] - End of list."
     }
    }
   }
  }
 }
}

proc bl:cop {nick uhost hand chan mc targ} {
 global blackl
 if {[isbotnick $targ] && $blackl(checkop) && [channel get $chan blacklist]} {
  foreach blnick [chanlist $chan] {
   bl:ban $blnick [getchanhost $blnick $chan] [nick2hand $blnick] $chan
  }
 }
}

proc rem:blban {chan ban} {
 global blackl
 if {$blackl(rbabt)} {
  pushmode $chan -b $ban
  bl:do:rem $ban
 } {
  pushmode $chan -b $ban
 }
}

proc we:can:find:ban {blnick type} {
 global blackl
 set spfound 0
 switch -- $type {
  "add" { 
   foreach temp [split [string tolower [read [set inf [open $blackl(file)]]]] "\n"][close $inf] {
    if {[string equal -nocase [lindex [split $temp] 0] $blnick]} { set spfound 1 ; break }
   }
  }
  "rem" {
   foreach temp [split [string tolower [read [set inf [open $blackl(file)]]]] "\n"][close $inf] {
    if {[string equal -nocase [lindex [split $temp] 0] [string map {\\ \\\\ \[ \\\[ \] \\\]} $blnick]]} { set spfound 1 ; break }
   }
  }
 }
 set spfound
}

proc blfollow {secs blvar} {
 upvar $blvar fvar
 utimer $secs [list bldicr $blvar]
 incr fvar
}

proc bldicr blvar {
 upvar $blvar fvar
 if {$fvar > 0} {
  incr fvar -1
 }
}

set blbtypeDefaultType 3

proc blbtype [list name [list type $blbtypeDefaultType]] { 
 if {[scan $name {%[^!]!%[^@]@%s} nick user host]!=3} { 
  error "Usage: maskbhost <nick!user@host> \[type\]" 
 } 
 if [string match {[3489]} $type] { 
  if [string match {*[0-9]} $host] { 
   set host [join [lrange [split $host .] 0 2] .].* 
  } elseif {[string match *.*.* $host]} { 
   set host *.[join [lrange [split $host .] end-1 end] .] 
  } 
 } 
 if [string match {[1368]} $type] { 
  set user *[string trimleft $user ~] 
 } elseif {[string match {[2479]} $type]} { 
  set user * 
 } 
 if [string match {[01234]} $type] { 
  set nick * 
 } 
 set name $nick!$user@$host 
}

putlog "BlackList v1.4 By Opposing (a.k.a Sir_Fz) Loaded..."


using this command :
!rembl ALme*ria*!*@* testing
gettin this error :
Tcl error [bl:pub]: list element in braces followed by "*!*@*" instead of space

output of .set errorInfo:


.set errorInfo
Currently: list element in braces followed by "*!*@*" instead of space
Currently: while executing
Currently: "lindex $b 0"
Currently: (procedure "bl:do:rem" line 14)
Currently: invoked from within
Currently: "bl:do:rem [join [lrange [split $arg] 1 end]]"
Currently: (procedure "bl:pub" line 31)
Currently: invoked from within
Currently: "bl:pub $_pubm1 $_pubm2 $_pubm3 $_pubm4 $_pubm5"
User avatar
CrazyCat
Revered One
Posts: 1384
Joined: Sun Jan 13, 2002 8:00 pm
Location: France
Contact:

Re: Blacklist script by Sir_fz

Post by CrazyCat »

Because you kept
switch -- [lindex [split [lindex [split $arg $blackl(trig)] 1]] 0] {
We spoke about that in #eggdrop
switch -- [string range $arg 1 end] {
And you treat string as lists...
set b [gets $a]
   if {![string equal -nocase [lindex $b 0] $blnick]} { lappend z ${b} }
Why don't use:
if {[string equal -nocase [string index $b 0] $blnick]}
s
simo
Revered One
Posts: 1143
Joined: Sun Mar 22, 2015 2:41 pm

Re: Blacklist script by Sir_fz

Post by simo »

thanks CrazyCat, after i apllied the changes i get this complaint:

(+Amigo) : !rembl \[ALme\]ria*!*@*
getting this complaint:
\[ALme\]ria*!*@* was not found in the blacklist.
while the ban is in the banlist::

(+Amigo) : !listbl
[1] - Mask: {ALJHHGHG_KHJ}*!*@* - Requester: ctcp - Bantime: 0
[2] - Mask: \[AL\]me?ria}*!*@* - Requester: ctcp - Bantime: 0
[3] - Mask: ALme?ria*!*@* - Requester: ctcp - Bantime: 0
[4] - Mask: ALme*ria*!*@* - Requester: ctcp - Bantime: 0
[5] - Mask: \[ALme\]ria*!*@* - Requester: ctcp - Bantime: 0
[*] - End of list.

also when using :

!rembl [ALme]ria*!*@*
i get this error again:
Tcl error [bl:pub]: list element in braces followed by "*!*@*" instead of space

14:43:34 <Amigo> .set errorInfo
14:43:34 <Hawk> Currently: list element in braces followed by "*!*@*" instead of space
14:43:34 <Hawk> Currently: while executing
14:43:34 <Hawk> Currently: "lindex $b 0"
14:43:34 <Hawk> Currently: (procedure "bl:do:rem" line 14)
14:43:34 <Hawk> Currently: invoked from within
14:43:34 <Hawk> Currently: "bl:do:rem [join [lrange [split $arg] 1 end]]"
14:43:34 <Hawk> Currently: (procedure "bl:pub" line 31)
14:43:34 <Hawk> Currently: invoked from within
14:43:34 <Hawk> Currently: "bl:pub $_pubm1 $_pubm2 $_pubm3 $_pubm4 $_pubm5"
current code:

Code: Select all


#############################################################################
#                                                                           #
# Coded by: Opposing (Fz_Egg@yahoo.com)                                     #
# Version : 1.4                                                             #
# Released: November 29, 2010                                               #
# Source  : http://Sir-Fz.blogspot.com/                                     #
##                                                                          #
# Description: A blacklist script that stores the banned masks in a db file #
#              and bans everyone who matches the blacklisted masks on join  #
#              or when the bot gets op.                                     #
#                                                                           #
# Available Commands:                                                       #
# - DCC: .addbl <nick>!<user>@<host> [reason] [bantime] : Adds ban.         #
#        .rembl <nick>!<user>@<host>                    : Deletes ban.      #
#        .listbl                                        : Lists bans.       #
# - PUB: addbl <nick>!<user>@<host> [reason] [bantime]  : Adds ban          #
#        rembl <nick>!<user>@<host>                     : Deletes ban.      #
#        listbl                                         : Lists bans.       #
#                                                                           #
# USE (DCC) .chanset #channel +blacklist to enable blacklist on a channel.  #
#                                                                           #
# Credits:                                                                  #
#         Thanks to strikelite and user (if I recall correctly) from the    #
#         egghelp.org forum for helping me with this script (back in 2003). #
#         Also used user's (egghelp.org forum) maskhost proc.               #
#                                                                           #
# History:                                                                  #
#         - 1.4: Fixed a bug when using the bansame option where nicknames  #
#           with special characters (\, [, ]) were not properly banned.     #
#         - 1.3: Added Flooding out protection, where the bot will start    #
#           using the slowest queue in case a number of blacklisted users   #
#           join in a certain period of seconds which can be defined by the #
#           user. + fixed a bug with brackets.                              #
#         - 1.2: Fixed a few bugs and made the script create the blacklist  #
#           file if it doesn't exist.                                       #
#         - 1.1: added the black list chan flag, and other features into    #
#           patterns of handling the blacklist.                             #
#         - 1.0: First release.                                             #
#                                                                           #
# Report bugs/suggestions to Fz_Egg@yahoo.com                               #
#                                                                           #
# Copyright © 2005 Opposing (aka Sir_Fz)                                    #
#                                                                           #
# This program is free software; you can redistribute it and/or modify      #
# it under the terms of the GNU General Public License as published by      #
# the Free Software Foundation; either version 2 of the License, or         #
# (at your option) any later version.                                       #
#                                                                           #
# This program is distributed in the hope that it will be useful,           #
# but WITHOUT ANY WARRANTY; without even the implied warranty of            #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             #
# GNU General Public License for more details.                              #
#                                                                           #
# You should have received a copy of the GNU General Public License         #
# along with this program; if not, write to the Free Software               #
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA #
#                                                                           #
#############################################################################
#
##############################
# Configurations start here: #
# __________________________ #

## Blacklist File:
#set blackl(file) "scripts/blacklist.txt"
set blackl(file) "test-scripts-6/blacklist.txt"


## Blacklist "Excess Flood" protection. Set here how many blacklisted users are allowed
## to join in how many seconds before using the slow queue in order for the bot not to
## flood out with reason "Excess Flood."
set blackl(punish) 4:2

## Do you want the bot to also check for blacklisted users on op ? (0: no / 1: yes)
set blackl(checkop) 1

## Do you want to ban the same ban from the blacklist file
## or do you want it to be spcific ? (0: specific / 1: same ban as the file) 
### example:
## Suppose that *!lamest@* is banned.
# .. joins lamer!lamest@lamer.org
# .. bot sets mode +b *!lamest@*
# .. lamer kicked by bot "Blacklisted user."
## This happens if this option is set to 1.
## but if you set it to 0, then you can choose what bantype you want to ban.
set blackl(bansame) 1

## if blackl(bansame) is set to 0:
## What ban type do you want to ban ?
# 0: *!user@full.host.tld 
# 1: *!*user@full.host.tld 
# 2: *!*@full.host.tld 
# 3: *!*user@*.host.tld 
# 4: *!*@*.host.tld 
# 5: nick!user@full.host.tld 
# 6: nick!*user@full.host.tld 
# 7: nick!*@full.host.tld 
# 8: nick!*user@*.host.tld 
# 9: nick!*@*.host.tld
set blackl(btype) 2

## Set default ban reason if not specified.
## NOTE: use %requester to use the nick of the one who set the ban.
set blackl(kmsg) "Banned: Requested by %requester"

## set default ban time (in minutes) if no bantime specified. (0 means no ban time)
set blackl(btime) 0

## Do you want the ban to be removed from the file after ban time expires ? (0: no / 1: yes)
## if set to 0, the bot will only remove the ban from the channel but not from the file.
set blackl(rbabt) 0

## Set here the trigger for public commands.
## example: set blackl(trig) "!"
## now using !listbl on main will show the blacklist.
set blackl(trig) "!"

## Set flags that are allowed to use these commands.
## <global flags>|<channel flags>
set blackl(flags) n|-

# Configurations end here. #
############################
#
######################################################################
# Code starts here, please do not edit anything unless you know TCL: #
# __________________________________________________________________ #


bind nick - * bl:ban
bind join - * bl:ban
bind dcc $blackl(flags) addbl bl:add
bind dcc $blackl(flags) rembl bl:rem
bind dcc $blackl(flags) listbl bl:list
bind pubm $blackl(flags) * bl:pub
bind mode - "* +o" bl:cop
setudef flag blacklist

if {[file exists $blackl(file)]} {
  set BLNicks [split [read [set inf [open $blackl(file)]]] "\n"][close $inf]
} {
 set BLNicks [list]
}

foreach {blackl(lim) blackl(secs)} [split $blackl(punish) :] {break}

proc bl:ban {nick uhost hand chan {nn ""}} {
 global BLNicks blackl blflood
 if {![botisop $chan] || ![channel get $chan blacklist]} {return 0}
 if {![info exists blflood([set chan [string tolower $chan]])]} { set blflood($chan) 0 }
 if {$nn != ""} { set nick $nn }
 foreach blnick $BLNicks {
  if {[string match -nocase [set ban [lindex [split $blnick] 0]] $nick!$uhost]} {
   set ban [string map {\\\\ \\ \\\[ \[ \\\] \]} $ban] 
   if {[blfollow $blackl(secs) blflood($chan)] < $blackl(lim)} {
    putquick "KICK $chan $nick :[string map [list %requester [lindex [split $blnick] 1]] [join [lrange [split $blnick] 2 end-1]]]"
  if {$blackl(bansame)} { 
   set ban [string map {\\\\ \\ \\\[ \[ \\\] \]} $ban]
   putquick "MODE $chan -o+b $nick $ban"
     if {!([set btime [lindex [split $blnick] end]] <= 0)} {
      timer $btime [list rem:blban $chan $ban]
     }
    } {
     putquick "MODE $chan -o+b $nick [set aban [blbtype $nick!$uhost $blackl(btype)]]"
     if {!([set btime [lindex [split $blnick] end]] <= 0)} {
      timer $btime [list rem:blban $chan $aban]
     }
    }
   } {
    puthelp "KICK $chan $nick :[string map [list %requester [lindex [split $blnick] 1]] [join [lrange [split $blnick] 2 end-1]]]"
  if {$blackl(bansame)} {
   set ban [string map {\\\\ \\ \\\[ \[ \\\] \]} $ban]
   pushmode $chan -o $nick
   pushmode $chan +b $ban
     if {!([set btime [lindex [split $blnick] end]] <= 0)} {
      timer $btime [list rem:blban $chan $ban]
     }
    } {
     pushmode $chan -o $nick
     pushmode $chan +b [set aban [blbtype $nick!$uhost $blackl(btype)]]
     if {!([set btime [lindex [split $blnick] end]] <= 0)} {
      timer $btime [list rem:blban $chan $aban]
     }
    }
   }
   putlog "\[\002BlackList\002\]: Banned \002$nick\002!\002$uhost\002 matching [string map {! \002!\002 @ \002@\002} \002$ban\002] on \002$chan\002"
   break
  }
 }
}

proc bl:add {hand idx arg} {
 if {$arg == ""} { putlog "SYNTAX: \003.addbl <nick!user@host> \[reason\] \[btime\]\003"; return 0 }
 if {![string match -nocase *!*@* [set blnick [lindex [split $arg] 0]]]} {
  putlog "SYNTAX: \003.addbl \002<nick>\002!\002<user>\002@\002<host>\002 \[reason\] \[bantime\]\003"
  return 0
 }
 if {[bl:do:add $hand $arg]} {
  foreach chan [channels] {
   if {![channel get $chan blacklist]} { continue }
   foreach ubchecked [chanlist $chan] {
    bl:ban $ubchecked [getchanhost $ubchecked $chan] [nick2hand $ubchecked] $chan
   }
  }
  putlog "[string map {! \002!\002 @ \002@\002} \002$blnick\002] has been \002added\002 to the blacklist."
 } {
  putlog "[string map {! \002!\002 @ \002@\002} \002$blnick\002] already \002exists\002 in the blacklist."
 }
}

proc bl:do:add {hand arg} {
 global blackl BLNicks
 set added 0
 if {[llength [lrange [split $arg] 1 end]] == 1} {
  if {[string is integer [lindex [split $arg] end]]} {
   set kreason "$blackl(kmsg)"
   set btime "[lindex [split $arg] end]"
  } else {
   set kreason "[lrange [split $arg] 1 end]"
   set btime "$blackl(btime)"
  }
 } elseif {[llength [lrange [split $arg] 1 end]] > 1} {
  if {[string is integer [lindex [split $arg] end]]} {
   set kreason "[join [lrange [split $arg] 1 end-1]]"
   set btime "[lindex [split $arg] end]"
  } else {
   set kreason "[join [lrange [split $arg] 1 end]]"
   set btime "$blackl(btime)"
  }
 } else {
  set kreason "$blackl(kmsg)"
  set btime "$blackl(btime)"
 }
 if {![file exists $blackl(file)]} { 
  set temp [open $blackl(file) w]
  close $temp
 }
 set blnick "[string map {\\ \\\\ \[ \\\[ \] \\\]} [lindex [split $arg] 0]]"
 if {![we:can:find:ban $blnick add]} {
  puts [set fs [open $blackl(file) a]] "$blnick $hand $kreason $btime"
  close $fs
  set BLNicks [split [read [set inf [open $blackl(file)]]] "\n"][close $inf]
  set added 1
 }
 set added
}

proc bl:rem {hand idx arg} {
 if {$arg == ""} { putlog "SYNTAX: \003.rembl <nick!user@host>\003"; return 0 }
 if {![string match -nocase *!*@* [set blnick [lindex [split $arg] 0]]]} { 
  putlog "SYNTAX: \003.rembl \002<nick>\002!\002<user>\002@\002<host>\002\003"
  return 0
 }
 if {[bl:do:rem $arg]} {
  foreach chan [channels] {
   if {![channel get $chan blacklist]} { continue }
   foreach ban [chanbans $chan] {
    if {[string match -nocase $blnick [set sban [lindex $ban 0]]]} {
     pushmode $chan -b $sban
    }
   }
  }
  putlog "[string map {! \002!\002 @ \002@\002} \002$blnick\002] was \002deleted\002 from the blacklist."
 } {
  putlog "[string map {! \002!\002 @ \002@\002} \002$blnick\002] was \002not\002 found in the blacklist."
 }
}

proc bl:do:rem arg {
 global blackl BLNicks
 set remmed 0
 set blnick [lindex [split $arg] 0]
 if {![file exists $blackl(file)]} { 
  set temp [open $blackl(file) w]
  close $temp
 }
 if {[we:can:find:ban $blnick rem]} {
  set z ""
  set a [open $blackl(file) r]
  while {![eof $a]} {
   set b [gets $a]
  if {[string equal -nocase [string index $b 0] $blnick]}
  # if {![string equal -nocase [lindex $b 0] $blnick]} { lappend z ${b} }
  }
  close $a
  set n [open $blackl(file) w]
  foreach k $z {
   if {$k != ""} { puts $n $k }
  }
  close $n
  set BLNicks [split [read [set inf [open $blackl(file)]]] "\n"][close $inf]
  set remmed 1
 }
 set remmed
}

proc bl:list {hand idx arg} {
 global BLNicks
 if {[string equal "{} {}" $BLNicks] || [string equal "" $BLNicks]} {
  putlog "There are \002no\002 bans in the blacklist."
 } {
  set c 1
  foreach blnick $BLNicks {
   if {$blnick != ""} {
    putlog "\[\002$c\002\] - \002Mask\002: [lindex [split $blnick] 0] - \002Requester\002: [lindex [split $blnick] 1] - \002Bantime\002: [lindex [split $blnick] end]"
    incr c
   } {
    putlog "\[\002*\002\] - End of list."
   }
  }
 }
}

proc bl:pub {nick uhost hand chan arg} {
 global blackl BLNicks
 if {![string equal $blackl(trig) [string index $arg 0]]} {return 0}
  switch -- [string range $arg 1 end] {
  "addbl" {
   if {[join [lrange [split $arg] 1 end]] == ""} { puthelp "NOTICE $nick :SYNTAX: \003$blackl(trig)addbl <nick!user@host> \[reason\] \[btime\]\003"; return 0 }
   if {![string match -nocase *!*@* [set blnick [lindex [split $arg] 1]]]} {
    puthelp "NOTICE $nick :SYNTAX: \003$blackl(trig)addbl \002<nick>\002!\002<user>\002@\002<host>\002 \[reason\] \[bantime\]\003"
    return 0
   }
   if {[bl:do:add $hand [join [lrange [split $arg] 1 end]]]} {
    if {[channel get $chan blacklist]} {
     foreach ubchecked [chanlist $chan] {
      bl:ban $ubchecked [getchanhost $ubchecked $chan] [nick2hand $ubchecked] $chan
     }
    }
     pushmode2 $chan +b $blnick
    puthelp "NOTICE $nick :[string map {! \002!\002 @ \002@\002} \002$blnick\002] has been \002added\002 to the blacklist."
   } {
    puthelp "NOTICE $nick :[string map {! \002!\002 @ \002@\002} \002$blnick\002] already \002exists\002 in the blacklist."
   }
  }
  "rembl" {
   #  putchan $chan "[join [lrange [split $arg] 1 end]]"
   if {[join [lrange [split $arg] 1 end]] == ""} { puthelp "NOTICE $nick :SYNTAX: \003$blackl(trig)rembl <nick!user@host>\003"; return 0 }
   if {![string match -nocase *!*@* [set blnick [lindex [split $arg] 1]]]} { 
    puthelp "NOTICE $nick :SYNTAX: \003$blackl(trig)rembl \002<nick>\002!\002<user>\002@\002<host>\002\003"
    return 0
   }
   if {[bl:do:rem [join [lrange [split $arg] 1 end]]]} { 
    if {[channel get $chan blacklist]} {
     foreach ban [chanbans $chan] {
      if {[string match -nocase $blnick [set sban [lindex $ban 0]]]} {
       pushmode $chan -b $sban
      }
     }
    }
    puthelp "NOTICE $nick :[string map {! \002!\002 @ \002@\002} \002$blnick\002] was \002deleted\002 from the blacklist."
   } {
    puthelp "NOTICE $nick :[string map {! \002!\002 @ \002@\002} \002$blnick\002] was \002not\002 found in the blacklist."
   }
  }
  "listbl" {
   if {[string equal "{} {}" $BLNicks] || [string equal "" $BLNicks]} {
    puthelp "NOTICE $nick :There are \002no\002 bans in the blacklist."
   } {
    set c 1
    foreach blnick $BLNicks {
     if {$blnick != ""} {
      puthelp "NOTICE $nick :\[\002$c\002\] - \002Mask\002: [lindex [split $blnick] 0] - \002Requester\002: [lindex [split $blnick] 1] - \002Bantime\002: [lindex [split $blnick] end]"
      incr c
     } {
      puthelp "NOTICE $nick :\[\002*\002\] - End of list."
     }
    }
   }
  }
 }
}

proc bl:cop {nick uhost hand chan mc targ} {
 global blackl
 if {[isbotnick $targ] && $blackl(checkop) && [channel get $chan blacklist]} {
  foreach blnick [chanlist $chan] {
   bl:ban $blnick [getchanhost $blnick $chan] [nick2hand $blnick] $chan
  }
 }
}

proc rem:blban {chan ban} {
 global blackl
 if {$blackl(rbabt)} {
  pushmode $chan -b $ban
  bl:do:rem $ban
 } {
  pushmode $chan -b $ban
 }
}

proc we:can:find:ban {blnick type} {
 global blackl
 set spfound 0
 switch -- $type {
  "add" { 
   foreach temp [split [string tolower [read [set inf [open $blackl(file)]]]] "\n"][close $inf] {
    if {[string equal -nocase [lindex [split $temp] 0] $blnick]} { set spfound 1 ; break }
   }
  }
  "rem" {
   foreach temp [split [string tolower [read [set inf [open $blackl(file)]]]] "\n"][close $inf] {
    if {[string equal -nocase [lindex [split $temp] 0] [string map {\\ \\\\ \[ \\\[ \] \\\]} $blnick]]} { set spfound 1 ; break }
   }
  }
 }
 set spfound
}

proc blfollow {secs blvar} {
 upvar $blvar fvar
 utimer $secs [list bldicr $blvar]
 incr fvar
}

proc bldicr blvar {
 upvar $blvar fvar
 if {$fvar > 0} {
  incr fvar -1
 }
}

set blbtypeDefaultType 3

proc blbtype [list name [list type $blbtypeDefaultType]] { 
 if {[scan $name {%[^!]!%[^@]@%s} nick user host]!=3} { 
  error "Usage: maskbhost <nick!user@host> \[type\]" 
 } 
 if [string match {[3489]} $type] { 
  if [string match {*[0-9]} $host] { 
   set host [join [lrange [split $host .] 0 2] .].* 
  } elseif {[string match *.*.* $host]} { 
   set host *.[join [lrange [split $host .] end-1 end] .] 
  } 
 } 
 if [string match {[1368]} $type] { 
  set user *[string trimleft $user ~] 
 } elseif {[string match {[2479]} $type]} { 
  set user * 
 } 
 if [string match {[01234]} $type] { 
  set nick * 
 } 
 set name $nick!$user@$host 
}

#putlog "BlackList v1.4 By Opposing (a.k.a Sir_Fz) Loaded..."

################################ 
putlog "[file normalize [info script]]"
############################### 

User avatar
CrazyCat
Revered One
Posts: 1384
Joined: Sun Jan 13, 2002 8:00 pm
Location: France
Contact:

Re: Blacklist script by Sir_fz

Post by CrazyCat »

I juste gave you some examples of bad usage of [lindex] and other list stuff applyed on strings.
Try to correct everything.

And peharps you can change some things, like using maskhost to create the ban mask rather than the blbtype proc...
The script is old, you'd probably redo it
s
simo
Revered One
Posts: 1143
Joined: Sun Mar 22, 2015 2:41 pm

Re: Blacklist script by Sir_fz

Post by simo »

ok thanks
Post Reply