]> jfr.im git - erebus.git/blobdiff - modules/trivia.py
py3 updates
[erebus.git] / modules / trivia.py
index c3d423bee0c396bad3aa5ee713121848b5457a48..8abc9ff7230467d09e15a48575424786760ab7b9 100644 (file)
@@ -35,8 +35,11 @@ import json, random, threading, re, time, datetime, os, sys
 
 if sys.version_info.major < 3:
        timerbase = threading._Timer
+       stringbase = basestring
 else:
+       import tempfile
        timerbase = threading.Timer
+       stringbase = str
 
 
 try:
@@ -130,11 +133,16 @@ class TriviaState(object):
                if json is not None and json.dump is not None:
 #                      json.dump(self.db, open(self.questionfile, "w"))#, indent=4, separators=(',', ': '))
                        dbjson = json.dumps(self.db)
+                       # we have to do a dance to save the file to make the update atomic, and also because Py3 doesn't have os.tempnam in the misguided pursuit of "security"
                        if len(dbjson) > 0:
                                os.rename(self.questionfile, self.questionfile+".auto.bak")
-                               tmpfn = os.tempnam('.', 'trivia')
                                try:
-                                       f = open(tmpfn, "w")
+                                       if sys.version_info.major < 3:
+                                               tmpfn = os.tempnam('.', 'trivia')
+                                               f = open(tmpfn, "w")
+                                       else:
+                                               fd, tmpfn = tempfile.mkstemp(dir='.', prefix='trivia')
+                                               f = open(fd, "w")
                                        f.write(dbjson)
                                        f.close()
                                        os.rename(tmpfn, self.questionfile)
@@ -145,7 +153,9 @@ class TriviaState(object):
                                                os.unlink(tmpfn)
                                        except OSError: # temp file is already gone
                                                pass
-                                       raise # we may be better off just swallowing exceptions?
+                                       except UnboundLocalError:
+                                               pass
+                                       raise
                return False
 
        def getchan(self):
@@ -332,7 +342,7 @@ class TriviaState(object):
                else:
                        nextq.append(time.time())
 
-               if isinstance(nextq[1], basestring):
+               if isinstance(nextq[1], stringbase):
                        nextq[1] = nextq[1].lower()
                else:
                        nextq[1] = [s.lower() for s in nextq[1]]
@@ -343,7 +353,7 @@ class TriviaState(object):
                qtext += " "
                for qword in qary:
                        spacer = random.choice(
-                               range(0x61,0x7A) + ([0x20]*4)
+                               list(range(0x61,0x7A)) + ([0x20]*4)
                        )
                        qtext += "\00304,01"+qword+"\00301,01"+chr(spacer) #a-z
                if not self.getbot().fastmsg(self.chan, qtext): #if message is too long:
@@ -355,7 +365,7 @@ class TriviaState(object):
                self.curq = nextq
                self.curqid = nextqid
 
-               if isinstance(self.curq[1], basestring): self.hintanswer = self.curq[1]
+               if isinstance(self.curq[1], stringbase): self.hintanswer = self.curq[1]
                else: self.hintanswer = random.choice(self.curq[1])
 
                self.steptimer = MyTimer(self.db['hinttimer'], self.nexthint, args=[1])
@@ -364,7 +374,7 @@ class TriviaState(object):
        def checkanswer(self, answer):
                if self.curq is None:
                        return False
-               elif isinstance(self.curq[1], basestring):
+               elif isinstance(self.curq[1], stringbase):
                        return answer.lower() == self.curq[1]
                else: # assume it's a list or something.
                        return answer.lower() in self.curq[1]
@@ -533,7 +543,7 @@ def start(bot, user, chan, realtarget, *args):
        else: replyto = user
 
        if chan is not None and chan.name != state.db['chan']:
-               bot.msg(replyto, "That command isn't valid here.")
+               bot.msg(replyto, "That command is only valid in %s" % (state.db['chan']))
                return
 
        if state.curq is None and state.pointvote is None and state.nextquestiontimer is None: