minerbot2/plugin.py

80 lines
2.0 KiB
Python

import json, traceback
help = {}
class CommandGroup:
def __init__(self,f,default="help"):
self.base = f
self.subcmds = {}
self.subcmds_help = {}
self.default = default
def command(self,name,help=""):
self.subcmds_help[name]=help
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)
return
class Data:
"""A class for plugin data."""
def __init__(self,value):
self.value = value
def serialize(self):
return self.value
def deserialize(self,value):
self.value = value
def save(self,filename):
with open(filename,"w") as f:
f.write(self.serialize())
def load(self,filename):
try:
with open(filename) as f:
self.deserialize(f.read())
except:
print("Error loading data from {!r}:".format(filename))
traceback.print_exc()
pass # You should've initialized this with a sane default, so just keep the default on error
class JSONData(Data):
"""Data, but can be serialized to JSON (and should be)."""
def serialize(self):
return json.dumps(self.value)
def deserialize(self,value):
self.value = json.loads(value)
def clear():
cmds.clear()
help.clear()
listeners.clear()
#def command(name,helptext="No help available for this command."):
# def _register_cmd(func):
# cmds[name]=func
# help[name]=helptext
# return func
# return _register_cmd
def group(name,helptext=""):
def _register_group(f):
gr = CommandGroup(f)
return gr
return _register_group
def listener(name):
def _register_cmd(func):
listeners[name]=func
return func
return _register_cmd
def alias(name,target):
cmds[name]=cmds[target]
help[name]=help[target]