# # ATTENTION: THIS IS AN ALPHA VERSION # # # This script require at moment my ModeD.tcl script from myself # http://cybex.b0rk.de/files/tcl/myown/beta/ # I have the timed whois and stuff there and i dont wanna doit twice. # later comes # first edit: 17.Mar.2004 # last edit: 19.Mar.2004 if {![info e ::ModeD::build]} { putlog "can't find ModeD.tcl! ABORT! Download from http://cybex.b0rk.de/files/tcl/myown/beta/ " return } namespace eval ::QNet:: { # # QNet.tcl startet 17.03.2004 by CyBex # # any problems or suggestions? write to Script-QNet@CyBex.has.nolife.org # # This script handle the QuakeNet Auth with your Botuser Files # it add hostmask to a handle, when QNet Auth match, remove old # hostmask # # Feel free to change this script, but please submit me your changes :-) # # Testet with Eggdrop 1.6.15 # # config # Auto add/remove unknown user (ignore every user with this flags: fvogamn) set UserAutoAdd 0 set UserAutoDel 0 # special flag, to identify autoadded users set UserAutoFlag A # remove chars like [] {} \ set UserRemoveChars 0 # use only one special user and add there every hostmask/auth set UserUseSpecial 0 set UserSpecial Guest # when not special, use nick or auth to add? (one must be 1, or UserAutoAdd is auto 0) set UserUseNick 0 set UserUseAuth 0 ## not reqied to edit below this commet # my bot configs if {$::nick=="NewS-FlasH"} { putcmdlog "QNet: load $::nick config" set UserAutoAdd 1; set UserAutoDel 1; set UserUseSpecial 1 } elseif {$::nick=="WebChat"} { putcmdlog "QNet: Load $::nick config" set UserAutoAdd 1; set UserAutoDel 1 set UserUseAuth 1; set UserRemoveChars 1 } # switch debug by default on/off if {![info exists ::QNet::debug]} { set ::QNet::debug 0 } ## vars set ::QNet::develop 0 if { $::nick=="Honecker" || $::nick=="Berlin" || $::nick=="NewS-FlasH" || $::nick=="WebChat" } { set ::QNet::develop 1 } set ::QNet::major 0 set ::QNet::minor 1 if {![info exist ::QNet::build] || !$::QNet::develop} { set ::QNet::build 1 } { incr ::QNet::build } if {![info exist ::QNet::run]} { set ::QNet::run 1 } { incr ::QNet::run } set ::lateststable 0.1.1 ### helper if $::QNet::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 - 330 ::QNet::raw330 bind time - * ::QNet::user:timecheck bind dcc n qnet {::QNet::partyline QNet} bind dcc n bodytest ::bodytest # permadd, permdel, permrem, permlist ### procs proc qauth:check {hand auth} { set XTRA [getuser $hand XTRA auth:$auth] #if $::QNet::debug { putcmdlog "::QNet::qauth:check h: $hand a: $auth X: $XTRA" } if {$XTRA==""} {return 0} {return 1} } proc qauth:set {hand auth host} { #if $::QNet::debug { putcmdlog "::QNet::auth:set hand $hand auth $auth host $host" } if ![qauth:check $hand $auth] {qauth:add $hand $auth $host} set XTRA [getuser $hand XTRA auth:$auth] if $::QNet::debug { putcmdlog "::QNet::qauth:set $hand XTRA: $XTRA" } set create [lindex $XTRA 0] set modify [lindex $XTRA 1] set lasthosts [lindex $XTRA 2] set num 0; putcmdlog "lasthost1 $lasthosts" foreach {hostl timel} $lasthosts { if {![string is digit $timel]} { putcmdlog "second par is no digit - host $host" qauth:add $hand $auth $host qauth:set $hand $auth $host return } set lnum [lsearch -exact $lasthosts $hostl] if {$lnum!=$num} {putcmdlog "num != lnum == $num != $lnum == [lindex $lasthosts $num] != [lindex $lasthosts $lnum]"} if {[string match $host $hostl] || [string equal $host $hostl]} { putcmdlog "lasthost2 $lasthosts" set lasthosts [lreplace $lasthosts [expr 1+$num] [expr 1+$num] [unixtime]] putcmdlog "lasthost3 $lasthosts" } #putcmdlog "num $num/$lnum host $host from lh $hostl timel $timel" incr num 2 } #putcmdlog "lasthosts $lasthosts" #if $::QNet::debug { putcmdlog "::QNet::qauth:set old XTRA: $XTRA" } set XTRAN "$create [unixtime] $lasthosts" #if $::QNet::debug { putcmdlog "::QNet::qauth:set new XTRA: $XTRAN" } if {$XTRA!=$XTRAN} { if $::QNet::debug { putcmdlog "::QNet::auth:set diff found in XTRA - $XTRAN - $XTRA" putcmdlog "::QNet::auth:set new: $XTRAN" putcmdlog "::QNet::auth:set old: $XTRA" } ###setuser $hand XTRA auth:$auth $XTRAN } { if $::QNet::debug { putcmdlog "::QNet::auth:set no diff in XTRA" } } putcmdlog "auth:set getuser [getuser $hand XTRA auth:$auth]" } proc qauth:get {hand auth} { set XTRA [getuser $hand XTRA auth:$auth] if {$XTRA==""} {return -1} {return $XTRA} } proc qauth:add {hand auth host} { if $::QNet::debug { putcmdlog "::QNet::auth:add hand $hand auth $auth host $host" } ###setuser $hand XTRA auth:$auth "[unixtime] [unixtime] [split $host] [unixtime]" putcmdlog "auth:add getuser [getuser $hand XTRA auth:$auth]" } proc user:check {nick hand auth {host ""}} { if $::QNet::debug { putcmdlog "::QNet::user:check $nick $hand $auth $host [qauth:check $hand $auth]" } if {$hand!="" && $hand!="*" && $auth!="" && $auth!="*"} { if {$host==""} {set host [getchanhost $nick]} if {$host=="" && [info ex ::ModeD::build] && [info ex ::ModeD::users($nick)]} { set host [lindex [split $::ModeD::users($nick) !] 1] } set ohost $host; set onick $nick if {[string match *@*.users.quakenet.org $host]} { set nick "*"; set host "*@[lindex [split $host @] 1]" } if {$host=="" || $host=="*"} { return 0 } # check for XTRA hostmask set found 0; set fhost "" foreach {chost ctime} [getuser $hand xtra permhost] { if {[string match $chost $nick!$host] || [string equal $chost $nick!$host]} { set fhost $chost; set found 1 } } foreach {chost ctime} [getuser $hand xtra delhost] { if {[string match $chost $nick!$host] || [string equal $chost $nick!$host]} { set fhost $chost; set found 1 } } foreach {chost ctime} [lindex [getuser $hand xtra auth:$auth] 2] { if {[string match $chost $nick!$host] || [string equal $chost $nick!$host]} { set fhost $chost; set found 1 } } if !$found { putcmdlog "::QNet::user:check add XTRA hostmask $nick!$host to $hand" set XTRA [getuser $hand XTRA auth:$auth]; set create [lindex $XTRA 0]; set modify [lindex $XTRA 1] set lasthosts [lindex $XTRA 2]; set lasthosts [linsert $lasthosts 0 $nick!$host [unixtime]] if {$create==""} {set create [unixtime]} set XTRAN "$create [unixtime] $lasthosts" if {$XTRA!=$XTRAN} { if $::QNet::debug { putcmdlog "::QNet::user:check diff found in XTRA" putcmdlog "::QNet::user:check new: $XTRAN" putcmdlog "::QNet::user:check old: $XTRA" } ###setuser $hand XTRA auth:$auth $XTRAN } { if $::QNet::debug { putcmdlog "::QNet::user:check no diff in XTRA" } } addhost $hand $nick!$host #putcmdlog "qauth:set $hand $auth $nick!$host " qauth:set $hand $auth $nick!$host } { # check host in userfile #if $::QNet::debug { putcmdlog "::QNet::user:check hostmask in users hosts" } set found 0; foreach chost [getuser $hand hosts] { if {[string match $chost $nick!$host] || [string equal $chost $nick!$host]} { set found 1 } } if !$found { if $::QNet::debug { putcmdlog "::QNet::user:check add user hostmask $nick!$host to $hand" }; addhost $hand $nick!$host } #putcmdlog "qauth:set $hand $auth $nick!$host " qauth:set $hand $auth $nick!$host } } } proc user:bigcheck args { # remove old hosts, cleanup userfile foreach user [userlist] { # at moment only self testing if {$user=="CyBex"} { } } } proc user:timecheck args { proc user:add {mask} { #if $::QNet::debug { putcmdlog " u:a start : $mask" } if ![info exist ::QNet::userlist] {set ::QNet::userlist [list]} set found 0; foreach {name time} $::QNet::userlist { if {$name==$mask || [string equal $mask $name] || [string match $mask $name]} { set found 1; break } } if !$found { lappend ::QNet::userlist $mask; lappend ::QNet::userlist [expr [unixtime]+20-[rand 60]] } return $found } proc user:del {} { set num 0; foreach {name last} $::QNet::userlist { set time [expr [unixtime]-$last] #3595 if {$time>3595} { #set num [lsearch $::QNet::userlist $name]; if $::QNet::debug { putcmdlog "nick $name last [duration $time] deleted" } set ::QNet::userlist [lreplace $ModeD::userlist $num [expr $num+1]] } { incr num 2 } #putcmdlog "nick $name last $time" } } proc user:whois {chan} { #putcmdlog "::QNet::user:timecheck user:whois"; set whois [list]; set skip [list] foreach user [chanlist $chan] { if [string eq -noc fishbot $user] continue set found [user:add $user] if $found { lappend skip $user } { lappend whois $user; utimer [expr 10+[rand 5]+[rand 5]+[rand 5]+[rand 5]+[rand 5]] [list puthelp [subst -nocommands -nobackslashes {WHOIS $user}]] } } set text "::QNet::user:timecheck \002whois:\002$whois \002skip:\002$skip" set text [string map -nocase {{cybex} {C*B*x} {never} {n*v*r} {securetohopethatneverthiswordcomes} {andthisonetwoorbettertoorevenbettertoo} {die} {d**}} $text] if {$whois!=[list]} { if $::QNet::debug { putcmdlog $text } } user:del } user:whois $::ModeD::channel # putcmdlog "whois" foreach user [userlist ] { # putcmdlog "foreach" set hosts [getuser $user hosts] set xtra [getuser $user xtra] #putcmdlog "user $user host $hosts [llength $hosts] xtra $xtra [llength $xtra]" set hostl [list]; set hostd [list] set authfound 0; set delfound 0; foreach item $xtra { #set item [split $item] # putcmdlog "foreach2 $item" if {[string match auth:* [lindex $item 0]]} { # putcmdlog "if string match auth:* [lindex $item 0] [string match auth:* [lindex $item 0]]" foreach host [lindex [lindex $item 1] 2] { # putcmdlog "foreach3" set authfound 1; lappend hostl $host } } #1 # putcmdlog "if string match permhost [lindex $item 0] [string match permhost [lindex $item 0]]" if {[string match "permhost" [lindex $item 0]]} { set authfound 1; foreach host [lindex $item 1] { lappend hostl $host } } if {[string match "delhost" [lindex $item 0]]} { set delfound 1; foreach host [lindex $item 1] { lappend hostd $host } } } #2 # putcmdlog "set found" set found 0; foreach host $hosts { foreach hostls $hostl { #putcmdlog "user $user [string match $host $hostls] [string match $hostls $host] [string equal $host $hostls] host $host hostl $hostls" if {[string match $host $hostls] || [string equal $host $hostls]} { #putcmdlog "found: [string match $host $hostls] || [string equal $host $hostls] h: \002$host\002 hls: \002$hostls\002" set found 1 } { #putcmdlog "not found: [string match $host $hostls] || [string equal $host $hostls] h: $host hls: $hostls" } } } # putcmdlog "found $found" #if !$found { putcmdlog "not" } { putcmdlog "!not" } } # putcmdlog "found" } proc user:add {args} { if $::QNet::debug { putcmdlog "::QNet::user:add $args" } } #set UserAutoAdd 0 ; set UserAutoDel 0 ; set UserAutoFlag A ; set UserRemoveChars 1 ; #set UserUseSpecial 0 ; set UserSpecial Guest ; set UserUseNick 0 ; set UserUseAuth 0 proc user:autoadd {nick auth {host ""}} { if {$nick==$::botnick} {return 0} if $::QNet::debug { putcmdlog "::QNet::user:autoadd $nick $auth $host" } proc removechar {text} { # clantag #if [regexp {\[.+].+} $text] { regsub -all {\[.+]} $text {\|} text } #if [regexp {].+\[.+} $text] { regsub -all {].+\[} $text {\|} text } set text [string map {\\ \| \[ \| \] \| \{ \| \} \| \" \|} $text] putcmdlog "removechar text $text" set num -1; set max -1; set name ""; foreach teil [split $text |] { incr num; if {[string len $teil]>[string len $name]} { #putcmdlog "$teil is longer then [lindex [split $text |] $max]" set max $num; set name $teil } }; if {$max>-1 && [string len $name]>2} { set text $name; } # chars return [string map {\\ "" \[ "" \] "" \{ "" \} "" \| "" \" ""} $text] } #putcmdlog "get host" set hand "" if {$host==""} {set host [getchanhost $nick]} if {$host=="" && [info e ::ModeD::build] && [info e ::ModeD::userlist]} { if [info exist ::ModeD::users($nick)] { set host [lindex [split $::ModeD::users($nick) !] 1] } } #putcmdlog "get hand" if {$host!=""} { set hand [auth2hand $auth] if {$hand=="" || $hand=="*"} { set hand [nick2hand $nick] } if {$hand=="" || $hand=="*"} { set hand [finduser $host] } if {$hand!="" && $hand!="*"} { if ![qauth:check $hand $auth] { if $::QNet::debug { putcmdlog "::QNet::user:autoadd qauth:check failed" } qauth:add $hand $auth $host } if $::QNet::debug { putcmdlog "::QNet::user:autoadd dont add $nick, is $hand" } user:check $nick $hand $auth $host return } } #putcmdlog "add" if {$hand==""} {set hand "*"} if {$::QNet::UserAutoAdd && $hand=="*"} { #putcmdlog "hand $hand" if {[string match *@*.users.quakenet.org $host]} { set nick "*" set host "*@[lindex [split $host @] 1]" #if $::QNet::debug { putcmdlog "::QNet::user:autoadd rewrite host to $host" } } if {!$::QNet::UserUseSpecial && !$::QNet::UserUseNick && !$::QNet::UserUseAuth} { putlog "No UserUse\002MODE\002 defined, abort AutoAdd" set ::QNet::UserAutoAdd 0 return } if {$::QNet::UserUseSpecial} { if $::QNet::debug { putcmdlog "::QNet::user:autoadd use special" } if ![validuser $::QNet::UserSpecial] { if $::QNet::debug { putcmdlog "::QNet::user:autoadd add user $::QNet::UserSpecial" } adduser $::QNet::UserSpecial chattr $::QNet::UserSpecial $::QNet::UserAutoFlag } if {$host!="" && $host!="*"} { if {[lsearch -exact [getuser $::QNet::UserSpecial HOSTS] $nick!$host]!=-1} { if $::QNet::debug { putcmdlog "::QNet::user:autoadd dont add host, allready known" } } { if $::QNet::debug { putcmdlog "::QNet::user:autoadd add host $::QNet::UserSpecial $nick!$host" } addhost $::QNet::UserSpecial $nick!$host } } #putcmdlog "user:autoadd qauth:set $::QNet::UserSpecial $auth $nick!$host" qauth:set $::QNet::UserSpecial $auth $nick!$host } elseif {$::QNet::UserUseNick} { if $::QNet::debug { putcmdlog "::QNet::user:autoadd use nick" } } elseif {$::QNet::UserUseAuth} { if $::QNet::UserRemoveChars { set cauth [removechar $auth] } { set cauth $auth } putcmdlog "::QNet::user:autoadd use auth $cauth ($auth)" if ![validuser $cauth] { adduser $cauth chattr $cauth $::QNet::UserAutoFlag if {$host!="" && $host!="*"} { if {[lsearch -exact [getuser $cauth HOSTS] $nick!$host]!=-1} { if $::QNet::debug { putcmdlog "::QNet::user:autoadd dont add host, allready known" } } { if $::QNet::debug { putcmdlog "::QNet::user:autoadd add host $cauth $nick!$host" } addhost $cauth $nick!$host } } qauth:set $cauth $auth $nick!$host if $::QNet::debug { putcmdlog "::QNet::user:autoadd use auth $cauth ($auth)" } } } else { if $::QNet::debug { putcmdlog "::QNet::user:autoadd failed - $nick $auth" } } } } proc auth2hand {auth} { foreach user [userlist] { set XTRA [getuser $user XTRA auth:$auth] if {$XTRA!=""} { return $user } } return "" } ### bind procs proc raw330 {from signal args} { if $::QNet::debug { putcmdlog "::QNet::raw330 from $from signal $signal args $args" } set args [lindex $args 0] set botn ""; set nick ""; set auth ""; set hand ""; set host ""; regexp {^(.*) (.*) :is authed as (.*)} $args args botn nick auth regexp {^(.*) (.*) (.*) :is authed as} $args args botn nick auth if {$nick==$::botnick} {return} if {$nick!="" && $auth!=""} { set hand [nick2hand $nick]; set host "" if {$hand=="" || $hand=="*"} {set hand [auth2hand $auth]} if [info exist ::ModeD::users($nick)] { set host [lindex [split $::ModeD::users($nick) !] 1] } if {$hand!="" && $hand!="*" && $host!="" && $host!="*"} { set hand [finduser $nick!$host] } if {$hand=="" || $hand=="*"} { if $::QNet::debug { putcmdlog "::QNet::raw330 handle from $nick/$auth is clear or not uniqe, check/add" } user:autoadd $nick $auth } { user:check $nick $hand $auth $host } } } bind dcc n qnet {::QNet::partyline QNet} proc partyline {cmd hand idx text} { if $::QNet::debug { putcmdlog "::QNet::partyline $cmd $hand $idx $text" } } } bind dcc n test clearA proc bodytest args { putcmdlog "load script" namespace eval :: { if {$::nick=="NewS-FlasH"} { #source scripts.NewsFlash/ModeD.tcl; source scripts.NewsFlash/QNet.tcl } elseif {$::nick=="WebChat"} { #source scripts.Berlin/ModeD.tcl; source scripts.Chatter/QNet.tcl } } set ::QNet::userlist [list]; set ::ModeD::userlist [list] putcmdlog "ModeD timecheck" ::ModeD::time:check 01 01 01 01 01 putcmdlog "QNet timecheck" ::QNet::user:timecheck } proc clearA args { foreach user [userlist] { foreach item [getuser $user xtra] { if [string match auth:* $item] { set auth [string range $item 5 [expr [string first " " $item]-1]] #setuser $user xtra auth:$auth putcmdlog "user $user auth $auth item $item" } } if {$user!="CyBex" && [matchattr $user A]} { #putcmdlog "delete $user" deluser $user } } putcmdlog "bodytest" bodytest } namespace eval ::QNet:: { #set ::QNet::develop 0 putlog "QNet.tcl loaded version $major.$minor.$build.$run" return "$major.$minor.$build.$run" }