+ 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")
+def top10(bot, user, chan, realtarget, *args):
+ if len(state.db['ranks']) == 0:
+ return bot.msg(state.db['chan'], "No one is ranked!")
+
+ max = len(state.db['ranks'])
+ if max > 10:
+ max = 10
+ replylist = ', '.join(["%s (%s) %s" % (person(x), country(x), pts(x)) for x in range(max)])
+ bot.msg(state.db['chan'], "Top 10: %s" % (replylist))
+
+@lib.hook(glevel=lib.ADMIN, needchan=False)
+@lib.help("<target score>", "changes the target score for this round")
+def settarget(bot, user, chan, realtarget, *args):
+ try:
+ state.db['target'] = int(args[0])
+ bot.msg(state.db['chan'], "Target has been changed to %s points!" % (state.db['target']))
+
+ if state.pointvote is not None:
+ state.pointvote.cancel()
+ state.pointvote = None
+ bot.msg(state.db['chan'], "Vote has been cancelled!")
+ except Exception as e:
+ print e
+ bot.msg(user, "Failed to set target.")
+
+@lib.hook(needchan=False)
+@lib.help("<option>", "votes for a trarget score for next round")
+def vote(bot, user, chan, realtarget, *args):
+ if state.pointvote is not None:
+ if int(args[0]) in state.voteamounts:
+ state.voteamounts[int(args[0])] += 1
+ bot.msg(user, "Your vote has been recorded.")
+ else:
+ bot.msg(user, "Sorry - that's not an option!")
+ else:
+ bot.msg(user, "There's no vote in progress.")
+
+@lib.hook(glevel=lib.ADMIN, needchan=False)
+@lib.help("<number>", "sets the max missed question before game stops")
+def maxmissed(bot, user, chan, realtarget, *args):
+ try:
+ state.db['maxmissedquestions'] = int(args[0])
+ bot.msg(state.db['chan'], "Max missed questions before round ends has been changed to %s." % (state.db['maxmissedquestions']))
+ except:
+ bot.msg(user, "Failed to set maxmissed.")
+
+@lib.hook(glevel=lib.ADMIN, needchan=False)
+@lib.help("<seconds>", "sets the time between hints")
+def hinttimer(bot, user, chan, realtarget, *args):
+ try:
+ state.db['hinttimer'] = float(args[0])
+ bot.msg(state.db['chan'], "Time between hints has been changed to %s." % (state.db['hinttimer']))
+ except:
+ bot.msg(user, "Failed to set hint timer.")
+
+@lib.hook(glevel=lib.ADMIN, needchan=False)
+@lib.help("<number>", "sets the number of hints given")
+def hintnum(bot, user, chan, realtarget, *args):
+ try:
+ state.db['hintnum'] = int(args[0])
+ bot.msg(state.db['chan'], "Max number of hints has been changed to %s." % (state.db['hintnum']))
+ except:
+ bot.msg(user, "Failed to set hintnum.")
+
+@lib.hook(glevel=lib.ADMIN, needchan=False)
+@lib.help("<seconds>", "sets the pause between questions")
+def questionpause(bot, user, chan, realtarget, *args):
+ try:
+ state.db['questionpause'] = float(args[0])
+ bot.msg(state.db['chan'], "Pause between questions has been changed to %s." % (state.db['questionpause']))
+ except:
+ bot.msg(user, "Failed to set questionpause.")
+
+@lib.hook(glevel=1, needchan=False)
+@lib.help("<full question>", "finds a qid given a complete question")
+def findq(bot, user, chan, realtarget, *args):
+ args = list(args)
+ if args[0][0] == "@":
+ cat = args.pop(0)[1:].lower()
+ questions = state.db['questions'][cat]
+ else:
+ questions = state.questions
+
+ if len(args) == 0:
+ bot.msg(user, "You need to specify the question.")
+ return
+
+ searchkey = ' '.join(args).lower()
+ matches = [str(i) for i in range(len(questions)) if questions[i][0].lower() == searchkey]
+ if len(matches) > 1:
+ bot.msg(user, "Multiple matches: %s" % (', '.join(matches)))
+ elif len(matches) == 1:
+ bot.msg(user, "One match: %s" % (matches[0]))
+ else:
+ bot.msg(user, "No match.")
+
+@lib.hook(glevel=1, needchan=False)
+@lib.help("[@<category>] <regex>", "finds a qid given a regex or partial question")
+def findqre(bot, user, chan, realtarget, *args):
+ args = list(args)
+ if args[0][0] == "@":
+ cat = args.pop(0)[1:].lower()
+ questions = state.db['questions'][cat]
+ else:
+ questions = state.questions
+
+ if len(args) == 0:
+ bot.msg(user, "You need to specify a search string.")
+ return
+
+ searcher = re.compile(' '.join(args), re.IGNORECASE)
+ matches = [str(i) for i in range(len(questions)) if searcher.search(questions[i][0]) is not None]
+ if len(matches) > 25:
+ bot.msg(user, "Too many matches! (>25)")
+ elif len(matches) > 1:
+ bot.msg(user, "Multiple matches: %s" % (', '.join(matches)))
+ elif len(matches) == 1:
+ bot.msg(user, "One match: %s" % (matches[0]))
+ else:
+ bot.msg(user, "No match.")
+
+@lib.hook(glevel=lib.STAFF, needchan=False)
+@lib.help("[@<category>] <qid>", "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] == "@":
+ cat = args.pop(0)[1:].lower()
+ questions = state.db['questions'][cat]
+ else:
+ questions = state.questions
+
+ try:
+ qid = int(args[0])
+ except:
+ bot.msg(user, "Specify a numeric question ID.")
+ return
+ try:
+ q = questions[qid]
+ except:
+ bot.msg(user, "ID not valid.")
+ return
+ bot.msg(user, "%s: %s*%s" % (qid, q[0], q[1]))
+
+@lib.hook(('delq', 'deleteq'), glevel=lib.STAFF, needchan=False)
+@lib.help("[@<category>] <qid>", "removes a question from the database")
+def delq(bot, user, chan, realtarget, *args):
+ args = list(args)
+ if args[0][0] == "@":
+ cat = args.pop(0)[1:].lower()
+ questions = state.db['questions'][cat]
+ else:
+ questions = state.questions
+
+ try:
+ backup = questions[int(args[0])]
+ del questions[int(args[0])]
+ bot.msg(user, "Deleted %s*%s" % (backup[0], backup[1]))
+ except:
+ bot.msg(user, "Couldn't delete that question. %r" % (e))
+
+@lib.hook(glevel=lib.STAFF, needchan=False)
+@lib.help("[@<category>] <q>*<a>", "adds a question")
+def addq(bot, user, chan, realtarget, *args):
+ args = list(args)
+ if args[0][0] == "@":
+ cat = args.pop(0)[1:].lower()
+ questions = state.db['questions'][cat]
+ else:
+ questions = state.questions