| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- #########################################################################
- ## BlackTools - The Ultimate Channel Control Script ##
- ## One TCL. One smart Eggdrop ##
- #########################################################################
- ########################### SECUREMODE TCL ##########################
- #########################################################################
- ## ##
- ## BlackTools : http://blacktools.tclscripts.net ##
- ## Bugs report : http://www.tclscripts.net/ ##
- ## GitHub page : https://github.com/tclscripts/BlackToolS-TCL ##
- ## Online Help : irc://irc.undernet.org/tcl-help ##
- ## #TCL-HELP / UnderNet ##
- ## You can ask in english or romanian ##
- ## ##
- #########################################################################
- proc securemode:findexcept {chan host} {
- global black
- set found_it 0
- set file [open $black(add_file) "r"]
- set w [read -nonewline $file]
- close $file
- set data [split $w "\n"]
- foreach line $data {
- set read_chan [lindex [split $line] 0]
- set enc_chan [encoding convertfrom utf-8 $read_chan]
- if {[string equal -nocase $enc_chan $chan]} {
- set read_type [lindex [split $line] 1]
- if {[string equal -nocase $read_type "SECUREMODE-EXCEPT"]} {
- set read_host [lindex [split $line] 3]
- set real_read_host [string map [list \[ {\[} \] {\]} \? {\?} \\ {\\}] $read_host]
- if {[string match -nocase $host $real_read_host] || [string match -nocase $real_read_host $host]} {
- set found_it 1
- }
- }
- }
- }
- return $found_it
- }
- proc securemode:kickremove {nick host hand chan kicked reason} {
- global black
- set host [getchanhost $kicked $chan]
- if {[setting:get $chan securemode]} {
- set chanmode [getchanmode $chan]
- if {[string match -nocase "*D*" $chanmode] && [string match -nocase "*m*" $chanmode]} {
- if {[info exists black(secure:$chan:allowlist)]} {
- if {[lsearch -exact [string tolower $black(secure:$chan:allowlist)] [string tolower $host]] > -1} {
- set position [lsearch -exact [string tolower $black(secure:$chan:allowlist)] [string tolower $host]]
- set black(secure:$chan:allowlist) [lreplace $black(secure:$chan:allowlist) $position $position]
- }
- if {[info exists black(secure:$chan:list)]} {
- if {[lsearch -exact [string tolower $black(secure:$chan:list)] [string tolower $kicked]] > -1} {
- set position [lsearch -exact [string tolower $black(secure:$chan:list)] [string tolower $kicked]]
- set black(secure:$chan:list) [lreplace $black(secure:$chan:list) $position $position]
- }
- }
- }
- }
- }
- }
- proc secured:allowlist:reset {minute hour day month year} {
- global black
- foreach chan [channels] {
- if {[validchan $chan]} {
- if {[info exists black(secure:$chan:allowlist)]} {
- unset black(secure:$chan:allowlist)
- }
- }
- }
- }
- proc securemode:timer {} {
- global black botnick
- set channels ""
- set secure_act 0
- foreach chan [channels] {
- if {[setting:get $chan securemode]} {
- lappend channels $chan
- if {[onchan $botnick $chan]} {
- set chanmode [getchanmode $chan]
- if {[string match -nocase "*D*" $chanmode] && [string match -nocase "*m*" $chanmode]} {
- set secure_act 1
- if {![info exists black(secure_mode:$chan)]} {
- set black(secure_mode:$chan) 1
- }
- } else {
- if {[info exists black(secure_mode:$chan)]} {
- unset black(secure_mode:$chan)
- }
- }
- }
- }
- }
- if {$channels == ""} {
- return
- }
- if {$secure_act == "1"} {
- securemode:act $channels 0
- }
- utimer 30 [list securemode:timer]
- }
- proc securemode:reply {nick host hand chan mod who} {
- global black
- if {[setting:get $chan securemode]} {
- set getlang [string tolower [setting:get $chan lang]]
- if {$getlang == ""} { set getlang "[string tolower $black(default_lang)]" }
- if {[string match "*+D*" $mod]} {
- set replace(%chan%) $chan
- set text [black:color:set "" $black(say.$getlang.securemode.10)]
- set reply [join $text]
- putserv "PRIVMSG $chan :[string map [array get replace] $reply]"
- }
- if {[string match "*-D*" $mod]} {
- set replace(%chan%) $chan
- set text2 [black:color:set "" $black(say.$getlang.securemode.11)]
- set reply2 [join $text2]
- putserv "PRIVMSG $chan :[string map [array get replace] $reply2]"
- }
- }
- }
- proc securemode:act {channels counter} {
- global black
- if {$channels == ""} {
- return
- }
- set chan [lindex $channels $counter]
- set cc [expr $counter + 1]
- if {$chan != ""} {
- securemode:raw $chan
- } else {
- return
- }
- utimer 5 [list securemode:act $channels $cc]
- }
- proc securemode:raw {chan} {
- global black
- putquick "NAMES -d $chan"
- set ::securechan $chan
- bind RAW - 355 get:nameslist
- bind RAW - 366 end:nameslist
- }
- proc get:nameslist {from keyword arguments} {
- global black
- set found_it 0
- set chan $::securechan
- set split_arg [split $arguments ":"]
- set names [lindex $split_arg 1]
- if {[info exists black(secure:$chan:list)]} {
- foreach entry $black(secure:$chan:list) {
- if {[lsearch -exact [string tolower [split $names]] [string tolower $entry]] < 0} {
- set position [lsearch -exact [string tolower $black(secure:$chan:list)] [string tolower $entry]]
- set black(secure:$chan:list) [lreplace $black(secure:$chan:list) $position $position]
- if {[info exists black(securecode:$entry:$chan)]} {
- unset black(securecode:$entry:$chan)
- }
- }
- }
- }
- if {[info exists black(secure:$chan:list)]} {
- if {[llength $black(secure:$chan:list)] == "0"} {
- unset black(secure:$chan:list)
- }
- }
- secure:gethost $names $chan 0
- }
- proc end:nameslist {from keyword arguments} {
- global black
- check:if:bind "get:nameslist" "355"
- check:if:bind "end:nameslist" "366"
- }
- proc secure:gethost {names chan counter} {
- global black
- set name [lindex [split $names] $counter]
- set cc [expr $counter + 1]
- if {$name != ""} {
- securemode:gethost:raw $name $chan
- } else {
- return
- }
- utimer 3 [list secure:gethost $names $chan $cc]
- }
- proc securemode:gethost:raw {name chan} {
- global black
- putserv "USERHOST :$name"
- set ::shchan $chan
- set ::shnick $name
- bind RAW - 302 get:securemode:host
- }
- proc get:securemode:host {from keyword arguments} {
- global black botnick
- set is_allowed 0
- set has_access 0
- set securemode_activ 0
- set hosts [lindex [split $arguments] 1]
- set hostname [lindex [split $hosts "="] 1]
- regsub {^[-+]} $hostname "" mask
- set ident [lindex [split $mask "@"] 0]
- set nick $::shnick
- set except_mask "$nick!$mask"
- set chan $::shchan
- if {[setting:get $chan securemode]} {
- set chanmode [getchanmode $chan]
- if {[string match -nocase "*D*" $chanmode] && [string match -nocase "*m*" $chanmode]} {
- set securemode_activ 1
- }
- }
- if {$securemode_activ == "0"} {
- return
- }
- set replace(%botnick%) $botnick
- set replace(%chan%) $chan
- set lang [setting:get $chan lang]
- if {$lang == ""} { set lang [string tolower $black(default_lang)] }
- set getaccess [finduser $except_mask]
- if {[matchattr $getaccess $black(exceptflags) $chan]} {
- if {[setting:get $chan xonly] && [onchan $black(chanserv) $chan]} {
- putserv "PRIVMSG $black(chanserv) :voice $chan $nick"
- } else {
- putserv "MODE $chan +v $nick"
- }
- return
- }
- if {[securemode:findexcept $chan $except_mask] == "1" || ![regexp {~} $ident]} {
- if {[setting:get $chan xonly] && [onchan $black(chanserv) $chan]} {
- putserv "PRIVMSG $black(chanserv) :voice $chan $nick"
- } else {
- putserv "MODE $chan +v $nick"
- }
- return
- }
- if {[info exists black(secure:$chan:allowlist)]} {
- if {[setting:get $chan strictsecured] == "" || [setting:get $chan strictsecured] == "0"} {
- if {[lsearch -exact [string tolower $black(secure:$chan:allowlist)] [string tolower $mask]] > -1} {
- set is_allowed 1
- if {[setting:get $chan xonly] && [onchan $black(chanserv) $chan]} {
- putserv "PRIVMSG $black(chanserv) :voice $chan $nick"
- } else {
- putserv "MODE $chan +v $nick"
- }
- }
- if {$is_allowed == "1"} {
- return
- }
- }
- }
- if {[info exists black(secure:$chan:list)]} {
- if {[lsearch -exact [string tolower $black(secure:$chan:list)] [string tolower $nick]] < 0} {
- set black(securecode:$nick:$chan) [string toupper [bot:setcode]]
- set replace(%msg.1%) $black(securecode:$nick:$chan)
- set message "$black(say.$lang.securemode.1)"
- set len [llength $message]
- set random [expr int(rand()*$len)]
- set message [lindex $message $random]
- set text [black:color:set "" $message]
- set reply [join $text]
- set message [string map [array get replace] $reply]
- putserv "PRIVMSG $nick :$message"
- lappend black(secure:$chan:list) $nick
- }
- } else {
- set black(securecode:$nick:$chan) [string toupper [bot:setcode]]
- set replace(%msg.1%) $black(securecode:$nick:$chan)
- set message "$black(say.$lang.securemode.1)"
- set len [llength $message]
- set random [expr int(rand()*$len)]
- set message [lindex $message $random]
- set text [black:color:set "" $message]
- set reply [join $text]
- set message [string map [array get replace] $reply]
- putserv "PRIVMSG $nick :$message"
- lappend black(secure:$chan:list) $nick
- }
- check:if:bind "get:securemode:host" "302"
- }
- ##############
- #########################################################################
- ## END ##
- #########################################################################
|