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.

wordgame error with scores

Old posts that have not been replied to for several years.
Locked
C
CosmicD
Op
Posts: 102
Joined: Sat Dec 11, 2004 3:46 pm

wordgame error with scores

Post by CosmicD »

can somebody examine a part of the word scramble game ?

I 've downloaded it from the site here and translated it to dutch for use in my bot:

however the procedure to show the scores doesn't seem to work and it always gives the following error in my dcc chat:

tcl error: expected integer but got ""

the procedure to show the scores looks like this:

Code: Select all

proc the_score {nick uhost handle channel args} {
  global botnick wscorefile words answer winuse chan
  if {($winuse == 1) && ($chan == $channel)} {
    putserv "PRIVMSG $chan :Amaai! We hebben nogal afgespeeld hier :P !!"
  return 0
  }
  if {![file exists $wscorefile]} {
    putserv "PRIVMSG $chan : Nog niemand heeft gescoord!"
    return
  }
  set fd [open $wscorefile r]
  set j 0
   while {![eof $fd]} {
     lappend score [gets $fd]
         incr j
   }
   set i [expr $j - 1]
   set score [lreplace $score $i $i]
   close $fd
   set looptest [llength $score]
   for {set k 0} {$k < $looptest} {incr k 3} {
      set wosnick [lindex $score $k]
      set dscore [lindex $score [expr $k + 1]]
      set fscore [format "%d" [lindex $score [expr $k + 2]]]
      lappend tempsortscore [format "%.20d %d %s" $fscore $dscore $wosnick]
   }
   set tempsortscore [lsort -decreasing $tempsortscore]
   for {set i 0} {$i < 10} {incr i} {
      set tiscore [lindex $tempsortscore $i]
          set newtempsortscore [string trimleft [lindex $tiscore 0] 0]
      append sortscore [format "\0034 %s\.\003 %s\(%d\/%d\)  " [expr {$i + 1}] [lindex $t$
   }

   set slength [llength $sortscore]
   putserv "PRIVMSG $channel :De top 10 woordspel scorers zijn (Total/Daily):"
   putserv "PRIVMSG $channel :$sortscore"
}
The format of the wscore file is:

Code: Select all

nickname
2
2
Does someone see the problem ?
User avatar
user
&nbsp;
Posts: 1452
Joined: Tue Mar 18, 2003 9:58 pm
Location: Norway

Post by user »

The reason might be an empty line in the data file (check if there's a blank line in there)
If you post the complete proc, I can try to make you a version that validates the data before trying to compile the output message. (that 'append sortscore' line is incomplete)
Have you ever read "The Manual"?
C
CosmicD
Op
Posts: 102
Joined: Sat Dec 11, 2004 3:46 pm

Post by CosmicD »

here it is,

Code: Select all

##################  Written by Murf 10/10/97 ##################
##                                                           ##
## Requires wordlist.txt and wscore file                     ##
## I have included a wordlist file, but if you want to write ##
## your own, the format is                                   ## 
## <word to scramble>:<clue>                                 ##
##                                                           ##
##                                                           ##
##                                                           ##
##  The only  commands are:                                  ##
##                                                           ##
##  !word       -- starts the game                           ##
##  !score      -- spews the top ten scorers                 ##
##  !wstatus    -- turns it on or off                        ##
##  !wgeef -- turn the answer on or off                 ##
##           Check www.blueday.org/eggdrop.html              ##
##           Contact murf@mindless.com with questions        ##
###############################################################

## NOTES

# Scores are kept globally
# Scores are only kept for those in the bot's user list.
# The special user used to track various things, is added
#   by the script.

## REVISION HISTORY

# Mar 26 2002   --  Fixed adding new channel 
# Dec 18 2000   --  Fixed the score again. It was totally broken, not listing
#                   anything close to the top 10 scorers
#               --  fixed problem with possible duplicate entries in the score
#                   file is users change case of their nicks
# July 9 2000   --  Added switch to say/not say the answer if no one gets it.
#				--  Got rid of all the 'putchan's
# July 2 2000 	-- 	Fixed bug in the_score that didn't account for 
# 					less than 10 people in the score list.
#				--	Fixed bug in the_score that failed to check for 
#					non-existent score file.

## BINDS

#Change the f|f if you want.

bind pub - !wscore the_score
bind pub - !woord pub_word
bind time - "05 03 % % %" wo_refresh_time
bind msg m "wstatus" word_onoff
bind msg m "wgeef" answer_onoff

## VARIABLES, set these.

# This is the file that holds the wordlist, set it to whatever
set wlistfile /web/eggdrop/scripts/wordlist.txt

# This file keeps scores again call it whatever 
set wscorefile /web/eggdrop/scripts/wscore

# This special user is added to the bots userlist and used to track
# where each chan is in the wordlist
set specuser specialwd

# Say the answer if no one gets it
# 0 is don't say it / 1 is say it
set ansonoff 1

## ----------------Leave the rest alone----------------------------------

# This variable tells whether the script is being run.  It will only allow
# the game to be played in one channel at a time, otherwise too many timers
# too much confusion.
# Occasionally, the script may become confused during desynchs and says its 
# running when it isn't. You must reset this variable to 0. Don't worry
# it doesnt happen often.  Obviously leave it set to 0 here
set winuse 0

# This variable is the place in the wordlist.  Its initialized to 0 don't
# mess with it.  I tried randomizing this, but found this worked better,
# but its not hard to randomize if you like that better.
set word_list_count 0

# On off switch for the annoying people
# 0 is off/ 1 is on
set glonoff 1

# Global channel variable, initialized to null, leave alone
set chan ""

# Initializes global wordlist to null, leave it alone
set words ""

# ----------CODE--------------------------------------------------------

# Procedure to turn on/off whether the answer is given if no one
# gets it.
proc answer_onoff {nick uhost handle args} {
  global ansonoff botnick
  set onoff [string tolower [ string trim [lindex [split $args] 0] "{}" ]]
  if {$onoff == "on"} { 
 	set ansonoff 1
	putserv "NOTICE $nick :Wordgame will now tell you losers the answers ;-P"
	return
	} 
  if {$onoff == "off"} { 
	set ansonoff 0
	putserv "NOTICE $nick :Wordgame will no longer tell you losers the answers"
	return
	}
   putserv "NOTICE $nick :USAGE: /msg $botnick !wordanswer on\/off"
   return
}

# Had to add an on off switch cause some pple started annoying me
proc word_onoff {nick uhost handle args} {
  global botnick glonoff
  set onoff [string tolower [ string trim [lindex [split $args] 0] "{}" ]]
  if {$onoff == "on"} { 
 	set glonoff 1
	putserv "NOTICE $nick :Wordgame is turned on"
	return
	} 
  if {$onoff == "off"} { 
	set glonoff 0
	putserv "NOTICE $nick :Wordgame is turned off"
	return
	}
   putserv "NOTICE $nick :USAGE: /msg $botnick !wordswitch on\/off"
   return
}

# This is the main proc, it spews the word and sets the timers to do the 
# rest.

proc pub_word {nick uhost handle channel args} {
   global wscorefile wlistfile words word_list_count answer winuse \
chan letone lettwo letters specuser glonoff
   if {$glonoff == 0} {
	putserv "PRIVMSG $channel :Sorry, wordgame is turned off, try again later"
	return
   } 
   set chn [string tolower $channel]
   if {$word_list_count == 0} {
       if {![validuser $specuser]} {
          set channels [channels]
          adduser $specuser specuser!special@word.special.org
          foreach chann $channels {
             setuser $specuser XTRA wcount.$chann 0
          }
       }
       set word_list_count [getuser $specuser XTRA wcount.$chn]
       if {$word_list_count == ""} {
          setuser $specuser XTRA wcount.$chn 0
          set $word_list_count 0
       }  
       set words ""	
       set fd [open $wlistfile r]
       while {![eof $fd]} {
          lappend words [gets $fd]
       }
       close $fd
   }
   if {($winuse == 1) && ([string compare $chn $chan] != 0)} {
      putserv "PRIVMSG $chn :Sorry, they're already playing in $chan, go join in. I'll tell em your coming, $nick." 
   return 0
   } elseif {($winuse == 1) && ([string compare $chn $chan] == 0)} { 
        putserv "PRIVMSG $chan :HEY! One word at a time!"
     return 0
   } elseif {$winuse == 0} {
      set chan $chn
      set winuse 1
      set word_pair [lindex $words $word_list_count]
      set answer [lindex [split $word_pair :] 1]
      set word_split [split $word_pair :]
      set letters [lreplace $word_split 1 1]
      set let_split [split $letters {}]
      set letone [lindex $let_split 0]
      set slettwo $letone
      set slettwo [join [lappend slettwo [lindex $let_split 1]]]
      regsub { } $slettwo {} lettwo
      set i [llength $let_split]
      set smixed ""
      set tmixed ""
      for {set j 0} {$j < $i} {incr j} {
        set k [rand [llength $let_split]] 
        set smixed $tmixed
        set smixed [lappend smixed [lindex $let_split $k]]
        set let_split [lreplace $let_split $k $k]
        regsub { } $smixed {} tmixed
      }
      set mixed $tmixed
      bind pub - $letters pub_gotit
      putserv "PRIVMSG $chan :Ontrafel ---> \0036 $mixed "
      incr word_list_count 
      if {$word_list_count >= [expr [llength $words] -1]} {
         set word_list_count "0"
      }
      setuser $specuser XTRA wcount.$chn $word_list_count
      utimer 60 noone_gotit 
      utimer 15 clue_1
      utimer 30 clue_2
      utimer 45 clue_3
   }
}

# All the timers expired and no one got it. Spew to chan.

proc noone_gotit {} {
   global winuse chan letters ansonoff
   if {$ansonoff} {
     putserv "PRIVMSG $chan :Niemand heeft het gevonden... het is \0034$letters"
   } else { 
     putserv "PRIVMSG $chan :Niemand heeft het gevonden...\0034losers!"
   }
   unbind pub - $letters pub_gotit
   set winuse 0 
   set chan "" 
}

# List of things to say when a validuser wins

set winsay {
"Dat kan hier niemeer eh :P"
"Gij rulet!!"
"Contractje hebbe ?"
"Mag ik jou vriend zijn ?"
"stoer!"
"Tja, als je alle gemakkelijke woordjes krijgt :P"
"Mor ge kunt nog beter"
"Gij staat zeker in \0034brand!!?"
"Valsspeler :P"
}

# Somebody won, spew to chan and update score file. Scores are kept for both
# daily and cumulative.  Once anyone hits 500 all scores are reset.

proc pub_gotit {nick uhost handle channel args} {
   global wscorefile words letters answer  winuse chan winsay
   putserv "PRIVMSG $chan :Woohoo $nick!! Je hebt het juist...\0034$letters"
   kill_timers   
   unbind pub - $letters pub_gotit
   if {![validuser $handle]} {
     set winuse 0
     set chan ""
     return 0
   }
   if {![file exists $wscorefile]} {
	set fd [open $wscorefile w]
	close $fd
   }
   set fd [open $wscorefile r]
   set j 0
   while {![eof $fd]} {
     lappend score [gets $fd]
     set j [incr j] 
   }
   set i [expr $j - 1]
   set score [lreplace $score $i $i]
   close $fd
   for {set k 0} {$k < $i} {incr k 3} {
     set scnick [lindex $score $k]
     if {[string tolower $handle] == [string tolower $scnick]} {
        set newd [expr [lindex $score [expr $k + 1]] + 1]
        set newf [expr [lindex $score [expr $k + 2]] + 1]
        set score [lreplace $score [expr $k + 1] [expr $k + 2] $newd $newf]
        set dscore [lindex $score [expr $k + 1]]
        set rand_say [lindex $winsay [rand [llength $winsay]]]
        putserv "PRIVMSG  $chan :$nick je hebt $dscore keer gewonnen, $rand_say"
        if {$newf == 500} {
          putserv "PRIVMSG $chan :OH MY GAWD!! $scnick just scored 500 since time began!"
          set score [lreplace $score 1 2 0 0]
          for {set k 1} {$k < $i} {incr k 2} {
            set score [lreplace $score $k $k 0]
	    incr k
            set score [lreplace $score $k $k 0]
          }
          putserv "PRIVMSG $chan :\001ACTION sprinkles bot dust and time begins again!"
        }
        set winuse 0
        set chan ""
        set fd [open $wscorefile w]
        foreach line $score {
          puts $fd $line
        } 
        close $fd
        return 0
     }  
   }
   putserv "PRIVMSG $chan :$nick Dit is je eerste juiste antwoord.. ni.. te .. doooeeennnn :PPPP!"
   set score [lappend score $handle]
   set score [lappend score 1]
   set score [lappend score 1]
   set fd [open $wscorefile w]
     foreach line $score {
       puts $fd $line
     }
   close $fd
   set winuse 0
   set chan ""
}

proc the_score {nick uhost handle channel args} {
  global botnick wscorefile words answer winuse chan
  if {($winuse == 1) && ($chan == $channel)} {
    putserv "PRIVMSG $chan :Amaai! We hebben nogal afgespeeld hier :P !!"
  return 0
  }
  if {![file exists $wscorefile]} {
    putserv "PRIVMSG $chan : Nog niemand heeft gescoord!"
    return
  }
  set fd [open $wscorefile r]
  set j 0
   while {![eof $fd]} {
     lappend score [gets $fd]
	 incr j
   }
   set i [expr $j - 1]
   set score [lreplace $score $i $i]
   close $fd
   set looptest [llength $score]
   for {set k 0} {$k < $looptest} {incr k 3} {
      set wosnick [lindex $score $k] 
      set dscore [lindex $score [expr $k + 1]]
      set fscore [format "%d" [lindex $score [expr $k + 2]]]
      lappend tempsortscore [format "%.20d %d %s" $fscore $dscore $wosnick]
   }
   set tempsortscore [lsort -decreasing $tempsortscore]
   for {set i 0} {$i < 10} {incr i} {
      set tiscore [lindex $tempsortscore $i]
	  set newtempsortscore [string trimleft [lindex $tiscore 0] 0]
      append sortscore [format "\0034 %s\.\003 %s\(%d\/%d\)  " [expr {$i + 1}] [lindex $tiscore 2] $newtempsortscore [lindex $tiscore 1]]
   }

   set slength [llength $sortscore]
   putserv "PRIVMSG $channel :De top 10 woordspel scorers zijn (Total/Daily):"
   putserv "PRIVMSG $channel :$sortscore"
}

# Give clue word

proc clue_1 {} {
   global chan answer
   set clue $answer
   putserv "PRIVMSG $chan :Hint --->\00312  $clue"
}


# Give first letter of the word

proc clue_2 {} {
   global chan letone
   set clue $letone
   putserv "PRIVMSG $chan :Eerste letter --->\00312  $clue"
}

# Give the second letter

proc clue_3 {} {
   global chan lettwo
   set clue $lettwo 
   putserv "PRIVMSG $chan :Eerste twee letters --->\00312  $clue"
}

# Kill all remaining timers when someone wins.

proc kill_timers {} {
   global chan
   foreach j [utimers] {
     if {[lindex $j 1] == "noone_gotit"} {
        killutimer [lindex $j 2]
     }
     if {[lindex $j 1] == "clue_1"} {
        killutimer [lindex $j 2]
     }
     if {[lindex $j 1] == "clue_2"} {
        killutimer [lindex $j 2]
     }
     if {[lindex $j 1] == "clue_3"} {
        killutimer [lindex $j 2]
     }
   }
   return 0
}

# Its 3:00 am, clear the daily scores.

proc wo_refresh_time {m h d mo y} {
  global wscorefile 
  set fd [open $wscorefile r]
  set j 0
  while {![eof $fd]} {
     lappend score [gets $fd]
     set j [incr j]
    }
  set i [expr $j - 1]
  set score [lreplace $score $i $i]
  close $fd
  set score [lreplace $score 1 1 0]
  for {set k 1} {$k < $i} {incr k 3} {
     set score [lreplace $score $k $k 0]
  }
  set fd [open $wscorefile w]
  foreach line $score {
      puts $fd $line
  } 
  close $fd
  return 1
}

putlog "Wordgame by murf loaded (translated by CosmicD)"
The bot doesn't count scores for other users then myself too :( it seems like it only counts a score for users that have their handle set to the bot ?

also ..while you're at it, another problem with the script is that you always have to tye the !woord command for the game to start.. is it possible that it has an on and off switch + variable ?)
User avatar
user
&nbsp;
Posts: 1452
Joined: Tue Mar 18, 2003 9:58 pm
Location: Norway

Post by user »

CosmicD wrote:The bot doesn't count scores for other users then myself too :( it seems like it only counts a score for users that have their handle set to the bot ?

also ..while you're at it, another problem with the script is that you always have to tye the !woord command for the game to start.. is it possible that it has an on and off switch + variable ?)
If you want a different script, it's probably better to start from scratch. (did you check that file for empty lines? (two or more linebreaks at the end count too))
Have you ever read "The Manual"?
C
CosmicD
Op
Posts: 102
Joined: Sat Dec 11, 2004 3:46 pm

Post by CosmicD »

ah sorry..

yep I checked that , there was none really but I did backspace and then saved the file....

sometimes the scores don't even give an error at all
User avatar
user
&nbsp;
Posts: 1452
Joined: Tue Mar 18, 2003 9:58 pm
Location: Norway

Post by user »

Did the script work before you translated it? If it did: compare your version to the original. If it didn't: why did you translate it?
Have you ever read "The Manual"?
C
CosmicD
Op
Posts: 102
Joined: Sat Dec 11, 2004 3:46 pm

Post by CosmicD »

i translate most of those scripts just because we are mainly a dutch speaking network,

kreynet is for belgian/dutch people.. and I even translate the binds...

about the users.. is it maybe easier to tie a user account (with adduser because it seems to need a host too) to the bot for this game, like, when a new user that the bot doesn't know wants to play i'ts automaticly added (and deleted when not played for 60 days orso)
C
CosmicD
Op
Posts: 102
Joined: Sat Dec 11, 2004 3:46 pm

Post by CosmicD »

CosmicD wrote:i translate most of those scripts just because we are mainly a dutch speaking network,

kreynet is for belgian/dutch people.. and I even translate the binds...

about the users.. is it maybe easier to tie a user account (with adduser because it seems to need a host too) to the bot for this game, like, when a new user that the bot doesn't know wants to play i'ts automaticly added (and deleted when not played for 60 days orso)
UPDATE:

I got the scores functioning properly :) I snatched it from an alternate version that floats around on the net ,

but still i'd like it to work for all users and not only users that are added to the bot, can someon help with that ? (or isn't it that simple)
C
CosmicD
Op
Posts: 102
Joined: Sat Dec 11, 2004 3:46 pm

Post by CosmicD »

hmm, the probs with this script never seem to stop,

I have now successfully circumvented almost all the troubles with the score and the users, and now I notice that it reads sequentially trough the word list,

meaning that you can actually know what to expect next..

How can I make the script read trough the wordfile in a random fasion ?

i think the code is

Code: Select all

proc pub_word {nick uhost handle channel args} {
   global wscorefile wlistfile words word_list_count answer winuse \
chan letone lettwo letters specuser glonoff
   if {$glonoff == 0} {
        putserv "PRIVMSG $channel :Sorry, het woordspel staat af, probeer later nog eens"
        return
   }
   set chn [string tolower $channel]
   if {$word_list_count == 0} {
       if {![validuser $specuser]} {
          set channels [channels]
          adduser $specuser specuser!special@word.special.org
          foreach chann $channels {
             setuser $specuser XTRA wcount.$chann 0
          }
       }
       set word_list_count [getuser $specuser XTRA wcount.$chn]
       if {$word_list_count == ""} {
          setuser $specuser XTRA wcount.$chn 0
          set $word_list_count 0
       }
       set words ""
       set fd [open $wlistfile r]
       while {![eof $fd]} {
          lappend words [gets $fd]
       }
       close $fd
   }
   if {($winuse == 1) && ([string compare $chn $chan] != 0)} {
    putserv "PRIVMSG $chn :Er is al een spelletje aan de gang in $chan, ga daar maar naartoe"
   return 0
   } elseif {($winuse == 1) && ([string compare $chn $chan] == 0)} {
        putserv "PRIVMSG $chan :HEY! Maar één spelletje tegelijk he!"
     return 0
   } elseif {$winuse == 0} {
      set chan $chn
      set winuse 1
      set word_pair [lindex $words $word_list_count]
      set answer [lindex [split $word_pair :] 1]
      set word_split [split $word_pair :]
      set letters [lreplace $word_split 1 1]
      set let_split [split $letters {}]
      set letone [lindex $let_split 0]
      set slettwo $letone
      set slettwo [join [lappend slettwo [lindex $let_split 1]]]
      regsub { } $slettwo {} lettwo
      set i [llength $let_split]
      set smixed ""
      set tmixed ""
      for {set j 0} {$j < $i} {incr j} {
        set k [rand [llength $let_split]]
        set smixed $tmixed
        set smixed [lappend smixed [lindex $let_split $k]]
        set let_split [lreplace $let_split $k $k]
        regsub { } $smixed {} tmixed
      }
      set mixed $tmixed
      bind pub - $letters pub_gotit
      putserv "PRIVMSG $chan :Ontrafel ---> \0036 $mixed "
      incr word_list_count
      if {$word_list_count >= [expr [llength $words] -1]} {
         set word_list_count "0"
      }
      setuser $specuser XTRA wcount.$chn $word_list_count
      utimer 60 noone_gotit
      utimer 15 clue_1
      utimer 30 clue_2
      utimer 45 clue_3
   }
}
Locked