Przeglądaj źródła

Add files via upload

Daniel Voipan 5 lat temu
rodzic
commit
626ac1775d
3 zmienionych plików z 1308 dodań i 713 usunięć
  1. 1230 0
      BlackTools/BT.Ban.tcl
  2. 74 713
      BlackTools/BT.Core.tcl
  3. 4 0
      BlackTools/BT.Loader.tcl

+ 1230 - 0
BlackTools/BT.Ban.tcl

@@ -0,0 +1,1230 @@
+##          BlackTools - The Ultimate Channel Control Script             ##
+##                    One TCL. One smart Eggdrop                         ##
+###########################################################################
+#############################   BAN TCL   #################################
+###########################################################################
+##						       		         ##
+##   BlackTools  : http://blacktools.tclscripts.net	   	         ##
+##   Bugs report : http://www.tclscripts.net/	                         ##
+##   GitHub page : https://github.com/tclscripts/BlackToolS-TCL		 ##
+##   Online Help : irc://irc.undernet.org/tcl-help 	       	       	 ##
+##                 #TCL-HELP / UnderNet        	                         ##
+##                 You can ask in english or romanian                    ##
+##					                                 ##	
+###########################################################################
+
+###
+proc blacktools:banlist {chan} {
+	global black
+	set banlist [lsearch -all -inline $black(bans) "* [string tolower $chan] *"]
+	return $banlist
+}
+
+###
+proc blacktools:banlist:ban {chan} {
+	global black
+	set banlist [lsearch -all -inline $black(bans) "BAN * [string tolower $chan] *"]
+	return $banlist
+}
+
+###
+proc blacktools:banlist:regex {chan} {
+	global black
+	set banlist [lsearch -all -inline $black(bans) "REGEX * [string tolower $chan] *"]
+	return $banlist
+}
+
+###
+proc blacktools:gaglist {chan} {
+	global black
+	set banlist [lsearch -all -inline $black(bans) "GAG * [string tolower $chan] *"]
+	return $banlist
+}
+
+###
+proc blacktools:banlist:gl {} {
+	global black
+	set banlist [lsearch -all -inline $black(bans) "* GLOBAL *"]
+	return $banlist
+}
+
+###
+proc blacktools:banlist:all {} {
+	global black
+	set file [open $black(bans_file) r]
+	set size [file size $black(bans_file)]
+	set data [split [read $file $size] \n]
+	close $file
+	set banlist [lsearch -all -inline $data "*"]
+}
+
+###
+proc blacktools:banlist:lastid {} {
+	global black
+if {$black(bans) != ""} {
+foreach b $black(bans) {
+	set id [lindex [split $b] 1]
+	lappend ids $id
+		}
+	set sort [blacktools:quicksort [join $ids]]
+	return [lindex $sort end]
+	} else {return 0}
+}
+
+###
+#https://rosettacode.org/wiki/Sorting_algorithms/Quicksort#Tcl
+proc blacktools:quicksort {m} {
+    if {[llength $m] <= 1} {
+        return $m
+    }
+    set pivot [lindex $m 0]
+    set less [set equal [set greater [list]]]
+    foreach x $m {
+        lappend [expr {$x < $pivot ? "less" : $x > $pivot ? "greater" : "equal"}] $x
+    }
+    return [concat [blacktools:quicksort $less] $equal [blacktools:quicksort $greater]]
+}
+
+###
+proc blacktools:sticky {host chan} {
+	global black
+	set bancheck [lsearch -all -inline $black(bans) "* [string tolower $chan] $host *"]
+if {$bancheck != ""} {
+	return [lindex [split $bancheck] 7]
+	}
+	return
+}
+
+###
+proc blacktools:isgag {host chan} {
+	global black
+	set bancheck [lsearch -all -inline $black(bans) "GAG * [string tolower $chan] $host *"]
+if {$bancheck != ""} {
+	set expire [lindex [split $bancheck] 5]
+	set dif [expr $expire - [unixtime]]
+if {$dif > 0} {
+	return 1
+} else {
+	return 0
+		}
+	} else {
+	return 0
+	}
+}
+
+###
+proc blacktools:isregex {host chan} {
+	global black
+	set bancheck [lsearch -all -inline $black(bans) "REGEX * [string tolower $chan] $host *"]
+if {$bancheck != ""} {
+	set expire [lindex [split $bancheck] 5]
+	set dif [expr $expire - [unixtime]]
+if {$dif > 0} {
+	return 1
+} else {
+	return 0
+		}
+	} else {
+	return 0
+	}
+}
+
+###
+proc blacktools:isban {host chan} {
+	global black
+	set bancheck [lsearch -all -inline $black(bans) "BAN * [string tolower $chan] $host *"]
+if {$bancheck != ""} {
+	return 1
+	} else {
+	return 0
+	}
+}
+
+###
+proc blacktools:addban:gl {nick host hand chan bantime type sticky global reason id} {
+	global black
+	set chan1 $chan
+	set sec_bantime [expr $bantime * 60]
+	set unixtime [unixtime]
+if {$bantime != "0"} {
+	set bantime [expr $unixtime + $sec_bantime]
+}
+	set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}]
+	set temp "$black(bans_file).new.$timestamp"
+	set file [open $black(bans_file) r]
+	set size [file size $black(bans_file)]
+	set data [split [read $file $size] \n]
+	close $file
+	set tempwrite [open $temp w]
+foreach line $data {
+if {$line != ""} {
+	set read_chan [lindex [split $line] 2]
+	set read_host [lindex [split $line] 3]
+if {$type != "REGEX"} {
+	set real_read_host [string map [list \[ {\[} \] {\]} \\ {\\}] $read_host]
+} else {set real_read_host $read_host}
+if {([string match -nocase $host $real_read_host] || [string match -nocase $real_read_host $host] || [string equal -nocase $real_read_host $host]) && [string equal -nocase $chan "GLOBAL"]} { 
+	continue
+		} else {
+	puts $tempwrite $line
+		}
+	}
+}
+	close $tempwrite
+    file rename -force $temp $black(bans_file)
+	blacktools:ban:put $nick $host $hand $chan $bantime $type $sticky $global $reason $id
+}
+
+###
+proc blacktools:delban {host chan global gag} {
+	global black
+if {$global == "1"} {
+	set chan "GLOBAL"
+} else {
+if {![validchan $chan]} {
+	return
+	}
+}
+if {$gag == "1"} {
+	set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}]
+	set temp "$black(bans_file).new.$timestamp"
+	set tempwrite [open $temp w]
+	set file [open $black(bans_file) r]
+	set size [file size $black(bans_file)]
+	set data [split [read $file $size] \n]
+	close $file
+foreach line $data {
+if {$line != ""} {
+	set read_type [lindex [split $line] 0]
+	set read_chan [lindex [split $line] 2]
+	set read_host [lindex [split $line] 3]
+if {[string match -nocase $host $read_host] && [string equal -nocase $chan $read_chan] && [string equal -nocase "GAG" $read_type]} { 
+	continue
+} else {
+	puts $tempwrite $line
+		}	 
+    }
+}
+	close $tempwrite
+    file rename -force $temp $black(bans_file)
+	set black(bans) [blacktools:banlist:all]
+	return
+}
+	set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}]
+	set temp "$black(bans_file).new.$timestamp"
+	set tempwrite [open $temp w]
+	set file [open $black(bans_file) r]
+	set size [file size $black(bans_file)]
+	set data [split [read $file $size] \n]
+	close $file
+foreach line $data {
+if {$line != ""} {
+	set read_chan [lindex [split $line] 2]
+	set read_host [lindex [split $line] 3]
+	set real_read_host [string map [list \[ {\[} \] {\]} \\ {\\}] $read_host]
+if {([string match -nocase $host $real_read_host] || [string match -nocase $real_read_host $host]) && [string equal -nocase $chan $read_chan]} {
+	continue
+} else {
+	puts $tempwrite $line
+		}	 
+    }
+}
+	close $tempwrite
+    file rename -force $temp $black(bans_file)
+	set black(bans) [blacktools:banlist:all]
+}
+
+###
+proc blacktools:addban {nick host hand chan chan1 bantime type sticky global reason notfound cmd type banned prv id} {
+	global black botnick
+	chanserv:ignore_remove
+	set rcmd [lindex $cmd 0]
+	set regex [lindex $cmd 1]
+	set read_num 0
+	set split_hand [split $hand ":"]
+	set gethand [lindex $split_hand 0]
+	set gettype [lindex $split_hand 1]
+if {$gettype == ""} {
+	set hand [string map {":" ""} $hand]
+} else {
+	set length_type [llength [split $gettype]]
+if {$length_type > 1} {
+	set gettype [string map {" " "%"} $gettype]
+	}
+	set hand "$gethand:$gettype"
+}
+	set sec_bantime [expr $bantime * 60]
+	set unixtime [unixtime]
+	set accdenied 0
+	set xban 0
+	set getcount [setting:get $chan kickcount]
+	set show_reason $reason
+if {$bantime != "0"} {
+	set bantime [expr $unixtime + $sec_bantime]
+}
+if {![string equal -nocase $gethand "BADCHAN"] && ![string equal -nocase $gethand "badident"] && ![string equal -nocase $gethand "badnick"] && ![string equal -nocase $gethand "antibadquitpart"] && ![string equal -nocase $gethand "antichanflood"] && ![string equal -nocase $gethand "antispam"] && ![string equal -nocase $gethand "badhost"] && ![string equal -nocase $gethand "inviteban"] && ![string equal -nocase $gethand "private"] && ![string equal -nocase $gethand "clonescan"]} {
+	set show_reason [blacktools:setreason $chan $reason $gethand $bantime $getcount "0" $id]
+}
+	set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}]
+	set temp "$black(bans_file).new.$timestamp"
+	set file [open $black(bans_file) r]
+	set size [file size $black(bans_file)]
+	set data [split [read $file $size] \n]
+	close $file
+	set tempwrite [open $temp w]
+foreach line $data {
+if {$line != ""} {
+	set read_chan [lindex [split $line] 2]
+	set read_host [lindex [split $line] 3]
+if {$regex != "REGEX"} {
+	set real_read_host [string map [list \[ {\[} \] {\]} \\ {\\}] $read_host]
+} else {set real_read_host $read_host}
+if {([string match -nocase $host $real_read_host] || [string match -nocase $real_read_host $host] || [string equal -nocase $real_read_host $host]) && [string equal -nocase $chan $read_chan]} { 
+	set read_num [lindex [split $line] 1]
+	set read_time [lindex [split $line] 5]
+	set read_stick [lindex [split $line] 7]
+	set bywho [lindex [split $line] 4]
+	set split_bywho [split $bywho ":"]
+	set level [lindex $split_bywho 1]
+if {![string equal -nocase $gethand "BADCHAN"] && ![string equal -nocase $gethand "badident"] && ![string equal -nocase $gethand "badnick"] && ![string equal -nocase $gethand "antibadquitpart"] && ![string equal -nocase $gethand "antichanflood"] && ![string equal -nocase $gethand "badrealname"] && ![string equal -nocase $gethand "antispam"] && ![string equal -nocase $gethand "badhost"] && ![string equal -nocase $gethand "inviteban"] && ![string equal -nocase $gethand "private"] && ![string equal -nocase $gethand "clonescan"]} {
+	set show_reason [blacktools:setreason $chan $reason $gethand $read_time $getcount "0" $id]
+}
+	set check [blacktools:check:levelub $gethand $chan $level]
+if {$check == "-1"} {
+	puts $tempwrite $line
+	set accdenied 1
+	continue
+}
+if {[matchattr $gethand -|O $chan] && ($read_time == "0")} {
+	puts $tempwrite $line
+	set accdenied 1
+	continue
+}
+if {[matchattr $gethand -|OAS $chan] && ($read_stick == "1")} {
+	puts $tempwrite $line
+	set accdenied 1
+	continue
+}	
+	continue
+} else {
+	puts $tempwrite $line
+		}	 
+    }
+}
+	close $tempwrite
+    file rename -force $temp $black(bans_file)
+if {$read_num != "0"} {
+	set id $read_num
+}
+if {$accdenied == "0"} {
+if {$rcmd == "b" && $type != "gl"} {
+if {$prv != "prv"} {
+	set prv ""
+}
+if {$regex == "REGEX"} {
+	blacktools:tell $nick $prv $hand $chan $chan1 b.12 $id
+} elseif {$regex != "REGEX" && [setting:get $chan xonly]} {
+	blacktools:tell $nick $prv $hand $chan $chan1 b.14 $id
+} else {
+	blacktools:tell $nick $prv $hand $chan $chan1 b.7 $id	
+	}
+}
+if {$notfound == "1"} {
+if {[setting:get $chan xonly]} {
+	set xban 1
+	set getxtime [setting:get $chan xbantime]
+	set getxlevel [setting:get $chan xbanlevel]
+if {$getxtime == ""} {
+	set getxtime $black(chanserv:bantime)
+}
+if {$getxlevel == ""} {
+	set getxlevel $black(chanserv:banlevel)
+	}
+}
+	set show_reason [blacktools:rem_comment_ban $show_reason]
+if {[onchan $black(chanserv) $chan] && $xban == "1" && $regex != "REGEX"} {
+if {$rcmd == "stick"} {
+	putquick "MODE $chan +b $host"
+			}
+	putquick "PRIVMSG $black(chanserv) :ban $chan $host $getxtime $getxlevel $show_reason"
+		} else {
+if {$regex != "REGEX"} {
+	putquick "MODE $chan +b $host"
+		}
+	}
+}
+	blacktools:ban:put $nick $host $hand $chan $bantime $type $sticky $global $reason $id
+		} else {
+	blacktools:tell $nick $host $hand $chan $chan1 gl.nobanlevel "$host"
+	}
+}
+
+###
+proc blacktools:ban:put {nick host hand chan bantime type sticky global reason id} {
+	global black
+	set is_comment 0
+	set file [open $black(bans_file) "a"]
+if {[lsearch -exact -nocase $reason "-comment"] > -1} {
+	set is_comment 1
+	set split_it [wsplit $reason "-comment"]
+	set comment [concat [lindex $split_it 1]]
+	set reason [concat [lindex $split_it 0]]
+} elseif {[lsearch -exact -nocase $reason "-com"] > -1} {
+	set is_comment 1
+	set split_it [wsplit $reason "-com"]
+	set comment [concat [lindex $split_it 1]]
+	set reason [concat [lindex $split_it 0]]
+} elseif {[lsearch -exact -nocase $reason "-c"] > -1} {
+	set is_comment 1
+	set split_it [wsplit $reason "-c"]
+	set comment [concat [lindex $split_it 1]]
+	set reason [concat [lindex $split_it 0]]
+}
+	set created [unixtime]
+if {$is_comment == "1"} {
+if {$global == "1"} {
+	puts $file "$type $id GLOBAL $host $hand $bantime $created $sticky $global $reason%C%$comment"
+} else {
+	puts $file "$type $id [string tolower $chan] $host $hand $bantime $created $sticky $global $reason%C%$comment"
+	}
+} else {
+if {$global == "1"} {
+	puts $file "$type $id GLOBAL $host $hand $bantime $created $sticky $global $reason"
+} else {
+	puts $file "$type $id [string tolower $chan] $host $hand $bantime $created $sticky $global $reason"
+	}
+}
+	close $file
+	blacktools:ub:setlast $bantime
+	set black(bans) [blacktools:banlist:all]
+}
+
+###
+proc blacktools:autounban {} {
+	global black
+	chanserv:ignore_remove
+	set found_expired 0
+foreach b $black(bans) {
+	set read_time [lindex [split $b] 5]
+if {$read_time == "0"} { continue }
+if {[expr $read_time - [unixtime]] <= 0} {
+	set read_host [lindex [split $b] 3]
+	set real_read_host [string map [list \[ {\[} \] {\]} \\ {\\}] $read_host]
+	set read_type [lindex [split $b] 0]
+	set read_chan [lindex [split $b] 2]
+	set read_tr [lindex [split $b] 7]
+	blacktools:auto:remove $real_read_host $read_chan
+	set found_expired 1
+if {![validchan $read_chan]} {
+if {[string equal -nocase $read_chan "GLOBAL"]} {
+	foreach chan [channels] {
+if {[ischanban $read_host $chan]} {
+if {[setting:get $chan xonly] && [onchan $black(chanserv)]} {
+	putquick "PRIVMSG $black(chanserv) :unban $chan $read_host"
+			} else {
+	pushmode $chan -b $read_host		
+			}
+		}
+	}
+}
+	continue
+} else { set chan $read_chan }
+if {[botisop $chan]} {
+	set getlang [string tolower [setting:get $chan lang]]
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
+if {[ischanban $read_host $chan]} {
+if {[string equal -nocase $read_type "GAG"]} {
+foreach user [chanlist $chan] {
+	set uhost "$user![getchanhost $user $chan]"
+if {[string match -nocase $real_read_host $uhost]} {
+	set replace(%nick%) $user
+	set replace(%chan%) $chan
+	set text [black:color:set "" $black(say.$getlang.gag.5)]
+	set reply [join $text]
+	puthelp "PRIVMSG $chan :[string map [array get replace] $reply]"
+			}
+		}
+	}
+	pushmode $chan -b $read_host
+	}
+}
+if {$read_tr == "2"} {
+	troll:del $read_host $chan
+}
+
+if {[setting:get $chan xonly] && [onchan $black(chanserv)]} {
+	putquick "PRIVMSG $black(chanserv) :unban $chan $read_host"
+			}
+		}
+	}
+
+if {$found_expired == 1} {
+	set black(bans) [blacktools:banlist:all]
+}
+	set lastban [blacktools:getlastban]
+if {$lastban == "-1"} {
+if {[info exists black(lastban)]} {
+	unset black(lastban)
+	}
+	return
+}
+	set black(lastban) $lastban
+foreach tmr [utimers] {
+if {[string match "*blacktools:autounban*" [join [lindex $tmr 1]]]} {
+	killutimer [lindex $tmr 2]
+		}
+	}
+	utimer $black(lastban) [list blacktools:autounban]
+}
+
+###
+proc blacktools:join:autoban {nick host vhost hand chan fullhost realname} {
+	global black
+	set hand [nick2hand $nick]
+	set foundblacktools_ban 0
+	set specified_bmask ""
+	set rest_host [lindex [split $fullhost @] 0]
+if {$host == ""} {set fulldns $fullhost} else {set fulldns "$rest_host@$host"}
+	chanserv:ignore_remove
+	set getlang [string tolower [setting:get $chan lang]]
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
+	set xban 0
+	set getcount [setting:get $chan kickcount]
+if {![botisop $chan] && ![setting:get $chan xonly]} {
+	return
+}
+if {[setting:get $chan xonly]} {
+	set xban 1
+	set getxtime [setting:get $chan xbantime]
+	set getxlevel [setting:get $chan xbanlevel]
+if {$getxtime == ""} {
+	set getxtime $black(chanserv:bantime)
+}
+if {$getxlevel == ""} {
+	set getxlevel $black(chanserv:banlevel)
+	}
+}
+	set foundgl 0
+	set getcount [setting:get $chan kickcount]
+if {[validuser $hand]} {
+if {[matchattr $hand $black(banflag)]} {
+	set hosts [getuser $hand hosts]
+	set cidr 0
+foreach h $hosts {
+if {[regexp {[/]} $h]} {
+	set read_ip [lindex [split $h @] 1]
+	set theip [lindex [split $fullhost @] 1]
+	set cidr_ip [ipcidr $read_ip $theip]
+if {$cidr_ip == "1"} {
+	set read_rest_ip [lindex [split $h @] 0]
+	set read_theip [lindex [split $fullhost @] 0]
+if {[string match -nocase $read_rest_ip $read_theip] || [string match -nocase $read_theip $read_rest_ip]} {
+	set cidr 1
+			}
+		}
+	}
+}
+if {[string match -nocase $h $fullhost] || [string match -nocase $h $fulldns] || $cidr == "1"} {
+	set check_except [blacktools:ban:chanexempt $fullhost $fulldns $chan]
+if {$check_except == "0"} {
+	add:ban $h [join [getuser $hand XTRA BLACK_REASON]]
+				}
+			}
+		}
+	}
+	set llength_banlist [llength $black(bans)]
+for {set i $llength_banlist} { $i >= 0 } { decr i } {
+	set b [lindex $black(bans) $i]
+	set cidr 0
+	set type [lindex [split $b] 0]
+	set read_chan [lindex [split $b] 2]
+	set read_host [lindex [split $b] 3]
+if {[string equal -nocase $type "REGEX"] && [string equal -nocase $read_chan $chan]} {
+if {[regexp {[/]} $read_host]} {
+	set a ""
+	regexp {/(.*)} $read_host a
+if {$a != ""} {
+	set split_a [split $a "/"]
+if {[regexp {[0-9]} [lindex $split_a 1]]} {
+	set specified_bmask [lindex $split_a 1]
+} elseif {[regexp {[0-9]} [lindex $split_a 2]]} {
+	set specified_bmask [lindex $split_a 2]
+}
+if {$specified_bmask != ""} {
+	regsub "/$specified_bmask" $read_host "" read_host
+	}
+}
+	set rfullhost "$fullhost/$realname"
+	set rfulldns "$fulldns/$realname"
+} else {
+	set rfullhost "$fullhost"
+	set rfulldns "$fulldns"
+}
+if {[regexp "$read_host" $rfullhost] || [regexp "$read_host" $rfulldns]} {
+if {[matchattr $hand $black(exceptflags) $chan]} {
+	break
+}
+	set check_except [blacktools:ban:chanexempt $fullhost $fulldns $chan]
+if {$check_except == "1"} {
+	break
+}
+if {$specified_bmask != ""} {
+	set mask [return_mask $specified_bmask $fullhost $nick]
+} else {
+	set mask [return_mask [return_host_num "b" $chan $fullhost] $fullhost $nick]
+}
+	set foundblacktools_ban 1
+	set num [lindex [split $b] 1]
+	set read_reason [join [lrange [split $b] 9 end]]
+	set read_reason [blacktools:rem_comment $read_reason]
+	set read_reason [encoding convertfrom utf-8 $read_reason]
+	set expire [lindex [split $b] 5]
+	set read_handle [split [lindex [split $b] 4] ":"]
+	set gethand [lindex [split $read_handle] 0]
+	set show_reason [blacktools:setreason $chan $read_reason $read_handle $expire $getcount "2" $num]
+if {$expire == "0"} {
+	set show_reason [blacktools:bl:setreason $chan $read_reason $read_handle $expire $getcount "0" $num]
+if {[setting:get $chan showhandle]} {
+if {![string equal -nocase $gethand "BADCHAN"] && ![string equal -nocase $gethand "badident"] && ![string equal -nocase $gethand "badnick"] && ![string equal -nocase $gethand "antibadquitpart"] && ![string equal -nocase $gethand "antichanflood"] && ![string equal -nocase $gethand "badrealname"] && ![string equal -nocase $gethand "antispam"] && ![string equal -nocase $gethand "badhost"] && ![string equal -nocase $gethand "antipub"] && ![string equal -nocase $gethand "antijoinflood"] && ![string equal -nocase $gethand "antinotice"] && ![string equal -nocase $gethand "antictcp"] && ![string equal -nocase $gethand "antirepeat"] && ![string equal -nocase $gethand "antibold"] && ![string equal -nocase $gethand "anticolor"] && ![string equal -nocase $gethand "antiunderline"] && ![string equal -nocase $gethand "antilongtext"] && ![string equal -nocase $gethand "antibadword"] && ![string equal -nocase $gethand "anticaps"] && ![string equal -nocase $gethand "nickflood"] && ![string equal -nocase $gethand "inviteban"] && ![string equal -nocase $gethand "private"] && ![string equal -nocase $gethand "clonescan"] && ![string equal -nocase $gethand "repetitivechars"]} {
+	set show_reason "\[BT\] \[$gethand\] (REGEX) blacklisted -- ($black(say.$getlang.gl.reason): $show_reason)"
+} else {
+		set show_reason "\[BT\] (REGEX) blacklisted -- ($black(say.$getlang.gl.reason): $show_reason)"
+	}
+} else {
+	set show_reason "\[BT\] (REGEX) blacklisted -- ($black(say.$getlang.gl.reason): $show_reason)"
+	}
+}
+if {[onchan $black(chanserv) $chan] && $xban == "1"} {
+	putquick "PRIVMSG $black(chanserv) :ban $chan $mask $getxtime $getxlevel $show_reason"
+} else {
+	putquick "MODE $chan +b $mask"
+	putquick "KICK $chan $nick :$show_reason"
+		}
+	break
+	}
+}
+if {[string equal -nocase $type "BAN"] && ![string equal -nocase $read_chan "GLOBAL"] && [string equal -nocase $read_chan $chan]} {
+	set read_host [lindex [split $b] 3]
+	set real_read_host [string map [list \[ {\[} \] {\]} \\ {\\}] $read_host]
+if {[regexp {[/]} $real_read_host]} {
+	set read_ip [lindex [split $real_read_host @] 1]
+	set theip [lindex [split $fullhost @] 1]
+	set theip_dns [lindex [split $fulldns @] 1]
+	set cidr_ip [ipcidr $read_ip $theip]
+	set cidr_ip_dns [ipcidr $read_ip $theip_dns]
+if {$cidr_ip == "1" || $cidr_ip_dns == "1"} {
+	set read_rest_ip [lindex [split $fullhost @] 0]
+	set read_theip [lindex [split $real_read_host @] 0]
+if {[string match -nocase $read_rest_ip $read_theip] || [string match -nocase $read_theip $read_rest_ip]} {
+	set cidr 1
+		}
+	}
+}
+if {([string match -nocase $fulldns $real_read_host] || [string match -nocase $real_read_host $fulldns]) || ([string match -nocase $fullhost $real_read_host] || [string match -nocase $real_read_host $fullhost]) || ($cidr == "1")} {
+	set check_except [blacktools:ban:chanexempt $fullhost $fulldns $chan]
+if {$check_except == "1"} {
+	break
+}
+	set foundblacktools_ban 1
+	set num [lindex [split $b] 1]
+	set read_reason [join [lrange [split $b] 9 end]]
+	set read_reason [encoding convertfrom utf-8 $read_reason]
+	set expire [lindex [split $b] 5]
+	set read_handle [split [lindex [split $b] 4] ":"]
+	set gethand [lindex [split $read_handle] 0]
+
+	set show_reason [blacktools:setreason $chan $read_reason $read_handle $expire $getcount "0" $num]
+if {$expire == "0"} {
+	set show_reason [blacktools:bl:setreason $chan $read_reason $read_handle $expire $getcount "0" $num]
+if {[setting:get $chan showhandle]} {
+if {![string equal -nocase $gethand "BADCHAN"] && ![string equal -nocase $gethand "badident"] && ![string equal -nocase $gethand "badnick"] && ![string equal -nocase $gethand "antibadquitpart"] && ![string equal -nocase $gethand "antichanflood"] && ![string equal -nocase $gethand "badrealname"] && ![string equal -nocase $gethand "antispam"] && ![string equal -nocase $gethand "badhost"] && ![string equal -nocase $gethand "antipub"] && ![string equal -nocase $gethand "antijoinflood"] && ![string equal -nocase $gethand "antinotice"] && ![string equal -nocase $gethand "antictcp"] && ![string equal -nocase $gethand "antirepeat"] && ![string equal -nocase $gethand "antibold"] && ![string equal -nocase $gethand "anticolor"] && ![string equal -nocase $gethand "antiunderline"] && ![string equal -nocase $gethand "antilongtext"] && ![string equal -nocase $gethand "antibadword"] && ![string equal -nocase $gethand "anticaps"] && ![string equal -nocase $gethand "nickflood"] && ![string equal -nocase $gethand "inviteban"] && ![string equal -nocase $gethand "private"] && ![string equal -nocase $gethand "clonescan"] && ![string equal -nocase $gethand "repetitivechars"]} {
+	set show_reason "\[BT\] \[$gethand\] blacklisted -- ($black(say.$getlang.gl.reason): $show_reason)" 
+} else {
+		set show_reason "\[BT\] blacklisted -- ($black(say.$getlang.gl.reason): $show_reason)" 
+	}
+} else {
+	set show_reason "\[BT\] blacklisted -- ($black(say.$getlang.gl.reason): $show_reason)"
+	}
+}
+if {[onchan $black(chanserv) $chan] && $xban == "1"} {
+	putquick "PRIVMSG $black(chanserv) :ban $chan $read_host $getxtime $getxlevel $show_reason"
+		} else {
+	putquick "MODE $chan +b $read_host"
+	putquick "KICK $chan $nick :$show_reason"
+			}
+		break
+	}
+}
+if {[string equal -nocase $read_chan "GLOBAL"]} {
+	set cidr 0
+	set read_host [lindex [split $b] 3]
+	set real_read_host [string map [list \[ {\[} \] {\]} \\ {\\}] $read_host]
+
+if {[string equal -nocase $type "REGEX"]} {
+if {[regexp {[/]} $read_host]} {
+	set a ""
+	regexp {/(.*)} $read_host a
+if {$a != ""} {
+	set split_a [split $a "/"]
+if {[regexp {[0-9]} [lindex $split_a 1]]} {
+	set specified_bmask [lindex $split_a 1]
+} elseif {[regexp {[0-9]} [lindex $split_a 2]]} {
+	set specified_bmask [lindex $split_a 2]
+}
+if {$specified_bmask != ""} {
+	regsub "/$specified_bmask" $read_host "" read_host
+	}
+}
+	set rfullhost "$fullhost/$realname"
+	set rfulldns "$fulldns/$realname"
+} else {
+	set rfullhost "$fullhost"
+	set rfulldns "$fulldns"
+}
+if {[regexp "$read_host" $rfullhost] || [regexp "$read_host" $rfulldns]} {
+	set check_except [blacktools:ban:exempt $fullhost]
+if {$check_except == "1"} {
+	break
+}
+if {$specified_bmask != ""} {
+	set mask [return_mask $specified_bmask $fullhost $nick]
+} else {
+	set mask [return_mask $black(b:banmask) $fullhost $nick]
+}
+	set foundblacktools_ban 1
+	set num [lindex [split $b] 1]
+	set read_reason [join [lrange [split $b] 9 end]]
+	set read_reason [encoding convertfrom utf-8 $read_reason]
+	set expire [lindex [split $b] 5]
+	set read_handle [lindex [split $b] 4]
+	set show_reason [blacktools:setreason $chan $read_reason $read_handle $expire "" "3" $num]
+if {$expire == "0"} {
+	set show_reason [blacktools:bl:setreason $chan $read_reason $read_handle $expire $getcount "0" $num]
+if {[setting:get $chan showhandle]} {
+	set show_reason "\[BT\] \[$read_handle\] (GLOBAL) (REGEX) blacklisted -- ($black(say.$getlang.gl.reason): $show_reason)" 
+} else {
+	set show_reason "\[BT\] (GLOBAL) (REGEX) blacklisted -- ($black(say.$getlang.gl.reason): $show_reason)"
+	}
+}
+if {[onchan $black(chanserv) $chan] && $xban == "1"} {
+	putquick "PRIVMSG $black(chanserv) :ban $chan $mask $getxtime $getxlevel $show_reason"
+		} else {
+	putquick "MODE $chan +b $mask"
+	putquick "KICK $chan $nick :$show_reason"
+		}
+	break
+	}
+}
+if {[regexp {[/]} $real_read_host]} {
+	set read_ip [lindex [split $real_read_host @] 1]
+	set theip [lindex [split $fullhost @] 1]
+	set theip_dns [lindex [split $fulldns @] 1]
+	set cidr_ip [ipcidr $read_ip $theip]
+	set cidr_ip_dns [ipcidr $read_ip $theip_dns]
+if {$cidr_ip == "1" || $cidr_ip_dns == "1"} {
+	set read_rest_ip [lindex [split $fullhost @] 0]
+	set read_theip [lindex [split $real_read_host @] 0]
+if {[string match -nocase $read_rest_ip $read_theip] || [string match -nocase $read_theip $read_rest_ip]} {
+	set cidr 1
+		}
+	}
+}
+if {([string match -nocase $fullhost $real_read_host] || [string match -nocase $real_read_host $fullhost]) || ($cidr == "1")} {
+	set check_except [blacktools:ban:exempt $fullhost]
+if {$check_except == "1"} {
+	break
+}
+	set foundblacktools_ban 1
+	set num [lindex [split $b] 1]
+	set read_reason [join [lrange [split $b] 9 end]]
+	set read_reason [encoding convertfrom utf-8 $read_reason]
+	set expire [lindex [split $b] 5]
+	set read_handle [lindex [split $b] 4]
+	set show_reason [blacktools:setreason $chan $read_reason $read_handle $expire "" "1" $num]
+if {$expire == "0"} {
+	set show_reason [blacktools:bl:setreason $chan $read_reason $read_handle $expire $getcount "0" $num]
+if {[setting:get $chan showhandle]} {
+	set show_reason "\[BT\] \[$read_handle\] (GLOBAL) blacklisted -- ($black(say.$getlang.gl.reason): $show_reason)" 
+} else {
+	set show_reason "\[BT\] (GLOBAL) blacklisted -- ($black(say.$getlang.gl.reason): $show_reason)"
+	}
+}
+if {[onchan $black(chanserv) $chan] && $xban == "1"} {
+	putquick "PRIVMSG $black(chanserv) :ban $chan $read_host $getxtime $getxlevel $show_reason"
+		} else {
+	putquick "MODE $chan +b $read_host"
+	putquick "KICK $chan $nick :$show_reason"
+			}
+		break
+	}
+}
+if {[string equal -nocase $type "GAG"] && [string equal -nocase $read_chan $chan]} {
+	set read_host [lindex [split $b] 3]
+	set real_read_host [string map [list \[ {\[} \] {\]} \\ {\\}] $read_host]
+if {([string match -nocase $fulldns $real_read_host] || [string match -nocase $real_read_host $fulldns]) || ([string match -nocase $fullhost $real_read_host] || [string match -nocase $real_read_host $fullhost])} {
+if {[ischanban $read_host $chan]} {
+	continue
+}
+	set expire [lindex [split $b] 5]
+	set read_time [return_time $getlang [expr $expire - [unixtime]]]
+	set replace(%minute%) $read_time
+	set replace(%gag%) $nick
+	pushmode $chan +b $read_host
+if {[isop $nick $chan]} {
+	pushmode $chan -o $nick
+}
+if {[isvoice $nick $chan]} {
+	pushmode $chan -v $nick
+}
+	set text [black:color:set "" $black(say.$getlang.gag.1)]
+	set reply [join $text]
+	set reply [string map [array get replace] $reply]
+	putquick "PRIVMSG $chan :$reply"
+	break
+		}
+	}
+}
+
+if {$foundblacktools_ban == 0} {
+foreach ban [banlist] {
+if {[string match -nocase [string tolower [lindex $ban 0]] $host]} {
+	set foundgl 1
+	set reason [lindex [split $ban] 1]
+	set expire [lindex [split $ban] 2]
+	set reason [join [lindex [split $ban] 1]]
+	set bywho [lindex [split $ban] 5]
+	set show_reason [blacktools:setreason $chan $reason $bywho $expire "" "1" "0"]
+if {[onchan $black(chanserv) $chan] && $xban == "1"} {
+	putquick "PRIVMSG $black(chanserv) :ban $chan [lindex $ban 0] $getxtime $getxlevel $show_reason"
+		} else {
+	putquick "MODE $chan +b [lindex $ban 0]"
+	putquick "KICK $chan $nick :$show_reason"
+		}
+		break
+	}
+}
+if {$foundgl == "0"} {
+foreach ban [banlist $chan] {
+if {[string match -nocase [string tolower [lindex $ban 0]] $host]} {
+	set reason [lindex $ban 1]
+	set expire [lindex $ban 2]
+	set reason [join [split [lindex $ban 1]]]
+	set bywho [split [lindex $ban 5]]
+	set show_reason [blacktools:setreason $chan $reason $bywho $expire $getcount "0" "0"]
+if {[onchan $black(chanserv) $chan] && $xban == "1"} {
+	putquick "PRIVMSG $black(chanserv) :ban $chan [lindex $ban 0] $getxtime $getxlevel $show_reason"
+} else {
+	putquick "MODE $chan +b [lindex $ban 0]"
+	putquick "KICK $chan $nick :$show_reason"
+					}
+					break
+				}
+			}
+		}		
+	}
+}
+
+###
+proc blacktools:auto:remove {host chan} {
+	global black
+	set timestamp [clock format [clock seconds] -format {%Y%m%d%H%M%S}]
+	set temp "$black(bans_file).new.$timestamp"
+	set tempwrite [open $temp w]
+	set file [open $black(bans_file) r]
+	set size [file size $black(bans_file)]
+	set data [split [read $file $size] \n]
+	close $file
+foreach line $data {
+	set read_host [lindex [split $line] 3]
+	set read_chan [lindex [split $line] 2]
+	set real_read_host [string map [list \[ {\[} \] {\]} \\ {\\}] $read_host]
+if {([string match -nocase $host $real_read_host] || [string equal -nocase $host $real_read_host]) && [string equal -nocase $read_chan $chan]} {
+	continue
+} else {
+	puts $tempwrite $line
+		}	 
+    }
+	close $tempwrite
+    file rename -force $temp $black(bans_file)
+}
+
+###
+proc blacktools:join:ban {nick host hand chan} {
+	global black
+if {[isbotnick $nick]} {
+foreach tmr [utimers] {
+if {[string match "*who:chan $chan*" [join [lindex $tmr 1]]]} {
+	killutimer [lindex $tmr 2]
+			}	
+		}
+	utimer 5 [list who:chan $chan]
+foreach b [blacktools:banlist:ban $chan] {
+	set read_host [lindex [split $b] 3]
+	set real_read_host [string map [list \[ {\[} \] {\]} \\ {\\}] $read_host]
+	set sticky [lindex [split $b] 7]
+if {$sticky == "1"} {
+if {![ischanban $read_host $chan]} {
+	utimer 5 [list pushmode $chan +b $read_host]
+				}
+			}
+		}	
+	}
+}
+
+###
+proc blacktools:auto:ban_act {nick uhost vhost chan realname} {
+	global black botnick
+	set rest_host [lindex [split $uhost @] 0]
+	set found_ban 0
+	set fulldns "$rest_host@$vhost"
+	set specified_bmask ""
+if {$vhost == ""} { set fulldns $uhost}
+	set xban 0
+	set getcount [setting:get $chan kickcount]
+	set getlang [string tolower [setting:get $chan lang]]
+	chanserv:ignore_remove
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
+if {![botisop $chan] && ![setting:get $chan xonly]} {
+	return
+}
+if {[setting:get $chan xonly]} {
+	set xban 1
+	set getxtime [setting:get $chan xbantime]
+	set getxlevel [setting:get $chan xbanlevel]
+if {$getxtime == ""} {
+	set getxtime $black(chanserv:bantime)
+}
+if {$getxlevel == ""} {
+	set getxlevel $black(chanserv:banlevel)
+	}
+}
+	set handle [nick2hand $nick]
+if {$handle != "*"} { 
+if {[validuser $handle]} {
+if {[matchattr $handle B]} {
+	set hosts [getuser $handle hosts]
+	set cidr 0
+foreach h $hosts {
+if {[regexp {[/]} $h]} {
+	set read_ip [lindex [split $h @] 1]
+	set theip [lindex [split $uhost @] 1]
+	set cidr_ip [ipcidr $read_ip $theip]
+if {$cidr_ip == "1"} {
+	set read_rest_ip [lindex [split $h @] 0]
+	set read_theip [lindex [split $uhost @] 0]
+if {[string match -nocase $read_rest_ip $read_theip] || [string match -nocase $read_theip $read_rest_ip]} {
+	set cidr 1
+		}
+	}
+}
+if {[string match -nocase $h $uhost] || [string match -nocase $h $fulldns] || $cidr == "1"} {
+	set check_except [blacktools:ban:chanexempt $uhost $fulldns $chan]
+if {$check_except == "0"} {
+	add:ban $h [join [getuser $handle XTRA BLACK_REASON]]
+	set found_ban 1
+					}
+				}
+			}
+		}
+	}
+}
+if {$found_ban == "1"} {
+	return
+}
+	set llength_banlist [llength $black(bans)]
+for {set i $llength_banlist} { $i >= 0 } { decr i } {
+	set b [lindex $black(bans) $i]
+	set cidr 0
+	set type [lindex [split $b] 0]
+	set read_chan [lindex [split $b] 2]
+if {[string equal -nocase $type "REGEX"] && [string equal -nocase $read_chan $chan]} {
+	set read_host [lindex [split $b] 3]
+if {[regexp {[/]} $read_host]} {
+	set a ""
+	regexp {/(.*)} $read_host a
+if {$a != ""} {
+	set split_a [split $a "/"]
+if {[regexp {[0-9]} [lindex $split_a 1]]} {
+	set specified_bmask [lindex $split_a 1]
+} elseif {[regexp {[0-9]} [lindex $split_a 2]]} {
+	set specified_bmask [lindex $split_a 2]
+}
+if {$specified_bmask != ""} {
+	regsub "/$specified_bmask" $read_host "" read_host
+	}
+}
+	set rfullhost "$uhost/$realname"
+	set rfulldns "$fulldns/$realname"
+} else {
+	set rfullhost "$uhost"
+	set rfulldns "$fulldns"
+}
+if {[regexp "$read_host" $rfullhost] || [regexp "$read_host" $rfulldns]} {
+if {[matchattr $handle $black(exceptflags) $chan]} {
+	continue
+}
+	set check_except [blacktools:ban:chanexempt $uhost $fulldns $chan]
+if {$check_except == "1"} {
+	break
+}
+if {$specified_bmask != ""} {
+	set mask [return_mask $specified_bmask $uhost $nick]
+} else {
+	set mask [return_mask [return_host_num "b" $chan $uhost] $uhost $nick]
+}
+	set num [lindex [split $b] 1]
+	set read_reason [join [lrange [split $b] 9 end]]
+	set read_reason [blacktools:rem_comment $read_reason]
+	set read_reason [encoding convertfrom utf-8 $read_reason]
+	set expire [lindex [split $b] 5]
+	set read_handle [split [lindex [split $b] 4] ":"]
+	set gethand [lindex [split $read_handle] 0]
+	set show_reason [blacktools:setreason $chan $read_reason $read_handle $expire $getcount "2" $num]
+if {$expire == "0"} {
+	set show_reason [blacktools:bl:setreason $chan $read_reason $read_handle $expire $getcount "0" $num]
+if {[setting:get $chan showhandle]} {
+if {![string equal -nocase $gethand "BADCHAN"] && ![string equal -nocase $gethand "badident"] && ![string equal -nocase $gethand "badnick"] && ![string equal -nocase $gethand "antibadquitpart"] && ![string equal -nocase $gethand "antichanflood"] && ![string equal -nocase $gethand "badrealname"] && ![string equal -nocase $gethand "antispam"] && ![string equal -nocase $gethand "badhost"] && ![string equal -nocase $gethand "antipub"] && ![string equal -nocase $gethand "antijoinflood"] && ![string equal -nocase $gethand "antinotice"] && ![string equal -nocase $gethand "antictcp"] && ![string equal -nocase $gethand "antirepeat"] && ![string equal -nocase $gethand "antibold"] && ![string equal -nocase $gethand "anticolor"] && ![string equal -nocase $gethand "antiunderline"] && ![string equal -nocase $gethand "antilongtext"] && ![string equal -nocase $gethand "antibadword"] && ![string equal -nocase $gethand "anticaps"] && ![string equal -nocase $gethand "nickflood"] && ![string equal -nocase $gethand "inviteban"] && ![string equal -nocase $gethand "private"] && ![string equal -nocase $gethand "clonescan"] && ![string equal -nocase $gethand "repetitivechars"]} {
+	set show_reason "\[BT\] \[$gethand\] (REGEX) blacklisted -- ($black(say.$getlang.gl.reason): $show_reason)"
+} else {
+		set show_reason "\[BT\] (REGEX) blacklisted -- ($black(say.$getlang.gl.reason): $show_reason)"
+	}
+} else {
+	set show_reason "\[BT\] (REGEX) blacklisted -- ($black(say.$getlang.gl.reason): $show_reason)"
+	}
+}
+if {[onchan $black(chanserv) $chan] && $xban == "1"} {
+	putquick "PRIVMSG $black(chanserv) :ban $chan $mask $getxtime $getxlevel $show_reason"
+} else {
+	putquick "MODE $chan +b $mask"
+	putquick "KICK $chan $nick :$show_reason"
+		}
+	break
+	}
+}
+if {[string equal -nocase $type "BAN"] && ![string equal -nocase $read_chan "GLOBAL"] && [string equal -nocase $read_chan $chan]} {
+	set read_host [lindex [split $b] 3]
+	set real_read_host [string map [list \[ {\[} \] {\]} \\ {\\}] $read_host]
+if {[regexp {[/]} $real_read_host]} {
+	set read_ip [lindex [split $real_read_host @] 1]
+	set theip [lindex [split $uhost @] 1]
+	set theip_dns [lindex [split $fulldns @] 1]
+	set cidr_ip [ipcidr $read_ip $theip]
+	set cidr_dns [ipcidr $read_ip $theip_dns]
+if {$cidr_ip == "1" || $cidr_dns == "1"} {
+	set read_rest_ip [lindex [split $uhost @] 0]
+	set read_theip [lindex [split $real_read_host @] 0]
+if {[string match -nocase $read_rest_ip $read_theip] || [string match -nocase $read_theip $read_rest_ip]} {
+	set cidr 1
+		}
+	}
+}
+if {([string match -nocase $real_read_host $uhost] || [string match -nocase $uhost $real_read_host]) || ([string match -nocase $real_read_host $fulldns] || [string match -nocase $fulldns $real_read_host]) || ($cidr == "1")} {
+	set check_except [blacktools:ban:chanexempt $uhost $fulldns $chan]
+if {$check_except == "1"} {
+	break
+}
+	set num [lindex [split $b] 1]
+	set read_reason [join [lrange [split $b] 9 end]]
+	set read_reason [blacktools:rem_comment $read_reason]
+	set read_reason [encoding convertfrom utf-8 $read_reason]
+	set expire [lindex [split $b] 5]
+	set read_handle [split [lindex [split $b] 4] ":"]
+	set gethand [lindex [split $read_handle] 0]
+	set show_reason [blacktools:setreason $chan $read_reason $read_handle $expire $getcount "0" $num]
+if {$expire == "0"} {
+	set show_reason [blacktools:bl:setreason $chan $read_reason $read_handle $expire $getcount "0" $num]
+if {[setting:get $chan showhandle]} {
+if {![string equal -nocase $gethand "BADCHAN"] && ![string equal -nocase $gethand "badident"] && ![string equal -nocase $gethand "badnick"] && ![string equal -nocase $gethand "antibadquitpart"] && ![string equal -nocase $gethand "antichanflood"] && ![string equal -nocase $gethand "badrealname"] && ![string equal -nocase $gethand "antispam"] && ![string equal -nocase $gethand "badhost"] && ![string equal -nocase $gethand "antipub"] && ![string equal -nocase $gethand "antijoinflood"] && ![string equal -nocase $gethand "antinotice"] && ![string equal -nocase $gethand "antictcp"] && ![string equal -nocase $gethand "antirepeat"] && ![string equal -nocase $gethand "antibold"] && ![string equal -nocase $gethand "anticolor"] && ![string equal -nocase $gethand "antiunderline"] && ![string equal -nocase $gethand "antilongtext"] && ![string equal -nocase $gethand "antibadword"] && ![string equal -nocase $gethand "anticaps"] && ![string equal -nocase $gethand "nickflood"] && ![string equal -nocase $gethand "inviteban"] && ![string equal -nocase $gethand "private"] && ![string equal -nocase $gethand "clonescan"] && ![string equal -nocase $gethand "repetitivechars"]} {
+	set show_reason "\[BT\] \[$gethand\] blacklisted -- ($black(say.$getlang.gl.reason): $show_reason)"
+} else {
+		set show_reason "\[BT\] blacklisted -- ($black(say.$getlang.gl.reason): $show_reason)"
+	}
+} else {
+	set show_reason "\[BT\] blacklisted -- ($black(say.$getlang.gl.reason): $show_reason)"
+	}
+}
+if {[onchan $black(chanserv) $chan] && $xban == "1"} {
+	putquick "PRIVMSG $black(chanserv) :ban $chan $read_host $getxtime $getxlevel $show_reason"
+} else {
+	putquick "MODE $chan +b $read_host"
+	putquick "KICK $chan $nick :$show_reason"
+		}
+		break
+	}
+}
+if {[string equal -nocase $read_chan "GLOBAL"]} {
+	set cidr 0
+	set read_host [lindex [split $b] 3]
+	set real_read_host [string map [list \[ {\[} \] {\]} \\ {\\}] $read_host]
+if {[string equal -nocase $type "REGEX"]} {
+if {[regexp {[/]} $read_host]} {
+	set a ""
+	regexp {/(.*)} $read_host a
+if {$a != ""} {
+	set split_a [split $a "/"]
+if {[regexp {[0-9]} [lindex $split_a 1]]} {
+	set specified_bmask [lindex $split_a 1]
+} elseif {[regexp {[0-9]} [lindex $split_a 2]]} {
+	set specified_bmask [lindex $split_a 2]
+}
+if {$specified_bmask != ""} {
+	regsub "/$specified_bmask" $read_host "" read_host
+	}
+}
+	set rfullhost "$uhost/$realname"
+	set rfulldns "$fulldns/$realname"
+} else {
+	set rfullhost "$uhost"
+	set rfulldns "$fulldns"
+}
+if {[regexp "$read_host" $rfullhost] || [regexp "$read_host" $rfulldns]} {
+	set check_except [blacktools:ban:exempt $uhost]
+if {$check_except == "1"} {
+	break
+}
+if {$specified_bmask != ""} {
+	set mask [return_mask $specified_bmask $uhost $nick]
+} else {
+	set mask [return_mask $black(b:banmask) $uhost $nick]
+}
+	set num [lindex [split $b] 1]
+	set read_reason [join [lrange [split $b] 9 end]]
+	set read_reason [blacktools:rem_comment $read_reason]
+	set read_reason [encoding convertfrom utf-8 $read_reason]
+	set expire [lindex [split $b] 5]
+	set read_handle [lindex [split $b] 4]
+	set read_handle [lindex [split $b] 4]
+	set gethand [lindex [split $read_handle] 0]
+	set show_reason [blacktools:setreason $chan $read_reason $read_handle $expire "" "3" $num]
+if {$expire == "0"} {
+	set show_reason [blacktools:bl:setreason $chan $read_reason $read_handle $expire $getcount "0" $num]
+if {[setting:get $chan showhandle]} {
+	set show_reason "\[BT\] \[$gethand\] (GLOBAL) (REGEXP) blacklisted -- ($black(say.$getlang.gl.reason): $read_reason)" 
+} else {
+	set show_reason "\[BT\] (GLOBAL) (REGEXP) blacklisted -- ($black(say.$getlang.gl.reason): $read_reason)"
+	}
+}
+if {[onchan $black(chanserv) $chan] && $xban == "1"} {
+	putquick "PRIVMSG $black(chanserv) :ban $chan $mask $getxtime $getxlevel $show_reason"
+} else {
+	putquick "MODE $chan +b $mask"
+	putquick "KICK $chan $nick :$show_reason"
+		}
+	break
+	}
+}
+if {[regexp {[/]} $real_read_host]} {
+	set read_ip [lindex [split $real_read_host @] 1]
+	set theip [lindex [split $uhost @] 1]
+	set theip_dns [lindex [split $fulldns @] 1]
+	set cidr_ip [ipcidr $read_ip $theip]
+	set cidr_dns [ipcidr $read_ip $theip_dns]
+if {$cidr_ip == "1" || $cidr_dns == "1"} {
+	set read_rest_ip [lindex [split $uhost @] 0]
+	set read_theip [lindex [split $real_read_host @] 0]
+if {[string match -nocase $read_rest_ip $read_theip] || [string match -nocase $read_theip $read_rest_ip]} {
+	set cidr 1
+		}
+	}
+}
+if {[string match -nocase $real_read_host $uhost] || [string match -nocase $uhost $real_read_host] || ($cidr == "1")} {
+	set check_except [blacktools:ban:exempt $uhost]
+if {$check_except == "1"} {
+	break
+}
+	set num [lindex [split $b] 1]
+	set read_reason [join [lrange [split $b] 9 end]]
+	set read_reason [blacktools:rem_comment $read_reason]
+	set read_reason [encoding convertfrom utf-8 $read_reason]
+	set expire [lindex [split $b] 5]
+	set read_handle [lindex [split $b] 4]
+	set read_handle [lindex [split $b] 4]
+	set gethand [lindex [split $read_handle] 0]
+	set show_reason [blacktools:setreason $chan $read_reason $read_handle $expire "" "1" $num]
+if {$expire == "0"} {
+	set show_reason [blacktools:bl:setreason $chan $read_reason $read_handle $expire $getcount "0" $num]
+if {[setting:get $chan showhandle]} {
+	set show_reason "\[BT\] \[$gethand\] (GLOBAL) blacklisted -- ($black(say.$getlang.gl.reason): $read_reason)" 
+} else {
+	set show_reason "\[BT\] (GLOBAL) blacklisted -- ($black(say.$getlang.gl.reason): $read_reason)"
+	}
+}
+if {[onchan $black(chanserv) $chan] && $xban == "1"} {
+	putquick "PRIVMSG $black(chanserv) :ban $chan $read_host $getxtime $getxlevel $show_reason"
+} else {
+	putquick "MODE $chan +b $read_host"
+	putquick "KICK $chan $nick :$show_reason"
+		}
+	break
+	}
+}
+if {[string equal -nocase $type "GAG"] && [string equal -nocase $read_chan $chan]} {
+	set read_host [lindex [split $b] 3]
+	set real_read_host [string map [list \[ {\[} \] {\]} \\ {\\}] $read_host]
+if {[string match -nocase $real_read_host $uhost]} {
+if {[ischanban $read_host $chan]} {
+	continue
+}
+	set num [lindex [split $b] 1]
+	set expire [lindex [split $b] 5]
+	set read_time [return_time $getlang [expr $expire - [unixtime]]]
+	set replace(%minute%) $read_time
+	set replace(%gag%) $nick
+if {[isop $nick $chan]} {
+	pushmode $chan -o $nick
+}
+if {[isvoice $nick $chan]} {
+	pushmode $chan -v $nick
+}
+	pushmode $chan +b $read_host
+	set text [black:color:set "" $black(say.$getlang.gag.1)]
+	set reply [join $text]
+	puthelp "PRIVMSG $chan :[string map [array get replace] $reply]"
+	break
+			}
+		}
+	}
+}
+
+###
+proc blacktools:mode:ban {nick host hand chan mod who} {
+	global black
+if {$mod == "-b"} {
+foreach b [blacktools:banlist:ban $chan] {
+	set read_host [lindex [split $b] 3]
+	set real_read_host [string map [list \[ {\[} \] {\]} \\ {\\}] $read_host]
+if {[string match -nocase $real_read_host $who]} {
+	set sticky [lindex [split $b] 7]
+if {$sticky == "1"} {
+	pushmode $chan +b $who
+			}
+	break
+		}
+	}
+}
+	
+if {$mod == "+o"} {
+if {[isbotnick $who]} {
+foreach b [blacktools:banlist:ban $chan] {
+	set read_host [lindex [split $b] 3]
+	set real_read_host [string map [list \[ {\[} \] {\]} \\ {\\}] $read_host]
+	set sticky [lindex [split $b] 7]
+if {$sticky == "1"} {
+if {![ischanban $read_host $chan]} {
+	pushmode $chan +b $read_host
+					}
+				}
+			}
+	mode:who:chan $chan
+		}
+	}	
+}
+
+###
+proc blacktools:chnick:ban {nick host hand chan newnick} {
+	global botnick black
+if {[validchan $chan]} {
+	set bhost "$newnick![getchanhost $newnick $chan]"
+	blacktools:auto:ban $newnick $bhost $chan ""
+	}
+}

Plik diff jest za duży
+ 74 - 713
BlackTools/BT.Core.tcl


+ 4 - 0
BlackTools/BT.Loader.tcl

@@ -70,6 +70,7 @@ if {$black(prot_error_$themodule) == "1"} {
 
 set black(timers_error) [catch {source $black(backdir)/BlackTools/BT.Timers.tcl} black(timers_error_stats)]
 set black(binds_error) [catch {source $black(backdir)/BlackTools/BT.Binds.tcl} black(binds_error_stats)]
+set black(ban_error) [catch {source $black(backdir)/BlackTools/BT.Ban.tcl} black(ban_error_stats)]
 set black(core_error) [catch {source $black(backdir)/BlackTools/BT.Core.tcl} black(core_error_stats)]
 set black(loader_error) [catch {source $black(backdir)/BlackTools/lang/loader.tcl} black(loader_error_stats)]
 
@@ -83,6 +84,9 @@ if {$black(binds_error) == "1"} {
 if {$black(core_error) == "1"} {
 	die "\[BT\] Error. Couldn't load the \"BT Core\". Reason: \"$black(core_error_stats)\""
 }
+if {$black(ban_error) == "1"} {
+	die "\[BT\] Error. Couldn't load the \"BT Ban\". Reason: \"$black(ban_error_stats)\""
+}
 if {$black(loader_error) == "1"} {
 	die "\[BT\] Error. Couldn't load the \"BT Language\". Reason: \"$black(loader_error_stats)\""
 }

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików