Public feed #723932

xvoice

public text v1 · immutable
Raw Edit
·published 2007-10-03 04:37 UTC
rendered paste body
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 #bitchesunited
	if {$::botnick=="DV9"} {
		set ::ModeD::savestats 1
		set ::ModeD::raiselimit 3
		set ::ModeD::uplimitticks 6
		set ::ModeD::downlimitticks 60
		set ::ModeD::channel #bitchesunited
	}
	if {$::username=="dv9"} {
		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 #bitchesunited
	}
	if {$::username=="Chatter"} {
		set ::ModeD::DoExtStats 1
	} {
		set ::ModeD::DoExtStats 1
	}

	# data

	## helper

	## main

	### vars

	set ::ModeD::develop 0
	if {$::botnick=="DV9" || $::botnick=="DV9"} { set ::ModeD::develop 1 }

	set ::ModeD::major 0
	set ::ModeD::minor 3
	if {![info exist ::ModeD::build] || !$::ModeD::develop} { set ::ModeD::build 14 } { incr ::ModeD::build }
	if {![info exist ::ModeD::run]} { set ::ModeD::run 1 } { incr run }
	set ::lateststable 0.3.14

	### 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
	bind raw - 311 ::ModeD::raw311
	bind raw * 330 ::ModeD::raw330
	bind raw - 355 ::ModeD::raw355
	bind pubm - "$::ModeD::channel *" ::ModeD::countwords;
	bind splt - "$::ModeD::channel *" ::ModeD::netsplit:split
	bind rejn - "$::ModeD::channel *" ::ModeD::netsplit:rejoin
	bind mode - "$::ModeD::channel +l" ::ModeD::ModeL
	bind time - "*" ::ModeD::time:check

	### 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 exists ::ModeD::Statistik(Init)] {set ::ModeD::Statistik(Init) 0} {incr ::ModeD::Statistik(Init)}
	if ![info exists ::ModeD::Statistik(Netsplit)] {set ::ModeD::Statistik(Netsplit) 0}
	if ![info exists ::ModeD::Statistik(Rejoin)] {set ::ModeD::Statistik(Rejoin) 0}
	if ![info exists ::ModeD::Statistik(WPM)] {set ::ModeD::Statistik(WPM) 0}
	if ![info exists ::ModeD::Statistik(LPM)] {set ::ModeD::Statistik(LPM) 0}

	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] }
	if {![info exists ::ModeD::authlist]} 		{ set ::ModeD::authlist [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

	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"
		}
	}

	proc raw330 {from signal args} {
		set args [lindex $args 0]

		set botn ""; set nick ""; set auth "";
		regexp {^(.*) (.*) :is authed as (.*)} $args args botn nick auth
		#putcmdlog "BotNick1: $botn - Nick: $nick - Auth: $auth"
		regexp {^(.*) (.*) (.*) :is authed as} $args args botn nick auth
		#putcmdlog "BotNick1: $botn - Nick: $nick - Auth: $auth"
		
	}

	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 {
				utimer [expr 10+[rand 5]+[rand 5]+[rand 5]+[rand 5]+[rand 5]] [list 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]"
	}

	proc countwords {nick host hand chan text} {

		#putcmdlog "args [llength [split $text]]"
		if ![info exists ::ModeD::Statistik(WPM)] {set ::ModeD::Statistik(WPM) 0} {incr ::ModeD::Statistik(WPM) [llength [split $text]]}
		if ![info exists ::ModeD::Statistik(LPM)] {set ::ModeD::Statistik(LPM) 0} {incr ::ModeD::Statistik(LPM)}

	}

	proc netsplit:split {nick args} {
		set found [user:add $nick]
		if ![info exists ::ModeD::Statistik(Netsplit)] {set ::ModeD::Statistik(Netsplit) 0} {incr ::ModeD::Statistik(Netsplit)}
	}
	proc netsplit:rejoin {nick args} {
		if ![info exists ::ModeD::Statistik(Rejoin)] {set ::ModeD::Statistik(Rejoin) 0} {incr ::ModeD::Statistik(Rejoin)}
		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]]
		}
	}

	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"}
		utimer [expr 3+[rand 5]+[rand 5]+[rand 5]] [list putserv "NAMES -d $::ModeD::channel"]
	}

	proc time:doit {args} {
		#putcmdlog "::ModeD::tc:b [llength $::ModeD::onlinelist] args $args"
		putdebug "::ModeD::time:check [set start [unixtime]] start"
		utimer [expr 3+[rand 5]+[rand 5]+[rand 5]] [list putserv "NAMES -d $::ModeD::channel"]
		if {[lindex $args 0]=="23" && [lindex $args 1]=="59"} {
			set ::ModeD::kicklist [list]
			set ::ModeD::voicelist [list]
		}
		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 "DEBUG: Check Mask $checkmask Type $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 [list]}
		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 {[lsearch -exact [split [string tolower [join $::ModeD::LastKickNick]]] [string tolower $cknick]]!=-1} {
					if [string match -nocase *.users.quakenet.org $checkmask] {
						set banmask *!*@[lindex [split $checkmask @] 1]
					} {
						set banmask [maskhost $checkmask]
					}
					putlog "BAN $::ModeD::channel +b $banmask // $checkmask"
					puthelp "MODE $::ModeD::channel +b $banmask"
				}
				putlog "KICK $cknick $::ModeD::channel :$checktype"
				puthelp "KICK $::ModeD::channel $cknick :$checktype"
				lappend ::ModeD::LastKickNick $cknick
				lappend ::ModeD::LastKickNick [unixtime]
				putcmdlog "LastKickNick(s) $::ModeD::LastKickNick"

			}
		}
		foreach {cknick dtime} $::ModeD::LastKickNick {
			if {[expr [unixtime]-$dtime]>600} {
				#putcmdlog "set Num [lsearch -exact [split [string tolower [join $::ModeD::LastKickNick]]] [string tolower $cknick]]"
				set Num [lsearch -exact [split [string tolower [join $::ModeD::LastKickNick]]] [string tolower $cknick]]
				putcmdlog "Remove $cknick from LastKickNicks $Num ($::ModeD::LastKickNick)"
				set ::ModeD::LastKickNick [lreplace $::ModeD::LastKickNick $Num [expr $Num+1]]
				#putcmdlog "LastKickNicks ($::ModeD::LastKickNick)"
			}
		}

		#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.$::nick.[lindex $args 4].[lindex $args 3].[lindex $args 2]
				#putcmdlog "set fname $fname - args $args"
				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
				lappend data [expr [llength $::ModeD::kicklist]/2]
				lappend data [expr [llength $::ModeD::voicelist]]
				#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"
				if {$::ModeD::DoExtStats} {
					lappend data $::ModeD::Statistik(Netsplit)
					lappend data $::ModeD::Statistik(Rejoin)
					lappend data $::ModeD::Statistik(WPM); set ::ModeD::Statistik(WPM) 0
					lappend data $::ModeD::Statistik(LPM); set ::ModeD::Statistik(LPM) 0
				}
				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"
}