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.

trivia.tcl

Support & discussion of released scripts, and announcements of new releases.
Post Reply
e
eVoLuTioN
Voice
Posts: 5
Joined: Sat Sep 22, 2012 2:01 am

trivia.tcl

Post by eVoLuTioN »

hello
I set trvian.tcl that the bot ask first and dan in response. questions
example.
now reads the bot - Berlin*Capital of Germany?
but i want - Capital of Germany* Berlin
it is possible
H
Hero
Halfop
Posts: 49
Joined: Tue Jun 26, 2012 6:27 pm
Location: root@localhost
Contact:

Post by Hero »

This Option Is ALready Availble On Trivia Tcl Kindly Read The TCL Carefully
The Road To Hell Is Full Of Good Intentions
e
eVoLuTioN
Voice
Posts: 5
Joined: Sat Sep 22, 2012 2:01 am

Post by eVoLuTioN »

. code
Last edited by eVoLuTioN on Tue Oct 09, 2012 4:53 am, edited 1 time in total.
H
Hero
Halfop
Posts: 49
Joined: Tue Jun 26, 2012 6:27 pm
Location: root@localhost
Contact:

Post by Hero »

Try This Code :) I Think Its Working

Code: Select all

###################################################################### 
#PLEASE customise the settings before rehashing your bot!            # 
###################################################################### 

#  The full path to the file containing the questions and answers. 
#  The account the bot runs on must have read access to this file. 
set tgqdb "/home/nexus/eggdrop/scripts/trivia.questions" 

#  The full path to the file which tracks the scores. The account 
#  the bot runs on must have read & write access to this file. If 
#  the file does not exist, it will be created when needed. 
set tgscf "/home/nexus/eggdrop/scripts/trivia.scores" 

#  The full path to the file which records error reports. The 
#  account the bot runs on must have read & write access to this 
#  file. If the file does not exist, it will be created when needed. 
set tgerrfil "/home/nexus/eggdrop/scripts/trivia.errors" 

#  The character that seperates the question and the answer in the
#  question/answer file.
set tgqdbsep "*"

#  What you set here defines how the bot expects the question/answer
#  pairs to be arranged.
#  If set to 1, bot expects lines in the format:
#    question<seperator>answer
#  If set to 0, bot expects lines in the format:
#    answer<seperator>question
set tgqdbquestionfirst 1

#  The full path to the file which the bot will use to generate 
#  an HTML info page. The account the bot runs on must have read 
#  & write access to this file. If the file does not exist, it will 
#  be created when needed. 
set tghtmlfile "/home/nexus/public_html/kviz.html" 

#  How often (in seconds) does the html file get updated. Set to 0 
#  to disable HTML page. 
set tghtmlrefresh 0 

#  The name of the channel where the game will be played. The game 
#  can only be played on one channel. 
set tgchan "#balkankviz" 

#  How many points to give a person for a correctly answered 
#  question. 
set tgpointsperanswer 10 

#  The maximum number of hints to give before the question 'expires' 
#  and the bot goes on to another one. This EXCLUDES the first hint 
#  given as the question is asked (i.e. the hint which shows no letters, 
#  only placeholders). 
set tgmaxhint 3 

#  The minimum number of correct answers in a row by one person which 
#  puts them on a winning streak. Setting this to 0 will disable the 
#  winning streak feature. 
set tgstreakmin 3 

#  The number of missed (i.e. unanswered, not skipped) questions to allow
#  before automatically stopping the game. Setting this to 0 will cause the 
#  game to run until somebody uses the stop command, or the bot dies, gets 
#  killed, pings out, or whatever. 
set tgmaxmissed 10 

#  The character to use as a placeholder in hints. 
set tghintchar "*" 

#  The time in seconds between hints. 
set tgtimehint 10 

#  The time in seconds between a correct answer, 'expired' or skipped question 
#  and the next question being asked. 
set tgtimenext 5 

#  Phrases to use at random when someone answers a question correctly. This must 
#  be a TCL list. If you don't know what that means, stick to the defaults. 
set tgcongrats [list "Cestitam" "Bravo" "To je tacan odgovor" "Tacanooo" "Bravooooo" "Kralju tacno"] 

#  Phrases to use when the question has 'expired'. Must also be a TCL list. 
set tgnobodygotit [list "Niko nije odgovorio." "Hello? Jesam li ja ovdje sam?" "Slabo!" "Hallo Nespavajte"] 

#  Phrases to use when the question expired and there's another one coming up. 
#  Yep, you guessed it... another TCL list. 
set tgtrythenextone [list "Da vidimo znatel sljedece pitanje..." "Idemo dalje, bice bolje..." "Idemo na sljedece pitanje..."] 

#  Will the bot show the correct answer if nobody gets it (1) or not (0)?
set tgshowanswer 1 

#  When someone answers a question, will the bot show just that person's score (0) 
#  or will it show all players' scores (1) (default). This is useful in channels with 
#  a large number (>20) players. 
set tgshowallscores 1 

#  Use bold codes in messages (1) or not (0)? 
set tgusebold 1 

#  Send private messages using /msg (1) or not (0)? 
#  If set to 0, private messages will be sent using /notice 
set tgpriv2msg 0 

#  Word to use as /msg command to give help. 
#  e.g. set tgcmdhelp "helpme" will make the bot give help when someone 
#  does "/msg <botnick> helpme" 
set tgcmdhelp "?" 

#  Channel command used to start the game. 
set tgcmdstart "!start" 

#  Flags required to be able to use the start command. 
set tgflagsstart -|- 

#  Channel command used to stop the game. 
set tgcmdstop "!stop" 

#  Flags required to be able to use the stop command. 
set tgflagsstop -|- 

#  Channel command used to give a hint. 
set tgcmdhint "!hint" 

#  Flags required to be able to use the hint command. 
set tgflagshint o|o 

#  Disable the !hint command x seconds after someone uses it. This 
#  prevents accidental double hints if two people use the command in 
#  quick succession. 
set tgtempnohint 10 

#  Channel command used to skip the question. 
set tgcmdskip "!skip" 

#  Flags required to be able to use the skip command. 
set tgflagsskip o|o 

#  /msg command used to reset scores. 
set tgcmdreset "reset" 

#  Flags required to be able to use the reset command. 
set tgflagsreset n|n 

#  /msg command for looking up somebody's score. 
set tgcmdlookup "score" 

#  /msg command for looking up your target. 
#  (i.e. the person ranked one higher than you). 
set tgcmdtarget "target" 

#  /msg command for reporting errors in questions and/or answers. 
set tgcmderror "error" 

#  /msg command to show channel's rules. 
set tgcmdrules "pravila" 

#  Channel's rules. 
set tgrules "Nema Reklama,Psovanja Vrijedjanja itd.  Nema uznemiravanja ostali usera. Ako se nepridrzavate ovih pravila bicete odstranjeni iz kanala. Uzivaj u kvizu :-)" 

#  Number of minutes between reminders of how to report errors. 
set tgerrremindtime 30 

#  COLOURS 
#  The colour codes used are the same as those used by mIRC: 
#  00:white        01:black        02:dark blue    03:dark green 
#  04:red          05:brown        06:purple       07:orange 
#  08:yellow       09:light green  10:turquoise    11:cyan 
#  12:light blue   13:magenta      14:dark grey    15:light grey 
# 
#  Always specify colour codes as two digits, i.e. use "01" for 
#  black, not "1". 
#  You can specify a background colour using "00,04" (white text 
#  on red background). 
#  To disable a colour, use "". 
#  Note that disabling some colours but not others may yield 
#  unexpected results. 

set tgcolourstart "03"      ;#Game has started. 
set tgcolourstop "04"      ;#Game has stopped. 
set tgcolourskip "10"      ;#Question has been skipped. 
set tgcolourerr "04"      ;#How to report errors. 
set tgcolourmiss "10"      ;#Nobody answered the question. 
set tgcolourqhead "04"      ;#Question heading. 
set tgcolourqbody "12"      ;#Question itself. 
set tgcolourhint "03"      ;#Hint. 
set tgcolourstrk "12"      ;#Person is on a winning streak. 
set tgcolourscr1 "04"      ;#Score of person in first place. 
set tgcolourscr2 "12"      ;#Score of person in second place. 
set tgcolourscr3 "03"      ;#Score of person in third place. 
set tgcolourrset "04"      ;#Scores have been reset. 
set tgcolourstend "12"      ;#Winning streak ended. 
set tgcolourmisc1 "06"      ;#Miscellaneous colour #1. 
set tgcolourmisc2 "04"      ;#Miscellaneous colour #2. 


# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 
#                                                                   # 
#    Any editing done beyond this point is done at your own risk!   # 
#                                                                   # 
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # 
#Misc checks & var initialisations 
set tgver "1.2.0" 
set tgrel "beta" 
if {[utimerexists tghtml]!=""} {killutimer $tghtmlrefreshtimer} 
if {$tghtmlrefresh>0} { 
 global tghtmlrefreshtimer 
 set tghtmlrefreshtimer [utimer $tghtmlrefresh tghtml] 
} 
if {![file exists $tgqdb]} { 
 putlog "\002[file tail [info script]]\002 failed to load: $tgqdb does not exist." 
 return 
} 
if {![info exists alltools_loaded]||$allt_version<204} { 
 putlog "\002[file tail [info script]]\002 failed to load: please load alltools.tcl v1.6 or higher before attempting to use this script." 
 return 
} 
if {[llength [split $tgchan]]!=1} { 
 putlog "\002[file tail [info script]]\002 failed to load: too many channels specified." 
 return 
} 
if {![info exists tgplaying]} {set tgplaying 0} 
if {![info exists tghintnum]} {set tghintnum 0} 
if {![info exists tgmissed]} {set tgmissed 0} 

#Binds 
bind pub $tgflagsstart $tgcmdstart tgstart 
bind pub $tgflagsstop $tgcmdstop tgstop 
bind pub $tgflagsskip $tgcmdskip tgskip 
bind join -|- "$tgchan *" tgjoinmsg 
bind msg - $tgcmdhelp tggivehelp 
bind msg - $tgcmdlookup tgscorelookup 
bind msg - $tgcmdtarget tgtargetlookup 
bind msg - $tgcmderror tgerror 
bind msg - $tgcmdrules tgrulesmsg 
bind msg $tgflagsreset "$tgcmdreset" tgresetscores 
bind kick - "$tgchan $botnick" tgbotgotkicked 
bind evnt - disconnect-server tgbotgotdisconnected 
proc tgbindhintcmd {} { 
 global tgflagshint tgcmdhint 
 bind pub $tgflagshint $tgcmdhint tgforcehint 
} 
proc tgunbindhintcmd {} { 
 global tgflagshint tgcmdhint 
 unbind pub $tgflagshint $tgcmdhint tgforcehint 
} 
tgbindhintcmd 

#starts the game if it isn't running. 
proc tgstart {nick host hand chan text} { 
 global tgplaying tgstreak tgchan tgerrremindtime tgerrremindtimer tgmissed 
 if {[strlwr $tgchan]==[strlwr $chan]} { 
  if {$tgplaying==0} { 
   tggamemsg "[tgcolstart]Kviz je startovan od $nick!" 
   tgnext 
   set tgplaying 1 
   set tgstreak 0 
   set tgmissed 0 
   set tgerrremindtimer [timer $tgerrremindtime tgerrremind] 
  } 
 } 
} 

#stops the game if it's running. 
proc tgstop {nick host hand chan text} { 
 global tghinttimer tgnexttimer tgplaying tgchan tgcurrentanswer tgstreak tgstreakmin 
 global tgerrremindtimer tgrebindhinttimer 
 if {[strlwr $tgchan]==[strlwr $chan]} { 
  if {$tgplaying==1} { 
   tggamemsg "[tgcolstop]Kviz je zaustavljen od $nick!" 
   if {$tgstreakmin>0&&[lindex [split $tgstreak ,] 1]>=$tgstreakmin} { tgstreakend } 
   set tgstreak 0 
   set tgplaying 0 
   catch {unbind pubm -|- "$tgchan $tgcurrentanswer" tgcorrectanswer} 
   if {[utimerexists tghint]!=""} {killutimer $tghinttimer} 
   if {[utimerexists tgnext]!=""} {killutimer $tgnexttimer} 
   if {[timerexists tgerrremind]!=""} {killtimer $tgerrremindtimer} 
   if {[utimerexists tgrebindhinttimer]!=""} {killtimer $tgrebindhinttimer} 
  } 
 } 
} 

#gives a hint if there is currently a question to answer. 
proc tgforcehint {nick host hand chan text} { 
 global tghinttimer tgnexttimer tgplaying tgchan tgcurrentanswer tgstreak tgstreakmin 
 global tgtempnohint tgmaxhint tghintnum tgrebindhinttimer tgtempnohint 
 if {[strlwr $tgchan]==[strlwr $chan]} { 
  if {$tgplaying==1&&[utimerexists tghint]!=""} { 
   killutimer $tghinttimer 
   tghint 
   tgunbindhintcmd 
   if {$tghintnum<$tgmaxhint} { 
    set tgrebindhinttimer [utimer $tgtempnohint tgbindhintcmd] 
   } 
  } 
 } 
} 

#skips the current question if one has been asked. 
proc tgskip {nick host hand chan text} { 
 global tghinttimer tgnexttimer tgplaying tgchan tgcurrentanswer tgstreak
 global tgstreakmin tgtimenext tgrebindhinttimer 
 if {[strlwr $tgchan]==[strlwr $chan]} { 
  if {$tgplaying==1&&[utimerexists tghint]!=""} { 
   tggamemsg "[tgcolskip]Skipping to next question by [tgcolmisc2]$nick's[tgcolskip] request..." 
   if {$tgstreakmin>0&&[lindex [split $tgstreak ,] 1]>=$tgstreakmin} { tgstreakend } 
   set tgstreak 0 
   unbind pubm -|- "$tgchan $tgcurrentanswer" tgcorrectanswer 
   killutimer $tghinttimer 
   if {[utimerexists tgrebindhinttimer]!=""} {killtimer $tgrebindhinttimer} 
   set tgnexttimer [utimer $tgtimenext tgnext] 
  } 
 } 
} 

#reminds channel how to report errors in questions/answers 
proc tgerrremind {} { 
 global tgerrremindtimer tgerrremindtime botnick tgcmderror 
 tggamemsg "[tgcolerr]Zapamti: Pogresan Odgovor/Pitanje, kucaj /msg $botnick $tgcmderror <number> \[description\]" 
 set tgerrremindtimer [timer $tgerrremindtime tgerrremind] 
} 

#bot got kicked. stop the game. 
proc tgbotgotkicked {nick host hand chan targ text} { 
 tgquietstop 
} 

#bot got disconnected. stop the game. 
proc tgbotgotdisconnected {disconnect-server} { 
 tgquietstop 
} 

#stops the game without telling the channel. 
proc tgquietstop {} { 
 global tgplaying tgstreak tgchan tgcurrentanswer tghinttimer tgnexttimer tgerrremindtimer 
 global tgrebindhinttimer 
 if {$tgplaying==1} { 
  set tgstreak 0 
  set tgplaying 0 
  catch {unbind pubm -|- "$tgchan $tgcurrentanswer" tgcorrectanswer} 
  if {[utimerexists tghint]!=""} {killutimer $tghinttimer} 
  if {[utimerexists tgnext]!=""} {killutimer $tgnexttimer} 
  if {[timerexists tgerrremind]!=""} {killtimer $tgerrremindtimer} 
  if {[utimerexists tgrebindhinttimer]!=""} {killtimer $tgrebindhinttimer} 
 } 
} 

#reads the question database. 
proc tgreadqdb {} { 
 global tgqdb tgquestionstotal tgquestionslist 
 set tgquestionstotal 0 
 set tgquestionslist ""    
 set qfile [open $tgqdb r] 
 while {![eof $qfile]} { 
  lappend tgquestionslist [gets $qfile] 
  incr tgquestionstotal 
 } 
 close $qfile 
} 

#selects the next question. 
proc tgnext {} { 
 global tgqdb tgcurrentquestion tgcurrentanswer tgquestionnumber tgquestionstotal 
 global tghintnum tgchan tgquestionslist 
 tgreadqdb 
 set tgquestionnumber [rand [llength $tgquestionslist]]          
 set tgquestionselected [lindex $tgquestionslist $tgquestionnumber] 
 set tgcurrentquestion [lindex [split $tgquestionselected |] 1] 
 set tgcurrentanswer [strlwr [lindex [split $tgquestionselected |] 0]] 
 unset tghintnum 
 tghint 
 bind pubm -|- "$tgchan $tgcurrentanswer" tgcorrectanswer 
 return 
} 

#shows timed hints. 
proc tghint {} { 
 global tgmaxhint tghintnum tgcurrentanswer tghinttimer tgchan 
 global tgtimehint tghintchar tgquestionnumber tgquestionstotal 
 global tgcurrentquestion tghintcharsused tgnexttimer tgtimenext tgstreak tgstreakmin 
 global tgnobodygotit tgtrythenextone tgmissed tgmaxmissed tgcmdstart tgshowanswer 
 global tgtimestart 
 if {[catch {incr tghintnum}]!=0} {set tghintnum 0} 
 if {$tghintnum >= [expr $tgmaxhint+1]} { 
  incr tgmissed 
  set _msg "" 
  append _msg "[tgcolmiss][lindex $tgnobodygotit [rand [llength $tgnobodygotit]]]" 
  if {$tgshowanswer==1} { 
   append _msg " Tacan Odgovor je bio [tgcolmisc2][strupr $tgcurrentanswer][tgcolmiss]." 
  } 
  if {$tgmaxmissed>0&&$tgmissed>=$tgmaxmissed} { 
   append _msg " Ovo je  $tgmissed Pitanje bez Tacnog odgovora! Kviz je automatski stopiran. Da bi ponovo pokrenuo Kviz, kucaj $tgcmdstart" 
   tgquietstop 
  } else { 
   append _msg " [lindex $tgtrythenextone [rand [llength $tgtrythenextone]]]" 
  } 
  tggamemsg "[tgcolmiss]$_msg" 
  if {$tgstreakmin>0&&[lindex [split $tgstreak ,] 1]>=$tgstreakmin} { tgstreakend } 
  set tgstreak 0 
  catch {unbind pubm -|- "$tgchan $tgcurrentanswer" tgcorrectanswer} 
  if {$tgmaxmissed==0||$tgmissed<$tgmaxmissed} { 
   set tgnexttimer [utimer $tgtimenext tgnext] 
  } 
  return 
 } elseif {$tghintnum == 0} { 
  set i 0 
  set _hint {} 
  set tghintcharsused {} 
  regsub -all -- "\[A-Za-z0-9\]" $tgcurrentanswer $tghintchar _hint 
  set tgtimestart [clock clicks -milliseconds] 
 } elseif {$tghintnum == 1} { 
  set i 0 
  set _hint {} 
  while {$i<[llength [split $tgcurrentanswer]]} { 
   set _word [lindex [split $tgcurrentanswer] $i] 
   set j 0 
   set _newword {} 
   while {$j<[strlen $_word]} { 
    if {$j==0} { 
     append _newword [stridx $_word $j] 
     lappend tghintcharsused $i,$j 
    } else { 
     if {[string is alnum [stridx $_word $j]]} { 
      append _newword $tghintchar 
     } else { 
      append _newword [stridx $_word $j] 
      lappend tghintcharsused $i,$j 
     } 
    } 
    incr j 
   } 
   lappend _hint $_newword 
   incr i 
  } 
  } else { 
   set i 0 
   set _hint {}    
   while {$i<[llength [split $tgcurrentanswer]]} { 
    set _word [lindex [split $tgcurrentanswer] $i] 
    set j 0 
    set _newword {} 
    set _selected [rand [strlen $_word]] 
    regsub -all -- "\[^A-Za-z0-9\]" $_word "" _wordalnum 
    if {[strlen $_wordalnum]>=$tghintnum} { 
     while {[lsearch $tghintcharsused $i,$_selected]!=-1||[string is alnum [stridx $_word $_selected]]==0} { 
      set _selected [rand [strlen $_word]] 
     } 
    } 
    lappend tghintcharsused $i,$_selected 
    while {$j<[strlen $_word]} { 
     if {[lsearch $tghintcharsused $i,$j]!=-1||[string is alnum [stridx $_word $j]]==0} { 
      append _newword [stridx $_word $j] 
     } else { 
      if {[string is alnum [stridx $_word $j]]} { 
       append _newword $tghintchar 
      } 
    } 
    incr j 
   } 
   lappend _hint $_newword 
   incr i 
  } 
 } 
 tggamemsg "[tgcolqhead]===== Pitanje [expr $tgquestionnumber+1]/$tgquestionstotal [expr $tghintnum?"(Pomoc $tghintnum/$tgmaxhint)":""] =====" 
 tggamemsg "[tgcolqbody][strupr $tgcurrentquestion]" 
 tggamemsg "[tgcolhint]Pomoc: [strupr $_hint]" 
 set tghinttimer [utimer $tgtimehint tghint] 
} 

#triggered when someone says the correct answer. 
proc tgcorrectanswer {nick host hand chan text} { 
 global tgcurrentanswer tghinttimer tgtimenext tgchan tgnexttimer tgstreak tgstreakmin 
 global tgscoresbyname tgranksbyname tgranksbynum tgcongrats tgscorestotal tgmissed 
 global tgtimestart tgshowallscores tgrealnames tgscoresbyrank 
 tggetscores 
 if {![info exists tgranksbyname([strlwr $nick])]} { 
  set _oldrank 0 
 } else { 
  set _oldrank $tgranksbyname([strlwr $nick]) 
 } 
 tgincrscore $nick 
 tggetscores 
 set _newrank $tgranksbyname([strlwr $nick]) 
 set _timetoanswer [expr [expr [clock clicks -milliseconds]-$tgtimestart]/1000.00] 
 set _msg "[tgcolmisc1][lindex $tgcongrats [rand [llength $tgcongrats]]] [tgcolmisc2]$nick[tgcolmisc1]! Tacan odgovor je bio [tgcolmisc2][strupr $tgcurrentanswer][tgcolmisc1]. Odgovorio si za [tgcolmisc2]$_timetoanswer[tgcolmisc1] sekundi." 
 if {$_newrank<$_oldrank} { 
  if {$_newrank==1} { 
   append _msg " Sad si PRVO mjesto!" 
  } else { 
   if {$tgshowallscores==0} { 
    append _msg " You've moved up in rank!" 
   } else { 
    append _msg " Zauzeo si mjesto [tgcolmisc2][tgordnum $tgranksbyname([strlwr $nick])][tgcolmisc1] od [tgcolmisc2]$tgscorestotal[tgcolmisc1], iza [tgcolmisc2]$tgrealnames($tgranksbynum([expr $_newrank-1]))[tgcolmisc1] sa [tgcolmisc2]$tgscoresbyrank([expr $_newrank-1])[tgcolmisc1]." 
   } 
  } 
 } 
 tggamemsg "$_msg" 
 if {$tgstreak!=0} { 
  if {[lindex [split $tgstreak ,] 0]==[strlwr $nick]} { 
   set tgstreak [strlwr $nick],[expr [lindex [split $tgstreak ,] 1]+1] 
   if {$tgstreakmin>0&&[lindex [split $tgstreak ,] 1]>=$tgstreakmin} { 
    tggamemsg "[tgcolstrk][tgcolmisc2]$nick[tgcolstrk] is on a winning streak! [tgcolmisc2][lindex [split $tgstreak ,] 1] [tgcolstrk]in a row so far!" 
   } 
  } else { 
   if {$tgstreakmin>0&&[lindex [split $tgstreak ,] 1]>=$tgstreakmin} { tgstreakend } 
   set tgstreak [strlwr $nick],1 
  } 
 } else { 
  set tgstreak [strlwr $nick],1 
 } 
 set tgmissed 0 
 tgshowscores $nick 
 unbind pubm -|- "$tgchan $tgcurrentanswer" tgcorrectanswer 
 killutimer $tghinttimer 
 set tgnexttimer [utimer $tgtimenext tgnext] 
} 

#read current scores from file, sort and store in variable. 
proc tggetscores {} { 
 global tgscf tgscorestotal tgscores tgscoresbyname tgranksbyname tgranksbynum 
 global tgrealnames tgscoresbyrank 
 if {[file exists $tgscf]&&[file size $tgscf]>2} { 
  set _sfile [open $tgscf r] 
  set tgscores [lsort -dict -decreasing [split [gets $_sfile]]] 
  close $_sfile 
  set tgscorestotal [llength $tgscores] 
 } else { 
  set tgscores "" 
  set tgscorestotal 0 
 } 
 if {[info exists tgscoresbyname]} {unset tgscoresbyname} 
 if {[info exists tgranksbyname]} {unset tgranksbyname} 
 if {[info exists tgrealnames]} {unset tgrealnames} 
 if {[info exists tgranksbynum]} {unset tgranksbynum} 
 set i 0 
 while {$i<[llength $tgscores]} { 
  set _item [lindex $tgscores $i] 
  set _nick [lindex [split $_item ,] 2] 
  set _lwrnick [lindex [split $_item ,] 3] 
  set _score [lindex [split $_item ,] 0] 
  set tgscoresbyname($_lwrnick) $_score 
  set tgrealnames($_lwrnick) $_nick 
  set tgranksbyname($_lwrnick) [expr $i+1] 
  set tgranksbynum([expr $i+1]) $_lwrnick 
  set tgscoresbyrank([expr $i+1]) $_score 
  incr i 
 } 
 return 
} 

#increment someone's score. 
proc tgincrscore {who} { 
 global tgscores tgscf tgpointsperanswer tgscorestotal tgscoresbyname 
 tggetscores 
 if {$tgscorestotal>0} { 
  set i 0 
  if {![info exists tgscoresbyname([strlwr $who])]} { 
   append _newscores "1,[expr 1000000000000.0/[unixtime]],$who,[strlwr $who] " 
  } 
  while {$i<[llength $tgscores]} { 
   set _item [lindex $tgscores $i] 
   set _nick [lindex [split $_item ,] 2] 
   set _time [lindex [split $_item ,] 1] 
   set _score [lindex [split $_item ,] 0] 
   if {[strlwr $who]==[strlwr $_nick]} { 
    append _newscores "[expr $_score+$tgpointsperanswer],[expr 1000000000000.0/[unixtime]],$who,[strlwr $who][expr [expr [llength $tgscores]-$i]==1?"":"\ "]" 
   } else { 
    append _newscores "$_score,$_time,$_nick,[strlwr $_nick][expr [expr [llength $tgscores]-$i]==1?"":"\ "]" 
   } 
   incr i 
  } 
 } else { 
  append _newscores "1,[expr 1000000000000.0/[unixtime]],$who,[strlwr $who]" 
 } 
 set _sfile [open $tgscf w] 
 puts $_sfile "$_newscores" 
 close $_sfile 
 return 
} 

#shows the current scores on channel. 
proc tgshowscores {nick} { 
 global tgscores tgchan tgscorestotal tgshowallscores tgranksbyname tgranksbynum 
 global tgscoresbyname tgrealnames tgscoresbyrank 
 tggetscores 
 set i 0 
 if {$tgshowallscores} { 
  while {$i<[llength $tgscores]} { 
   set _item [lindex $tgscores $i] 
   set _nick [lindex [split $_item ,] 2] 
   set _score [lindex [split $_item ,] 0] 
   if {$i==0} { 
    append _scores "[tgcolscr1]$_nick $_score" 
   } elseif {$i==1} { 
    append _scores ", [tgcolscr2]$_nick $_score" 
   } elseif {$i==2} { 
    append _scores ", [tgcolscr3]$_nick $_score" 
   } elseif {[onchan $_nick $tgchan]} { 
    append _scores ", [tgcolmisc1]$_nick $_score" 
   } 
   incr i 
  } 
  tggamemsg "[tgcolmisc1]Bodovi: $_scores" 
 } else { 
  if {$tgranksbyname([strlwr $nick])==1} { 
   set _tgt "." 
  } else { 
   set _tgt ", behind [tgcolmisc2]$tgrealnames($tgranksbynum([expr $tgranksbyname([strlwr $nick])-1]))[tgcolmisc1] with [tgcolmisc2]$tgscoresbyrank([expr $tgranksbyname([strlwr $nick])-1])[tgcolmisc1]." 
  } 
  tggamemsg "[tgcolmisc2]$nick [tgcolmisc1]now has [tgcolmisc2]$tgscoresbyname([strlwr $nick]) [tgcolmisc1][expr $tgscoresbyname([strlwr $nick])==1?"point":"points"] and is ranked [tgcolmisc2][tgordnum $tgranksbyname([strlwr $nick])] [tgcolmisc1]of [tgcolmisc2]$tgscorestotal[tgcolmisc1]$_tgt" 
 } 
} 

#reset current scores. 
proc tgresetscores {nick host hand text} { 
 global tgscf tgscorestotal tgscores tgplaying 
 if {$tgplaying==0} { 
  if {[file exists $tgscf]&&[file size $tgscf]>2} { 
   set _sfile [open $tgscf w] 
   puts $_sfile "" 
   close $_sfile 
   set tgscores "" 
   set tgscorestotal 0 
  } 
  tggamemsg "[tgcolrset]===== Score table reset by $nick! =====" 
 } else { 
  putnotc $nick "You cannot reset the scores while the game is running!" 
 } 
} 

#triggered when a winning streak ends. 
proc tgstreakend {} { 
  global tgstreak tgrealnames 
  tggamemsg "[tgcolstend]So much for [tgcolmisc2]$tgrealnames([lindex [split $tgstreak ,] 0])'s[tgcolstend] winning streak." 
  return 
} 

#triggered when someone joins trivia chan. 
proc tgjoinmsg {nick host hand chan} { 
 global botnick tgplaying tgcmdhelp tgcmdstart tgflagsstart tgcmdstop tgflagsstop tgchan 
 if {$nick != $botnick} { 
  set _msg "" 
  append _msg "Dobro Dosli na  $botnick'ov Kviz kanal. Kviz je trenutno" 
  if {$tgplaying==1} { 
   append _msg " \002ukljucen\002." 
  } else { 
   append _msg " \002iskljucen\002." 
  } 
  if {[matchattr $hand $tgflagsstart $tgchan]&&$tgplaying==0} { 
   append _msg " Da Startas Kviz kucaj, \002$tgcmdstart\002 on $tgchan." 
  } 
  append _msg " Kucaj \002/MSG $botnick [strupr $tgcmdhelp]\002 Ako ti treba pomoc. Uzivaj! :-)" 
  [tgpriv] $nick "$_msg" 
 } 
} 

#triggered when someone /msgs the bot with the score lookup command. 
proc tgscorelookup {nick host hand text} { 
 global tgscoresbyname tgranksbyname tgscorestotal tgrealnames 
 if {$text==""} { set text $nick } else { set text [lindex [split $text] 0] } 
 tggetscores 
 if {![info exists tgscoresbyname([strlwr $text])]} { 
  if {[strlwr $text]==[strlwr $nick]} { 
   set _who "[tgcolmisc1]You are" 
  } else { 
   set _who "[tgcolmisc2]$text [tgcolmisc1]is" 
  } 
  [tgpriv] $nick "[tgbold]$_who [tgcolmisc1]not on the score list." 
 } else { 
  if {[strlwr $text]==[strlwr $nick]} { 
   set _who "[tgcolmisc1]You have" 
  } else { 
   set _who "[tgcolmisc2]$tgrealnames([strlwr $text]) [tgcolmisc1]has" 
  } 
  [tgpriv] $nick "[tgbold]$_who [tgcolmisc2]$tgscoresbyname([strlwr $text])[tgcolmisc1] points, ranked [tgcolmisc2][tgordnum $tgranksbyname([strlwr $text])] [tgcolmisc1]of [tgcolmisc2]$tgscorestotal[tgcolmisc1]." 
 } 
} 

#triggered when someone /msgs the bot with the target lookup command. 
proc tgtargetlookup {nick host hand text} { 
 global tgscoresbyname tgranksbyname tgscorestotal tgranksbynum tgrealnames 
 tggetscores 
 if {![info exists tgscoresbyname([strlwr $nick])]} { 
  [tgpriv] $nick "[tgbold][tgcolmisc1]You are not on the score list yet."
 } elseif {$tgranksbyname([strlwr $nick])==1} { 
  [tgpriv] $nick "[tgbold][tgcolmisc1]You are in first place!" 
 } else { 
  [tgpriv] $nick "[tgbold][tgcolmisc1]You are on [tgcolmisc2]$tgscoresbyname([strlwr $nick])[tgcolmisc1]. Your next target is [tgcolmisc2]$tgrealnames($tgranksbynum([expr $tgranksbyname([strlwr $nick])-1])) [tgcolmisc1]with [tgcolmisc2]$tgscoresbyname($tgranksbynum([expr $tgranksbyname([strlwr $nick])-1]))[tgcolmisc1], ranked [tgcolmisc2][tgordnum [expr $tgranksbyname([strlwr $nick])-1]] [tgcolmisc1]of [tgcolmisc2]$tgscorestotal[tgcolmisc1]." 
 } 
} 

#triggered when someone /msgs the bot with the error reporting command. 
proc tgerror {nick host hand text} { 
 global tgquestionstotal tgquestionslist tgerrfil 
 if {$text==""||![string is int [lindex $text 0]]} { 
  [tgpriv] $nick "[tgbold][tgcolmisc1]You need to specify the number of the question." 
  return 
 } 
 tgreadqdb 
 set _qnum [lindex $text 0] 
 if {$_qnum>$tgquestionstotal} { 
  [tgpriv] $nick "[tgbold][tgcolmisc1]No such question." 
  return 
 } 
 set _qques [lindex [split [lindex $tgquestionslist [expr $_qnum-1]] |] 1] 
 set _qans [lindex [split [lindex $tgquestionslist [expr $_qnum-1]] |] 0]
 set _desc [lrange $text 1 end] 
 if {$_desc==""} { set _desc "No further info given for this error." } 
 set _file [open $tgerrfil a] 
 puts $_file "Reported by:\t$nick" 
 puts $_file "Question #:\t$_qnum" 
 puts $_file "Question:\t$_qques" 
 puts $_file "Answer:\t\t$_qans" 
 puts $_file "Comments:\t$_desc" 
 puts $_file "------------------------------" 
 close $_file 
 [tgpriv] $nick "[tgbold][tgcolmisc1]Thanks for reporting the error." 
} 

#triggered when someone /msgs the bot with the rules command. 
proc tgrulesmsg {nick host hand text} { 
 global tgrules 
 [tgpriv] $nick "The channel's rules are as follows: $tgrules" 
} 

#triggered when someone /msgs the bot with the help command. 
proc tggivehelp {nick host hand {text ""}} { 
 global botnick tgcmdlookup tgcmdhelp tgcmdstart tgcmdstop tgchan tgflagsstop 
 global tgcmdstop tgflagshint tgcmdhint tgflagsskip tgcmdskip tgflagsreset tgcmdreset 
 global tgcmdtarget tgcmderror tgcmdrules 
 if {$text==""} { 
  [tgpriv] $nick "You have access to the following /MSG commands:" 
  [tgpriv] $nick "To use, /MSG $botnick <command>" 
  [tgpriv] $nick "  \002[strupr $tgcmdrules]\002" 
  [tgpriv] $nick "   -- Lists the channel rules." 
  [tgpriv] $nick "  \002[strupr $tgcmdlookup]\002 \[nick\]" 
  [tgpriv] $nick "   -- Shows you the rank & score of \[nick\], if specified," 
  [tgpriv] $nick "    otherwise, shows you your own rank & score." 
  [tgpriv] $nick "  \002[strupr $tgcmdtarget]\002" 
  [tgpriv] $nick "   -- Shows you the rank & score of the person ranked" 
  [tgpriv] $nick "    one above you." 
  [tgpriv] $nick "  \002[strupr $tgcmderror]\002 <number> \[description\]" 
  [tgpriv] $nick "   -- Reports an error in question <number>" 
  [tgpriv] $nick "    The description is optional, but helpful." 
  if {[matchattr $hand $tgflagsreset $tgchan]} { 
   [tgpriv] $nick "  \002[strupr $tgcmdreset]\002" 
   [tgpriv] $nick "   -- Resets the score table." 
  } 
  [tgpriv] $nick "For a list of channel commands, /MSG $botnick [strupr $tgcmdhelp] PUBCMDS" 
 } 
 if {[strlwr $text]=="pubcmds"} { 
  [tgpriv] $nick "You have access to the following channel commands:" 
  if {[matchattr $hand $tgflagsstart $tgchan]} { 
   [tgpriv] $nick "  \002$tgcmdstart\002 -- starts the trivia game." 
  } 
  if {[matchattr $hand $tgflagsstop $tgchan]} { 
   [tgpriv] $nick "  \002$tgcmdstop\002 -- stops the trivia game." 
  } 
  if {[matchattr $hand $tgflagshint $tgchan]} { 
   [tgpriv] $nick "  \002$tgcmdhint\002 -- shows a hint." 
  } 
  if {[matchattr $hand $tgflagsskip $tgchan]} { 
   [tgpriv] $nick "  \002$tgcmdskip\002 -- skips current question." 
  } 
  [tgpriv] $nick "For a list of /MSG commands, /MSG $botnick [strupr $tgcmdhelp]" 
 } 
} 

proc tggamemsg {what} { 
 global tgchan 
 putquick "PRIVMSG $tgchan :[tgbold]$what" 
} 

#Returns ordinal version of number passed to it. 
#i.e. [tgordnum 1] returns "1st", [tgordnum 33] returns "33rd" 
#Surely there's an easier way to do this? 
proc tgordnum {num} { 
 set _last1 [string range $num [expr [strlen $num]-1] end] 
 set _last2 [string range $num [expr [strlen $num]-2] end] 
 if {$_last1=="1"&&$_last2!="11"} { 
  return "[expr $num]st" 
 } elseif {$_last1=="2"&&$_last2!="12"} { 
  return "[expr $num]nd" 
 } elseif {$_last1=="3"&&$_last2!="13"} { 
  return "[expr $num]rd" 
 } else { 
  return "[expr $num]th" 
 } 
} 
proc tgbold {} { 
 global tgusebold 
 if {$tgusebold==1} { return "\002" } 
} 
proc tgcolstart {} { 
 global tgcolourstart 
 if {$tgcolourstart!=""} { return "\003$tgcolourstart" } 
} 
proc tgcolstop {} { 
 global tgcolourstop 
 if {$tgcolourstop!=""} { return "\003$tgcolourstop" } 
} 
proc tgcolskip {} { 
 global tgcolourskip 
 if {$tgcolourskip!=""} { return "\003$tgcolourskip" } 
} 
proc tgcolerr {} { 
 global tgcolourerr 
 if {$tgcolourerr!=""} { return "\003$tgcolourerr" } 
} 
proc tgcolmiss {} { 
 global tgcolourmiss 
 if {$tgcolourmiss!=""} { return "\003$tgcolourmiss" } 
} 
proc tgcolqhead {} { 
 global tgcolourqhead 
 if {$tgcolourqhead!=""} { return "\003$tgcolourqhead" } 
} 
proc tgcolqbody {} { 
 global tgcolourqbody 
 if {$tgcolourqbody!=""} { return "\003$tgcolourqbody" } 
} 
proc tgcolhint {} { 
 global tgcolourhint 
 if {$tgcolourhint!=""} { return "\003$tgcolourhint" } 
} 
proc tgcolstrk {} { 
 global tgcolourstrk 
 if {$tgcolourstrk!=""} { return "\003$tgcolourstrk" } 
} 
proc tgcolscr1 {} { 
 global tgcolourscr1 
 if {$tgcolourscr1!=""} { return "\003$tgcolourscr1" } 
} 
proc tgcolscr2 {} { 
 global tgcolourscr2 
 if {$tgcolourscr2!=""} { return "\003$tgcolourscr2" } 
} 
proc tgcolscr3 {} { 
 global tgcolourscr3 
 if {$tgcolourscr3!=""} { return "\003$tgcolourscr3" } 
} 
proc tgcolrset {} { 
 global tgcolourrset 
 if {$tgcolourrset!=""} { return "\003$tgcolourrset" } 
} 
proc tgcolstend {} { 
 global tgcolourstend 
 if {$tgcolourstend!=""} { return "\003$tgcolourstend" } 
} 
proc tgcolmisc1 {} { 
 global tgcolourmisc1 
 if {$tgcolourmisc1!=""} { return "\003$tgcolourmisc1" } 
} 
proc tgcolmisc2 {} { 
 global tgcolourmisc2 
 if {$tgcolourmisc2!=""} { return "\003$tgcolourmisc2" } 
} 
proc tgpriv {} { 
 global tgpriv2msg 
 if {$tgpriv2msg==1} { return "putmsg" } else { return "putnotc" } 
} 

#this generates an html file with all the people on the chan with 
#their score, as well as a list of all scores, sorted by rank 
proc tghtml {} { 
 global tgchan botnick tghtmlfile tghtmlrefresh server tgscoresbyname tgranksbyname 
 global tgscorestotal tgranksbyname tgrealnames tgscoresbyrank tgranksbynum tgplaying 
 global tgquestionstotal tghtmlrefreshtimer 
 tggetscores 
 tgreadqdb 
 set _file [open $tghtmlfile~new w] 
 puts $_file "<html>" 
 puts $_file " <head>" 
 puts $_file "  <title>$botnick's trivia channel</title>" 
 puts $_file "  <meta http-equiv=\"refresh\" content=\"$tghtmlrefresh\">"
 puts $_file "  <meta name=\"generator\" value=\"trivia.tcl script for eggdrop. http://www.geocities.com/triviatcl/\">" 
 puts $_file " </head>" 
 puts $_file " <body>" 
 puts $_file "  <h1>$tgchan on [lindex [split $server :] 0]</h1>" 
 puts $_file "  <small>Generated on [strftime %A,\ %d\ %B\ %Y\ @\ %H:%M:%S].</small>" 
 puts $_file "  <hr size=\"1\" noshade>" 
 if {![onchan $botnick $tgchan]} { 
  puts $_file "  <p>Hmmm... for some reason I'm not on $tgchan at the moment. Please try again later.</p>" 
 } else { 
  puts $_file "  <p>Trivia game is currently <b>[expr $tgplaying==1?"on":"off"]</b>. There are <b>$tgquestionstotal</b> questions in the database." 
  puts $_file "  <p>People on $tgchan right now:<br>" 
  puts $_file "  <table width=\"50%\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\"><tr><td><table width=\"100%\" cellspacing=\"3\" border=\"0\">" 
  puts $_file "   <tr>" 
  puts $_file "    <td><b>Nick</b></td>" 
  puts $_file "    <td><b>Score</b></td>" 
  puts $_file "    <td><b>Rank</b></td>" 
  puts $_file "   </tr>" 
  foreach nick [lsort [chanlist $tgchan]] { 
   puts $_file "   <tr>" 
   puts $_file "    <td>[expr [isop $nick $tgchan]?"@":""][expr [isvoice $nick $tgchan]?"+":""]$nick[expr [string match $nick $botnick]?" (that's me!)":""]</td>" 
   if {[info exists tgscoresbyname([strlwr $nick])]} { 
    puts $_file "    <td>$tgscoresbyname([strlwr $nick])</td>" 
   } else { 
    puts $_file "    <td>-</td>" 
   } 
   if {[info exists tgranksbyname([strlwr $nick])]} { 
    puts $_file "    <td>$tgranksbyname([strlwr $nick])</td>" 
   } else { 
    puts $_file "    <td>-</td>" 
   } 
   puts $_file "   </tr>" 
  } 
  puts $_file "  </table></td></tr></table>" 
 } 
 puts $_file "  </p>" 
 if {$tgscorestotal>0} { 
  puts $_file "  <p><small>There [expr $tgscorestotal==1?"is":"are"] currently <b>$tgscorestotal</b> [expr $tgscorestotal==1?"nick":"nicks"] in the score table:<br>" 
  set _rank 1 
  while {$_rank<=$tgscorestotal} { 
   puts $_file "  <b>$_rank</b>. $tgrealnames($tgranksbynum($_rank)) $tgscoresbyrank($_rank)<br>" 
   incr _rank 
  } 
 } else { 
  puts $_file "  <p><small>There are currently no nicks in the score table.<br>" 
 } 
 puts $_file "  </small></p>" 
 puts $_file "  <hr size=\"1\" noshade>" 
 puts $_file "  <small>Generated by <a href=\"http://www.geocities.com/triviatcl/\">trivia.tcl</a> for <a href=\"http://www.egghelp.org\">eggdrop</a>.<br>" 
 puts $_file "  This page is automatically updated (and refreshed if supported by your browser) every [expr $tghtmlrefresh==1?"second":"$tghtmlrefresh seconds"].</small>" 
 puts $_file " </body>" 
 puts $_file "</html>" 
 close $_file 
 file rename -force $tghtmlfile~new $tghtmlfile 
 set tghtmlrefreshtimer [utimer $tghtmlrefresh tghtml] 
} 

putlog "=======================================================" 
putlog "* trivia.tcl $tgver ($tgrel) by Souperman <gpd@planetpastel.com> loaded." 
putlog "* Visit http://www.geocities.com/triviatcl/ for updates." 
tgreadqdb 
putlog "* $tgquestionstotal questions in $tgqdb ([file size $tgqdb] bytes)" 
putlog "=======================================================" 
The Road To Hell Is Full Of Good Intentions
e
eVoLuTioN
Voice
Posts: 5
Joined: Sat Sep 22, 2012 2:01 am

Post by eVoLuTioN »

hello
No still the same problem ...
answer is heh ask
H
Hero
Halfop
Posts: 49
Joined: Tue Jun 26, 2012 6:27 pm
Location: root@localhost
Contact:

Post by Hero »

I Checked The Code On My Bot It Working Fine :)
Kindly please Show 2 or 3 Questions From Your Question File
The Road To Hell Is Full Of Good Intentions
e
eVoLuTioN
Voice
Posts: 5
Joined: Sat Sep 22, 2012 2:01 am

Post by eVoLuTioN »

hello
i have tried 3-4 times but the bot still reads the same
answer*question
and not
question*answer

---------------------------
trivia.questions
OBELIX I...*ASTERIX
ASTERIX I...*OBELIX
H
Hero
Halfop
Posts: 49
Joined: Tue Jun 26, 2012 6:27 pm
Location: root@localhost
Contact:

Post by Hero »

What You Want?
Question*Answer

Or

Answer*Question ??
The Road To Hell Is Full Of Good Intentions
e
eVoLuTioN
Voice
Posts: 5
Joined: Sat Sep 22, 2012 2:01 am

Post by eVoLuTioN »

question*answer
I try your code with 1 and 0 but the bot read allwasy answer*question
User avatar
SpiKe^^
Owner
Posts: 831
Joined: Fri May 12, 2006 10:20 pm
Location: Tennessee, USA
Contact:

Try BogusTrivia

Post by SpiKe^^ »

Try BogusTrivia, it can do the questions from files in almost any format:)
SpiKe^^

Get BogusTrivia 2.06.4.7 at www.mytclscripts.com
or visit the New Tcl Acrhive at www.tclarchive.org
.
r
roofer
Voice
Posts: 1
Joined: Fri Dec 20, 2013 1:50 pm

trivia.tcl to fixs script requires alltools.tcl v1

Post by roofer »

trivia.tcl to fixs script


remove the lines


if {![info exists a82887lltools_loaded]||$allt_version<204} {die "[file tail [info script]]: this
script requires alltools.tcl v1.6 (or higher) to be loaded!"}


:lol:

Code: Select all

#PLEASE consult the file trivia.readme.html for detailed
#explanations of these variables.

set tgqdb  "/home/roofstar/roofstar/scripts/trivia.questions"
set tgscf "/home/roofstar/roofstar/scripts/trivia.scores"
set tgerrfil "/home/roofstar/roofstar/scripts/trivia.errors"
set tgchan "#trivia"
set tgpointsperanswer 1000
set tgmaxhint 3
set tgstreakmin 1
set tgmaxmissed 3
set tghintchar "?"
set tgtimehint 30
set tgtimenext 10
set tgcongrats [list "Congratulations" "Well done" "Nice going" "Way to go" "You got it" "That's the way" "Show 'em how it's done"]
set tgnobodygotit [list "Nobody got it right." "Hello? Anybody home?" "You're going to have to try harder!" "Are these too tough for you?" "Am I alone here or what?" "You're not going to score any points this way!"]
set tgtrythenextone [list "Let's see if you can get the next one..." "Get ready for the next one..." "Maybe you'll get the next one..." "Try and get the next one..." "Here comes the next one..."]
set tgusebold 5
set tgcmdhelp "!help"
set tgcmdstart "!start"
set tgflagsstart -|-
set tgcmdstop "!stop"
set tgflagsstop o|o
set tgcmdhint "!hint"
set tgflagshint o|o
set tgcmdskip "!skip"
set tgflagsskip o|o
set tgcmdreset "reset"
set tgflagsreset n|n
set tgcmdlookup "score"
set tgcmdtarget "target"
set tgcmderror "error"
set tgerrremindtime 15

#You'll need to remove the next line. It's just there to make sure you make
#some effort to edit the settings...
#die "* [file tail [info script]]: you didn't edit the settings like you were told, did you?"

######################################################################
#      You shouldn't need to modify anything beyond this point.      #
######################################################################
#Misc checks & var initialisations
if {![file exists $tgqdb]} {die "[file tail [info script]]: $tgqdb does not exist!"}
 
if {![info exists tgplaying]} {set tgplaying 0}
if {![info exists tghintnum]} {set tghintnum 0}
if {![info exists tgmissed]} {set tgmissed 0}

#Binds
bind pub $tgflagsstart $tgcmdstart tgstart
bind pub $tgflagsstop $tgcmdstop tgstop
bind pub $tgflagshint $tgcmdhint tgforcehint
bind pub $tgflagsskip $tgcmdskip tgskip
bind join -|- "$tgchan *" tgjoinmsg
bind msg - $tgcmdhelp tggivehelp
bind msg - $tgcmdlookup tgscorelookup
bind msg - $tgcmdtarget tgtargetlookup
bind msg - $tgcmderror tgerror
bind msg $tgflagsreset "$tgcmdreset" tgresetscores
bind kick - "$tgchan $botnick" tgbotgotkicked
bind evnt - disconnect-server tgbotgotdisconnected

#starts the game if it isn't running.
proc tgstart {nick host hand chan text} {
 global tgplaying tgstreak tgchan tgerrremindtime tgerrremindtimer tgmissed
 if {[strlwr $tgchan]==[strlwr $chan]} {
  if {$tgplaying==0} {
   tggamemsg "\00303Trivia game started by $nick!"
   tgnext
   set tgplaying 1
   set tgstreak 0
   set tgmissed 0
   set tgerrremindtimer [timer $tgerrremindtime tgerrremind]
  }
  return 1
 }
}

#stops the game if it's running.
proc tgstop {nick host hand chan text} {
 global tghinttimer tgnexttimer tgplaying tgchan tgcurrentanswer tgstreak tgstreakmin
 global tgerrremindtimer
 if {[strlwr $tgchan]==[strlwr $chan]} {
  if {$tgplaying==1} {
   tggamemsg "\00304Trivia game stopped by $nick!"
   if {$tgstreakmin>0&&[lindex [split $tgstreak ,] 1]>=$tgstreakmin} { tgstreakend }
   set tgstreak 0
   set tgplaying 0
   catch {unbind pubm -|- "$tgchan $tgcurrentanswer" tgcorrectanswer}
   if {[utimerexists tghint]!=""} {killutimer $tghinttimer}
   if {[utimerexists tgnext]!=""} {killutimer $tgnexttimer}
   if {[timerexists tgerrremind]!=""} {killtimer $tgerrremindtimer}
  }
  return 1
 }
}

#gives a hint if there is currently a question to answer.
proc tgforcehint {nick host hand chan text} {
 global tghinttimer tgnexttimer tgplaying tgchan tgcurrentanswer tgstreak tgstreakmin
 if {[strlwr $tgchan]==[strlwr $chan]} {
  if {$tgplaying==1&&[utimerexists tghint]!=""} {
   killutimer $tghinttimer
   tghint
  }
  return 1
 }
}

#skips the current question if one has been asked.
proc tgskip {nick host hand chan text} {
 global tghinttimer tgnexttimer tgplaying tgchan tgcurrentanswer tgstreak tgstreakmin tgtimenext
 if {[strlwr $tgchan]==[strlwr $chan]} {
  if {$tgplaying==1&&[utimerexists tghint]!=""} {
   tggamemsg "\00310Skipping to next question by $nick's request..."
   if {$tgstreakmin>0&&[lindex [split $tgstreak ,] 1]>=$tgstreakmin} { tgstreakend }
   set tgstreak 0
   unbind pubm -|- "$tgchan $tgcurrentanswer" tgcorrectanswer
   killutimer $tghinttimer
   set tgnexttimer [utimer $tgtimenext tgnext]
  }
  return 1
 }
}

#reminds channel how to report errors in questions/answers
proc tgerrremind {} {
 global tgerrremindtimer tgerrremindtime botnick tgcmderror
 tggamemsg "\00306Remember: to report errors in questions/answers, type \00307/msg $botnick $tgcmderror <number> \[description\]"
 set tgerrremindtimer [timer $tgerrremindtime tgerrremind]
}


#bot got kicked. stop the game.
proc tgbotgotkicked {nick host hand chan targ text} {
 tgquietstop
}

#bot got disconnected. stop the game.
proc tgbotgotdisconnected {disconnect-server} {
 tgquietstop
}

#stops the game quietly.
proc tgquietstop {} {
 global tgplaying tgstreak tgchan tgcurrentanswer tghinttimer tgnexttimer tgerrremindtimer
 if {$tgplaying==1} {
  set tgstreak 0
  set tgplaying 0
  catch {unbind pubm -|- "$tgchan $tgcurrentanswer" tgcorrectanswer}
  if {[utimerexists tghint]!=""} {killutimer $tghinttimer}
  if {[utimerexists tgnext]!=""} {killutimer $tgnexttimer}
  if {[timerexists tgerrremind]!=""} {killtimer $tgerrremindtimer}
 }
}

#reads the question database.
proc tgreadqdb {} {
 global tgqdb tgquestionstotal tgquestionslist
 set tgquestionstotal 0
 set tgquestionslist ""	
 set qfile [open $tgqdb r]
 while {![eof $qfile]} {
  lappend tgquestionslist [gets $qfile]
  incr tgquestionstotal
 }
 close $qfile
}

#selects the next question.
proc tgnext {} {
 global tgqdb tgcurrentquestion tgcurrentanswer tgquestionnumber tgquestionstotal
 global tghintnum tgchan tgquestionslist
 tgreadqdb
 set tgquestionnumber [rand [llength $tgquestionslist]]			
 set tgquestionselected [lindex $tgquestionslist $tgquestionnumber]
 set tgcurrentquestion [lindex [split $tgquestionselected |] 1]
 set tgcurrentanswer [strlwr [lindex [split $tgquestionselected |] 0]]
 unset tghintnum
 tghint
 bind pubm -|- "$tgchan $tgcurrentanswer" tgcorrectanswer
 return
}

#shows timed hints.
proc tghint {} {
 global tgmaxhint tghintnum tgcurrentanswer tghinttimer tgchan
 global tgtimehint tghintchar tgquestionnumber tgquestionstotal
 global tgcurrentquestion tghintcharsused tgnexttimer tgtimenext tgstreak tgstreakmin
 global tgnobodygotit tgtrythenextone tgmissed tgmaxmissed tgcmdstart
 if {[catch {incr tghintnum}]!=0} {set tghintnum 0}
 if {$tghintnum >= [expr $tgmaxhint+1]} {
  incr tgmissed
  set _msg ""
  append _msg "\00310[lindex $tgnobodygotit [rand [llength $tgnobodygotit]]]"
  if {$tgmaxmissed>0&&$tgmissed>=$tgmaxmissed} {
   append _msg " That's $tgmissed questions gone by unanswered! The game is now automatically disabled. To start the game again, type $tgcmdstart"
   tgquietstop
  } else {
   append _msg " [lindex $tgtrythenextone [rand [llength $tgtrythenextone]]]"
  }
  tggamemsg "$_msg"
  if {$tgstreakmin>0&&[lindex [split $tgstreak ,] 1]>=$tgstreakmin} { tgstreakend }
  set tgstreak 0
  catch {unbind pubm -|- "$tgchan $tgcurrentanswer" tgcorrectanswer}
  if {$tgmaxmissed==0||$tgmissed<$tgmaxmissed} {
   set tgnexttimer [utimer $tgtimenext tgnext]
  }
  return
 } elseif {$tghintnum == 0} {
  set i 0
  set _hint {}
  set tghintcharsused {}
  regsub -all -- "\[A-Za-z0-9\]" $tgcurrentanswer $tghintchar _hint
 } elseif {$tghintnum == 1} {
  set i 0
  set _hint {}
  while {$i<[llength [split $tgcurrentanswer " "]]} {
   set _word [lindex [split $tgcurrentanswer " "] $i]
   set j 0
   set _newword {}
   while {$j<[strlen $_word]} {
    if {$j==0} {
     append _newword [stridx $_word $j]
     lappend tghintcharsused $i,$j
    } else {
     if {[string is alnum [stridx $_word $j]]} {
      append _newword $tghintchar
     } else {
      append _newword [stridx $_word $j]
      lappend tghintcharsused $i,$j
     }
    }
    incr j
   }
   lappend _hint $_newword
   incr i
  }
  } else {
   set i 0
   set _hint {}    
   while {$i<[llength [split $tgcurrentanswer " "]]} {
    set _word [lindex [split $tgcurrentanswer " "] $i]
    set j 0
    set _newword {}
    set _selected [rand [strlen $_word]]
    regsub -all -- "\[^A-Za-z0-9\]" $_word "" _wordalnum
    if {[strlen $_wordalnum]>=$tghintnum} {
     while {[lsearch $tghintcharsused $i,$_selected]!=-1||[string is alnum [stridx $_word $_selected]]==0} {
      set _selected [rand [strlen $_word]]
     }
    }
    lappend tghintcharsused $i,$_selected
    while {$j<[strlen $_word]} {
     if {[lsearch $tghintcharsused $i,$j]!=-1||[string is alnum [stridx $_word $j]]==0} {
      append _newword [stridx $_word $j]
     } else {
      if {[string is alnum [stridx $_word $j]]} {
       append _newword $tghintchar
      }
    }
    incr j
   }
   lappend _hint $_newword
   incr i
  }
 }
 tggamemsg "\00304===== Question [expr $tgquestionnumber+1]/$tgquestionstotal [expr $tghintnum?"(Hint $tghintnum/$tgmaxhint)":""] ====="
 tggamemsg "\00312[strupr $tgcurrentquestion]"
 tggamemsg "\00303Hint: [strupr $_hint]"
 set tghinttimer [utimer $tgtimehint tghint]
}

#triggered when someone says the correct answer.
proc tgcorrectanswer {nick host hand chan text} {
 global tgcurrentanswer tghinttimer tgtimenext tgchan tgnexttimer tgstreak tgstreakmin
 global tgscoresbyname tgranksbyname tgranksbynum tgcongrats tgscorestotal tgmissed
 tggetscores
 if {![info exists tgranksbyname($nick)]} {
  set _oldrank 0
 } else {
  set _oldrank [lindex [split $tgranksbyname($nick) ,] 0]
 }
 tgincrscore $nick
 tggetscores
 set _newrank [lindex [split $tgranksbyname($nick) ,] 0]
 set _msg "\00306[lindex $tgcongrats [rand [llength $tgcongrats]]] \00304$nick\00306! The answer was \00304[strupr $tgcurrentanswer]\00306."
 if {$_newrank<$_oldrank} {
  if {$_newrank==1} {
   append _msg " You are now in first place!"
  } else {
   append _msg " You are now ranked \00304[tgnumsuf [lindex [split $tgranksbyname($nick) ,] 0]]\00306 of \00304$tgscorestotal\00306, behind \00304[lindex [split $tgranksbynum([expr $_newrank-1]) ,] 0]\00306 with \00304[lindex [split $tgranksbynum([expr $_newrank-1]) ,] 1]\00306."
  }
 }
 tggamemsg "$_msg"
 if {$tgstreak!=0} {
  if {[lindex [split $tgstreak ,] 0]==$nick} {
   set tgstreak $nick,[expr [lindex [split $tgstreak ,] 1]+1]
   if {$tgstreakmin>0&&[lindex [split $tgstreak ,] 1]>=$tgstreakmin} {
    tggamemsg "\00312$nick is on a winning streak! [lindex [split $tgstreak ,] 1] in a row so far!"
   }
  } else {
   if {$tgstreakmin>0&&[lindex [split $tgstreak ,] 1]>=$tgstreakmin} { tgstreakend }
   set tgstreak $nick,1
  }
 } else {
  set tgstreak $nick,1
 }
 set tgmissed 0
 tgshowscores
 unbind pubm -|- "$tgchan $tgcurrentanswer" tgcorrectanswer
 killutimer $tghinttimer
 set tgnexttimer [utimer $tgtimenext tgnext]
 return 1
}

#read current scores from file, sort and store in variable.
proc tggetscores {} {
 global tgscf tgscorestotal tgscores tgscoresbyname tgranksbyname tgranksbynum
 if {[file exists $tgscf]&&[file size $tgscf]>2} {
  set _sfile [open $tgscf r]
  set tgscores [lsort -dict -decreasing [split [gets $_sfile] " "]]
  close $_sfile
  set tgscorestotal [llength $tgscores]
 } else {
  set tgscores ""
  set tgscorestotal 0
 }
 if {[info exists tgscoresbyname]} {unset tgscoresbyname}
 if {[info exists tgranksbyname]} {unset tgranksbyname}
 if {[info exists tgranksbynum]} {unset tgranksbynum}
 set i 0
 while {$i<[llength $tgscores]} {
  set _item [lindex $tgscores $i]
  set _nick [lindex [split $_item ,] 2]
  set _score [lindex [split $_item ,] 0]
  set tgscoresbyname($_nick) $_score
  set tgranksbyname($_nick) [expr $i+1],$_score
  set tgranksbynum([expr $i+1]) $_nick,$_score
  incr i
 }
 return
}

#increment someone's score.
proc tgincrscore {who} {
 global tgscores tgscf tgpointsperanswer tgscorestotal
 tggetscores
 if {$tgscorestotal>0} {
  set i 0
  if {[lsearch $tgscores "*,*,$who"]==-1} {
   append _newscores "1,[expr 1000000000000.0/[unixtime]],$who "
  }
  while {$i<[llength $tgscores]} {
   set _item [lindex $tgscores $i]
   set _nick [lindex [split $_item ,] 2]
   set _time [lindex [split $_item ,] 1]
   set _score [lindex [split $_item ,] 0]
   if {[strlwr $who]==[strlwr $_nick]} {
    append _newscores "[expr $_score+$tgpointsperanswer],[expr 1000000000000.0/[unixtime]],$who[expr [expr [llength $tgscores]-$i]==1?"":"\ "]"
   } else {
    append _newscores "$_score,$_time,$_nick[expr [expr [llength $tgscores]-$i]==1?"":"\ "]"
   }
   incr i
  }
 } else {
  append _newscores "1,[expr 1000000000000.0/[unixtime]],$who"
 }
 set _sfile [open $tgscf w]
 puts $_sfile "$_newscores"
 close $_sfile
 return
}

#shows the current scores on channel.
proc tgshowscores {} {
 global tgscores tgchan tgscorestotal
 tggetscores
 set i 0
 while {$i<[llength $tgscores]} {
  set _item [lindex $tgscores $i]
  set _nick [lindex [split $_item ,] 2]
  set _score [lindex [split $_item ,] 0]
  if {$i==0} {
   append _scores "\00304$_nick $_score"
  } elseif {$i==1} {
   append _scores ", \00303$_nick $_score"
  } elseif {$i==2} {
   append _scores ", \00312$_nick $_score"
  } elseif {[onchan $_nick $tgchan]} {
   append _scores ", \00306$_nick $_score"
  }
  incr i
 }
 tggamemsg "\00306The scores: $_scores"
}

#reset current scores.
proc tgresetscores {nick host hand text} {
 global tgscf tgscorestotal tgscores
 if {[file exists $tgscf]&&[file size $tgscf]>2} {
  set _sfile [open $tgscf w]
  puts $_sfile ""
  close $_sfile
  set tgscores ""
  set tgscorestotal 0
 }
 tggamemsg "\00304===== Score table reset by $nick! ====="
 return 1
}

#triggered when a winning streak ends.
proc tgstreakend {} {
  global tgstreak
  tggamemsg "\00312So much for [lindex [split $tgstreak ,] 0]'s winning streak."
  return
}

#triggered when someone joins trivia chan.
proc tgjoinmsg {nick host hand chan} {
 global botnick tgplaying tgcmdhelp tgcmdstart
 if {$nick != $botnick} {
  putnotc $nick "Welcome to $botnick's trivia channel. Trivia game is currently \002[expr $tgplaying?"on\002.":"off\002. To start the game, type \002$tgcmdstart\002."] Please type \002/MSG $botnick [strupr $tgcmdhelp]\002 if you need help. Enjoy your stay! :-)"
 }
}

#triggered when someone /msgs the bot with the score lookup command.
proc tgscorelookup {nick host hand text} {
 global tgscoresbyname tgranksbyname tgscorestotal
 if {$text==""} { set text $nick } else { set text [lindex [split $text " "] 0] }
 tggetscores
 set _array [array get tgscoresbyname]
 set _index [lsearch [strlwr "$_array"] [strlwr "$text"]]
 if {$_index==-1} {
  if {[strlwr $text]==[strlwr $nick]} {
   set _who "\00306You are"
  } else {
   set _who "\00304$text \00306is"
  }
  putnotc $nick "[tgbold]$_who \00306not on the score list."
 } else {
  set _nick [lindex $_array $_index]
  if {[strlwr $_nick]==[strlwr $nick]} {
   set _who "\00306You are"
  } else {
   set _who "\00304$_nick \00306is"
  }
  putnotc $nick "[tgbold]$_who on \00304$tgscoresbyname($_nick)\00306, ranked \00304[tgnumsuf [lindex [split $tgranksbyname($_nick) ,] 0]] \00306of \00304$tgscorestotal\00306."
 }
 return 1
}

#triggered when someone /msgs the bot with the target lookup command.
proc tgtargetlookup {nick host hand text} {
 global tgscoresbyname tgranksbyname tgscorestotal tgranksbynum
 tggetscores
 set _array [array get tgscoresbyname]
 set _index [lsearch [strlwr "$_array"] [strlwr "$nick"]]
 set _nick [lindex $_array $_index]
 if {$_index==-1} {
  putnotc $nick "[tgbold]\00306You are not on the score list."
 } elseif {$tgranksbyname($_nick)==1} {
  putnotc $nick "[tgbold]\00304You're in first place!"
 } else {
  set _myrank [lindex [split $tgranksbyname($_nick) ,] 0]
  set _myscore [lindex [split $tgscoresbyname($_nick) ,] 0]
  set _tgtrank [expr [lindex [split $tgranksbyname($_nick) ,] 0]-1]
  set _tgtnick [lindex [split $tgranksbynum($_tgtrank) ,] 0]
  set _tgtscore [lindex [split $tgranksbynum($_tgtrank) ,] 1]
  putnotc $nick "[tgbold]\00306You are on \00304$_myscore\00306. Your next target is \00304$_tgtnick \00306with \00304$_tgtscore\00306, ranked \00304[tgnumsuf $_tgtrank] \00306of \00304$tgscorestotal\00304."
 }
 return 1
}

#triggered when someone /msgs the bot with the target lookup command.
proc tgerror {nick host hand text} {
 global tgquestionstotal tgquestionslist tgerrfil
 if {$text==""||![string is int [lindex $text 0]]} {
  putnotc $nick "[tgbold]\00306You need to specify the number of the question."
  return
 }
 tgreadqdb
 set _qnum [lindex $text 0]
 if {$_qnum>$tgquestionstotal} {
  putnotc $nick "[tgbold]\00306No such question."
  return
 }
 set _qques [lindex [split [lindex $tgquestionslist [expr $_qnum-1]] |] 1]
 set _qans [lindex [split [lindex $tgquestionslist [expr $_qnum-1]] |] 0]
 set _desc [lrange $text 1 end]
 if {$_desc==""} { set _desc "No further info given for this error." }
 set _file [open $tgerrfil a]
 puts $_file "Reported by:\t$nick"
 puts $_file "Question #:\t$_qnum"
 puts $_file "Question:\t$_qques"
 puts $_file "Answer:\t\t$_qans"
 puts $_file "Comments:\t$_desc"
 puts $_file "--------------------------------------------------------------------------------"
 close $_file
 putnotc $nick "[tgbold]\00306Thanks for reporting the error."
 return 1
}

#triggered when someone /msgs the bot with the help command.
proc tggivehelp {nick host hand {text ""}} {
 global botnick tgcmdlookup tgcmdhelp tgcmdstart tgcmdstop tgchan tgflagsstop
 global tgcmdstop tgflagshint tgcmdhint tgflagsskip tgcmdskip tgflagsreset tgcmdreset
 global tgcmdtarget tgcmderror
 if {$text==""} {
  putnotc $nick "You have access to the following /MSG commands:"
  putnotc $nick "To use, /MSG $botnick <command>"
  putnotc $nick "  \002[strupr $tgcmdlookup]\002 \[nick\]"
  putnotc $nick "   -- Shows you the rank & score of \[nick\], if specified,"
  putnotc $nick "    otherwise, shows you your own rank & score."
  putnotc $nick "  \002[strupr $tgcmdtarget]\002"
  putnotc $nick "   -- Shows you the rank & score of the person ranked"
  putnotc $nick "    one above you."
  putnotc $nick "  \002[strupr $tgcmderror]\002 <number> \[description\]"
  putnotc $nick "   -- Reports an error in question <number>"
  putnotc $nick "    The description is optional, but helpful."
  if {[matchattr $hand $tgflagsreset $tgchan]} {
   putnotc $nick "  \002[strupr $tgcmdreset]\002"
   putnotc $nick "   -- Resets the score table."
  }
  putnotc $nick "For a list of channel commands, /MSG $botnick [strupr $tgcmdhelp] PUBCMDS"
 }
 if {[strlwr $text]=="pubcmds"} {
  putnotc $nick "You have access to the following channel commands:"
  putnotc $nick "  \002$tgcmdstart\002 -- starts the trivia game."
  if {[matchattr $hand $tgflagsstop $tgchan]} {
   putnotc $nick "  \002$tgcmdstop\002 -- stops the trivia game."
  }
  if {[matchattr $hand $tgflagshint $tgchan]} {
   putnotc $nick "  \002$tgcmdhint\002 -- shows a hint."
  }
  if {[matchattr $hand $tgflagsskip $tgchan]} {
   putnotc $nick "  \002$tgcmdskip\002 -- skips current question."
  }
  putnotc $nick "For a list of /MSG commands, /MSG $botnick [strupr $tgcmdhelp]"
 }
 return 1
}

#misc aliases
proc tggamemsg {what} {global tgchan;putquick "PRIVMSG $tgchan :[tgbold]$what"}
proc tggamenotc {who what} {putquick "NOTICE $who :$what"}
proc tgnumsuf {num} {set _last1 [string range $num [expr [strlen $num]-1] end];set _last2 [string range $num [expr [strlen $num]-2] end];if {$_last1=="1"&&$_last2!="11"} {return "[expr $num]st"} elseif {$_last1=="2"&&$_last2!="12"} {return "[expr $num]nd"} elseif {$_last1=="3"&&$_last2!="13"} {return "[expr $num]rd"} else {return "[expr $num]th"}}
proc tgbold {} {global tgusebold;if {$tgusebold==1} {return "\002"}}

putlog "* [file tail [info script]] by DarkMist` loaded."
tgreadqdb
putlog "* $tgquestionstotal questions in $tgqdb"
Post Reply