X-Git-Url: https://jfr.im/git/erebus.git/blobdiff_plain/e227969cbc199db053faf836c8c911e1a75241d3..4b5f28dde311d1f8cc5cce200329207e95f4d8f0:/modules/trivia.py diff --git a/modules/trivia.py b/modules/trivia.py index dfa0b7d..1f949bd 100644 --- a/modules/trivia.py +++ b/modules/trivia.py @@ -6,7 +6,7 @@ modinfo = { 'author': 'Erebus Team', 'license': 'public domain', - 'compatible': [1,2], + 'compatible': [2], 'depends': ['userinfo'], 'softdeps': ['help'], } @@ -99,8 +99,8 @@ class TriviaState(object): else: self.pointvote = None - def __del__(self): - self.closeshop() +# def __del__(self): +# self.closeshop() def closeshop(self): try: self.steptimer.cancel() @@ -110,14 +110,6 @@ class TriviaState(object): 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: @@ -138,7 +130,7 @@ class TriviaState(object): os.unlink(tmpfn) except OSError: # temp file is already gone pass - raise #TODO: we may be better off just swallowing exceptions? + raise # we may be better off just swallowing exceptions? return False def getchan(self): @@ -269,9 +261,9 @@ class TriviaState(object): if 'topicformat' in self.db and self.db['topicformat'] is not None: self.getbot().conn.send("TOPIC %s" % (self.db['chan'])) - if isinstance(self.steptimer, threading._Timer): + if isinstance(self.steptimer, MyTimer): self.steptimer.cancel() - if isinstance(self.nextquestiontimer, threading._Timer): + if isinstance(self.nextquestiontimer, MyTimer): self.nextquestiontimer.cancel() self.nextquestiontimer = None @@ -302,11 +294,11 @@ class TriviaState(object): nextqid = random.randrange(0, len(self.questions)) nextq = self.questions[nextqid] - if nextq[0][0] == "!": + if nextq[0].startswith("!"): nextqid = None nextq = specialQuestion(nextq) - if len(nextq) > 2 and nextq[2] - time.time() < 7*24*60*60 and iteration < 10: + if len(nextq) > 2 and time.time() - nextq[2] < 7*24*60*60 and iteration < 10: return self._nextquestion(iteration=iteration+1) #short-circuit to pick another question if len(nextq) > 2: nextq[2] = time.time() @@ -419,10 +411,10 @@ def trivia_checkanswer(bot, user, chan, *args): 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.hook(glevel=1, needchan=False, wantchan=True) @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 + if chan is not None: replyto = chan else: replyto = user if state.savedb(): @@ -430,10 +422,10 @@ def save(bot, user, chan, realtarget, *args): else: bot.msg(replyto, "Save failed!") -@lib.hook(needchan=False) +@lib.hook(needchan=False, wantchan=True) @lib.help("[]", "shows how many points you or someone has") def points(bot, user, chan, realtarget, *args): - if chan is not None and realtarget == chan.name: replyto = chan + if chan is not None: eplyto = chan else: replyto = user if len(args) != 0: who = args[0] @@ -474,7 +466,7 @@ def setnextid(bot, user, chan, realtarget, *args): @lib.argsGE(1) def setnext(bot, user, chan, realtarget, *args): line = ' '.join([str(arg) for arg in args]) - linepieces = line.split('*') + linepieces = line.split('*', 1) if len(linepieces) < 2: bot.msg(user, "Error: need *") return @@ -488,10 +480,10 @@ def setnext(bot, user, chan, realtarget, *args): def skip(bot, user, chan, realtarget, *args): state.nextquestion(qskipped=True, skipwait=True) -@lib.hook(needchan=False) +@lib.hook(needchan=False, wantchan=True) @lib.help(None, "starts the trivia game") def start(bot, user, chan, realtarget, *args): - if chan is not None and realtarget == chan.name: replyto = chan + if chan is not None: replyto = chan else: replyto = user if chan is not None and chan.name != state.db['chan']: @@ -576,10 +568,10 @@ def delbadq(bot, user, chan, realtarget, *args): except: bot.msg(user, "Failed!") -@lib.hook(needchan=False) +@lib.hook(needchan=False, wantchan=True) @lib.help("[]", "shows you or someone else's rank") def rank(bot, user, chan, realtarget, *args): - if chan is not None and realtarget == chan.name: replyto = chan + if chan is not None: replyto = chan else: replyto = user if len(args) != 0: who = args[0] @@ -666,7 +658,7 @@ def questionpause(bot, user, chan, realtarget, *args): @lib.help("", "finds a qid given a complete question") def findq(bot, user, chan, realtarget, *args): args = list(args) - if args[0][0] == "@": + if args[0].startswith("@"): cat = args.pop(0)[1:].lower() questions = state.db['questions'][cat] else: @@ -689,7 +681,7 @@ def findq(bot, user, chan, realtarget, *args): @lib.help("[@] ", "finds a qid given a regex or partial question") def findqre(bot, user, chan, realtarget, *args): args = list(args) - if args[0][0] == "@": + if args[0].startswith("@"): cat = args.pop(0)[1:].lower() questions = state.db['questions'][cat] else: @@ -714,7 +706,7 @@ def findqre(bot, user, chan, realtarget, *args): @lib.help("[@] ", "displays the q*a for a qid", "category defaults to current") def showq(bot, user, chan, realtarget, *args): args = list(args) - if args[0][0] == "@": + if args[0].startswith("@"): cat = args.pop(0)[1:].lower() questions = state.db['questions'][cat] else: @@ -736,7 +728,7 @@ def showq(bot, user, chan, realtarget, *args): @lib.help("[@] ", "removes a question from the database") def delq(bot, user, chan, realtarget, *args): args = list(args) - if args[0][0] == "@": + if args[0].startswith("@"): cat = args.pop(0)[1:].lower() questions = state.db['questions'][cat] else: @@ -753,14 +745,14 @@ def delq(bot, user, chan, realtarget, *args): @lib.help("[@] *", "adds a question") def addq(bot, user, chan, realtarget, *args): args = list(args) - if args[0][0] == "@": + if args[0].startswith("@"): cat = args.pop(0)[1:].lower() questions = state.db['questions'][cat] else: questions = state.questions line = ' '.join([str(arg) for arg in args]) - linepieces = line.split('*') + linepieces = line.split('*', 1) if len(linepieces) < 2: bot.msg(user, "Error: need *") return @@ -769,6 +761,11 @@ def addq(bot, user, chan, realtarget, *args): questions.append([question, answer]) bot.msg(user, "Done. Question is #%s" % (len(questions)-1)) +@lib.hook(needchan=False) +@lib.help(None, "show current category") +def showcat(bot, user, chan, realtarget, *args): + bot.msg(user, "Current category: %s" % (state.db['category'])) + @lib.hook(glevel=1, needchan=False) @lib.help("", "change category") def setcat(bot, user, chan, realtarget, *args): @@ -781,9 +778,9 @@ def setcat(bot, user, chan, realtarget, *args): bot.msg(user, "That category doesn't exist.") @lib.hook(needchan=False) -@lib.help(None, "list categories") +@lib.help(None, "list categories", "the current category will be marked with a *") def listcats(bot, user, chan, realtarget, *args): - cats = ["%s (%d)" % (c, len(state.db['questions'][c])) for c in state.db['questions'].keys()] + cats = ["%s%s (%d)" % ("*" if c == state.db['category'] else "", c, len(state.db['questions'][c])) for c in state.db['questions'].keys()] bot.msg(user, "Categories: %s" % (', '.join(cats))) @lib.hook(glevel=lib.STAFF, needchan=False) @@ -841,7 +838,8 @@ def triviahelp(bot, user, chan, realtarget, *args): @lib.hooknum(417) def num_417(bot, textline): # bot.fastmsg(state.db['chan'], "Whoops, it looks like that question didn't quite go through! (E:417). Let's try another...") - state.nextquestion(qskipped=False, skipwait=True) + if state.curq is not None: + state.nextquestion(qskipped=False, skipwait=True) @lib.hooknum(332) def num_TOPIC(bot, textline): @@ -873,6 +871,7 @@ def num_TOPIC(bot, textline): 'lastwinner': state.db['lastwinner'], 'lastwon': time.strftime("%b %d", time.gmtime(state.db['lastwon'])), 'target': state.db['target'], + 'category': state.db['category'], } if gottopic != formatted: state.getbot().conn.send("TOPIC %s :%s" % (state.db['chan'], formatted)) @@ -886,16 +885,50 @@ def specialQuestion(oldq): newq[0] = "What month is it currently (in UTC)?" newq[1] = time.strftime("%B", time.gmtime()).lower() elif qtype == "!MATH+": - randnum1 = random.randrange(0, 11) - randnum2 = random.randrange(0, 11) + try: + maxnum = int(oldq[1]) + except ValueError: + maxnum = 10 + randnum1 = random.randrange(0, maxnum+1) + randnum2 = random.randrange(0, maxnum+1) newq[0] = "What is %d + %d?" % (randnum1, randnum2) newq[1] = spellout(randnum1+randnum2) + elif qtype == "!ALGEBRA+": + try: + num1, num2 = [int(i) for i in oldq[1].split('!')] + except ValueError: + num1, num2 = 10, 10 + randnum1 = random.randrange(0, num1+1) + randnum2 = random.randrange(randnum1, num2+1) + newq[0] = "What is x? %d = %d + x" % (randnum2, randnum1) + newq[1] = spellout(randnum2-randnum1) else: pass #default to not modifying return newq def spellout(num): - return [ - "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", - "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", - "sixteen", "seventeen", "eighteen", "nineteen", "twenty" - ][num] + ones = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'] + teens = ['ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'] + tens = ['', '', 'twenty', 'thirty', 'fourty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'] + + if num == 0: + return 'zero' + + ihundreds = num / 100 + itens = num % 100 / 10 + iones = num % 10 + buf = [] + + if ihundreds > 0: + buf.append("%s hundred" % (ones[ihundreds])) + if itens > 1: + buf.append(tens[itens]) + if itens == 1: + buf.append(teens[iones]) + elif iones > 0: + buf.append(ones[iones]) + return ' '.join(buf) +# return [ +# "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", +# "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", +# "sixteen", "seventeen", "eighteen", "nineteen", "twenty" +# ][num]