namespace eval ::ModeD:: { # # ModeD.tcl startet 21.09.2003 by CyBex # # any problems or suggestions? write to Script-ModeD@CyBex.has.nolife.org # # This Script is written for one channel only and its only for the # www.QuakeNET.org channel mode +D .. it scan for new joining users # and give them +v (do visible without talk) .. or kick user that # found in the banlist or have the +k flag. Ant an auto-limit is included # to see, how many user are at moment online :-) # # Feel free to change this script, but please submit me your changes :-) # # Testet with Eggdrop 1.6.15 # # config #how much higher set ::ModeD::userandom 0 set ::ModeD::random 1 set ::ModeD::raiselimit 5 #time in minutes to change the limit set ::ModeD::uplimitticks 8 set ::ModeD::downlimitticks 16 #save stats 0/1 and path to data dir, or create "data" in your eggdrop folder set ::ModeD::savestats 1 set ::ModeD::datadir data set ::ModeD::uselimiter 0 if {$::botnick=="Honecker" || $::botnick=="NewS-FlasH"} {set ::ModeD::uselimiter 1} # switch debug by default on/off if {![info exists ::ModeD::debug]} { set ::ModeD::debug 0 } #my special settings ;) set ::ModeD::channel #berlin if {$::botnick=="NewS-FlasH"} { set ::ModeD::savestats 1 set ::ModeD::raiselimit 3 set ::ModeD::uplimitticks 6 set ::ModeD::downlimitticks 60 set ::ModeD::channel #news.de } if {$::username=="b0rkBerlin"} { set ::ModeD::userandom 1 set ::ModeD::random 5 set ::ModeD::uplimitticks 16 set ::ModeD::downlimitticks 32 } if {$::username=="20mark"} { set ::ModeD::savestats 0 set ::ModeD::raiselimit 3 set ::ModeD::uplimitticks 15 set ::ModeD::downlimitticks 120 set ::ModeD::channel #news.de } # data ## helper ## main ### vars set ::ModeD::develop 0 if {$::botnick=="Honecker" || $::botnick=="Berlin"} { set ::ModeD::develop 1 } set ::ModeD::major 0 set ::ModeD::minor 3 if {![info exist ::ModeD::build] || !$::ModeD::develop} { set ::ModeD::build 1 } { incr ::ModeD::build } if {![info exist ::ModeD::run]} { set ::ModeD::run 1 } { incr run } set ::lateststable 0.3.1 ### helper if {$debug} { putcmdlog "Warning! Debug Mode ist \002ON\002!" } if {$::lateststable!="$major.$minor.$build"} { if $develop { putcmdlog "Warning! Developer Mode \002ON\002! Latest stable: $::lateststable" } { putcmdlog "Warning! Unstable Version! Latest stable: $::lateststable" } } ### binds ### procs proc onchan {nick {chan ""}} { if {$chan!=""} { putcmdlog "onchan ModeD: [expr [lsearch -exact [string tolower $::ModeD::onlinelist] [string tolower $nick]]!=-1 || [::onchan $nick $chan]]" return [expr [lsearch -exact [string tolower $::ModeD::onlinelist] [string tolower $nick]]!=-1 || [::onchan $nick $chan]] } { putcmdlog "onchan ModeD: [expr [lsearch -exact [string tolower $::ModeD::onlinelist] [string tolower $nick]]!=-1 || [::onchan $nick]]" return [expr [lsearch -exact [string tolower $::ModeD::onlinelist] [string tolower $nick]]!=-1 || [::onchan $nick]] } } #### helper proc loadfile {name args} { if {$::ModeD::debug} { putcmdlog "load $name" } if [info exists name] { set fh [open $name r] set gets [gets $fh] close $fh return $gets } } proc savefile {name data} { if {$::ModeD::debug} { putcmdlog "save $name" } set fh [open $name w] puts $fh $data close $fh } proc appendfile {name data} { if [info exists name] { if {$::ModeD::debug} { putcmdlog "append $name" } set fh [open $name a] puts $fh $data close $fh } { save $name $data } } proc debug:makedummy {} { proc adddebug {args} {} proc putdebug {args} {} } if [info exist ::ModeD::debug] { if $::ModeD::debug { if [info exist debug:buffer] { set debug:buffer [list] } proc adddebug {args} { if {[lindex $args 0]=="-newline"} { lappend ::ModeD::debug:buffer [lrange $args 1 end] } { set ::ModeD::debug:buffer [lreplace $::ModeD::debug:buffer end end [set args "[lindex $::ModeD::debug:bufer end]${args}"]] } } proc putdebug {args} { putcmdlog "putdebug $args!=[list]" if {$args!=[list]} { putcmdlog [join $args] } { foreach line $::ModeD:buffer { putcmdlog $line } set debug:buffer [list] } } } { debug:makedummy } } { debug:makedummy } if {![info exists ::ModeD::onlinelist]} { set ::ModeD::onlinelist [list] } if {![info exists ::ModeD::userlist]} { set ::ModeD::userlist [list] } if {![info exists ::ModeD::voicelist]} { set ::ModeD::voicelist [list] } if {![info exists ::ModeD::kicklist]} { set ::ModeD::kicklist [list] } proc user:add {mask} { if $::ModeD::debug { putcmdlog " u:a start : $mask" } set found 0 if ![info exist ::ModeD::userlist] {set ::ModeD::userlist [list]} set num 0; foreach {name last} $::ModeD::userlist { set time [expr [unixtime]-$last] if {$time>295 && !$::ModeD::develop || $time>115 && $::ModeD::develop} { #set num [lsearch $::ModeD::userlist $name]; if $::ModeD::debug { putcmdlog "nick $name last [duration $time] deleted" } set ::ModeD::userlist [lreplace $ModeD::userlist $num [expr $num+1]] } { incr num 2 } #putcmdlog "nick $name last $time" } #putcmdlog "lsearch $::ModeD::userlist [list $mask] [lsearch $::ModeD::userlist [list $mask]]" set found 0; foreach {name time} $::ModeD::userlist { if {$name==$mask || [string match $mask $name]} { set found 1; break} } if !$found { lappend ::ModeD::userlist $mask lappend ::ModeD::userlist [expr [unixtime]+20-[rand 60]] } #putcmdlog "::ModeD::user:add found $found $mask" return $found } #### main bind raw - 311 ::ModeD::raw311 proc raw311 {args} { if $::ModeD::debug { putcmdlog " r311 start : $args" } if ![info exist ::ModeD::voicelist] {set ::ModeD::voicelist [list]} if ![info exist ::ModeD::kicklist] {set ::ModeD::kicklist [list]} set nick [lindex [split [lindex $args 2]] 1] set ident [lindex [split [lindex $args 2]] 2] set host [lindex [split [lindex $args 2]] 3] set mask $nick!$ident@$host set hand [finduser $mask] set chattr [chattr $hand $::ModeD::channel] set banlist [list] if {[banlist]!=[list]} { lappend banlist [banlist] } if {[banlist $::ModeD::channel]!=[list]} { lappend banlist [banlist $::ModeD::channel] } if {[string match -nocase *Pink* $nick]} { #putcmdlog "Checkmask: $mask // Banlist: $banlist" } set num 0; foreach item $banlist { foreach ban $item { #putcmdlog "check: $ban" incr num if {[string match *Pink* [lindex $ban 0]] && [string match *Pink* $mask]} { #putcmdlog "if {string match -nocase [lindex $ban 0] $mask [string match -nocase [lindex $ban 0] $mask]}" } if {[string match -nocase [lindex $ban 0] $mask]} { if {[lsearch -exact $::ModeD::kicklist $mask] == -1} { putcmdlog "add $nick to kicklist / match banlist $num / string match [lindex $ban 0] $mask [string match [lindex $ban 0] $mask]" lappend ::ModeD::kicklist $mask lappend ::ModeD::kicklist [lindex $ban 1] } { putcmdlog "$nick is allready on kicklist 1" } } } } if {$hand!="*"} { #putcmdlog "v: if {matchattr $hand v|gv $::ModeD::channel && lsearch $::ModeD::voicelist $nick == -1} == [matchattr $hand v|gv $::ModeD::channel] && [lsearch $::ModeD::voicelist $nick] == -1" if {[matchattr $hand v|gv $::ModeD::channel]} { if {[lsearch -exact $::ModeD::voicelist $nick] == -1} { putcmdlog "add $nick to voicelist" lappend ::ModeD::voicelist $nick #pushmode $::ModeD::channel +v $nick } { #putcmdlog "allready exist $nick in voicelist"; } } { #putcmdlog "dont match voice $nick"; } #putcmdlog "k: if {matchattr $hand k|k $::ModeD::channel && lsearch $::ModeD::kicklist $nick == -1} == [matchattr $hand k|k $::ModeD::channel] && [lsearch $::ModeD::kicklist $nick] == -1" if {[matchattr $hand k|k $::ModeD::channel]} { if {[lsearch -exact $::ModeD::kicklist $mask] == -1} { putcmdlog "add $nick to kicklist / match +k flag" lappend ::ModeD::kicklist $mask lappend ::ModeD::kicklist "banned" #pushmode $::ModeD::channel +v $nick } { putcmdlog "$nick is allready on kicklist 2" } } } { #putcmdlog "::ModeD::raw311 nick $mask - no handle" } } bind raw - 355 ::ModeD::raw355 proc raw355 {args} { if $::ModeD::debug { putcmdlog " r355 start : $args" } if ![info exist ::ModeD::raw355:timestamp] {set ::ModeD::raw355:timestamp [clock sec]} if {[expr [clock sec]-${::ModeD::raw355:timestamp}]<=10} { #putcmdlog "onlyappend"; set onlyadd 1 } { #putcmdlog "startnew"; set onlyadd 0; set ::ModeD::raw355:timestamp [clock sec] } #putcmdlog "::ModeD::raw355:b [llength $::ModeD::onlinelist] expr [expr [clock sec]-${::ModeD::raw355:timestamp}] onlyadd $onlyadd" set whois ""; set skip ""; set users [lindex [split [lindex $args 2] :] 1] if !$onlyadd {set ::ModeD::onlinelist [list]} foreach user [split $users] { set found [user:add $user] ### #putcmdlog " r355 found $found user $user" if !$found { puthelp [subst -nocommands -nobackslashes {WHOIS $user}]; lappend whois $user } { lappend skip $user } if {[lsearch -exact $::ModeD::onlinelist $user]==-1} { #putcmdlog " r355 append $found user $user to onlinelist" lappend ::ModeD::onlinelist $user } } if ![info exist ::ModeD::statuscounter] { set ::ModeD::statuscounter 0 } { incr ::ModeD::statuscounter } #putcmdlog "statuscounter: $::ModeD::statuscounter" set text "\002whois:\002$whois \002skip:\002$skip" set text [string map -nocase {{cybex} {C*B*x} {never} {n*v*r} {securetohopethatneverthiswordcomes} {andthisonetwoorbettertoorevenbettertoo} {die} {d**}} $text] set ::ModeD::checktext $::ModeD::onlinelist if ![info exist ::ModeD::lastwhoistext] { set ::ModeD::lastwhoistext "" } if { ( $::ModeD::statuscounter>="15" && ( $whois!="" || $skip!="" ) ) && [string length $::ModeD::checktext] != [string length $::ModeD::lastwhoistext]} { set ::ModeD::statuscounter 0; #putcmdlog "$text // [string length $::ModeD::checktext] != [string length $::ModeD::lastwhoistext] // [llength $::ModeD::checktext] != [llength $::ModeD::lastwhoistext]" set ::ModeD::lastwhoistext $::ModeD::checktext } { if {$whois!="" || $skip!=""} { if $::ModeD::debug { putcmdlog "$text" } } } #putcmdlog "::ModeD::raw355:e [llength $::ModeD::onlinelist]" } bind splt - "$::ModeD::channel *" ::ModeD::netsplit:split bind rejn - "$::ModeD::channel *" ::ModeD::netsplit:rejoin proc netsplit:split {nick args} { set found [user:add $nick] } proc netsplit:rejoin {nick args} { if ![info exist ::ModeD::userlist] {set ::ModeD::userlist [list]} set num [lsearch -exact $::ModeD::userlist $nick] if {$num!="-1"} { set ::ModeD::userlist [lreplace $::ModeD::userlist $num [expr $num+1]] } } bind mode - "$::ModeD::channel +l" ::ModeD::ModeL proc ModeL {nick host hand chan mc victim} { set ::ModeD::lastlimit $victim set ::ModeD::lastlimittick 0 if {$nick!=$::botnick && $::ModeD::develop} {putcmdlog "MODE Change $chan $mc $victim by $nick"} } bind time - "*" ::ModeD::time:check proc time:doit {args} { #putcmdlog "::ModeD::tc:b [llength $::ModeD::onlinelist] args $args" putdebug "::ModeD::time:check [set start [unixtime]] start" putserv "NAMES -d $::ModeD::channel" if ![info exist ::ModeD::userlist] {set ::ModeD::userlist [list]} if ![info exist ::ModeD::kicklist] {set ::ModeD::kicklist [list]} if ![info exist ::ModeD::voicelist] {set ::ModeD::voicelist [list]} set limit [expr [llength [chanlist $::ModeD::channel]]+[llength $::ModeD::userlist]/2+$::ModeD::raiselimit] if ![info exist ::ModeD::lastlimit] {set ::ModeD::lastlimit 0} if ![info exist ::ModeD::lastlimittick] {set ::ModeD::lastlimittick 0} if {$::ModeD::voicelist != [list]} { #putcmdlog "if {$::ModeD::voicelist != [list] && ( [llength $::ModeD::voicelist] >= 5 || [lindex $args 0]==\"00\" || [lindex $args 0]==\"15\" || [lindex $args 0]==\"30\" || [lindex $args 0]==\"45\") } " } #remove dead nicks foreach checknick $::ModeD::voicelist { if {[lsearch -exact $::ModeD::onlinelist $checknick]==-1} { #putcmdlog "[lsearch -exact $::ModeD::onlinelist $checknick] == -1 // lsearch $checknick <> $::ModeD::onlinelist " putcmdlog "remove $checknick from voicelist" set removenum [lsearch -exact $::ModeD::voicelist $checknick] #putcmdlog "1 - $removenum - $::ModeD::voicelist" set ::ModeD::voicelist [lreplace $::ModeD::voicelist $removenum $removenum] set removenum [lsearch -exact $::ModeD::voicelist $checknick] #putcmdlog "2 - $removenum - $::ModeD::voicelist" } } foreach {checkmask checktype} $::ModeD::kicklist { #putcmdlog "XX: kick $checknick - $checktype" set cknick [lindex [split $checkmask !] 0] if {[lsearch [split [string tolower [join $::ModeD::onlinelist]]] *[string tolower $cknick]*]==-1} { set removenum [lsearch -exact $::ModeD::kicklist $checkmask] putcmdlog "1 - $removenum - $checkmask from $::ModeD::kicklist" set ::ModeD::kicklist [lreplace $::ModeD::kicklist $removenum [expr 1+$removenum]] set removenum [lsearch -exact $::ModeD::kicklist $checkmask] putcmdlog "2 - $removenum - $::ModeD::kicklist" putcmdlog "remove $cknick from kicklist ($removenum)" } } if ![info exists ::ModeD::LastKickNick] {set ::ModeD::LastKickNick ""} foreach {checkmask checktype} $::ModeD::kicklist { set cknick [lindex [split $checkmask !] 0] if {[lsearch -exact [split [string tolower [join $::ModeD::onlinelist]]] [string tolower $cknick]]!=-1} { if {[string match -nocase $::ModeD::LastKickNick $cknick]} { if [string match -nocase *.users.quakenet.org $checkmask] { set banmask *!*@[lindex [split $checkmask @] 1] } { set banmask [maskhost $checkmask] } putcmdlog "BAN $::ModeD::channel +b $banmask // $checkmask" puthelp "MODE $::ModeD::channel +b $banmask" } putcmdlog "KICK $cknick $::ModeD::channel :$checktype" puthelp "KICK $::ModeD::channel $cknick :$checktype" set ::ModeD::LastKickNick $cknick } } #work on cy:allbefore to 20031030 if {$::ModeD::voicelist != [list] && ( [llength $::ModeD::voicelist] >= 5 || [lindex $args 0]=="00" || [lindex $args 0]=="15" || [lindex $args 0]=="30" || [lindex $args 0]=="45") || ( $::ModeD::voicelist != [list] && ( ( $::ModeD::lastlimit<$limit && $::ModeD::lastlimittick>=$::ModeD::uplimitticks ) || ( $::ModeD::lastlimit>$limit && $::ModeD::lastlimittick>=$::ModeD::downlimitticks ) ) ) } { #if {$::ModeD::voicelist != [list]} if {$::ModeD::lastlimit!=$limit && $::ModeD::lastlimittick!=0} { putcmdlog "VOICELIST-LIMIT: $limit $::ModeD::voicelist" foreach {a b c d e} $::ModeD::voicelist { puthelp "MODE $::ModeD::channel +lvvvvv $limit $a $b $c $d $e" putcmdlog "MODE $::ModeD::channel +lvvvvv $limit $a $b $c $d $e" } set ::ModeD::voicelist [list] set ::ModeD::lastlimit $limit set ::ModeD::lastlimittick 0 if $::ModeD::debug { putcmdlog "set ::ModeD::lastlimittick to 0 - $limit/$::ModeD::lastlimit - $args" } } { putcmdlog "VOICELIST: $::ModeD::voicelist" foreach {a b c d e f} $::ModeD::voicelist { puthelp "MODE $::ModeD::channel +vvvvvv $a $b $c $d $e $f" putcmdlog "MODE $::ModeD::channel +vvvvvv $a $b $c $d $e $f" } set ::ModeD::voicelist [list] } } { if {$::ModeD::voicelist != [list]} { #putcmdlog "waiting with voices: $::ModeD::voicelist != [list] && ( [llength $::ModeD::voicelist] >= 5 || [lindex $args 0]==00 || [lindex $args 0]==15 || [lindex $args 0]==30 || [lindex $args 0]==45) " } } #putcmdlog "if { ( ( $::ModeD::lastlimit<$limit && $::ModeD::lastlimittick>=$::ModeD::uplimitticks ) || ( $::ModeD::lastlimit>$limit && $::ModeD::lastlimittick>=$::ModeD::downlimitticks ) ) }" if { ( ( $::ModeD::lastlimit<$limit && $::ModeD::lastlimittick>=$::ModeD::uplimitticks ) || ( $::ModeD::lastlimit>$limit && $::ModeD::lastlimittick>=$::ModeD::downlimitticks ) ) } { putcmdlog "set limit from $::ModeD::lastlimit to $limit after [duration [expr $::ModeD::lastlimittick*60]]" if { ( $::ModeD::lastlimit<$limit && $::ModeD::lastlimittick>$::ModeD::uplimitticks ) || ( $::ModeD::lastlimit>$limit && $::ModeD::lastlimittick>$::ModeD::downlimitticks ) } { #putcmdlog "set limit from $::ModeD::lastlimit to $limit after [duration [expr $::ModeD::lastlimittick*60]]" } set ::ModeD::lastlimit $limit pushmode $::ModeD::channel +l $limit set ::ModeD::lastlimittick 0 if $::ModeD::debug { putcmdlog "set ::ModeD::lastlimittick to 0 - $limit/$::ModeD::lastlimit - $args" } } { incr ::ModeD::lastlimittick if $::ModeD::debug { putcmdlog "incr ::ModeD::lastlimittick to $::ModeD::lastlimittick - $limit/$::ModeD::lastlimit - $args" } } #später ersetzen durch if ::ModeD::savestat if {$::ModeD::savestats} { if {[llength $args]==5} { set fname $::ModeD::datadir/day.$::botnick.[lindex $args 4].[lindex $args 3].[lindex $args 2] set op 0; set voice 0; set visit 0; foreach user [chanlist $::ModeD::channel] { if [isop $user $::ModeD::channel] { incr op } elseif [isvoice $user $::ModeD::channel] { incr voice } { incr visit } } set data [list] lappend data [lindex $args 1] lappend data [lindex $args 0] lappend data [expr [llength [chanlist $::ModeD::channel]]+[llength $::ModeD::onlinelist]] lappend data $op lappend data $voice lappend data $visit lappend data [llength $::ModeD::onlinelist] lappend data [expr [llength $::ModeD::userlist]/2] lappend data $::ModeD::lastlimittick lappend data $limit lappend data $::ModeD::lastlimit #putcmdlog "::ModeD::time:check - t: ll: l: - c: op: voice: user: invisible: - u: v:[llength $::ModeD::voicelist] k:[llength $::ModeD::kicklist] - $args -" #putcmdlog "::ModeD::time:check $fname $data" appendfile $fname $data if {$::ModeD::develop || $::ModeD::debug || ( [expr [scan [lindex $args 0] %d] % 5]==0 && [channel get $::ModeD::channel statuslog]) } { putcmdlog "::ModeD::time:check - t:$::ModeD::lastlimittick ll:$::ModeD::lastlimit l:$limit - c:[expr [llength [chanlist $::ModeD::channel]]+[llength $::ModeD::onlinelist]] op:$op voice:$voice user:$visit invisible:[llength $::ModeD::onlinelist] visible:[llength [chanlist $::ModeD::channel]] - u:[expr [llength $::ModeD::userlist]/2] v:[llength $::ModeD::voicelist] k:[expr [llength $::ModeD::kicklist]/2] - $args -" } } } set num 0; foreach {name last} $::ModeD::userlist { set time [expr [unixtime]-$last] if {$time>3595} { #set num [lsearch $::ModeD::userlist $name]; if $::ModeD::debug { putcmdlog "nick $name last [duration $time] deleted" } set ::ModeD::userlist [lreplace $ModeD::userlist $num [expr $num+1]] } { incr num 2 } #putcmdlog "nick $name last $time" } if $::ModeD::debug { } #putcmdlog "::ModeD::tc:e [llength $::ModeD::onlinelist] args $args" #putdebug "::ModeD::time:check [set end [unixtime]] end [expr $end-$start]" } proc time:check {arg1 arg2 arg3 arg4 args} { set time [expr [rand $::ModeD::random]+[rand $::ModeD::random]+[rand $::ModeD::random]+[rand $::ModeD::random]+$::ModeD::random] set cmd [list ::ModeD::time:doit $arg1 $arg2 $arg3 $arg4 $args] if {$::ModeD::userandom && $::ModeD::debug} {putcmdlog "utimer $time $cmd"} if $::ModeD::userandom {utimer $time $cmd} {eval $cmd} } proc main {args} { } ### init proc init {args} { set err [catch {main $args} msg] return [list $err $msg] } set init [init] } # proc fixes for me # proc lol_whois_reply {args} {} # proc lol_whois_unknow {args} {} namespace eval ::ModeD:: { set ::ModeD::develop 0 putlog "ModeD.tcl loaded version $major.$minor.$build.$run" return "$major.$minor.$build.$run" }