add command groups

This commit is contained in:
minerobber 2019-01-10 14:51:11 +00:00
parent 20af75d6c2
commit 9dd3680825
3 changed files with 100 additions and 58 deletions

View File

@ -2,6 +2,26 @@ cmds = {}
help = {}
listeners = {}
class CommandGroup:
def __init__(self,f,default="help"):
self.base = f
self.subcmds = {}
self.default = default
def command(self,name):
def _register_subcmd(f):
self.subcmds[name]=f
return f
return _register_subcmd
def __call__(self,bot,channel,nick,subcmd,*args):
print("Calling base")
if self.base(bot,channel,nick,subcmd,*args):
return
print("Calling subcommand {}".format(subcmd if subcmd in self.subcmds else self.default))
if subcmd in self.subcmds:
return self.subcmds[subcmd](bot,channel,nick,subcmd,*args)
else:
return self.subcmds[self.default](bot,channel,nick,subcmd,*args)
def clear():
cmds.clear()
help.clear()
@ -14,6 +34,14 @@ def command(name,helptext="No help available for this command."):
return func
return _register_cmd
def group(name,helptext=""):
def _register_group(f):
gr = CommandGroup(f)
cmds[name]=gr
help[name]=helptext
return gr
return _register_group
def listener(name):
def _register_cmd(func):
listeners[name]=func

View File

@ -1,42 +1,73 @@
import requests,plugin,subprocess
from math import floor
@plugin.command("mbtilde","<operation> [args]")
def on_mbtilde(bot,channel,nick,subcmd,*args):
@plugin.group("mbtilde","<operation> [args]")
def mbtilde(bot,channel,nick,subcmd,*args):
for arg in args:
if (arg.isdigit() and int(arg)>100 and subcmd!="factor"):
bot.say(channel,"no u")
return
if subcmd=="ask":
bot.say(channel,"!tilde")
elif subcmd=="parrot":
bot.say(channel," ".join(args))
elif subcmd=="add" and len(args)==2:
bot.say(channel,str(int(args[0])+int(args[1])))
elif subcmd=="sub" and len(args)==2:
bot.say(channel,str(int(args[0])-int(args[1])))
elif subcmd=="mult" and len(args)==2:
bot.say(channel,str(int(args[0])*int(args[1])))
elif subcmd=="div" and len(args)==2:
bot.say(channel,str(floor(int(args[0])/int(args[1]))))
elif subcmd=="mod" and len(args)==2:
bot.say(channel,str(int(args[0])%int(args[1])))
elif subcmd=="pow" and len(args)==2:
bot.say(channel,str(int(args[0])**int(args[1])))
elif subcmd=="alphabetize" and len(args)==4:
num = int(args[0])-1
texts = [args[x] for x in range(1,4)]
texts.sort()
bot.say(channel,texts[num])
elif subcmd=="unscramble" and len(args)==1:
r = requests.get("http://anagramica.com/best/{}".format(args[0]))
r.raise_for_status()
r = r.json()
if len(r["best"])==0:
bot.say(channel,args[0])
elif len(r["best"])==1:
bot.say(channel,r["best"][0])
else:
bot.say(channel,r["best"][0])
elif subcmd=="factor" and len(args)==1:
bot.say(channel,subprocess.check_output(["/usr/bin/factor",str(args[0])]).decode("ascii").split(": ")[1].replace(" ",",").strip())
return True
if subcmd in "add sub mult div mod pow".split() and len(args)!=2:
return True
elif subcmd in "unscramble factor".split() and len(args)!=1:
return True
return False
@mbtilde.command("help")
def help(bot,channel,nick,subcmd,*args):
bot.say(channel,"{}: Usage: !{} <{}>".format(nick,bot.cmd,"|".join(sorted(list(mbtilde.subcmds.keys())))))
@mbtilde.command("ask")
def ask(bot,channel,nick,subcmd,*args):
bot.say(channel,"!tilde")
@mbtilde.command("parrot")
def parrot(bot,channel,nick,subcmd,*args):
bot.say(channel," ".join(args))
@mbtilde.command("add")
def add(bot,channel,nick,subcmd,*args):
bot.say(channel,str(int(args[0])+int(args[1])))
@mbtilde.command("sub")
def sub(bot,channel,nick,subcmd,*args):
bot.say(channel,str(int(args[0])-int(args[1])))
@mbtilde.command("mult")
def mult(bot,channel,nick,subcmd,*args):
bot.say(channel,str(int(args[0])*int(args[1])))
@mbtilde.command("div")
def div(bot,channel,nick,subcmd,*args):
bot.say(channel,str(floor(int(args[0])/int(args[1]))))
@mbtilde.command("mod")
def mod(bot,channel,nick,subcmd,*args):
bot.say(channel,str(int(args[0])%int(args[1])))
@mbtilde.command("pow")
def pow(bot,channel,nick,subcmd,*args):
bot.say(channel,str(int(args[0])**int(args[1])))
@mbtilde.command("alphabetize")
def alphabetize(bot,channel,nick,subcmd,*args):
num = int(args[0])-1
texts = [args[x] for x in range(1,4)]
texts.sort()
bot.say(channel,texts[num])
@mbtilde.command("unscramble")
def unscramble(bot,channel,nick,subcmd,*args):
r = requests.get("http://anagramica.com/best/{}".format(args[0]))
r.raise_for_status()
r = r.json()
if len(r["best"])==0:
bot.say(channel,args[0])
# elif len(r["best"])==1:
# bot.say(channel,r["best"][0])
else:
bot.say(channel,r["best"][0])
@mbtilde.command("factor")
def factor(bot,channel,nick,subcmd,*args):
bot.say(channel,subprocess.check_output(["/usr/bin/factor",str(args[0])]).decode("ascii").split(": ")[1].replace(" ",",").strip())

View File

@ -1,32 +1,15 @@
import markovuniverse,plugin,sys
SUBCMDS = dict()
USAGE = dict()
def reg_subcmd(name,format=""):
def _register(func):
SUBCMDS[name]=func
USAGE[name]=" ".join(filter(None,[name,format]))
return _register
@plugin.command("stevenuniverse","<subcmd> [args]")
@plugin.group("stevenuniverse","<subcmd> [args]")
def stevenuniverse(bot,channel,nick,subcmd=None,*args):
if not subcmd: subcmd = "help"
if subcmd not in SUBCMDS: subcmd = "help"
try:
SUBCMDS[subcmd](bot,channel,nick,*args)
except TypeError:
bot.say("Usage: !{} {}".format(bot.cmd,USAGE[subcmd]))
except:
print("!{} {} {}".format(bot.cmd,subcmd," ".join(args)))
raise
return False
plugin.alias("su","stevenuniverse")
@reg_subcmd("help")
@stevenuniverse.command("help")
def help(bot,channel,nick,*a):
bot.say(channel,"{}: Current !{} subcommands are {}".format(nick,bot.cmd,", ".join(SUBCMDS.keys())))
bot.say(channel,"{}: Current !{} subcommands are {}".format(nick,bot.cmd,", ".join(stevenuniverse.subcmds.keys())))
@reg_subcmd("fake-leak")
@stevenuniverse.command("fake-leak")
def fakeleak(bot,channel,nick,*a):
bot.say(channel,nick+": {} - {}".format(*markovuniverse.new_episode()))