116 lines
4.4 KiB
Python
116 lines
4.4 KiB
Python
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 <add/check/dedupe/list> [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 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:
|
|
n = milestones_stack.pop(0)
|
|
say(channel,"{}: Throwing out {!s} (already achieved)".format(nick,n))
|
|
milestones["stack"]=milestones_stack
|
|
dedupe(bot,channel,nick,"dedupe")
|
|
say(channel,"{}: Added {}.".format(nick,", ".join([x for x in args if int(x)>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 <number>".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)
|