import plugin, re, pluralslib, os.path from dictdata import DictData import importlib from bot import IRCLine importlib.reload(plugin) BOT = None def say(target,msg): if not BOT: return None BOT.socket.send(IRCLine("PRIVMSG",target,":"+msg)) milestones = DictData("counting_milestones.json") milestones_stack = [] if "stack" not in milestones else milestones["stack"] current_number = 7 if "current_num" not in milestones else milestones["current_num"] last_poster = " " if "last_poster" not in milestones else milestones["last_poster"] @plugin.group("milestone") def milestone(bot,channel,nick,subcmd,*args): if subcmd not in "add check dedupe list manual dist now next": say(channel,"{}: Usage: {}milestone [args]".format(nick,bot.prefix)) return True @milestone.command("dedupe") def dedupe(bot, channel, nick, subcmd, *args): milestones["stack"]=sorted(list(set(milestones["stack"]))) milestones["stack"]=[x for x in milestones["stack"] if x>current_number] @milestone.command("add") def add(bot,channel,nick,subcmd,*args): if len(args)<1: say(channel,"{}: Usage: {}milestone add [number number...]".format(nick,bot.prefix)) return try: milestones_stack.extend([int(x) for x in args]) milestones_stack.sort() while milestones_stack[0]current_number]))) except: say(channel,"ACCESS VIOLATION: Numbers must be integers") @milestone.command("dist") def dist(bot,channel,nick,subcmd,*args): try: number_to_check = int(args[0]) except ValueError: say(channel,"ACCESS VIOLATION: Invalid number "+args[0]) d = number_to_check-current_number if len(args)>1 and args[1]=="milestone": say(channel,"{}: The next milestone ({!s}) will be hit in {}".format(nick,number_to_check,pluralslib.plural(d,"number"))) else: say(channel,"{}: {!s} will be hit in {}".format(nick,number_to_check,pluralslib.plural(d,"number"))) @milestone.command("check") @milestone.command("next") def check(bot,channel,nick,subcmd,*args): if len(args)!=0: say(channel,"{}: Usage: {}milestone {}".format(nick,bot.prefix,subcmd)) return number_to_check = milestones_stack[0] if len(milestones_stack)>0 else None if number_to_check is None: say(channel,"{}: Please add a milestone by using {}milestone add ".format(nick,bot.prefix)) return dist(bot,channel,nick,"dist",str(number_to_check),"milestone") @milestone.command("list") def list_milestones(bot,channel,nick,subcmd,*args): say(channel,nick+": Upcoming milestones: {}".format(", ".join([str(x) for x in milestones["stack"][:10]]))) @milestone.command("now") def now(bot,channel,nick,subcmd,*args): say(channel,nick+": The correct next number is `{}`.".format(current_number+1)) def on_milestone(event): if not BOT: return None milestone(BOT,event.target,event.hostmask.nick,*event.parts) def listen_counting(event): if not BOT: return None bot = BOT channel = event.target nick = event.hostmask.nick msg = event.message if channel!="#counting" or (re.match("^\d+$",msg) is None): # if not in #counting or if not a number return global current_number, last_poster if int(msg)!=(current_number+1): say("#counting-meta","ERROR: {} attempted to enter {} (should be {})".format(nick,msg,str(current_number+1))) say(nick,"Hey, just wanted to let you know that you just put the wrong number in. Try putting {} in.".format(str(current_number+1))) return if last_poster==nick: say("#counting-meta","ERROR: {} went twice".format(nick)) say(nick,"Hey, just wanted to let you know that you can't go twice in #counting!") return current_number=int(msg) milestones["current_num"]=current_number last_poster=nick milestones["last_poster"]=last_poster if current_number in milestones_stack: milestones_stack.remove(current_number) milestones["stack"]=milestones_stack milestones[current_number]=nick say("#counting-meta","CONGRATS {} ON THE {} GET!".format(nick,current_number)) # if zipcode.has_zipcode(current_number) and current_number>10000: # plugin.cmds["zipcode"](bot,"#counting-meta","automated-trigger",str(current_number),"quiet") def register(bot): global BOT BOT = bot bot.event_manager.on("command_milestone",on_milestone) bot.event_manager.on("privmsg",listen_counting)