|
@@ -0,0 +1,1628 @@
|
|
|
|
|
+##########################################################
|
|
|
|
|
+#
|
|
|
|
|
+# BLackToolS
|
|
|
|
|
+# Protection TCL
|
|
|
|
|
+#
|
|
|
|
|
+# BLaCkShaDoW ProductionS
|
|
|
|
|
+##########################################################
|
|
|
|
|
+
|
|
|
|
|
+set black(antipub_file) "scripts/BlackTools/FILES/$username.antipub_except.txt"
|
|
|
|
|
+set black(bad_saylist) "scripts/BlackTools/FILES/$username.bad_saylist.txt"
|
|
|
|
|
+
|
|
|
|
|
+if {![file exists $black(antipub_file)]} {
|
|
|
|
|
+ set file [open $black(antipub_file) w]
|
|
|
|
|
+ close $file
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+if {![file exists $black(bad_saylist)]} {
|
|
|
|
|
+ set file [open $black(bad_saylist) w]
|
|
|
|
|
+ close $file
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc bad:add:word {chan host msg} {
|
|
|
|
|
+ global black
|
|
|
|
|
+ set counter 0
|
|
|
|
|
+ set file [open $black(bad_saylist) r]
|
|
|
|
|
+ set w [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ set data [split $w "\n"]
|
|
|
|
|
+if {$w != ""} {
|
|
|
|
|
+foreach line $data {
|
|
|
|
|
+ set channel [lindex [split $line] 0]
|
|
|
|
|
+ set hostmask [lindex [split $line] 1]
|
|
|
|
|
+if {[string match -nocase $channel $chan] && [string equal -nocase $host $hostmask]} {
|
|
|
|
|
+ set counter [expr $counter + 1]
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+for {set j 0} {$j < $counter} {incr j} {
|
|
|
|
|
+ set file [open $black(bad_saylist) "r"]
|
|
|
|
|
+ set database [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ set data [split $database "\n"]
|
|
|
|
|
+ set i [lsearch -glob $data "$chan $host *"]
|
|
|
|
|
+if {$i > -1} {
|
|
|
|
|
+ set line [lindex $data $i]
|
|
|
|
|
+ set delete [lreplace $data $i $i]
|
|
|
|
|
+ set file [open $black(bad_saylist) "w"]
|
|
|
|
|
+ puts $file [join $delete "\n"]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+ set file [open $black(bad_saylist) "r"]
|
|
|
|
|
+ set database [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+if {$database == ""} {
|
|
|
|
|
+ set file [open $black(bad_saylist) "w"]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+ set file [open $black(bad_saylist) "a"]
|
|
|
|
|
+ puts $file "$chan $host $msg"
|
|
|
|
|
+ close $file
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+proc badword:autocheck {minute hour day month year} {
|
|
|
|
|
+ global black
|
|
|
|
|
+ set file [open $black(bad_saylist) r]
|
|
|
|
|
+ set w [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ set data [split $w "\n"]
|
|
|
|
|
+if {$w != ""} {
|
|
|
|
|
+foreach line $data {
|
|
|
|
|
+ set chan [lindex [split $line] 0]
|
|
|
|
|
+ set hostmask [lindex [split $line] 1]
|
|
|
|
|
+if {![validchan $chan]} {
|
|
|
|
|
+ bad:del:word $chan $hostmask
|
|
|
|
|
+} else {
|
|
|
|
|
+if {![isban $hostmask $chan]} {
|
|
|
|
|
+ bad:del:word $chan $hostmask
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc check:badword:unban {level chan message} {
|
|
|
|
|
+ global black
|
|
|
|
|
+if {[string equal "*" $chan] && [string match -nocase "*No longer banning*" $message]} {
|
|
|
|
|
+ set ban [lindex $message 3]
|
|
|
|
|
+ set channel [lindex $message 5]
|
|
|
|
|
+ bad:del:word $channel $ban
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc bad:del:word {chan host} {
|
|
|
|
|
+ global black
|
|
|
|
|
+ set counter 0
|
|
|
|
|
+ set file [open $black(bad_saylist) r]
|
|
|
|
|
+ set w [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ set data [split $w "\n"]
|
|
|
|
|
+if {$w != ""} {
|
|
|
|
|
+foreach line $data {
|
|
|
|
|
+ set channel [lindex [split $line] 0]
|
|
|
|
|
+ set hostmask [lindex [split $line] 1]
|
|
|
|
|
+if {[string match -nocase $channel $chan] && [string equal -nocase $host $hostmask]} {
|
|
|
|
|
+ set counter [expr $counter + 1]
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+for {set j 0} {$j < $counter} {incr j} {
|
|
|
|
|
+ set file [open $black(bad_saylist) "r"]
|
|
|
|
|
+ set database [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ set data [split $database "\n"]
|
|
|
|
|
+ set i [lsearch -glob $data "$chan $host *"]
|
|
|
|
|
+if {$i > -1} {
|
|
|
|
|
+ set line [lindex $data $i]
|
|
|
|
|
+ set delete [lreplace $data $i $i]
|
|
|
|
|
+ set file [open $black(bad_saylist) "w"]
|
|
|
|
|
+ puts $file [join $delete "\n"]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+ set file [open $black(bad_saylist) "r"]
|
|
|
|
|
+ set database [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+if {$database == ""} {
|
|
|
|
|
+ set file [open $black(bad_saylist) "w"]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+proc check:badword:entries {oldpath newpath} {
|
|
|
|
|
+ global botnick
|
|
|
|
|
+if {![file exists $newpath]} {
|
|
|
|
|
+ set file [open $newpath w]
|
|
|
|
|
+ close $file
|
|
|
|
|
+}
|
|
|
|
|
+if {[file exists $oldpath]} {
|
|
|
|
|
+ set file [open $oldpath r]
|
|
|
|
|
+ set w [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+if {$w != ""} {
|
|
|
|
|
+ set data [split $w "\n"]
|
|
|
|
|
+foreach entry $data {
|
|
|
|
|
+ set file [open $newpath a]
|
|
|
|
|
+ puts $file "$entry"
|
|
|
|
|
+ close $file
|
|
|
|
|
+}
|
|
|
|
|
+ set file [open $oldpath w]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+ set old_badword_dir "$username.bword.db"
|
|
|
|
|
+ set new_badword_dir "scripts/BlackTools/FILES/$username.bword.txt"
|
|
|
|
|
+
|
|
|
|
|
+ check:badword:entries $old_badword_dir $new_badword_dir
|
|
|
|
|
+
|
|
|
|
|
+proc blacktools:banner:1 {banmask botnick chan reason mode timer bantime} {
|
|
|
|
|
+global black
|
|
|
|
|
+if {[channel get $chan xban]} {
|
|
|
|
|
+set getcount [channel get $chan kickcount]
|
|
|
|
|
+set getxtime [channel get $chan xbantime]
|
|
|
|
|
+set getxlevel [channel get $chan xbanlevel]
|
|
|
|
|
+if {$getxlevel == "0"} { set getxlevel "100"}
|
|
|
|
|
+if {$getxtime == "0"} { set getxtime "1" }
|
|
|
|
|
+set kcount [expr $getcount +1]
|
|
|
|
|
+channel set $chan kickcount $kcount
|
|
|
|
|
+if {[channel get $chan showcount]} {
|
|
|
|
|
+set reason "$reason - $kcount -"
|
|
|
|
|
+} else {
|
|
|
|
|
+set reason "$reason"
|
|
|
|
|
+}
|
|
|
|
|
+putquick "MODE $chan +$mode" -next ;utimer $timer [list putquick "MODE $chan -$mode"]
|
|
|
|
|
+putquick "PRIVMSG $black(chanserv) :ban $chan $banmask $getxtime $getxlevel $reason"
|
|
|
|
|
+newchanban $chan $banmask $botnick $reason $bantime
|
|
|
|
|
+if {![channel get $chan chanreport]} {
|
|
|
|
|
+return 0
|
|
|
|
|
+}
|
|
|
|
|
+set backchan [channel get $chan backchan]
|
|
|
|
|
+if {$backchan == ""} {
|
|
|
|
|
+return 0
|
|
|
|
|
+}
|
|
|
|
|
+if {!([validchan $backchan]) || !([onchan $botnick $backchan])} {
|
|
|
|
|
+return 0
|
|
|
|
|
+}
|
|
|
|
|
+if {[info exists black($chan:anounce)]} {
|
|
|
|
|
+return 0
|
|
|
|
|
+}
|
|
|
|
|
+set black($chan:anounce) 1
|
|
|
|
|
+set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+set replace(%banmask%) $banmask
|
|
|
|
|
+set replace(%bantime%) $bantime
|
|
|
|
|
+set replace(%reason%) $reason
|
|
|
|
|
+set replace(%chan%) $chan
|
|
|
|
|
+puthelp "PRIVMSG $backchan :[string map [array get replace] $black(say.$getlang.reportchan)]"
|
|
|
|
|
+} else {
|
|
|
|
|
+set getcount [channel get $chan kickcount]
|
|
|
|
|
+set kcount [expr $getcount +1]
|
|
|
|
|
+channel set $chan kickcount $kcount
|
|
|
|
|
+if {[channel get $chan showcount]} {
|
|
|
|
|
+set reason "$reason - $kcount -" } else {
|
|
|
|
|
+set reason "$reason" }
|
|
|
|
|
+putquick "MODE $chan +$mode" -next ;utimer $timer [list putquick "MODE $chan -$mode"]
|
|
|
|
|
+newchanban $chan $banmask $botnick $reason $bantime
|
|
|
|
|
+if {![channel get $chan chanreport]} {
|
|
|
|
|
+return 0
|
|
|
|
|
+}
|
|
|
|
|
+set backchan [channel get $chan backchan]
|
|
|
|
|
+if {$backchan == ""} {
|
|
|
|
|
+return 0
|
|
|
|
|
+}
|
|
|
|
|
+if {!([validchan $backchan]) || !([onchan $botnick $backchan])} {
|
|
|
|
|
+return 0
|
|
|
|
|
+}
|
|
|
|
|
+if {[info exists black($chan:anounce)]} {
|
|
|
|
|
+return 0
|
|
|
|
|
+}
|
|
|
|
|
+set black($chan:anounce) 1
|
|
|
|
|
+set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+set replace(%banmask%) $banmask
|
|
|
|
|
+set replace(%bantime%) $bantime
|
|
|
|
|
+set replace(%reason%) $reason
|
|
|
|
|
+set replace(%chan%) $chan
|
|
|
|
|
+puthelp "PRIVMSG $backchan :[string map [array get replace] $black(say.$getlang.reportchan)]"
|
|
|
|
|
+}
|
|
|
|
|
+utimer 5 [list unset black($chan:anounce)]
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc blacktools:banner:2 {banmask botnick chan reason bantime} {
|
|
|
|
|
+global black
|
|
|
|
|
+if {[channel get $chan xban]} {
|
|
|
|
|
+set getcount [channel get $chan kickcount]
|
|
|
|
|
+set getxtime [channel get $chan xbantime]
|
|
|
|
|
+if {$getxtime == "0"} { set getxtime "1" }
|
|
|
|
|
+set getxlevel [channel get $chan xbanlevel]
|
|
|
|
|
+if {$getxlevel == "0"} { set getxlevel "100"}
|
|
|
|
|
+set kcount [expr $getcount +1]
|
|
|
|
|
+channel set $chan kickcount $kcount
|
|
|
|
|
+if {[channel get $chan showcount]} {
|
|
|
|
|
+set reason "$reason - $kcount -"
|
|
|
|
|
+} else {
|
|
|
|
|
+set reason "$reason"
|
|
|
|
|
+}
|
|
|
|
|
+putquick "PRIVMSG $black(chanserv) :ban $chan $banmask $getxtime $getxlevel $reason"
|
|
|
|
|
+newchanban $chan $banmask $botnick $reason $bantime
|
|
|
|
|
+if {![channel get $chan chanreport]} {
|
|
|
|
|
+return 0
|
|
|
|
|
+}
|
|
|
|
|
+set backchan [channel get $chan backchan]
|
|
|
|
|
+if {$backchan == ""} {
|
|
|
|
|
+return 0
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+if {!([validchan $backchan]) || !([onchan $botnick $backchan])} {
|
|
|
|
|
+return 0
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+if {[info exists black($chan:anounce)]} {
|
|
|
|
|
+return 0
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+set black($chan:anounce) 1
|
|
|
|
|
+set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+set replace(%banmask%) $banmask
|
|
|
|
|
+set replace(%bantime%) $bantime
|
|
|
|
|
+set replace(%reason%) $reason
|
|
|
|
|
+set replace(%chan%) $chan
|
|
|
|
|
+puthelp "PRIVMSG $backchan :[string map [array get replace] $black(say.$getlang.reportchan)]"
|
|
|
|
|
+
|
|
|
|
|
+} else {
|
|
|
|
|
+
|
|
|
|
|
+set getcount [channel get $chan kickcount]
|
|
|
|
|
+set kcount [expr $getcount +1]
|
|
|
|
|
+channel set $chan kickcount $kcount
|
|
|
|
|
+if {[channel get $chan showcount]} {
|
|
|
|
|
+set reason "$reason - $kcount -" } else {
|
|
|
|
|
+set reason "$reason" }
|
|
|
|
|
+newchanban $chan $banmask $botnick $reason $bantime
|
|
|
|
|
+if {![channel get $chan chanreport]} {
|
|
|
|
|
+return 0
|
|
|
|
|
+}
|
|
|
|
|
+set backchan [channel get $chan backchan]
|
|
|
|
|
+if {$backchan == ""} {
|
|
|
|
|
+return 0
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+if {!([validchan $backchan]) || !([onchan $botnick $backchan])} {
|
|
|
|
|
+return 0
|
|
|
|
|
+}
|
|
|
|
|
+if {[info exists black($chan:anounce)]} {
|
|
|
|
|
+return 0
|
|
|
|
|
+}
|
|
|
|
|
+set black($chan:anounce) 1
|
|
|
|
|
+set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+set replace(%banmask%) $banmask
|
|
|
|
|
+set replace(%bantime%) $bantime
|
|
|
|
|
+set replace(%reason%) $reason
|
|
|
|
|
+set replace(%chan%) $chan
|
|
|
|
|
+puthelp "PRIVMSG $backchan :[string map [array get replace] $black(say.$getlang.reportchan)]"
|
|
|
|
|
+}
|
|
|
|
|
+utimer 5 [list unset black($chan:anounce)]
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+################################ antipub ###########################
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+proc antipub:filter {str} {
|
|
|
|
|
+ regsub -all -- {\003([0-9]{1,2}(,[0-9]{1,2})?)?|\017|\037|\002|\026|\006|\007} $str "" str
|
|
|
|
|
+ return $str
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc antipub:protect {nick host hand chan arg} {
|
|
|
|
|
+global black botnick
|
|
|
|
|
+ set text [antipub:filter [join [split $arg]]]
|
|
|
|
|
+ set handle [nick2hand $nick]
|
|
|
|
|
+ set find_pub 0
|
|
|
|
|
+if {![validchan $chan]} { return }
|
|
|
|
|
+if {[channel get $chan antipub]} {
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return }
|
|
|
|
|
+if {![botisop $chan]} { return }
|
|
|
|
|
+if {[antipub:protect:except $text $chan] == "1"} {
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+ set getreason [channel get $chan antipub-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+ set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+ set getreason $black(say.$getlang.antipub.1)
|
|
|
|
|
+}
|
|
|
|
|
+ set getbantime [channel get $chan antipub-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(antipubbantime) }
|
|
|
|
|
+ set replace(%chan%) $chan
|
|
|
|
|
+ set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+ set reason "$protectreason"
|
|
|
|
|
+ set banmask *!*@[lindex [split $host @] 1]
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+foreach antipub [string tolower $black(antipubword)] {
|
|
|
|
|
+if {[string match -nocase $antipub $arg]} {
|
|
|
|
|
+ set find_pub 1
|
|
|
|
|
+blacktools:banner:1 $banmask "ANTIPUB" $chan $reason $black(antipubmode) $black(antipubsecunde) $getbantime
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+if {$find_pub == "1"} {
|
|
|
|
|
+ bad:add:word $chan $banmask $arg
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc antipub:protect:me {nick host hand chan keyword arg} {
|
|
|
|
|
+global black
|
|
|
|
|
+antipub:protect $nick $host $hand $chan $arg
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc antipub:protect:except {text chan} {
|
|
|
|
|
+ global black
|
|
|
|
|
+ set text [split $text]
|
|
|
|
|
+ set counter_word 0
|
|
|
|
|
+ set counter_except 0
|
|
|
|
|
+ set found_pub 0
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+foreach antipub $black(antipubword) {
|
|
|
|
|
+if {[string match -nocase $antipub $text]} {
|
|
|
|
|
+ set found_pub 1
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+if {$found_pub == 0} { return }
|
|
|
|
|
+
|
|
|
|
|
+foreach except $black(antipubexcept) {
|
|
|
|
|
+ set position [lsearch -exact [string tolower $text] [string tolower $except]]
|
|
|
|
|
+if {$position > -1} {
|
|
|
|
|
+ set text [lreplace $text $position $position]
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+ set file [open $black(antipub_file) "r"]
|
|
|
|
|
+ set database [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ set data [split $database "\n"]
|
|
|
|
|
+
|
|
|
|
|
+foreach line $data {
|
|
|
|
|
+ set channel [lindex [split $line] 0]
|
|
|
|
|
+ set link [lindex $line 1]
|
|
|
|
|
+foreach word $text {
|
|
|
|
|
+if {[string equal -nocase $channel $chan] && [string match -nocase $link $word]} {
|
|
|
|
|
+ set position [lsearch -exact [string tolower $text] [string tolower $word]]
|
|
|
|
|
+if {$position > -1} {
|
|
|
|
|
+ set text [lreplace $text $position $position]
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+foreach antipub $black(antipubword) {
|
|
|
|
|
+if {[string match -nocase $antipub $text]} {
|
|
|
|
|
+ return 0
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return 1
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc antipub:module {nick host hand chan arg} {
|
|
|
|
|
+ global black
|
|
|
|
|
+ set type 0
|
|
|
|
|
+ set chan1 "$chan"
|
|
|
|
|
+ set why [lindex [split $arg] 0]
|
|
|
|
|
+ set except [lrange [split $arg] 1 end]
|
|
|
|
|
+if {[regexp {^[&#]} $why] && [matchattr $hand nm|- $chan]} {
|
|
|
|
|
+ set chan "$why"
|
|
|
|
|
+ set why [lindex [split $arg] 1]
|
|
|
|
|
+ set except [lrange [split $arg] 2 end]
|
|
|
|
|
+}
|
|
|
|
|
+ antipub:module:process $nick $host $hand $chan $chan1 $why $except $type
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc antipub:module:process {nick host hand chan chan1 why except type} {
|
|
|
|
|
+ global black botnick
|
|
|
|
|
+ set i 0
|
|
|
|
|
+ set char(p) [lindex $black(cmdchar) 0]
|
|
|
|
|
+if {[string match -nocase "none" "$char(p)"]} {
|
|
|
|
|
+ set char(p) ""
|
|
|
|
|
+}
|
|
|
|
|
+if {[matchattr $hand nm|- $chan]} {
|
|
|
|
|
+if {($why == "") && ($type == "0")} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 antipub.2 none
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+if {($why == "") && ($type == "1")} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 antipub.3 none
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+if {($why == "") && ($type == "0")} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 antipub.4 none
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+if {($why == "") && ($type == "1")} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 antipub.5 none
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+if {![validchan $chan]} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+if {![onchan $botnick $chan]} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+switch -exact -- [string tolower $why] {
|
|
|
|
|
+
|
|
|
|
|
+add {
|
|
|
|
|
+
|
|
|
|
|
+if {$except == ""} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 antipub.9 none
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+ set file [open $black(antipub_file) a]
|
|
|
|
|
+ puts $file "$chan $except"
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 antipub.6 $except
|
|
|
|
|
+ close $file
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+list {
|
|
|
|
|
+ set counter 0
|
|
|
|
|
+ set found_it 0
|
|
|
|
|
+ set file [open $black(antipub_file) r]
|
|
|
|
|
+ set database [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ set data [split $database "\n"]
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 antipub.7 none
|
|
|
|
|
+foreach line $data {
|
|
|
|
|
+ set channel [lindex [split $line] 0]
|
|
|
|
|
+ set link [lindex [split $line] 1]
|
|
|
|
|
+
|
|
|
|
|
+if {[string equal -nocase $channel $chan]} {
|
|
|
|
|
+ set counter [expr $counter + 1]
|
|
|
|
|
+ set found_it 1
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 antipub.8 "$counter.) $link"
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if {$found_it == "0"} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 antipub.10 none
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+del {
|
|
|
|
|
+ set counter 0
|
|
|
|
|
+if {$except == ""} {
|
|
|
|
|
+blacktools:tell $nick $host $hand $chan $chan1 antipub.11 none
|
|
|
|
|
+return
|
|
|
|
|
+}
|
|
|
|
|
+ set file [open $black(antipub_file) r]
|
|
|
|
|
+ set database [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ set data [split $database "\n"]
|
|
|
|
|
+
|
|
|
|
|
+foreach line $data {
|
|
|
|
|
+
|
|
|
|
|
+ set channel [lindex [split $line] 0]
|
|
|
|
|
+ set link [lindex [split $line] 1]
|
|
|
|
|
+if {[string equal -nocase $channel $chan] && [string equal -nocase $except $link]} {
|
|
|
|
|
+ set counter [expr $counter + 1]
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+for {set j 0} {$j < $counter} {incr j} {
|
|
|
|
|
+
|
|
|
|
|
+ set file [open $black(antipub_file) "r"]
|
|
|
|
|
+ set database [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ set data [split $database "\n"]
|
|
|
|
|
+ set i [lsearch -glob $data "* $except"]
|
|
|
|
|
+
|
|
|
|
|
+if {$i > -1} {
|
|
|
|
|
+ set line [lindex $data $i]
|
|
|
|
|
+ set delete [lreplace $data $i $i]
|
|
|
|
|
+ set file [open $black(antipub_file) "w"]
|
|
|
|
|
+ puts $file [join $delete "\n"]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+ set file [open $black(antipub_file) "r"]
|
|
|
|
|
+ set database [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+if {$database == ""} {
|
|
|
|
|
+ set file [open $black(antipub_file) "w"]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ }
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 antipub.12 $counter
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+############################### antinotice #############################
|
|
|
|
|
+
|
|
|
|
|
+proc antinotice:protect {nick host hand arg chan} {
|
|
|
|
|
+global black botnick
|
|
|
|
|
+set handle [nick2hand $nick]
|
|
|
|
|
+if {![validchan $chan]} { return 0 }
|
|
|
|
|
+set getreason [channel get $chan antinotice-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+set getreason $black(say.$getlang.antinotice.1)
|
|
|
|
|
+}
|
|
|
|
|
+set getbantime [channel get $chan antinotice-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(antinoticebantime) }
|
|
|
|
|
+set replace(%chan%) $chan
|
|
|
|
|
+set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+set banmask *!*@[lindex [split $host @] 1]
|
|
|
|
|
+set reason "$protectreason"
|
|
|
|
|
+if {![botisop $chan]} { return }
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return }
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+if {[isbotnick $nick]} { return }
|
|
|
|
|
+if {$chan == $botnick} { return }
|
|
|
|
|
+if { [channel get $chan antinotice] } {
|
|
|
|
|
+blacktools:banner:1 $banmask $botnick $chan $reason $black(antinoticemode) $black(antinoticesecunde) $getbantime
|
|
|
|
|
+}
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+############################## antictcp ################################
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+proc antictcp:protect {nick host hand chan keyword arg} {
|
|
|
|
|
+global black botnick
|
|
|
|
|
+set handle [nick2hand $nick]
|
|
|
|
|
+if {![validchan $chan]} { return 0 }
|
|
|
|
|
+set getreason [channel get $chan antictcp-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+set getreason $black(say.$getlang.antictcp.1)
|
|
|
|
|
+}
|
|
|
|
|
+set getbantime [channel get $chan antictcp-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(antictcpbantime) }
|
|
|
|
|
+set replace(%chan%) $chan
|
|
|
|
|
+set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+set reason "$protectreason"
|
|
|
|
|
+set banmask *!*@[lindex [split $host @] 1]
|
|
|
|
|
+if {[string equal -nocase "action" $keyword] || [string equal -nocase "chat" $keyword]} {return 0}
|
|
|
|
|
+if {![botisop $chan]} { return 0 }
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return}
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+if {[isbotnick $nick]} { return }
|
|
|
|
|
+if { [channel get $chan antictcp] } {
|
|
|
|
|
+blacktools:banner:1 $banmask $botnick $chan $reason $black(antictcpmode) $black(antictcpsecunde) $getbantime
|
|
|
|
|
+}
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+############################## antibadword ################################
|
|
|
|
|
+
|
|
|
|
|
+proc antibadword:filter {str} {
|
|
|
|
|
+ regsub -all -- {\003([0-9]{1,2}(,[0-9]{1,2})?)?|\017|\037|\002|\026|\006|\007} $str "" str
|
|
|
|
|
+ return $str
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+proc antibadword:protect {nick host hand chan arg} {
|
|
|
|
|
+global black botnick username
|
|
|
|
|
+ set bwordir "scripts/BlackTools/FILES/$username.bword.txt"
|
|
|
|
|
+ set handle [nick2hand $nick]
|
|
|
|
|
+ set found_word 0
|
|
|
|
|
+if {![validchan $chan]} { return }
|
|
|
|
|
+ set getreason [channel get $chan antibadword-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+ set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+ set getreason $black(say.$getlang.antibadword.1)
|
|
|
|
|
+}
|
|
|
|
|
+ set getbantime [channel get $chan antibadword-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(antibadwordbantime) }
|
|
|
|
|
+ set replace(%chan%) $chan
|
|
|
|
|
+ set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+ set text [antibadword:filter $arg]
|
|
|
|
|
+ set reason "$protectreason"
|
|
|
|
|
+ set banmask *!*@[lindex [split $host @] 1]
|
|
|
|
|
+if {![botisop $chan]} { return }
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return }
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+if {[isbotnick $nick]} { return }
|
|
|
|
|
+if {[channel get $chan antibadword]} {
|
|
|
|
|
+ set file [open $bwordir "r"]
|
|
|
|
|
+ set data [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ set lines [split $data "\n"]
|
|
|
|
|
+foreach word $lines {
|
|
|
|
|
+ set c [lindex [split $word] 0]
|
|
|
|
|
+ set w [lrange [split $word] 1 end]
|
|
|
|
|
+if {[string match -nocase $c $chan]} {
|
|
|
|
|
+if {[string match -nocase $w $text]} {
|
|
|
|
|
+ set found_word 1
|
|
|
|
|
+ blacktools:banner:2 $banmask "BADWORD" $chan $reason $getbantime
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+foreach antibadword [string tolower $black(antibadword)] {
|
|
|
|
|
+if {[string match -nocase $antibadword $text]} {
|
|
|
|
|
+ set found_word 1
|
|
|
|
|
+ blacktools:banner:2 $banmask "BADWORD" $chan $reason $getbantime
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if {$found_word == 1} {
|
|
|
|
|
+ bad:add:word $chan $banmask $arg
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc antibadword:protect:me {nick host hand chan keyword arg} {
|
|
|
|
|
+global black
|
|
|
|
|
+antibadword:protect $nick $host $hand $chan $arg
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+################################ badword ##################################
|
|
|
|
|
+
|
|
|
|
|
+proc antibadword:command:public {nick host hand chan arg} {
|
|
|
|
|
+global black botnick
|
|
|
|
|
+ set why [lindex [split $arg] 0]
|
|
|
|
|
+ set type 0
|
|
|
|
|
+ set chan1 "$chan"
|
|
|
|
|
+ set bdword [lrange [split $arg] 1 end]
|
|
|
|
|
+ set bdnumber [lindex [split $arg] 1]
|
|
|
|
|
+if {[regexp {^[&#]} $why] && [matchattr $hand nm|- $chan]} {
|
|
|
|
|
+ set chan "$why"
|
|
|
|
|
+ set why [lindex [split $arg] 1]
|
|
|
|
|
+ set bdnumber [lindex [split $arg] 2]
|
|
|
|
|
+ set bdword [lrange [split $arg] 2 end]
|
|
|
|
|
+}
|
|
|
|
|
+ antibadword:command:process $nick $host $hand $chan $chan1 $why $bdword $bdnumber $type
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc antibadword:command:process {nick host hand chan chan1 why bdword bdnumber type} {
|
|
|
|
|
+global black botnick username
|
|
|
|
|
+ set bwordir "scripts/BlackTools/FILES/$username.bword.txt"
|
|
|
|
|
+ set i 0
|
|
|
|
|
+ set foundchan 0
|
|
|
|
|
+ set char(p) [lindex $black(cmdchar) 0]
|
|
|
|
|
+if {[string match -nocase "none" "$char(p)"]} {
|
|
|
|
|
+ set char(p) ""
|
|
|
|
|
+}
|
|
|
|
|
+if {[matchattr $hand nm|- $chan]} {
|
|
|
|
|
+if {($why == "") && ($type == "0")} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 badword.1 none
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+if {($why == "") && ($type == "1")} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 badword.2 none
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+if {($why == "") && ($type == "0")} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 badword.3 none
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+if {($why == "") && ($type == "1")} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 badword.4 none
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+if {![validchan $chan]} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 gl.novalidchan none
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+if {![onchan $botnick $chan]} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 gl.notonchan none
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+switch -exact -- [string tolower $why] {
|
|
|
|
|
+
|
|
|
|
|
+add {
|
|
|
|
|
+ set file [open $bwordir a]
|
|
|
|
|
+ puts $file "$chan $bdword"
|
|
|
|
|
+ close $file
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 badword.5 $bdword
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+list {
|
|
|
|
|
+ set file [open $bwordir "r"]
|
|
|
|
|
+ set why [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ set data [split $why "\n"]
|
|
|
|
|
+if {$why == ""} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 badword.6 none
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 badword.7 none
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 badword.6 none
|
|
|
|
|
+foreach word $data {
|
|
|
|
|
+ set c [lindex [split $word] 0]
|
|
|
|
|
+ set word [lrange [split $word] 1 end]
|
|
|
|
|
+if {[string match -nocase $chan $c]} {
|
|
|
|
|
+ set foundchan 1
|
|
|
|
|
+ set i [expr $i +1]
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 badword.8 " $i . $word"
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if {$foundchan == 0} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 badword.7 none
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+del {
|
|
|
|
|
+if {![regexp {^[0-9]} $bdnumber]} {
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 badword.9 $bdword
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+ set file [open $bwordir "r"]
|
|
|
|
|
+ set data [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ set lines [split $data "\n"]
|
|
|
|
|
+foreach word $lines {
|
|
|
|
|
+ set c [lindex [split $word] 0]
|
|
|
|
|
+if {[string match -nocase $c $chan]} {
|
|
|
|
|
+ set i [expr $bdnumber - 1]
|
|
|
|
|
+ set delete [lreplace $lines $i $i]
|
|
|
|
|
+ set file [open $bwordir "w"]
|
|
|
|
|
+ puts $file [join $delete "\n"]
|
|
|
|
|
+ close $file
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+ set file [open $bwordir "r"]
|
|
|
|
|
+ set data [read -nonewline $file]
|
|
|
|
|
+ close $file
|
|
|
|
|
+if {$data == ""} {
|
|
|
|
|
+ set files [open $bwordir "w"]
|
|
|
|
|
+ close $files
|
|
|
|
|
+}
|
|
|
|
|
+ blacktools:tell $nick $host $hand $chan $chan1 badword.10 $bdnumber
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+############################## AntiLongText ################################
|
|
|
|
|
+
|
|
|
|
|
+proc antilongtext:protect {nick uhost hand chan arg} {
|
|
|
|
|
+global black botnick
|
|
|
|
|
+ set handle [nick2hand $nick]
|
|
|
|
|
+if {![validchan $chan]} { return }
|
|
|
|
|
+ set getreason [channel get $chan antilongtext-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+set getreason $black(say.$getlang.antilongtext.1)
|
|
|
|
|
+}
|
|
|
|
|
+set getbantime [channel get $chan antilongtext-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(longbantime) }
|
|
|
|
|
+set getlongchar [channel get $chan antilongtextmax]
|
|
|
|
|
+if {$getlongchar == "0"} { set getlongchar "$black(longchar)" }
|
|
|
|
|
+set replace(%chan%) $chan
|
|
|
|
|
+set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+set banmask "*!*@[lindex [split $uhost @] 1]"
|
|
|
|
|
+set reason "$protectreason"
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return }
|
|
|
|
|
+if {![botisop $chan]} { return 0 }
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+if {[isbotnick $nick]} { return }
|
|
|
|
|
+if {[string length $arg] >= $getlongchar} {
|
|
|
|
|
+if {[channel get $chan antilongtext]} {
|
|
|
|
|
+blacktools:banner:1 $banmask $botnick $chan $reason $black(longmode) $black(longtimemode) $getbantime
|
|
|
|
|
+}
|
|
|
|
|
+}
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc antilongtext:protect:me {nick host hand chan keyword arg} {
|
|
|
|
|
+global black
|
|
|
|
|
+antilongtext:protect $nick $host $hand $chan $arg
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+############################ AntiBAdQuitPart ##############################
|
|
|
|
|
+
|
|
|
|
|
+set black(badcolors) {
|
|
|
|
|
+
|
|
|
|
|
+"*\x03*"
|
|
|
|
|
+"*\037*"
|
|
|
|
|
+"*\002*"
|
|
|
|
|
+
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc antipubpart:protect {nick host hand chan arg} {
|
|
|
|
|
+global botnick black
|
|
|
|
|
+set handle [nick2hand $nick]
|
|
|
|
|
+if {![validchan $chan]} { return 0 }
|
|
|
|
|
+set getreason [channel get $chan antibadquitpart-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+set getreason $black(say.$getlang.antibadquitpart.1)
|
|
|
|
|
+}
|
|
|
|
|
+set getbantime [channel get $chan antibadquitpart-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(badquitparttime) }
|
|
|
|
|
+set replace(%chan%) $chan
|
|
|
|
|
+set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+set banmask "*!*@[lindex [split $host @] 1]"
|
|
|
|
|
+set reason "$protectreason"
|
|
|
|
|
+if {[channel get $chan badquitpart]} {
|
|
|
|
|
+foreach word $black(badquitpartwords) {
|
|
|
|
|
+if {![botisop $chan]} { return }
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return }
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+if {[isbotnick $nick]} { return }
|
|
|
|
|
+if {[string match -nocase $word $arg]} {
|
|
|
|
|
+blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
|
|
|
|
|
+}
|
|
|
|
|
+}
|
|
|
|
|
+}
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc antipubsign:protect {nick host hand chan arg} {
|
|
|
|
|
+antipubpart:protect $nick $host $hand $chan $arg
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+proc anticolorpart:protect {nick host hand chan arg} {
|
|
|
|
|
+global botnick black
|
|
|
|
|
+set handle [nick2hand $nick]
|
|
|
|
|
+if {![validchan $chan]} { return }
|
|
|
|
|
+set getreason [channel get $chan antibadquitpart-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+set getreason $black(say.$getlang.antibadquitpart.1)
|
|
|
|
|
+}
|
|
|
|
|
+set getbantime [channel get $chan antibadquitpart-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(badquitparttime) }
|
|
|
|
|
+set replace(%chan%) $chan
|
|
|
|
|
+set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+set banmask "*!*@[lindex [split $host @] 1]"
|
|
|
|
|
+set reason "$protectreason"
|
|
|
|
|
+if {[channel get $chan badquitpart]} {
|
|
|
|
|
+foreach color $black(badcolors) {
|
|
|
|
|
+if {![botisop $chan]} { return }
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return }
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+if {[isbotnick $nick]} { return }
|
|
|
|
|
+if {($black(badquitpartcolour) == "1") && [string match -nocase $color $arg]} {
|
|
|
|
|
+blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
|
|
|
|
|
+}
|
|
|
|
|
+}
|
|
|
|
|
+}
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc anticolorquit:protect {nick host hand chan arg} {
|
|
|
|
|
+anticolorpart:protect $nick $host $hand $chan $arg
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+########################### AntiJoinPart #############################
|
|
|
|
|
+
|
|
|
|
|
+proc antijoinpart:protect {nick host hand chan arg} {
|
|
|
|
|
+global black botnick
|
|
|
|
|
+set handle [nick2hand $nick]
|
|
|
|
|
+if {![validchan $chan]} { return }
|
|
|
|
|
+set getreason [channel get $chan antijoinpart-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+set getreason $black(say.$getlang.antijoinpart.1)
|
|
|
|
|
+}
|
|
|
|
|
+set getbantime [channel get $chan antijoinpart-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(joinpartbantime) }
|
|
|
|
|
+set replace(%chan%) $chan
|
|
|
|
|
+set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+set banmask "*!*@[lindex [split $host @] 1]"
|
|
|
|
|
+set reason "$protectreason"
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
|
|
|
|
|
+if {[isbotnick $nick]} { return }
|
|
|
|
|
+if {$chan == $botnick} { return }
|
|
|
|
|
+if {[channel get $chan antijoinpart]} {
|
|
|
|
|
+if {[getchanjoin $nick $chan] >= [expr {[clock seconds]-$black(joinparttime)}]} {
|
|
|
|
|
+blacktools:banner:1 $banmask $botnick $chan $reason $black(joinpartmode) $black(joinparttimemode) $getbantime
|
|
|
|
|
+}
|
|
|
|
|
+}
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc spam:filter {str} {
|
|
|
|
|
+ regsub -all -- {\003([0-9]{1,2}(,[0-9]{1,2})?)?|\017|\037|\002|\026|\006|\007} $str "" str
|
|
|
|
|
+ return $str
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+############################# AntiSpam ##############################
|
|
|
|
|
+
|
|
|
|
|
+proc antispam:protect {nick uhost hand arg} {
|
|
|
|
|
+global botnick black
|
|
|
|
|
+ set text [spam:filter $arg]
|
|
|
|
|
+ set handle [nick2hand $nick]
|
|
|
|
|
+foreach spammer [string tolower $black(spamword)] {
|
|
|
|
|
+if {[string match -nocase $spammer $arg]} {
|
|
|
|
|
+foreach chans [channels] {
|
|
|
|
|
+ if {![validchan $chans]} { return }
|
|
|
|
|
+ set getreason [channel get $chans antispam-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+ set getlang [string tolower [channel get $chans lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+ set getreason $black(say.$getlang.antispam.1)
|
|
|
|
|
+}
|
|
|
|
|
+ set getbantime [channel get $chans antispam-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(spamban) }
|
|
|
|
|
+if {[onchan $nick $chans]} {
|
|
|
|
|
+if {[channel get $chans antispam]} {
|
|
|
|
|
+if {![botisop $chans]} { return }
|
|
|
|
|
+if {[isbotnick $nick]} { return }
|
|
|
|
|
+ set banmask *!*@[lindex [split $uhost @] 1]
|
|
|
|
|
+ set replace(%chan%) $chans
|
|
|
|
|
+ set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+ set reason "$protectreason"
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chans]} { return 0 }
|
|
|
|
|
+if {[channel get $chans vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chans vprotect]] }
|
|
|
|
|
+if {[channel get $chans oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chans oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chans] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chans] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+ blacktools:banner:2 $banmask $botnick $chans $reason $getbantime
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+proc antispam:protect:msg {nick host hand chan } {
|
|
|
|
|
+global black
|
|
|
|
|
+if {![validchan $chan]} { return }
|
|
|
|
|
+if {[channel get $chan antispam]} {
|
|
|
|
|
+if {[isbotnick $nick]} { return }
|
|
|
|
|
+if {[info exists black(turnOnFlood:$chan)]} {
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+ set handle [nick2hand $nick]
|
|
|
|
|
+if {$black(spamreq) == "1"} {
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return }
|
|
|
|
|
+ set getmsg [channel get $chan antispam-message]
|
|
|
|
|
+if {$getmsg == ""} {
|
|
|
|
|
+ set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+ set getmsg $black(say.$getlang.antispam.2)
|
|
|
|
|
+}
|
|
|
|
|
+ set replace(%nick%) $nick
|
|
|
|
|
+ set replace(%chan%) $chan
|
|
|
|
|
+ set spamsg [string map [array get replace] $getmsg]
|
|
|
|
|
+ puthelp "PRIVMSG $nick :$spamsg"
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+proc antispam:protect:cycle {min hour day mon year} {
|
|
|
|
|
+global black
|
|
|
|
|
+if {([scan $min %d]+([scan $hour %d]*60)) % $black(spamcycle) == 0} {
|
|
|
|
|
+foreach chan [channels] {
|
|
|
|
|
+if {![channel get $chan inactive]} {
|
|
|
|
|
+if {[channel get $chan antispam]} {
|
|
|
|
|
+ putserv "PART $chan :$black(spammsgcycle)"; putserv "JOIN $chan"
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+############################## AntiRepeat ###############################
|
|
|
|
|
+
|
|
|
|
|
+proc antirepeat:protect {nick host hand chan arg} {
|
|
|
|
|
+global black botnick count
|
|
|
|
|
+ set arg [antipub:filter [join [split $arg]]]
|
|
|
|
|
+ set handle [nick2hand $nick]
|
|
|
|
|
+if {![validchan $chan]} { return }
|
|
|
|
|
+if {[channel get $chan antirepeat]} {
|
|
|
|
|
+if {![botisop $chan]} { return }
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return }
|
|
|
|
|
+if {[isbotnick $nick]} { return }
|
|
|
|
|
+ set getreason [channel get $chan antirepeat-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+ set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+ set getreason $black(say.$getlang.antirepeat.1)
|
|
|
|
|
+}
|
|
|
|
|
+ set getbantime [channel get $chan antirepeat-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(antirepeatbantime) }
|
|
|
|
|
+ set replace(%chan%) $chan
|
|
|
|
|
+ set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+ set reason "$protectreason"
|
|
|
|
|
+ set repeatset [channel get $chan antirepeat-setting]
|
|
|
|
|
+if {$repeatset == ""} { set repeatset "$black(repeats)" }
|
|
|
|
|
+ set number [scan $repeatset %\[^:\]]
|
|
|
|
|
+ set time [scan $repeatset %*\[^:\]:%s]
|
|
|
|
|
+ set banmask *!*@[lindex [split $host @] 1]
|
|
|
|
|
+foreach tmr [utimers] {
|
|
|
|
|
+if {[string match "*count(repeat:$host:$chan:$arg)*" [join [lindex $tmr 1]]]} {
|
|
|
|
|
+ killutimer [lindex $tmr 2]
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+
|
|
|
|
|
+if {![info exists count(repeat:$host:$chan:$arg)]} {
|
|
|
|
|
+ set count(repeat:$host:$chan:$arg) 0
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+if {![info exists count(repeat:$host:$chan)]} {
|
|
|
|
|
+ set count(repeat:$host:$chan) 0
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+ incr count(repeat:$host:$chan:$arg)
|
|
|
|
|
+ utimer $time [list unset count(repeat:$host:$chan:$arg)]
|
|
|
|
|
+
|
|
|
|
|
+if {$count(repeat:$host:$chan:$arg) >= $number} {
|
|
|
|
|
+if {$black(antirepeattype) == "0"} { set count(repeat:$host:$chan) 2 }
|
|
|
|
|
+incr count(repeat:$host:$chan)
|
|
|
|
|
+if {$count(repeat:$host:$chan) == 1} {
|
|
|
|
|
+set getcount [channel get $chan kickcount]
|
|
|
|
|
+set kcount [expr $getcount +1]
|
|
|
|
|
+channel set $chan kickcount $kcount
|
|
|
|
|
+if {[channel get $chan showcount]} {
|
|
|
|
|
+set reason "$reason - $kcount -"
|
|
|
|
|
+} else {
|
|
|
|
|
+set reason "$reason"
|
|
|
|
|
+}
|
|
|
|
|
+putquick "KICK $chan $nick :$reason"
|
|
|
|
|
+}
|
|
|
|
|
+if {$count(repeat:$host:$chan) >= 2} {
|
|
|
|
|
+blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
|
|
|
|
|
+unset count(repeat:$host:$chan)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+proc antirepeat:protect:me {nick host hand chan keyword arg} {
|
|
|
|
|
+antirepeat:protect $nick $host $hand $chan $arg
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+############################# AntiColor ################################
|
|
|
|
|
+
|
|
|
|
|
+proc anticolor:protect {nick host hand chan arg} {
|
|
|
|
|
+global black botnick count
|
|
|
|
|
+set arg [join [split $arg]]
|
|
|
|
|
+if {![validchan $chan]} { return }
|
|
|
|
|
+set getreason [channel get $chan anticolor-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+set getreason $black(say.$getlang.anticolor.1)
|
|
|
|
|
+}
|
|
|
|
|
+set getbantime [channel get $chan anticolor-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(anticolorbantime) }
|
|
|
|
|
+set replace(%chan%) $chan
|
|
|
|
|
+set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+set reason "$protectreason"
|
|
|
|
|
+set banmask *!*@[lindex [split $host @] 1]
|
|
|
|
|
+set handle [nick2hand $nick]
|
|
|
|
|
+if {[channel get $chan anticolor]} {
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+if {![botisop $chan]} { return }
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return }
|
|
|
|
|
+if {[isbotnick $nick]} { return }
|
|
|
|
|
+if {![info exists count(color:$host:$chan)]} {
|
|
|
|
|
+set count(color:$host:$chan) 0
|
|
|
|
|
+}
|
|
|
|
|
+if {[string match *\003* $arg]} {
|
|
|
|
|
+incr count(color:$host:$chan)
|
|
|
|
|
+if {$black(anticolortype) == "0" } { set count(color:$host:$chan) 2 }
|
|
|
|
|
+if {$count(color:$host:$chan) == 1} {
|
|
|
|
|
+set getcount [channel get $chan kickcount]
|
|
|
|
|
+set kcount [expr $getcount +1]
|
|
|
|
|
+channel set $chan kickcount $kcount
|
|
|
|
|
+if {[channel get $chan showcount]} {
|
|
|
|
|
+set reason "$reason - $kcount -"
|
|
|
|
|
+} else {
|
|
|
|
|
+set reason "$reason"
|
|
|
|
|
+}
|
|
|
|
|
+putquick "KICK $chan $nick :$reason"
|
|
|
|
|
+}
|
|
|
|
|
+if {$count(color:$host:$chan) == 2} {
|
|
|
|
|
+blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
|
|
|
|
|
+unset count(color:$host:$chan)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc anticolor:protect:me {nick host hand chan keyword arg} {
|
|
|
|
|
+anticolor:protect $nick $host $hand $chan $arg
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+############################# AntiBold ################################
|
|
|
|
|
+
|
|
|
|
|
+proc antibold:protect {nick host hand chan arg} {
|
|
|
|
|
+global black botnick count
|
|
|
|
|
+set arg [split $arg]
|
|
|
|
|
+if {![validchan $chan]} { return }
|
|
|
|
|
+set getreason [channel get $chan antibold-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+set getreason $black(say.$getlang.antibold.1)
|
|
|
|
|
+}
|
|
|
|
|
+set getbantime [channel get $chan antibold-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(antiboldbantime) }
|
|
|
|
|
+set replace(%chan%) $chan
|
|
|
|
|
+set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+set reason "$protectreason"
|
|
|
|
|
+set banmask *!*@[lindex [split $host @] 1]
|
|
|
|
|
+set handle [nick2hand $nick]
|
|
|
|
|
+if {[channel get $chan antibold]} {
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+if {![botisop $chan]} { return }
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return }
|
|
|
|
|
+if {[isbotnick $nick]} { return }
|
|
|
|
|
+if {![info exists count(bold:$host:$chan)]} {
|
|
|
|
|
+set count(bold:$host:$chan) 0
|
|
|
|
|
+}
|
|
|
|
|
+if {[string match *\002* $arg]} {
|
|
|
|
|
+incr count(bold:$host:$chan)
|
|
|
|
|
+if {$black(antiboldtype) == "0" } { set count(bold:$host:$chan) 2 }
|
|
|
|
|
+if {$count(bold:$host:$chan) == 1} {
|
|
|
|
|
+set getcount [channel get $chan kickcount]
|
|
|
|
|
+set kcount [expr $getcount +1]
|
|
|
|
|
+channel set $chan kickcount $kcount
|
|
|
|
|
+if {[channel get $chan showcount]} {
|
|
|
|
|
+set reason "$reason - $kcount -"
|
|
|
|
|
+} else {
|
|
|
|
|
+set reason "$reason"
|
|
|
|
|
+}
|
|
|
|
|
+putquick "KICK $chan $nick :$reason"
|
|
|
|
|
+}
|
|
|
|
|
+if {$count(bold:$host:$chan) == 2} {
|
|
|
|
|
+blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
|
|
|
|
|
+unset count(bold:$host:$chan)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc antibold:protect:me {nick host hand chan keyword arg} {
|
|
|
|
|
+antibold:protect $nick $host $hand $chan $arg
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+############################ AntiUnderline ###############################
|
|
|
|
|
+
|
|
|
|
|
+proc antiunderline:protect {nick host hand chan arg} {
|
|
|
|
|
+global black botnick count
|
|
|
|
|
+set arg [split $arg]
|
|
|
|
|
+if {![validchan $chan]} { return }
|
|
|
|
|
+set getreason [channel get $chan antiunderline-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+set getreason $black(say.$getlang.antiunderline.1)
|
|
|
|
|
+}
|
|
|
|
|
+set getbantime [channel get $chan antiunderline-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(antiunderlinebantime) }
|
|
|
|
|
+set replace(%chan%) $chan
|
|
|
|
|
+set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+set reason "$protectreason"
|
|
|
|
|
+set banmask *!*@[lindex [split $host @] 1]
|
|
|
|
|
+set handle [nick2hand $nick]
|
|
|
|
|
+if {[channel get $chan antiunderline]} {
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+if {![botisop $chan]} { return }
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return }
|
|
|
|
|
+if {[isbotnick $nick]} { return }
|
|
|
|
|
+if {![info exists count(underline:$host:$chan)]} {
|
|
|
|
|
+set count(underline:$host:$chan) 0
|
|
|
|
|
+}
|
|
|
|
|
+if {[string match *\037* $arg]} {
|
|
|
|
|
+incr count(underline:$host:$chan)
|
|
|
|
|
+if {$black(antiunderlinetype) == "0" } { set count(underline:$host:$chan) 2 }
|
|
|
|
|
+if {$count(underline:$host:$chan) == 1} {
|
|
|
|
|
+set getcount [channel get $chan kickcount]
|
|
|
|
|
+set kcount [expr $getcount +1]
|
|
|
|
|
+channel set $chan kickcount $kcount
|
|
|
|
|
+if {[channel get $chan showcount]} {
|
|
|
|
|
+set reason "$reason - $kcount -"
|
|
|
|
|
+} else {
|
|
|
|
|
+set reason "$reason"
|
|
|
|
|
+}
|
|
|
|
|
+putquick "KICK $chan $nick :$reason"
|
|
|
|
|
+}
|
|
|
|
|
+if {$count(underline:$host:$chan) == 2} {
|
|
|
|
|
+blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
|
|
|
|
|
+unset count(underline:$host:$chan)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc antiunderline:protect:me {nick host hand chan keyword arg} {
|
|
|
|
|
+antiunderline:protect $nick $host $hand $chan $arg
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+############################## AntiCaps #################################
|
|
|
|
|
+
|
|
|
|
|
+proc anticaps:protect {nick host hand chan arg} {
|
|
|
|
|
+global black botnick count
|
|
|
|
|
+set handle [nick2hand $nick]
|
|
|
|
|
+if {![validchan $chan]} { return }
|
|
|
|
|
+set getreason [channel get $chan anticaps-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+set getreason $black(say.$getlang.anticaps.1)
|
|
|
|
|
+}
|
|
|
|
|
+set getbantime [channel get $chan anticaps-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(anticapsbantime) }
|
|
|
|
|
+set replace(%chan%) $chan
|
|
|
|
|
+set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+set reason "$protectreason"
|
|
|
|
|
+set banmask *!*@[lindex [split $host @] 1]
|
|
|
|
|
+if {![info exists count(caps:$host:$chan)]} {
|
|
|
|
|
+set count(caps:$host:$chan) 0
|
|
|
|
|
+}
|
|
|
|
|
+if {[channel get $chan anticaps]} {
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+if {![botisop $chan]} { return }
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return }
|
|
|
|
|
+if {[isbotnick $nick]} { return }
|
|
|
|
|
+set caps($nick:$host) 0
|
|
|
|
|
+foreach word [split $arg {}] {
|
|
|
|
|
+if [string match \[A-Z\] $word] {
|
|
|
|
|
+incr caps($nick:$host)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+if {$caps($nick:$host) == 0} {
|
|
|
|
|
+ return 0
|
|
|
|
|
+}
|
|
|
|
|
+ if {[string length $arg] < 20} {return 0}
|
|
|
|
|
+ set capchar [string length $arg]
|
|
|
|
|
+ set number $caps($nick:$host)/$capchar
|
|
|
|
|
+ if {[expr 100 * $caps($nick:$host) / $capchar] > $black(anticapscount)} {
|
|
|
|
|
+incr count(caps:$host:$chan)
|
|
|
|
|
+if {$black(anticapstype) == "0" } { set count(caps:$host:$chan) 2 }
|
|
|
|
|
+if {$count(caps:$host:$chan) == 1} {
|
|
|
|
|
+set getcount [channel get $chan kickcount]
|
|
|
|
|
+set kcount [expr $getcount +1]
|
|
|
|
|
+channel set $chan kickcount $kcount
|
|
|
|
|
+if {[channel get $chan showcount]} {
|
|
|
|
|
+set reason "$reason - $kcount -"
|
|
|
|
|
+} else {
|
|
|
|
|
+set reason "$reason"
|
|
|
|
|
+}
|
|
|
|
|
+putquick "KICK $chan $nick :$reason"
|
|
|
|
|
+}
|
|
|
|
|
+if {$count(caps:$host:$chan) == 2} {
|
|
|
|
|
+blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
|
|
|
|
|
+unset count(caps:$host:$chan)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc anticaps:protect:me {nick host hand chan keyword arg} {
|
|
|
|
|
+anticaps:protect $nick $host $hand $chan $arg
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+################################ BadIdent #################################
|
|
|
|
|
+
|
|
|
|
|
+proc badident:protect:join {nick host hand chan} {
|
|
|
|
|
+global black botnick
|
|
|
|
|
+if {![validchan $chan]} { return }
|
|
|
|
|
+set getreason [channel get $chan badident-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+set getreason $black(say.$getlang.badident.1)
|
|
|
|
|
+}
|
|
|
|
|
+set getbantime [channel get $chan badident-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(badidentbantime) }
|
|
|
|
|
+set replace(%chan%) $chan
|
|
|
|
|
+set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+set reason "$protectreason"
|
|
|
|
|
+set ident "[string trimleft [string tolower [lindex [split $host "@"] 0]] "~"]"
|
|
|
|
|
+set banmask "*!*$ident@*"
|
|
|
|
|
+if {![validchan $chan]} { return }
|
|
|
|
|
+if {[channel get $chan badident]} {
|
|
|
|
|
+if {![botisop $chan]} { return }
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+if {[matchattr $hand $black(exceptflags) $chan]} { return 0 }
|
|
|
|
|
+foreach bit $black(badidentwords) {
|
|
|
|
|
+if {[string match -nocase $bit $ident]} {
|
|
|
|
|
+blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+############################## BadFullname ###############################
|
|
|
|
|
+
|
|
|
|
|
+proc badfullname:protect:join {nick host hand chan} {
|
|
|
|
|
+global botnick black
|
|
|
|
|
+set ::cchan $chan
|
|
|
|
|
+set ::nnick $nick
|
|
|
|
|
+set ::hhost $host
|
|
|
|
|
+set handle [nick2hand $nick]
|
|
|
|
|
+if { [channel get $chan badfullname] } {
|
|
|
|
|
+if {![botisop $chan]} { return }
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return }
|
|
|
|
|
+if {[onchan $nick $chan]} {
|
|
|
|
|
+putquick "WHOIS $nick $nick"
|
|
|
|
|
+bind RAW - 311 badfullname:protect
|
|
|
|
|
+}
|
|
|
|
|
+}
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc badfullname:protect { from keyword arguments } {
|
|
|
|
|
+global botnick black
|
|
|
|
|
+set chan $::cchan
|
|
|
|
|
+set nick $::nnick
|
|
|
|
|
+set host $::hhost
|
|
|
|
|
+set getreason [channel get $chan badfullname-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+set getreason $black(say.$getlang.badfullname.1)
|
|
|
|
|
+}
|
|
|
|
|
+set getbantime [channel get $chan badfullname-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(badfbantime) }
|
|
|
|
|
+set replace(%chan%) $chan
|
|
|
|
|
+set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+set reason "$protectreason"
|
|
|
|
|
+set fullname [string range [join [lrange $arguments 5 end]] 1 end]
|
|
|
|
|
+if {[onchan $nick $chan]} {
|
|
|
|
|
+set banmask *!*@[lindex [split [getchanhost $nick $chan] "@"] 1]
|
|
|
|
|
+}
|
|
|
|
|
+ foreach realname $black(badfwords) {
|
|
|
|
|
+if {[string match -nocase $realname $fullname]} {
|
|
|
|
|
+blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
|
|
|
|
|
+}
|
|
|
|
|
+}
|
|
|
|
|
+unbind RAW - 311 badfullname:protect
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+################################ BadNick #################################
|
|
|
|
|
+
|
|
|
|
|
+proc badnick:protect:join {nick host hand chan} {
|
|
|
|
|
+global black botnick
|
|
|
|
|
+ set handle [nick2hand $nick]
|
|
|
|
|
+if {![validchan $chan]} { return 0 }
|
|
|
|
|
+ set getreason [channel get $chan badnick-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+ set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+ set getreason $black(say.$getlang.badnick.1)
|
|
|
|
|
+}
|
|
|
|
|
+ set getbantime [channel get $chan badnick-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(badnickbantime) }
|
|
|
|
|
+ set replace(%chan%) $chan
|
|
|
|
|
+ set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+ set reason "$protectreason"
|
|
|
|
|
+ set banmask "$nick*!*@*"
|
|
|
|
|
+if {![validchan $chan]} { return 0 }
|
|
|
|
|
+if {[channel get $chan badnick]} {
|
|
|
|
|
+if {![botisop $chan]} { return 0 }
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
|
|
|
|
|
+foreach badnick [string tolower $black(badnickwords)] {
|
|
|
|
|
+if {[string match $badnick [string tolower $nick]]} {
|
|
|
|
|
+ blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc badnick:protect:change {nick host hand chan newnick} {
|
|
|
|
|
+global black botnick
|
|
|
|
|
+ set handle [nick2hand $nick]
|
|
|
|
|
+if {![validchan $chan]} { return 0 }
|
|
|
|
|
+ set getreason [channel get $chan badnick-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+ set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+ set getreason $black(say.$getlang.badnick.1)
|
|
|
|
|
+}
|
|
|
|
|
+ set getbantime [channel get $chan badnick-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(badnickbantime) }
|
|
|
|
|
+ set replace(%chan%) $chan
|
|
|
|
|
+ set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+ set reason "$protectreason"
|
|
|
|
|
+ set banmask "$newnick*!*@*"
|
|
|
|
|
+if {![validchan $chan]} { return 0 }
|
|
|
|
|
+if {[channel get $chan badnick]} {
|
|
|
|
|
+if {![botisop $chan]} { return 0 }
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
|
|
|
|
|
+foreach badnick [string tolower $black(badnickwords)] {
|
|
|
|
|
+if {[string match $badnick [string tolower $newnick]]} {
|
|
|
|
|
+ blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+########################### AntiJoinFlood ################################
|
|
|
|
|
+
|
|
|
|
|
+proc joinflood:unlock {chan} {
|
|
|
|
|
+ global black
|
|
|
|
|
+ putquick "MODE $chan -$black(modes)"
|
|
|
|
|
+ unset black(floodjoin:on:$chan)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc joinflood:protect {nick host hand chan} {
|
|
|
|
|
+global black count
|
|
|
|
|
+if {[channel get $chan antijoinflood]} {
|
|
|
|
|
+ set getset [channel get $chan joinflood]
|
|
|
|
|
+ if {$getset == ""} { set getset "4:5" }
|
|
|
|
|
+ set number [scan $getset %\[^:\]]
|
|
|
|
|
+ set time [scan $getset %*\[^:\]:%s]
|
|
|
|
|
+ set replace(%chan%) $chan
|
|
|
|
|
+foreach tmr [utimers] {
|
|
|
|
|
+if {[string match "*count(joinflood:$chan)*" [join [lindex $tmr 1]]]} {
|
|
|
|
|
+ killutimer [lindex $tmr 2]
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+if {[info exists black(floodjoin:on:$chan)]} {
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+if {![info exists count(joinflood:$chan)]} {
|
|
|
|
|
+ set count(joinflood:$chan) 0
|
|
|
|
|
+}
|
|
|
|
|
+ incr count(joinflood:$chan)
|
|
|
|
|
+utimer $time [list unset count(joinflood:$chan)]
|
|
|
|
|
+if {$count(joinflood:$chan) >= "$number"} {
|
|
|
|
|
+if {![botisop $chan]} { return 0 }
|
|
|
|
|
+ set black(floodjoin:on:$chan) 1
|
|
|
|
|
+ putquick "MODE $chan +$black(modes)" ; utimer $black(nomodetime) [list joinflood:unlock $chan]
|
|
|
|
|
+if {$black(fjoinhow) == "1"} {
|
|
|
|
|
+ set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+ set getmessage $black(say.$getlang.antijoinflood.1)
|
|
|
|
|
+ set message [string map [array get replace] $getmessage]
|
|
|
|
|
+ puthelp "NOTICE @$chan :$message"
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+########################### User Protection ################################
|
|
|
|
|
+
|
|
|
|
|
+proc protectpublic {nick host hand chan args} {
|
|
|
|
|
+global black
|
|
|
|
|
+ set bans [lindex $args 1]
|
|
|
|
|
+if {![botisop $chan]} { return 0 }
|
|
|
|
|
+if {$bans == "*!*@*"} { putquick "MODE $chan -b $bans"
|
|
|
|
|
+ return
|
|
|
|
|
+}
|
|
|
|
|
+ set list [userlist $black(exceptflags) $chan]
|
|
|
|
|
+foreach user $list {
|
|
|
|
|
+ set hosts [getuser $user hosts]
|
|
|
|
|
+foreach host $hosts {
|
|
|
|
|
+if {[string match -nocase $bans $host]} {
|
|
|
|
|
+ putquick "MODE $chan -b $bans"
|
|
|
|
|
+if {[onchan $black(chanserv) $chan]} {
|
|
|
|
|
+ putquick "PRIVMSG $black(chanserv) :unban $chan $bans"
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+############################## AntiChanFlood ###############################
|
|
|
|
|
+
|
|
|
|
|
+proc antifloodchan:protect {nick host hand chan arg} {
|
|
|
|
|
+global black botnick count
|
|
|
|
|
+ set arg [split $arg]
|
|
|
|
|
+if {![validchan $chan]} { return 0 }
|
|
|
|
|
+ set getreason [channel get $chan antichanflood-reason]
|
|
|
|
|
+if {$getreason == ""} {
|
|
|
|
|
+ set getlang [string tolower [channel get $chan lang]]
|
|
|
|
|
+if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
|
|
|
|
|
+ set getreason $black(say.$getlang.antichanflood.1)
|
|
|
|
|
+}
|
|
|
|
|
+ set getbantime [channel get $chan antichanflood-bantime]
|
|
|
|
|
+if {$getbantime == "0"} { set getbantime $black(antifloodchanbantime) }
|
|
|
|
|
+ set replace(%chan%) $chan
|
|
|
|
|
+ set getset [channel get $chan chanflood]
|
|
|
|
|
+if {$getset == ""} { set getset "4:5" }
|
|
|
|
|
+ set protectreason [string map [array get replace] $getreason]
|
|
|
|
|
+ set reason "$protectreason"
|
|
|
|
|
+ set number [scan $getset %\[^:\]]
|
|
|
|
|
+ set time [scan $getset %*\[^:\]:%s]
|
|
|
|
|
+ set banmask *!*@[lindex [split $host @] 1]
|
|
|
|
|
+ set handle [nick2hand $nick]
|
|
|
|
|
+foreach tmr [utimers] {
|
|
|
|
|
+if {[string match "*count(repeat:$host:$chan:flood)*" [join [lindex $tmr 1]]]} {
|
|
|
|
|
+ killutimer [lindex $tmr 2]
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+if {[channel get $chan antichanflood]} {
|
|
|
|
|
+if {[channel get $chan vprotect] == ""} { set vprotect ON } else { set vprotect [string toupper [channel get $chan vprotect]] }
|
|
|
|
|
+if {[channel get $chan oprotect] == ""} { set oprotect ON } else { set oprotect [string toupper [channel get $chan oprotect]] }
|
|
|
|
|
+if {[isvoice $nick $chan] && [string equal -nocase $vprotect "ON"]} { return }
|
|
|
|
|
+if {[isop $nick $chan] && [string equal -nocase $oprotect "ON"]} { return }
|
|
|
|
|
+if {![botisop $chan]} { return 0 }
|
|
|
|
|
+if {[matchattr $handle $black(exceptflags) $chan]} { return 0 }
|
|
|
|
|
+if {[isbotnick $nick]} { return 0 }
|
|
|
|
|
+
|
|
|
|
|
+if {![info exists count(repeat:$host:$chan:flood)]} {
|
|
|
|
|
+ set count(repeat:$host:$chan:flood) 0
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+if {![info exists count(repeat:$host:$chan)]} {
|
|
|
|
|
+ set count(repeat:$host:$chan) 0
|
|
|
|
|
+}
|
|
|
|
|
+ incr count(repeat:$host:$chan:flood)
|
|
|
|
|
+ utimer $time [list unset count(repeat:$host:$chan:flood)]
|
|
|
|
|
+if {$count(repeat:$host:$chan:flood) >= $number} {
|
|
|
|
|
+if {$black(antifloodchantype) == "0"} { set count(repeat:$host:$chan) 2 }
|
|
|
|
|
+ incr count(repeat:$host:$chan)
|
|
|
|
|
+if {$count(repeat:$host:$chan) == 1} {
|
|
|
|
|
+set getcount [channel get $chan kickcount]
|
|
|
|
|
+set kcount [expr $getcount +1]
|
|
|
|
|
+ channel set $chan kickcount $kcount
|
|
|
|
|
+if {[channel get $chan showcount]} {
|
|
|
|
|
+ set reason "$reason - $kcount -"
|
|
|
|
|
+} else {
|
|
|
|
|
+ set reason "$reason"
|
|
|
|
|
+}
|
|
|
|
|
+ putquick "KICK $chan $nick :$reason"
|
|
|
|
|
+}
|
|
|
|
|
+if {$count(repeat:$host:$chan) >= 2} {
|
|
|
|
|
+ blacktools:banner:2 $banmask $botnick $chan $reason $getbantime
|
|
|
|
|
+ unset count(repeat:$host:$chan)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+proc antifloodchan:protect:me {nick host hand chan keyword arg} {
|
|
|
|
|
+antirepeat:protect $nick $host $hand $chan $arg
|
|
|
|
|
+}
|