X-Git-Url: https://jfr.im/git/erebus.git/blobdiff_plain/aaf381b89dbe853f0106d6e90a4a40d3265d3027..b091071713e832e6c007e57b49d68e2a3b54f0ed:/modules/trivia.py diff --git a/modules/trivia.py b/modules/trivia.py index 6199790..0055c42 100644 --- a/modules/trivia.py +++ b/modules/trivia.py @@ -27,7 +27,7 @@ def modstop(*args, **kwargs): return lib.modstop(*args, **kwargs) # module code -import json, random, threading, re, time, datetime +import json, random, threading, re, time, datetime, os try: import twitter @@ -100,17 +100,44 @@ class TriviaState(object): def __del__(self): self.closeshop() def closeshop(self): - if threading is not None and threading._Timer is not None: - if isinstance(self.steptimer, threading._Timer): - self.steptimer.cancel() - if isinstance(self.nextquestiontimer, threading._Timer): - self.nextquestiontimer.cancel() - self.nextquestiontimer = None - self.savedb() - - def savedb(self): + try: + self.steptimer.cancel() + self.steptimer = None + except: pass + try: + self.nextquestiontimer.cancel() + self.nextquestiontimer = None + except: pass +#TODO remove if the replacement works +# if threading is not None and threading._Timer is not None: +# if isinstance(self.steptimer, threading._Timer): +# self.steptimer.cancel() +# if isinstance(self.nextquestiontimer, threading._Timer): +# self.nextquestiontimer.cancel() +# self.nextquestiontimer = None +# self.savedb() + + def savedb(self): #returns whether or not it was able to save if json is not None and json.dump is not None: - json.dump(self.db, open(self.questionfile, "w"))#, indent=4, separators=(',', ': ')) +# json.dump(self.db, open(self.questionfile, "w"))#, indent=4, separators=(',', ': ')) + dbjson = json.dumps(self.db) + if len(dbjson) > 0: + os.rename(self.questionfile, self.questionfile+".auto.bak") + tmpfn = os.tempnam('.', 'trivia') + try: + f = open(tmpfn, "w") + f.write(dbjson) + f.close() + os.rename(tmpfn, self.questionfile) + return True + except: #if something happens, restore the backup + os.rename(self.questionfile+".auto.bak", self.questionfile) + try: + os.unlink(tmpfn) + except OSError: # temp file is already gone + pass + raise #TODO: we may be better off just swallowing exceptions? + return False def getchan(self): return self.parent.channel(self.chan) @@ -251,6 +278,8 @@ class TriviaState(object): self.revealpossibilities = None self.reveal = None + self.savedb() + if self.missedquestions > self.db['maxmissedquestions']: stop() self.getbot().msg(self.getchan(), "%d questions unanswered! Stopping the game." % (self.missedquestions)) @@ -292,7 +321,10 @@ class TriviaState(object): qary = nextq[0].split(None) qtext += " " for qword in qary: - qtext += "\00304,01"+qword+"\00301,01"+chr(random.randrange(0x61,0x7A)) #a-z + spacer = random.choice( + range(0x61,0x7A) + ([0x20]*4) + ) + qtext += "\00304,01"+qword+"\00301,01"+chr(spacer) #a-z self.getbot().fastmsg(self.chan, qtext) self.curq = nextq @@ -364,11 +396,11 @@ class TriviaState(object): if user in self.db['users']: rank = self.db['users'][user]['rank'] if rank == 0: - return "N/A" + return "" else: - return self.db['users'][self.db['ranks'][rank-1]]['points'] + return "("+str(self.db['users'][self.db['ranks'][rank-1]]['points'])+")" else: - return self.db['users'][self.db['ranks'][-1]]['points'] + return "("+str(self.db['users'][self.db['ranks'][-1]]['points'])+")" state = TriviaState() @@ -378,13 +410,24 @@ def trivia_checkanswer(bot, user, chan, *args): if state.checkanswer(line): state.curq = None if state.hintanswer.lower() == line.lower(): - bot.fastmsg(chan, "\00312%s\003 has it! The answer was \00312%s\003. New score: %d. Rank: %d. Target: %s (%s)." % (user, line, state.addpoint(user), state.rank(user), state.targetuser(user), state.targetpoints(user))) + bot.fastmsg(chan, "\00312%s\003 has it! The answer was \00312%s\003. New score: %d. Rank: %d. Target: %s %s" % (user, line, state.addpoint(user), state.rank(user), state.targetuser(user), state.targetpoints(user))) else: - bot.fastmsg(chan, "\00312%s\003 has it! The answer was \00312%s\003 (hinted answer: %s). New score: %d. Rank: %d. Target: %s (%s)." % (user, line, state.hintanswer, state.addpoint(user), state.rank(user), state.targetuser(user), state.targetpoints(user))) + bot.fastmsg(chan, "\00312%s\003 has it! The answer was \00312%s\003 (hinted answer: %s). New score: %d. Rank: %d. Target: %s%s" % (user, line, state.hintanswer, state.addpoint(user), state.rank(user), state.targetuser(user), state.targetpoints(user))) if state.hintsgiven == 0: bot.msg(chan, "\00312%s\003 got an extra point for getting it before the hints! New score: %d." % (user, state.addpoint(user))) state.nextquestion() +@lib.hook(glevel=1, needchan=False) +@lib.help(None, "saves the trivia database") +def save(bot, user, chan, realtarget, *args): + if chan is not None and realtarget == chan.name: replyto = chan + else: replyto = user + + if state.savedb(): + bot.msg(replyto, "Save successful.") + else: + bot.msg(replyto, "Save failed!") + @lib.hook(needchan=False) @lib.help("[]", "shows how many points you or someone has") def points(bot, user, chan, realtarget, *args): @@ -493,7 +536,6 @@ def badq(bot, user, chan, realtarget, *args): reason = ' '.join(args) state.db['badqs'].append([lastqid, curqid, reason]) - state.savedb() bot.msg(user, "Reported bad question.") @lib.hook(glevel=lib.STAFF, needchan=False) @@ -519,7 +561,6 @@ def badqs(bot, user, chan, realtarget, *args): @lib.hook(None, "clears list of BADQ reports") def clearbadqs(bot, user, chan, realtarget, *args): state.db['badqs'] = [] - state.savedb() bot.msg(user, "Cleared reports.") @lib.hook(glevel=lib.STAFF, needchan=False) @@ -529,7 +570,6 @@ def delbadq(bot, user, chan, realtarget, *args): try: qid = int(args[0]) del state.db['badqs'][qid] - state.savedb() bot.msg(user, "Removed report #%d" % (qid)) except: bot.msg(user, "Failed!") @@ -543,7 +583,7 @@ def rank(bot, user, chan, realtarget, *args): if len(args) != 0: who = args[0] else: who = user - bot.msg(replyto, "%s is in %d place (%s points). Target is: %s (%s points)." % (who, state.rank(who), state.points(who), state.targetuser(who), state.targetpoints(who))) + bot.msg(replyto, "%s is in %d place (%s points). Target is: %s %s" % (who, state.rank(who), state.points(who), state.targetuser(who), state.targetpoints(who))) @lib.hook(needchan=False) @lib.help(None, "shows top10 list") @@ -675,7 +715,6 @@ def delq(bot, user, chan, realtarget, *args): try: backup = state.db['questions'][int(args[0])] del state.db['questions'][int(args[0])] - state.savedb() bot.msg(user, "Deleted %s*%s" % (backup[0], backup[1])) except: bot.msg(user, "Couldn't delete that question. %r" % (e)) @@ -691,7 +730,6 @@ def addq(bot, user, chan, realtarget, *args): question = linepieces[0].strip() answer = linepieces[1].strip() state.db['questions'].append([question, answer]) - state.savedb() bot.msg(user, "Done. Question is #%s" % (len(state.db['questions'])-1))