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
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)
try: return str(self.db['users'][self.db['ranks'][num]]['points'])
except: return 0
+ status = False
try:
f = open(self.db['hofpath'], 'rb+')
for i in range(self.db['hoflines']): #skip this many lines
'thirdscore': pts(2),
})
f.write(fcontents)
- return True
+ status = True
except Exception as e:
- raise e #FIXME wtf???
- return False
+ status = False
finally:
f.close()
+ return status
def endPointVote(self):
self.getchan().msg("Voting has ended!")
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))
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
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()
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("[<user>]", "shows how many points you or someone has")
def points(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)
@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)
try:
qid = int(args[0])
del state.db['badqs'][qid]
- state.savedb()
bot.msg(user, "Removed report #%d" % (qid))
except:
bot.msg(user, "Failed!")
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")
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))
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))