This is the new home of the egghelp.org community forum.
All data has been migrated (including user logins/passwords) to a new phpBB version.


For more information, see this announcement post. Click the X in the top right-corner of this box to dismiss this message.

stats.mod and empty spaces

Discussion of Eggdrop's code and module programming in C.
Post Reply
T
Torrevado
Op
Posts: 101
Joined: Wed Aug 02, 2006 6:29 pm

stats.mod and empty spaces

Post by Torrevado »

Hello,

this module is IMHO the best stats creator for eggdrop, but there's an issue with it, it doesn't "strip" extra empty spaces, so if someone types a command or a nick followed by more than one empty space, it won't neither recognize command or nick.

In tcl we can solve this with "set arg [lindex $arg 0]" or something like that, but is there an "easy" way to do it in C?

note: gseen.mod, from the same author, doesn't have such issue.

Thanks.
T
Torrevado
Op
Posts: 101
Joined: Wed Aug 02, 2006 6:29 pm

Post by Torrevado »

At the end of gseen.conf, after binds, there's some tcl code, 2nd and 3rd "if" are about AI feature, but that part "foreach bnd..." could it be what is doing gseen to work with extra empty spaces?. If so, it maybe would be the solution to fix stats.mod...

Code: Select all

bind chjn - * *chjn:gseen
bind chpt - * *chpt:gseen

catch "unbind pub - !seen *pub:!seen"
catch "unbind pub - !seennick *pub:!seennick"
catch "unbind pub - !seenstats *pub:!seenstats"
bind pub - ${cmdchar}seen *pub:!seen
bind pub - ${cmdchar}seennick *pub:!seennick
bind pub - ${cmdchar}seenstats *pub:!seenstats

foreach bnd [binds pubm] {
  if {([lindex $bnd 2] == "*pubm:seen") || ([lindex $bnd 2] == "*pub:!seenstats")} {
    unbind [lindex $bnd 0] [lindex $bnd 1] [lindex $bnd 2] [lindex $bnd 4]
  }
}

if {${ai-seen-binds} != ""} {
  foreach mask ${ai-seen-binds} {
    bind pubm -|- "% [subst $mask]" *pubm:seen
  }
}

if {${ai-seenstats-binds} != ""} {
  foreach mask ${ai-seenstats-binds} {
    bind pubm -|- "% [subst $mask]" *pub:!seenstats
  }
}
t
thommey
Halfop
Posts: 76
Joined: Tue Apr 01, 2008 2:59 pm

Post by thommey »

You will have to modify the C code of stats.mod to solve this issue. Which version do you use?
T
Torrevado
Op
Posts: 101
Joined: Wed Aug 02, 2006 6:29 pm

Post by Torrevado »

I'm using the stable one (v1.3)

I found a tcl script to display statistics from stats.mod, it's easy to fix stats.mod issue from there.
I know it would be better to modify C code, but I'm not able to do it.

Code: Select all

#################### stats-public.tcl ############################
## Ein schönes TCL was dazu dient um das Stats.mod über
## Channelbefehle zu steuern.
##
## Diese Befehle stehen allen Moderatoren und Operatoren
## zu verfügung.
##
## Settings:
## Statistik Befehle
## ein: !stats +cmd <top10|ttop10|top20|ttop20|stat|tstat|place|tplace|all>
## aus: !stats -cmd <top10|ttop10|top20|ttop20|stat|tstat|place|tplace|all>
##
## User ausschließen von der Channel-Statistik
## ein: !stats +user <nick>
## aus: !stats -user <nick>
##
## User zurücksetzen (resetuser)
## reset: !stats reset <nick>
##
##
## viel spaß damit
## ©2002-2003 by  BlackDeath
################### stats-public.tcl ##############################

catch "unbind pub - !top10 *pub:!top10"
catch "unbind pub - !ttop10 *pub:!ttop10"
catch "unbind pub - !top20 *pub:!top20"
catch "unbind pub - !ttop20 *pub:!ttop20"
catch "unbind pub - !stat *pub:!stat"
catch "unbind pub - !tstat *pub:!tstat"
catch "unbind pub - !place *pub:!place"
catch "unbind pub - !tplace *pub:!tplace"
catch "unbind pub - !wordstats *pub:!wordstats"
catch "unbind pub - !topwords *pub:!topwords"



bind pub - !top10 stats_top10
bind pub - !ttop10 stats_ttop10
bind pub - !top20 stats_top20
bind pub - !ttop20 stats_ttop20
bind pub - !stat stats_stat
bind pub - !tstat stats_tstat
bind pub - !place stats_place
bind pub - !tplace stats_tplace
bind pub - !wordstats stats_wordstats
bind pub - !topwords stats_topwords



proc stats_top10 {nick uhost hand chan rest} {
if {[stats_cmd "top10" $chan]} {
*pub:!top10 $nick $uhost $hand $chan $rest
}
}

proc stats_ttop10 {nick uhost hand chan rest} {
if {[stats_cmd "ttop10" $chan]} {
*pub:!ttop10 $nick $uhost $hand $chan $rest
}
}

proc stats_top20 {nick uhost hand chan rest} {
if {[stats_cmd "top20" $chan]} {
*pub:!top20 $nick $uhost $hand $chan $rest
}
}

proc stats_ttop20 {nick uhost hand chan rest} {
if {[stats_cmd "ttop20" $chan]} {
*pub:!ttop20 $nick $uhost $hand $chan $rest
}
}

proc stats_stat {nick uhost hand chan rest} {
if {[stats_cmd "stat" $chan]} {
*pub:!stat $nick $uhost $hand $chan $rest
}
}

proc stats_tstat {nick uhost hand chan rest} {
if {[stats_cmd "tstat" $chan]} {
*pub:!tstat $nick $uhost $hand $chan $rest
}
}

proc stats_place {nick uhost hand chan rest} {
if {[stats_cmd "place" $chan]} {
*pub:!place $nick $uhost $hand $chan $rest
}
}

proc stats_tplace {nick uhost hand chan rest} {
if {[stats_cmd "tplace" $chan]} {
*pub:!tplace $nick $uhost $hand $chan $rest
}
}

proc stats_wordstats {nick uhost hand chan rest} {
if {[stats_cmd "wordstats" $chan]} {
*pub:!wordstats $nick $uhost $hand $chan $rest
}
}

proc stats_topwords {nick uhost hand chan rest} {
if {[stats_cmd "topwords" $chan]} {
*pub:!topwords $nick $uhost $hand $chan $rest
}
}

set stats_commands {top10 ttop10 top20 ttop20 stat tstat place tplace wordstats topwords}

proc stats_cmd {cmd chan} {
global stats_cmd
stats_cmd_load $chan
set cmd [string tolower $cmd]
if {[info exists stats_cmd($chan,$cmd)]} {
return $stats_cmd($chan,$cmd)
} else {
return true
}
}

proc stats_cmd_load {chan} {
global stats_cmd
global stats_commands
if {[info exists stats_cmd($chan,-loaded-)]} { return }
set filename [string tolower $chan]
set filename "statscom.cmd"
catch {
set f [open $filename r]
while {[gets $f line] >= 0} {
set switch [string range $line 0 0]
set cmd [string tolower [string range $line 1 end]]
set idx [lsearch $stats_commands $cmd]
if {$idx >= 0} {
switch -- $switch {
"+" {set stats_cmd($chan,$cmd) true}
"-" {set stats_cmd($chan,$cmd) false}
}
}
}
close $f
} resp
set stats_cmd($chan,-loaded-) ""
}

proc stats_cmd_save {chan} {
global stats_cmd
global stats_commands
set filename [string tolower $chan]
set filename "statscom.cmd"
catch {
set f [open $filename w]
foreach cmd [split $stats_commands] {
set cmd [string tolower $cmd]
set opt "+"
if {[info exists stats_cmd($chan,$cmd)]} {
if {$stats_cmd($chan,$cmd)} {
set opt "+"
} else {
set opt "-"
}
}
puts $f "${opt}${cmd}"
}
close $f
}
}

bind pub - !stats stats_switch
bind bot - "stats-user" stats_bot_user

proc stats_schattr {nick user opt} {
if {$opt} {
set opt "+list"
set opt_str "ein"
} else {
set opt "-list"
set opt_str "aus"
}

catch {
set dcclist [dcclist TELNET]
set dcc [lindex $dcclist 0]
set xtra [lindex $dcc 4]
set port [lindex $xtra 1]
set idx [connect localhost $port]
set hdl [idx2hand $idx]
catch { *dcc:schattr $hdl $idx "$user $opt" } result
after 1
killdcc $idx
if {$result != "0"} {
return $result
}
} result
if {$result == ""} {
puthelp "NOTICE $nick :Anzeigen der Statistiken für Benutzer $user in allen Räumen ${opt_str}geschaltet"
putlog "modpub.tcl: $nick changes $user to $opt"
} else {
puthelp "NOTICE $nick :Fehler beim Umschalten des Statistiken: $result"
}
return
}


proc stats_switch_cmd {nick chan cmd opt} {
global stats_cmd
global stats_commands
stats_cmd_load $chan
if {$opt} {
set opt_str "ein"
} else {
set opt_str "aus"
}
if {[string tolower $cmd] == "all"} {
foreach cmd [split $stats_commands] {
set cmd [string tolower $cmd ]
set stats_cmd($chan,$cmd) $opt
}

puthelp "NOTICE $nick :Alle Befehle im Raum $chan ${opt_str}geschaltet"
stats_cmd_save $chan
return
}

set cmd [string tolower $cmd]
set idx [lsearch $stats_commands $cmd]
if {$idx == -1} {
puthelp "NOTICE $nick :Falscher Befehl \"$cmd\""
return
}

set stats_cmd($chan,$cmd) $opt
puthelp "NOTICE $nick :Der Befehl \"$cmd\" im Raum $chan ${opt_str}geschaltet"
stats_cmd_save $chan
return
}



proc stats_bot_user {from command arg} {
# what are the parameters
set cmd [split $arg]
set nick [lindex $cmd 0]
set user [lindex $cmd 1]
set opt [lindex $cmd 2]
# do the work
stats_schattr $nick $user $opt
}

proc stats_switch_user {nick user opt} {
# inform other bots
# do it yourselt, too
stats_schattr $nick $user $opt
return 0
}



proc stats_reset_user {nick chan opt} {
resetuser $opt $chan
puthelp "NOTICE $nick :Statistiken des Benutzers $opt wurden im Raum $chan zurückgesetzt"
}



proc stats_switch {nick uhost hand chan rest} {
if {![isvoice $nick $chan] && ![isop $nick $chan]} {
puthelp "NOTICE $nick :Dieser Befehl ist nur für Moderatoren"
return 0
}

set lrest [split $rest]
set cmd [lindex $lrest 0]
set arg [lindex $lrest 1]
switch -exact -- $cmd {
+cmd { stats_switch_cmd $nick $chan $arg true }
-cmd { stats_switch_cmd $nick $chan $arg false }
reset { stats_reset_user $nick $chan $arg }
+user { stats_switch_user $nick $arg true }
-user { stats_switch_user $nick $arg false }
}
}

putlog "stats-public.tcl by BlackDeath loaded..."
Post Reply