|
@@ -14,6 +14,217 @@
|
|
|
## ##
|
|
## ##
|
|
|
#########################################################################
|
|
#########################################################################
|
|
|
|
|
|
|
|
|
|
+bind RAW - 319 badchan:execute
|
|
|
|
|
+bind RAW - 401 badchan:nosuchnick
|
|
|
|
|
+
|
|
|
|
|
+###
|
|
|
|
|
+proc badchanpublic:join {nick host hand chan} {
|
|
|
|
|
+ global black badchan
|
|
|
|
|
+if {![validchan $chan]} { return }
|
|
|
|
|
+if {[setting:get $chan antibadchan]} {
|
|
|
|
|
+if {[matchattr $hand $black(exceptflags) $chan]} {
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+if {[isbotnick $nick]} { return }
|
|
|
|
|
+
|
|
|
|
|
+if {(![botisop $chan]) && (![setting:get $chan xonly])} { return }
|
|
|
|
|
+ set flood_protect [badchan:flood:prot $chan $host]
|
|
|
|
|
+if {$flood_protect == "1"} {
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+ set banmask [return_mask [return_host_num "badchan" $chan [getchanhost $nick $chan]] [getchanhost $nick $chan] $nick]
|
|
|
|
|
+if {[info exists badchan(checkagain:$banmask:$chan)]} {return}
|
|
|
|
|
+ putserv "WHOIS $nick"
|
|
|
|
|
+ set ::badchan($nick) $chan
|
|
|
|
|
+ set black(badchan:check:$nick:$chan) [list $chan $banmask]
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+###
|
|
|
|
|
+proc badchan:check:again {nick chan banmask} {
|
|
|
|
|
+ global black badchan
|
|
|
|
|
+ putserv "WHOIS $nick"
|
|
|
|
|
+ set black(badchan:check:$nick:$chan) [list $chan $banmask]
|
|
|
|
|
+ set ::badchan($nick) $chan
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+###
|
|
|
|
|
+proc badchan:unset {nick chan banmask} {
|
|
|
|
|
+ global black badchan
|
|
|
|
|
+if {[info exists black(badchan:check:$nick:$chan)]} {
|
|
|
|
|
+ unset black(badchan:check:$nick:$chan)
|
|
|
|
|
+}
|
|
|
|
|
+if {[info exists badchan(checkagain:$banmask:$chan)]} {
|
|
|
|
|
+ unset badchan(checkagain:$banmask:$chan)
|
|
|
|
|
+}
|
|
|
|
|
+if {[info exists badchan($banmask:$chan)]} {
|
|
|
|
|
+ unset badchan($banmask:$chan)
|
|
|
|
|
+}
|
|
|
|
|
+if {[info exists badchan(channels:$banmask:$chan)]} {
|
|
|
|
|
+ unset badchan(channels:$banmask:$chan)
|
|
|
|
|
+ }
|
|
|
|
|
+if {[info exists black(badchan:check:$nick:$chan)]} {
|
|
|
|
|
+ unset black(badchan:check:$nick:$chan)
|
|
|
|
|
+ }
|
|
|
|
|
+if {[info exists ::badchan($nick)]} {
|
|
|
|
|
+ unset ::badchan($nick)
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+###
|
|
|
|
|
+proc badchan:nosuchnick {from keyword arguments} {
|
|
|
|
|
+ global black badchan
|
|
|
|
|
+ set nick [lindex [split $arguments] 1]
|
|
|
|
|
+if {![info exists ::badchan($nick)]} {
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+ set chan $::badchan($nick)
|
|
|
|
|
+if {[info exists black(badchan:check:$nick:$chan)]} {
|
|
|
|
|
+ set banmask [lindex $black(badchan:check:$nick:$chan) 1]
|
|
|
|
|
+ badchan:unset $nick $chan $banmask
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+###
|
|
|
|
|
+proc badchan:execute {from keyword arguments} {
|
|
|
|
|
+global botnick badchan black
|
|
|
|
|
+ set cmd "badchan"
|
|
|
|
|
+ set arguments [split $arguments]
|
|
|
|
|
+ set nick [lindex $arguments 1]
|
|
|
|
|
+if {![info exists ::badchan($nick)]} {
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+ set chan $::badchan($nick)
|
|
|
|
|
+ set file_found 0
|
|
|
|
|
+
|
|
|
|
|
+if {[info exists black(badchan:check:$nick:$chan)]} {set banmask [lindex $black(badchan:check:$nick:$chan) 1]} else {return}
|
|
|
|
|
+if {![validchan $chan]} {return}
|
|
|
|
|
+if {![onchan $nick $chan]} {
|
|
|
|
|
+ badchan:unset $nick $chan $banmask
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+ set chan1 $chan
|
|
|
|
|
+ set show_nick [lindex $arguments 1]
|
|
|
|
|
+ set channels [string tolower [lrange $arguments 2 end]]
|
|
|
|
|
+ set text [join [check:badchan:except $channels $chan]]
|
|
|
|
|
+ set getlang [string tolower [setting:get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+ set bl_protect [blacktools:protect $nick $chan]
|
|
|
|
|
+if {$bl_protect == "1"} {
|
|
|
|
|
+ badchan:unset $nick $chan $banmask
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+ set file [open $black(add_file) r]
|
|
|
|
|
+ set size [file size $black(add_file)]
|
|
|
|
|
+ set data [split [read $file $size] \n]
|
|
|
|
|
+ close $file
|
|
|
|
|
+foreach line $data {
|
|
|
|
|
+ set mainchan [lindex [split $line] 0]
|
|
|
|
|
+ set read_type [lindex [split $line] 1]
|
|
|
|
|
+if {([string equal -nocase $chan $mainchan] || [string equal -nocase "GLOBAL" $mainchan]) && ([string equal -nocase $read_type "BADCHAN"] || [string equal -nocase $read_type "BADCHAN:REGEX"])} {
|
|
|
|
|
+ set readchan [lindex [split $line] 3]
|
|
|
|
|
+ set encoded [encoding convertfrom utf-8 $readchan]
|
|
|
|
|
+foreach c $text {
|
|
|
|
|
+ set ch [string trimleft $c ":~@+"]
|
|
|
|
|
+if {[string match -nocase $encoded $ch] && [string equal -nocase $read_type "BADCHAN"]} {
|
|
|
|
|
+ set file_found 1
|
|
|
|
|
+ set reason [lrange [split $line] 4 end]
|
|
|
|
|
+ set badchan($banmask:$chan) $reason
|
|
|
|
|
+ set badchan(channels:$banmask:$chan) $ch
|
|
|
|
|
+ break
|
|
|
|
|
+} elseif {[string equal -nocase $read_type "BADCHAN:REGEX"]} {
|
|
|
|
|
+if {[regexp "$readchan" $ch]} {
|
|
|
|
|
+ set file_found 1
|
|
|
|
|
+ set reason [lrange [split $line] 4 end]
|
|
|
|
|
+ set badchan($banmask:$chan) $reason
|
|
|
|
|
+ set badchan(channels:$banmask:$chan) $ch
|
|
|
|
|
+ break
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+if {$file_found == "0"} {
|
|
|
|
|
+foreach defchan $black(badcchannels) {
|
|
|
|
|
+ set encoded [encoding convertfrom utf-8 $defchan]
|
|
|
|
|
+foreach c $text {
|
|
|
|
|
+ set ch [string trimleft $c ":@+"]
|
|
|
|
|
+ set ch [check:except $ch $chan $black(badcchannels) $black(exceptchannels) "BADCHAN"]
|
|
|
|
|
+if {[string match -nocase $encoded $ch]} {
|
|
|
|
|
+ set badchan(channels:$banmask:$chan) $ch
|
|
|
|
|
+ set badchan($banmask:$chan) $black(say.$getlang.badchan.5)
|
|
|
|
|
+ break
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+if {[info exists badchan($banmask:$chan)]} {
|
|
|
|
|
+if {[string equal -nocase $badchan($banmask:$chan) $black(say.$getlang.badchan.5)]} {
|
|
|
|
|
+if {[setting:get $chan badchan-reason] != ""} {
|
|
|
|
|
+ set getreason [join [setting:get $chan badchan-reason]]
|
|
|
|
|
+} else {
|
|
|
|
|
+ set getreason $black(say.$getlang.badchan.5)
|
|
|
|
|
+ }
|
|
|
|
|
+} else {
|
|
|
|
|
+ set getreason [join $badchan($banmask:$chan)]
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+if {[info exists badchan(checkagain:$banmask:$chan)]} {
|
|
|
|
|
+if {[info exists badchan($banmask:$chan)]} {
|
|
|
|
|
+ blacktools:banner:2 $nick "BADCHAN,[encoding convertto utf-8 $badchan(channels:$banmask:$chan)]" $chan $chan1 [getchanhost $nick $chan] "0" ""
|
|
|
|
|
+ who:chan $chan
|
|
|
|
|
+if {[setting:get $chan showbadchan]} {
|
|
|
|
|
+ set replace(%nick%) $show_nick
|
|
|
|
|
+ set replace(%chans%) $badchan(channels:$banmask:$chan)
|
|
|
|
|
+ set mes [string map [array get replace] $black(say.$getlang.badchan.44)]
|
|
|
|
|
+ putserv "NOTICE @$chan :$mes"
|
|
|
|
|
+}
|
|
|
|
|
+ badchan:unset $nick $chan $banmask
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+ badchan:unset $nick $chan $banmask
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+if {[info exists badchan($banmask:$chan)]} {
|
|
|
|
|
+if {[setting:get $chan badchan-bmethod] == "0" || [setting:get $chan badchan-bmethod] == ""} {
|
|
|
|
|
+ set bmethod $black(badcbanmethod)
|
|
|
|
|
+} else { set bmethod [setting:get $chan badchan-bmethod] }
|
|
|
|
|
+if {$bmethod == "2"} {
|
|
|
|
|
+ blacktools:banner:2 $nick "BADCHAN,[encoding convertto utf-8 $badchan(channels:$banmask:$chan)]" $chan $chan1 [getchanhost $nick $chan] "0" ""
|
|
|
|
|
+ who:chan $chan
|
|
|
|
|
+if {[setting:get $chan showbadchan]} {
|
|
|
|
|
+ set replace(%nick%) $nick
|
|
|
|
|
+ set replace(%chans%) $badchan(channels:$banmask:$chan)
|
|
|
|
|
+ set text [black:color:set "" $black(say.$getlang.badchan.44)]
|
|
|
|
|
+ set text [join $text]
|
|
|
|
|
+ set mes [string map [array get replace] $text]
|
|
|
|
|
+ putserv "NOTICE @$chan :$mes"
|
|
|
|
|
+}
|
|
|
|
|
+ badchan:unset $nick $chan $banmask
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+ set replace(%badchans%) [join $badchan(channels:$banmask:$chan) ", "]
|
|
|
|
|
+ set text [black:color:set "" $black(say.$getlang.badchan.40)]
|
|
|
|
|
+ set reply [join $text]
|
|
|
|
|
+if {[setting:get $chan badchan-banwait] == ""} {
|
|
|
|
|
+ set wait_time $black(badcbanwait)
|
|
|
|
|
+ utimer $black(badcbanwait) [list badchan:check:again $nick $chan $banmask]
|
|
|
|
|
+} else {
|
|
|
|
|
+ set wait_time [setting:get $chan badchan-banwait]
|
|
|
|
|
+ utimer $wait_time [list badchan:check:again $nick $chan $banmask]
|
|
|
|
|
+}
|
|
|
|
|
+ set replace(%time%) $wait_time
|
|
|
|
|
+ set message [string map [array get replace] $reply]
|
|
|
|
|
+ putquick "PRIVMSG $nick :\[$chan\] $message"
|
|
|
|
|
+ badchan:unset $nick $chan $banmask
|
|
|
|
|
+ set badchan(checkagain:$banmask:$chan) 1
|
|
|
|
|
+} else {
|
|
|
|
|
+ badchan:unset $nick $chan $banmask
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+###
|
|
|
proc badchan:getlist {nick host hand chan chan1 type next} {
|
|
proc badchan:getlist {nick host hand chan chan1 type next} {
|
|
|
global black
|
|
global black
|
|
|
set userlang [getuser $hand XTRA OUTPUT_LANG]
|
|
set userlang [getuser $hand XTRA OUTPUT_LANG]
|
|
@@ -29,12 +240,15 @@ foreach line $data {
|
|
|
set read_chan [lindex [split $line] 0]
|
|
set read_chan [lindex [split $line] 0]
|
|
|
set enc_chan [encoding convertfrom utf-8 $read_chan]
|
|
set enc_chan [encoding convertfrom utf-8 $read_chan]
|
|
|
set read_type [lindex [split $line] 1]
|
|
set read_type [lindex [split $line] 1]
|
|
|
-if {[string match -nocase $enc_chan $chan] && [string match -nocase $read_type "BADCHAN"]} {
|
|
|
|
|
|
|
+if {[string match -nocase $enc_chan $chan] && ([string match -nocase $read_type "BADCHAN"] || [string match -nocase $read_type "BADCHAN:REGEX"])} {
|
|
|
set msg_num [lindex [split $line] 2]
|
|
set msg_num [lindex [split $line] 2]
|
|
|
set bdchan [lindex [split $line] 3]
|
|
set bdchan [lindex [split $line] 3]
|
|
|
if {[regexp {^[+]} $bdchan]} {
|
|
if {[regexp {^[+]} $bdchan]} {
|
|
|
set text [black:color:set $hand $black(say.$userlang.gl.protexcept)]
|
|
set text [black:color:set $hand $black(say.$userlang.gl.protexcept)]
|
|
|
lappend badchanlist($msg_num) [string map {"+" ""} $bdchan] \[$text\]
|
|
lappend badchanlist($msg_num) [string map {"+" ""} $bdchan] \[$text\]
|
|
|
|
|
+} elseif {$read_type == "BADCHAN:REGEX"} {
|
|
|
|
|
+ set text [black:color:set $hand $black(say.$userlang.badchan.46)]
|
|
|
|
|
+ lappend badchanlist($msg_num) $bdchan \[$text\]
|
|
|
} else {
|
|
} else {
|
|
|
lappend badchanlist($msg_num) $bdchan
|
|
lappend badchanlist($msg_num) $bdchan
|
|
|
}
|
|
}
|
|
@@ -57,6 +271,7 @@ if {[string equal -nocase $chan "GLOBAL"]} {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+###
|
|
|
proc badchan:delchan {nick host hand chan chan1 number} {
|
|
proc badchan:delchan {nick host hand chan chan1 number} {
|
|
|
global black
|
|
global black
|
|
|
|
|
|
|
@@ -69,7 +284,7 @@ if {$type == "1"} {
|
|
|
}
|
|
}
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
- set ret [find:num $number $chan "BADCHAN"]
|
|
|
|
|
|
|
+ set ret [badchan:exists $chan $number]
|
|
|
if {$ret == 0} {
|
|
if {$ret == 0} {
|
|
|
blacktools:tell $nick $host $hand $chan $chan1 badchan.17 $number
|
|
blacktools:tell $nick $host $hand $chan $chan1 badchan.17 $number
|
|
|
return
|
|
return
|
|
@@ -87,7 +302,7 @@ if {$line != ""} {
|
|
|
set read_chan [lindex [split $line] 0]
|
|
set read_chan [lindex [split $line] 0]
|
|
|
set read_type [lindex [split $line] 1]
|
|
set read_type [lindex [split $line] 1]
|
|
|
set enc_chan [encoding convertfrom utf-8 $read_chan]
|
|
set enc_chan [encoding convertfrom utf-8 $read_chan]
|
|
|
-if {[string equal $number $read_num] && [string equal -nocase $chan $enc_chan] && [string equal -nocase $read_type "BADCHAN"]} {
|
|
|
|
|
|
|
+if {[string equal $number $read_num] && [string equal -nocase $chan $enc_chan] && ([string equal -nocase $read_type "BADCHAN"] || [string equal -nocase $read_type "BADCHAN:REGEX"])} {
|
|
|
continue
|
|
continue
|
|
|
} else {
|
|
} else {
|
|
|
puts $tempwrite $line
|
|
puts $tempwrite $line
|
|
@@ -103,6 +318,49 @@ if {[string equal -nocase $chan "GLOBAL"]} {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+###
|
|
|
|
|
+proc badchan:exists {chan num} {
|
|
|
|
|
+ global black
|
|
|
|
|
+ set found_it 0
|
|
|
|
|
+ set file [open $black(add_file) r]
|
|
|
|
|
+while {[gets $file line] != -1} {
|
|
|
|
|
+ set read_chan [lindex [split $line] 0]
|
|
|
|
|
+ set read_type [lindex [split $line] 1]
|
|
|
|
|
+ set read_num [lindex [split $line] 2]
|
|
|
|
|
+ set enc_chan [encoding convertfrom utf-8 $read_chan]
|
|
|
|
|
+if {[string equal -nocase $enc_chan $chan] && ([string equal -nocase $read_type "BADCHAN"] || [string equal -nocase $read_type "BADCHAN:REGEX"]) && [string equal $read_num $num]} {
|
|
|
|
|
+ set found_it 1
|
|
|
|
|
+ break
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ close $file
|
|
|
|
|
+ return $found_it
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+###
|
|
|
|
|
+proc badchan:find:num {chan} {
|
|
|
|
|
+ global black
|
|
|
|
|
+ set nums ""
|
|
|
|
|
+ set file [open $black(add_file) r]
|
|
|
|
|
+while {[gets $file line] != -1} {
|
|
|
|
|
+ set read_chan [lindex [split $line] 0]
|
|
|
|
|
+ set read_type [lindex [split $line] 1]
|
|
|
|
|
+ set read_num [lindex [split $line] 2]
|
|
|
|
|
+ set enc_chan [encoding convertfrom utf-8 $read_chan]
|
|
|
|
|
+if {[string equal -nocase $enc_chan $chan] && ([string equal -nocase $read_type "BADCHAN"] || [string equal -nocase $read_type "BADCHAN:REGEX"])} {
|
|
|
|
|
+ lappend nums $read_num
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+ close $file
|
|
|
|
|
+if {$nums != ""} {
|
|
|
|
|
+ set sort [blacktools:quicksort [join $nums]]
|
|
|
|
|
+ return [expr [lindex $sort end] + 1]
|
|
|
|
|
+} else {
|
|
|
|
|
+ return 1
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+###
|
|
|
proc badchan:process {nick host hand chan chan1 why bdchan type1 type reason} {
|
|
proc badchan:process {nick host hand chan chan1 why bdchan type1 type reason} {
|
|
|
global botnick black
|
|
global botnick black
|
|
|
set cmd_status [btcmd:status $chan $hand "badchan" 0]
|
|
set cmd_status [btcmd:status $chan $hand "badchan" 0]
|
|
@@ -117,9 +375,6 @@ if {[matchattr $hand -|q $chan]} { blacktools:tell $nick $host $hand $chan $chan
|
|
|
}
|
|
}
|
|
|
set show_bdchan $bdchan
|
|
set show_bdchan $bdchan
|
|
|
set cmd "badchan"
|
|
set cmd "badchan"
|
|
|
- set num 0
|
|
|
|
|
- set temp_num 0
|
|
|
|
|
- set gl 0
|
|
|
|
|
set getlang [string tolower [setting:get $chan lang]]
|
|
set getlang [string tolower [setting:get $chan lang]]
|
|
|
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
|
|
@@ -146,6 +401,55 @@ if {[info exists black(badchan:counter:$chan)]} {
|
|
|
unset black(badchan:counter:$chan)
|
|
unset black(badchan:counter:$chan)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+regex {
|
|
|
|
|
+if {![validchan $chan] && ![string equal -nocase $type "global"]} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+if {![regexp {^[&#]} $bdchan]} {
|
|
|
|
|
+switch $type1 {
|
|
|
|
|
+ 0 {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 gl.instr "badchan"
|
|
|
|
|
+ }
|
|
|
|
|
+ 1 {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 gl.instr_nick "badchan"
|
|
|
|
|
+ }
|
|
|
|
|
+ 2 {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 gl.instr_priv "badchan"
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+ set findchan [prot:findbadchan $chan $bdchan]
|
|
|
|
|
+if {$findchan == "1"} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 badchan.1 $show_bdchan
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+if {$reason == ""} {
|
|
|
|
|
+ set reason "$black(say.$getlang.badchan.5)"
|
|
|
|
|
+}
|
|
|
|
|
+ set reason [join [encoding convertto utf-8 $reason]]
|
|
|
|
|
+if {[matchattr $hand mn] && [string equal -nocase $type "global"]} {
|
|
|
|
|
+ set findchan [prot:findbadchan "GLOBAL" $bdchan]
|
|
|
|
|
+if {$findchan == "1"} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 badchan.42 $show_bdchan
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+ set num [badchan:find:num "GLOBAL"]
|
|
|
|
|
+ set file [open $black(add_file) a]
|
|
|
|
|
+ puts $file "GLOBAL BADCHAN:REGEX $num $bdchan $reason"
|
|
|
|
|
+ close $file
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 badchan.47 "$show_bdchan $num"
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+ set num [badchan:find:num $chan]
|
|
|
|
|
+ set encoded [encoding convertto utf-8 $bdchan]
|
|
|
|
|
+ set enc_chan [encoding convertto utf-8 $chan]
|
|
|
|
|
+ set file [open $black(add_file) a]
|
|
|
|
|
+ puts $file "$enc_chan BADCHAN:REGEX $num $encoded $reason"
|
|
|
|
|
+ close $file
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 badchan.48 "$bdchan $num"
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
add {
|
|
add {
|
|
|
if {![validchan $chan] && ![string equal -nocase $type "global"]} {
|
|
if {![validchan $chan] && ![string equal -nocase $type "global"]} {
|
|
@@ -191,7 +495,6 @@ if {$get == "$num"} {
|
|
|
set file [open $black(add_file) a]
|
|
set file [open $black(add_file) a]
|
|
|
puts $file "GLOBAL BADCHAN $num $bdchan $reason"
|
|
puts $file "GLOBAL BADCHAN $num $bdchan $reason"
|
|
|
close $file
|
|
close $file
|
|
|
- set gl 1
|
|
|
|
|
blacktools:tell $nick $host $hand $chan $chan1 badchan.11 "$show_bdchan $num"
|
|
blacktools:tell $nick $host $hand $chan $chan1 badchan.11 "$show_bdchan $num"
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
@@ -206,7 +509,6 @@ if {$get == "$num"} {
|
|
|
set file [open $black(add_file) a]
|
|
set file [open $black(add_file) a]
|
|
|
puts $file "$enc_chan BADCHAN $num $encoded $reason"
|
|
puts $file "$enc_chan BADCHAN $num $encoded $reason"
|
|
|
close $file
|
|
close $file
|
|
|
- set gl 0
|
|
|
|
|
if {[regexp {^[+]} $bdchan]} {
|
|
if {[regexp {^[+]} $bdchan]} {
|
|
|
blacktools:tell $nick $host $hand $chan $chan1 badchan.45 "[string map {"+" ""} $bdchan] $num"
|
|
blacktools:tell $nick $host $hand $chan $chan1 badchan.45 "[string map {"+" ""} $bdchan] $num"
|
|
|
} else {
|
|
} else {
|
|
@@ -269,6 +571,7 @@ switch $type1 {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+###
|
|
|
proc prot:findbadchan {chan word} {
|
|
proc prot:findbadchan {chan word} {
|
|
|
global black
|
|
global black
|
|
|
set found_it 0
|
|
set found_it 0
|
|
@@ -282,7 +585,7 @@ foreach line $data {
|
|
|
set read_type [lindex [split $line] 1]
|
|
set read_type [lindex [split $line] 1]
|
|
|
set b [lindex [split $line] 3]
|
|
set b [lindex [split $line] 3]
|
|
|
set enc_bchan [encoding convertfrom utf-8 $b]
|
|
set enc_bchan [encoding convertfrom utf-8 $b]
|
|
|
-if {[string match -nocase $enc_chan $chan] && [string match -nocase $read_type "BADCHAN"] && [string equal -nocase $word $enc_bchan] && ![regexp {^[+]} $read_chan] && ![regexp {^[+]} $word]} {
|
|
|
|
|
|
|
+if {[string match -nocase $enc_chan $chan] && ([string match -nocase $read_type "BADCHAN"] || [string match -nocase $read_type "BADCHAN:REGEX"]) && [string equal -nocase $word $enc_bchan] && ![regexp {^[+]} $read_chan] && ![regexp {^[+]} $word]} {
|
|
|
set found_it 1
|
|
set found_it 1
|
|
|
} elseif {[string match -nocase $enc_chan $chan] && [string match -nocase $read_type "BADCHAN"] && [string equal -nocase $word $enc_bchan] && [regexp {^[+]} $read_chan] && [regexp {^[+]} $word]} {
|
|
} elseif {[string match -nocase $enc_chan $chan] && [string match -nocase $read_type "BADCHAN"] && [string equal -nocase $word $enc_bchan] && [regexp {^[+]} $read_chan] && [regexp {^[+]} $word]} {
|
|
|
set found_it 1
|
|
set found_it 1
|
|
@@ -291,51 +594,72 @@ if {[string match -nocase $enc_chan $chan] && [string match -nocase $read_type "
|
|
|
return $found_it
|
|
return $found_it
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-proc badchanpublic:join {nick host hand chan} {
|
|
|
|
|
- global black
|
|
|
|
|
- set ::bad_chan $chan
|
|
|
|
|
-if {![validchan $chan]} { return }
|
|
|
|
|
-if {[setting:get $chan antibadchan]} {
|
|
|
|
|
-if {[matchattr $hand $black(exceptflags) $chan]} {
|
|
|
|
|
- return
|
|
|
|
|
|
|
+###
|
|
|
|
|
+proc badchan:flood:prot {chan host} {
|
|
|
|
|
+ global badchan black
|
|
|
|
|
+ set number [scan $black(badchan:join:seconds) %\[^:\]]
|
|
|
|
|
+ set timer [scan $black(badchan:join:seconds) %*\[^:\]:%s]
|
|
|
|
|
+if {[info exists badchan(flood:$host:$chan:act)]} {
|
|
|
|
|
+ return 1
|
|
|
}
|
|
}
|
|
|
-if {[isbotnick $nick]} { return }
|
|
|
|
|
-if {(![botisop $chan]) && (![setting:get $chan xonly])} { return }
|
|
|
|
|
- utimer 5 [list putserv "WHOIS $nick"]
|
|
|
|
|
- bind RAW - 319 badchan:execute
|
|
|
|
|
|
|
+foreach tmr [utimers] {
|
|
|
|
|
+if {[string match "*badchan:remove:flood $host $chan*" [join [lindex $tmr 1]]]} {
|
|
|
|
|
+ killutimer [lindex $tmr 2]
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+if {![info exists badchan(flood:$host:$chan)]} {
|
|
|
|
|
+ set badchan(flood:$host:$chan) 0
|
|
|
|
|
+}
|
|
|
|
|
+ incr badchan(flood:$host:$chan)
|
|
|
|
|
+ utimer $timer [list badchan:remove:flood $host $chan]
|
|
|
|
|
+if {$badchan(flood:$host:$chan) >= $number} {
|
|
|
|
|
+ set badchan(flood:$host:$chan:act) 1
|
|
|
|
|
+ utimer [expr $black(badchan:floodprot:time) * 60] [list badchan:expire:flood $host $chan]
|
|
|
|
|
+ return 1
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return 0
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-proc badchan:joinflood:unset {chan} {
|
|
|
|
|
- global black
|
|
|
|
|
-if {[info exists black(badchan_floodcontrol:$chan)]} {
|
|
|
|
|
- unset black(badchan_floodcontrol:$chan)
|
|
|
|
|
|
|
+###
|
|
|
|
|
+proc badchan:remove:flood {host chan} {
|
|
|
|
|
+ global badchan
|
|
|
|
|
+if {[info exists badchan(flood:$host:$chan)]} {
|
|
|
|
|
+ unset badchan(flood:$host:$chan)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-proc badchan:joinflood:unset:act {chan} {
|
|
|
|
|
- global black
|
|
|
|
|
-if {[info exists black(floodcontrol:act:$chan)]} {
|
|
|
|
|
- unset black(floodcontrol:act:$chan)
|
|
|
|
|
|
|
+###
|
|
|
|
|
+proc badchan:expire:flood {host chan} {
|
|
|
|
|
+ global badchan
|
|
|
|
|
+if {[info exists badchan(flood:$host:$chan:act)]} {
|
|
|
|
|
+ unset badchan(flood:$host:$chan:act)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+###
|
|
|
proc badchan:scantimer {channels} {
|
|
proc badchan:scantimer {channels} {
|
|
|
- global black
|
|
|
|
|
|
|
+ global black badchan
|
|
|
set badchanscan_list ""
|
|
set badchanscan_list ""
|
|
|
foreach chan $channels {
|
|
foreach chan $channels {
|
|
|
if {[validchan $chan]} {
|
|
if {[validchan $chan]} {
|
|
|
foreach nick [chanlist $chan] {
|
|
foreach nick [chanlist $chan] {
|
|
|
|
|
+ set host [getchanhost $nick $chan]
|
|
|
set hand [nick2hand $nick]
|
|
set hand [nick2hand $nick]
|
|
|
if {[isbotnick $nick]} { continue }
|
|
if {[isbotnick $nick]} { continue }
|
|
|
if {[matchattr $hand $black(exceptflags) $chan]} {
|
|
if {[matchattr $hand $black(exceptflags) $chan]} {
|
|
|
continue
|
|
continue
|
|
|
}
|
|
}
|
|
|
|
|
+if {[info exists badchan(flood:$host:$chan:act)]} {
|
|
|
|
|
+ continue
|
|
|
|
|
+}
|
|
|
|
|
+ set banmask [return_mask [return_host_num "badchan" $chan $host] $host $nick]
|
|
|
|
|
+if {[info exists badchan(checkagain:$banmask:$chan)]} {continue}
|
|
|
set bl_protect [blacktools:protect $nick $chan]
|
|
set bl_protect [blacktools:protect $nick $chan]
|
|
|
if {$bl_protect == "1"} { continue }
|
|
if {$bl_protect == "1"} { continue }
|
|
|
- set position [lsearch -exact [string tolower $badchanscan_list] "[string tolower $nick]:[string tolower $chan]"]
|
|
|
|
|
|
|
+ set position [lsearch -exact [string tolower $badchanscan_list] "[string tolower $nick]:[string tolower $chan]:$banmask"]
|
|
|
if {$position < 0} {
|
|
if {$position < 0} {
|
|
|
- lappend badchanscan_list "$nick:$chan"
|
|
|
|
|
|
|
+ lappend badchanscan_list "$nick:$chan:$banmask"
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -345,8 +669,9 @@ if {$badchanscan_list != ""} {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+###
|
|
|
proc badchan:scan {badchanlist} {
|
|
proc badchan:scan {badchanlist} {
|
|
|
- global black
|
|
|
|
|
|
|
+ global black badchan
|
|
|
if {![info exists black(badchan:scan:counter)]} {
|
|
if {![info exists black(badchan:scan:counter)]} {
|
|
|
set black(badchan:scan:counter) 0
|
|
set black(badchan:scan:counter) 0
|
|
|
}
|
|
}
|
|
@@ -355,160 +680,20 @@ if {$person == ""} {
|
|
|
unset black(badchan:scan:counter)
|
|
unset black(badchan:scan:counter)
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
- set black(badchan:scan:counter) [expr $black(badchan:scan:counter) + 1]
|
|
|
|
|
|
|
+ incr black(badchan:scan:counter)
|
|
|
set split_person [split $person ":"]
|
|
set split_person [split $person ":"]
|
|
|
set nick [lindex $split_person 0]
|
|
set nick [lindex $split_person 0]
|
|
|
- set channel [lindex $split_person 1]
|
|
|
|
|
- set ::bad_chan $channel
|
|
|
|
|
|
|
+ set chan [lindex $split_person 1]
|
|
|
|
|
+ set banmask [lindex $split_person 2]
|
|
|
|
|
+if {![info exists black(badchan:check:$nick:$chan)]} {
|
|
|
|
|
+ set black(badchan:check:$nick:$chan) [list $chan $banmask]
|
|
|
putserv "WHOIS $nick"
|
|
putserv "WHOIS $nick"
|
|
|
- bind RAW - 319 badchan:execute
|
|
|
|
|
- utimer 10 [list badchan:scan $badchanlist]
|
|
|
|
|
|
|
+ set ::badchan($nick) $chan
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-proc badchan:execute {from keyword arguments } {
|
|
|
|
|
-global botnick badchan black
|
|
|
|
|
- set chan $::bad_chan
|
|
|
|
|
- set cmd "badchan"
|
|
|
|
|
- set file_found 0
|
|
|
|
|
- set chan1 $chan
|
|
|
|
|
- set arguments [split $arguments]
|
|
|
|
|
- set nick [string tolower [lindex $arguments 1]]
|
|
|
|
|
- set show_nick [lindex $arguments 1]
|
|
|
|
|
- set channels [string tolower [lrange $arguments 2 end]]
|
|
|
|
|
- set text [join [check:badchan:except $channels $chan]]
|
|
|
|
|
- set banmask [return_mask [return_host_num $cmd $chan [getchanhost $nick $chan]] [getchanhost $nick $chan] $nick]
|
|
|
|
|
- set getlang [string tolower [setting:get $chan lang]]
|
|
|
|
|
-if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
-if {![onchan $nick $chan]} {
|
|
|
|
|
- return
|
|
|
|
|
-}
|
|
|
|
|
- set bl_protect [blacktools:protect $nick $chan]
|
|
|
|
|
-if {$bl_protect == "1"} { return }
|
|
|
|
|
-
|
|
|
|
|
- set file [open $black(add_file) r]
|
|
|
|
|
- set size [file size $black(add_file)]
|
|
|
|
|
- set data [split [read $file $size] \n]
|
|
|
|
|
- close $file
|
|
|
|
|
-foreach line $data {
|
|
|
|
|
- set mainchan [lindex [split $line] 0]
|
|
|
|
|
- set read_type [lindex [split $line] 1]
|
|
|
|
|
-if {([string equal -nocase $chan $mainchan] || [string equal -nocase "GLOBAL" $mainchan]) && [string equal -nocase $read_type "BADCHAN"]} {
|
|
|
|
|
- set readchan [lindex [split $line] 3]
|
|
|
|
|
- set encoded [encoding convertfrom utf-8 $readchan]
|
|
|
|
|
-foreach c $text {
|
|
|
|
|
- set ch [string trimleft $c ":~@+"]
|
|
|
|
|
-if {[string match -nocase $encoded $ch]} {
|
|
|
|
|
- set file_found 1
|
|
|
|
|
- set reason [lrange [split $line] 4 end]
|
|
|
|
|
- set badchan($banmask:$chan) $reason
|
|
|
|
|
- set badchan(channels:$banmask:$chan) $ch
|
|
|
|
|
- break
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-if {$file_found == "0"} {
|
|
|
|
|
-foreach defchan $black(badcchannels) {
|
|
|
|
|
- set encoded [encoding convertfrom utf-8 $defchan]
|
|
|
|
|
-foreach c $text {
|
|
|
|
|
- set ch [string trimleft $c ":@+"]
|
|
|
|
|
- set ch [check:except $ch $chan $black(badcchannels) $black(exceptchannels) "BADCHAN"]
|
|
|
|
|
-if {[string match -nocase $encoded $ch]} {
|
|
|
|
|
- set badchan(channels:$banmask:$chan) $ch
|
|
|
|
|
- set badchan($banmask:$chan) $black(say.$getlang.badchan.5)
|
|
|
|
|
- break
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-if {[info exists badchan($banmask:$chan)]} {
|
|
|
|
|
-if {[string equal -nocase $badchan($banmask:$chan) $black(say.$getlang.badchan.5)]} {
|
|
|
|
|
-if {[setting:get $chan badchan-reason] != ""} {
|
|
|
|
|
- set getreason [join [setting:get $chan badchan-reason]]
|
|
|
|
|
-} else {
|
|
|
|
|
- set getreason $black(say.$getlang.badchan.5)
|
|
|
|
|
- }
|
|
|
|
|
-} else {
|
|
|
|
|
- set getreason [join $badchan($banmask:$chan)]
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-if {[info exists badchan(checkagain:$banmask:$chan)]} {
|
|
|
|
|
-if {[info exists badchan($banmask:$chan)]} {
|
|
|
|
|
- blacktools:banner:2 $nick "BADCHAN,[encoding convertto utf-8 $badchan(channels:$banmask:$chan)]" $chan $chan1 [getchanhost $nick $chan] "0" ""
|
|
|
|
|
- who:chan $chan
|
|
|
|
|
-if {[setting:get $chan showbadchan]} {
|
|
|
|
|
- set replace(%nick%) $show_nick
|
|
|
|
|
- set replace(%chans%) $badchan(channels:$banmask:$chan)
|
|
|
|
|
- set mes [string map [array get replace] $black(say.$getlang.badchan.44)]
|
|
|
|
|
- putserv "NOTICE @$chan :$mes"
|
|
|
|
|
-}
|
|
|
|
|
- unset badchan(checkagain:$banmask:$chan)
|
|
|
|
|
- unset badchan($banmask:$chan)
|
|
|
|
|
- unset badchan(channels:$banmask:$chan)
|
|
|
|
|
- return
|
|
|
|
|
-}
|
|
|
|
|
- unset badchan(checkagain:$banmask:$chan)
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-if {[info exists badchan($banmask:$chan)]} {
|
|
|
|
|
-if {[setting:get $chan badchan-bmethod] == "0" || [setting:get $chan badchan-bmethod] == ""} {
|
|
|
|
|
- set bmethod $black(badcbanmethod)
|
|
|
|
|
-} else { set bmethod [setting:get $chan badchan-bmethod] }
|
|
|
|
|
-if {$bmethod == "2"} {
|
|
|
|
|
- blacktools:banner:2 $nick "BADCHAN,[encoding convertto utf-8 $badchan(channels:$banmask:$chan)]" $chan $chan1 [getchanhost $nick $chan] "0" ""
|
|
|
|
|
- who:chan $chan
|
|
|
|
|
-if {[setting:get $chan showbadchan]} {
|
|
|
|
|
- set replace(%nick%) $nick
|
|
|
|
|
- set replace(%chans%) $badchan(channels:$banmask:$chan)
|
|
|
|
|
- set text [black:color:set "" $black(say.$getlang.badchan.44)]
|
|
|
|
|
- set text [join $text]
|
|
|
|
|
- set mes [string map [array get replace] $text]
|
|
|
|
|
- putserv "NOTICE @$chan :$mes"
|
|
|
|
|
-}
|
|
|
|
|
- unset badchan($banmask:$chan)
|
|
|
|
|
- unset badchan(channels:$banmask:$chan)
|
|
|
|
|
- return
|
|
|
|
|
-}
|
|
|
|
|
- set replace(%badchans%) [join $badchan(channels:$banmask:$chan) ", "]
|
|
|
|
|
- set text [black:color:set "" $black(say.$getlang.badchan.40)]
|
|
|
|
|
- set reply [join $text]
|
|
|
|
|
-if {[setting:get $chan badchan-banwait] == ""} {
|
|
|
|
|
- set wait_time $black(badcbanwait)
|
|
|
|
|
- utimer $black(badcbanwait) [list badchan:check:again $nick $chan]
|
|
|
|
|
-} else {
|
|
|
|
|
- set wait_time [setting:get $chan badchan-banwait]
|
|
|
|
|
- utimer $wait_time [list badchan:check:again $nick $chan]
|
|
|
|
|
-}
|
|
|
|
|
- set replace(%time%) $wait_time
|
|
|
|
|
- set message [string map [array get replace] $reply]
|
|
|
|
|
- putquick "PRIVMSG $nick :\[$chan\] $message"
|
|
|
|
|
- unset badchan($banmask:$chan)
|
|
|
|
|
- unset badchan(channels:$banmask:$chan)
|
|
|
|
|
- set badchan(checkagain:$banmask:$chan) 1
|
|
|
|
|
-} else {
|
|
|
|
|
-if {[info exists badchan(checkagain:$banmask:$chan]} {
|
|
|
|
|
- unset badchan(checkagain:$banmask:$chan
|
|
|
|
|
-}
|
|
|
|
|
-if {[info exists badchan($banmask:$chan)]} {
|
|
|
|
|
- unset badchan($banmask:$chan)
|
|
|
|
|
-}
|
|
|
|
|
-if {[info exists badchan(channels:$banmask:$chan)]} {
|
|
|
|
|
- unset badchan(channels:$banmask:$chan)
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- unbind RAW - 319 badchan:execute
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-proc badchan:check:again {nick chan} {
|
|
|
|
|
- global black badchan
|
|
|
|
|
- putserv "WHOIS $nick"
|
|
|
|
|
- set ::bad_chan $chan
|
|
|
|
|
- bind RAW - 319 badchan:execute
|
|
|
|
|
|
|
+ utimer 10 [list badchan:scan $badchanlist]
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+###
|
|
|
proc badchan:nickchange {nick host hand chan newnick} {
|
|
proc badchan:nickchange {nick host hand chan newnick} {
|
|
|
global badchan
|
|
global badchan
|
|
|
set found_time 0
|
|
set found_time 0
|
|
@@ -525,39 +710,7 @@ if {$found_time == "1"} {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-proc badchan:split {nick host hand chan args} {
|
|
|
|
|
- global badchan
|
|
|
|
|
- badchan:part $nick $host $hand $chan "none"
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-proc badchan:kick {nick host hand chan kicked reason} {
|
|
|
|
|
- global badchan
|
|
|
|
|
- badchan:part $kicked $host $hand $chan "none"
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-proc badchan:part {nick host hand chan arg} {
|
|
|
|
|
- global badchan
|
|
|
|
|
-if {![validchan $chan]} { return }
|
|
|
|
|
- set banmask *!*@[lindex [split [getchanhost $nick $chan] "@"] 1]
|
|
|
|
|
-foreach tmr [utimers] {
|
|
|
|
|
-if {[string match -nocase "*badchan:check:again $nick $chan*" [join [lindex $tmr 1]]]} {
|
|
|
|
|
- killutimer [lindex $tmr 2]
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-if {[info exists badchan(checkagain:$banmask:$chan)]} {
|
|
|
|
|
- unset badchan(checkagain:$banmask:$chan)
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-if {[info exists badchan($banmask:$chan)]} {
|
|
|
|
|
- unset badchan($banmask:$chan)
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-if {[info exists badchan(channels:$banmask:$chan)]} {
|
|
|
|
|
- unset badchan(channels:$banmask:$chan)
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
|
|
+###
|
|
|
proc get:timer:time {nick chan} {
|
|
proc get:timer:time {nick chan} {
|
|
|
global black
|
|
global black
|
|
|
set time_left 0
|
|
set time_left 0
|
|
@@ -569,7 +722,7 @@ if {[string match -nocase "*badchan:check:again $nick $chan*" [join [lindex $tmr
|
|
|
return $time_left
|
|
return $time_left
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
|
+###
|
|
|
proc check:badchan:except {text chan} {
|
|
proc check:badchan:except {text chan} {
|
|
|
global black
|
|
global black
|
|
|
set counter_word 0
|
|
set counter_word 0
|