__module_name__ = "VastorsQuiz" __module_version__ = "0.1" __module_description__ = "Quiz for XCHAT" import xchat import time import string import re print "loaded %s" % __module_name__ nextquesthnd = None # Handler für die Funktion nächste Frage showscorehnd = None # Handler für die Punkte zeige Routine vokhnd = None # Handler für die Tipp-Hilfe scoreshnd = None # Handler für die Punkte Funktion der User questhnd = None # Handler für die Frage anzeige Funktion der User helphnd = None # Handler für die Hilfe anzeige Funktion der User access_vok = True # vok-Hilfe verfügbar? access_scores = True # Punkteanzeige verfügbar? access_question = True # Frage darf angezeigt werden? access_help = True # Hilfe darf angezeigt werden? startnum = 0 # Startnumer der Fragen class question: text = [] # Fragen answer = [] # Antworten number = -1 # aktuelle Frage time = None # Startzeit der Frage chan = '#mychan' # Aktueller Quiz-Channel active = False # läuft das quiz? def loadfile(self, filename): quests = open(filename) record = quests.readline() record = quests.readline() record = quests.readline() while 1: self.text.append(quests.readline().rstrip('\r\n')) self.answer.append(quests.readline().rstrip('\r\n')) record = quests.readline() if record == "": break def next(self): global nextquesthnd global vokhnd global access_vok nextquesthnd = xchat.hook_timer(90000, next_question_timer, xchat.PRI_HIGHEST) vokhnd = xchat.hook_timer(30000, vok_timer) access_vok = False self.number += 1 xchat.command("MSG %s \0033 Frage %s: %s" % (self.chan, str(self.number+1), self.text[self.number]) ) self.time = time.time() def start(self, startnum): self.chan = xchat.get_info("channel") self.active = True if (len(self.text)<1): xchat.command("MSG %s Keine Fragen geladen!" % (self.chan)) else: self.number = startnum self.next() install_timer() def timeElapsed(self): if self.time: return time.time() - self.time def reset(self): self.number = -1 def startnumber(self, num): self.number = int(num) def current_answer(self): if (self.number != -1): return self.answer[self.number] else: return '' def current_number(self): if (self.number != -1): return self.number else: return 0 def current_question(self): xchat.command("MSG %s \0033 Frage %s: %s" % (self.chan, str(self.number+1), self.text[self.number]) ) def quizchan(self): if (self.chan != ''): return self.chan else: return '' def isactive(self): if (self.active): return True else: return False class highscore: points = {} # Punkteliste dummy = [] # temporär Array def add(self, nick): if self.points.has_key(nick): self.points[nick] += 1 else: self.points[nick] = 1 return self.points[nick] def show(self, userdata): global startnum if (los.isactive()): list = self.points.items() self.dummy = [] for i in list: self.dummy.append((i[1], i[0])) self.dummy.sort() self.dummy.reverse() xchat.command("MSG %s \0033 Highscore nach %s Fragen:" % (los.quizchan(), str(los.current_number()-startnum)) ) rank = 0 for i in self.dummy: rank += 1 xchat.command("MSG %s \0033 %s.: %s (%s points)" % (los.quizchan(), rank, i[1], str(i[0]))) if rank >= 3: break; return 1 los = question() hghscr = highscore() los.loadfile('/home/vastor/FILES/download/xchat/Susus_Quizfragen.txt') # Standardfragen laden def help_timer(userdata): global access_help access_help = True return 0 def quest_timer(userdata): global access_question access_question = True return 0 def scores_timer(userdata): global access_scores access_scores = True return 0 def vok_timer(userdata): global access_vok access_vok = True return 0 def next_question_timer(userdata): if (los.isactive()): xchat.command("MSG %s \0033 Antwort war: %s (aufgel??st nach %s sek)" % (los.quizchan(), los.current_answer(), str(round(los.timeElapsed(),1))) ) los.next() return 0 def install_timer(): global showscorehnd showscorehnd = xchat.hook_timer(600000, hghscr.show) def voktip(): pattern = re.compile('[^aeiou* ]', re.IGNORECASE) return pattern.sub('.', los.current_answer()) def comp_answer(given_answer): pattern2 = re.compile(r'\*', re.IGNORECASE) tmp_answer = pattern2.sub(r'.{0,2}', los.current_answer()) pattern = re.compile(tmp_answer, re.IGNORECASE) return pattern.search(given_answer) def quiz(word, word_eol, userdata): aktchan = los.quizchan() if comp_answer(word_eol[1]) and xchat.get_info("channel") == aktchan: if (nextquesthnd): xchat.unhook(nextquesthnd) if (vokhnd): xchat.unhook(vokhnd) timeans = los.timeElapsed() playernick = word[0] xchat.command("MSG %s \0033 %s war die richtige Antwort" % (aktchan, los.current_answer()) ) xchat.command("MSG %s \0033 gelöst nach %s sek." % (aktchan, str(round(timeans,1))) ) xchat.command("MSG %s \0033 %s bekommt 1 Punkt (Gesamt %s)!" % (aktchan, playernick, str(hghscr.add(playernick))) ) los.next() msghook = xchat.hook_print("Channel Message",quiz) def startquiz(word, word_eol, userdata): global startnum aktchan=los.quizchan() if word[1] == 'start': xchat.command("MSG %s \0033 %s (2004)" % (xchat.get_info("channel"), __module_name__) ) if (nextquesthnd): xchat.unhook(nextquesthnd) if (vokhnd): xchat.unhook(vokhnd) if (len(word)>2): startnum = int(word[2])-2 los.start(int(word[2])-2) else: los.start(-1) if word[1] == 'next': xchat.command("MSG %s \0033 Antwort war: %s (aufgelöst nach %s sek)" % (aktchan, los.current_answer(), str(round(los.timeElapsed(),1))) ) if (nextquesthnd): xchat.unhook(nextquesthnd) if (vokhnd): xchat.unhook(vokhnd) los.next() if word[1] == 'reset': xchat.command("MSG %s \0033 Quiz wurde neu gestartet " % (aktchan) ) if (nextquesthnd): xchat.unhook(nextquesthnd) if (vokhnd): xchat.unhook(vokhnd) los.reset() los.next() if word[1] == 'number': xchat.command("MSG %s \0033 Quiz startet mit Frage %s" % (aktchan, word[2]) ) los.startnumber(int(word[2])-2) los.next() return xchat.EAT_ALL def usercommands(word, word_eol, userdata): global access_help global access_vok global access_question global access_scores global scoreshnd global questhnd global helphnd aktchan=los.quizchan() if word_eol[1].count('!scores') and xchat.get_info("channel")==aktchan and los.isactive() and access_scores: hghscr.show(1) scoreshnd = xchat.hook_timer(180000, scores_timer) access_scores = False if word_eol[1].count('!vok') and xchat.get_info("channel")==aktchan and los.isactive() and access_vok: xchat.command("MSG %s \0033 Tipp: %s" % (aktchan, voktip()) ) if word_eol[1].count('!question') and xchat.get_info("channel")==aktchan and los.isactive() and access_question: los.current_question() questhnd = xchat.hook_timer(30000, quest_timer) access_question = False if word_eol[1].count('!quizhelp') and xchat.get_info("channel")==aktchan and los.isactive() and access_help: xchat.command("MSG %s \0033 Verf??gbare Befehle:" % (aktchan) ) xchat.command("MSG %s \0033 !scores : zeigt die besten 3 (nur alle 3 min m??glich)" % (aktchan) ) xchat.command("MSG %s \0033 !vok : zeigt als Tipp die vokale an (erst nach 30 sek möglich)" % (aktchan) ) xchat.command("MSG %s \0033 !question : zeigt die Frage nochmal an (nur alle 30 sek möglich)" % (aktchan) ) xchat.command("MSG %s \0033 !quizhelp : zeigt diese Hilfe (nur alle 5 min m??glich)" % (aktchan) ) helphnd = xchat.hook_timer(300000, help_timer) access_help = False return xchat.EAT_NONE cmdhook = xchat.hook_command("QUIZ",startquiz,help="Usage: QUIZ <command>") ucmdhook = xchat.hook_print("Channel Message", usercommands) def catch_nick_change(word, word_eol, userdata): if hghscr.points.has_key(word[0]): oldnick = word[0] newnick = word[1] nickpoints = int(hghscr.points[oldnick]) hghscr.points[newnick] = nickpoints hghscr.points.__delitem__(oldnick) return xchat.EAT_NONE xchat.hook_print("Change Nick",catch_nick_change) def unload(userdata): xchat.unhook(msghook) xchat.unhook(cmdhook) xchat.unhook(ucmdhook) if (nextquesthnd): xchat.unhook(nextquesthnd) if (showscorehnd): xchat.unhook(showscorehnd) if (vokhnd): xchat.unhook(vokhnd) if (questhnd): xchat.unhook(questhnd) if (scoreshnd): xchat.unhook(scoreshnd) if (helphnd): xchat.unhook(helphnd) xchat.command("MSG %s \0033 Das Quiz wurde beendet." % (los.quizchan()) ) print "Bye bye" xchat.hook_unload(unload)