minerbot2/plugins/counting.py

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)