minerbot-phoenix/bot.py

88 lines
3.3 KiB
Python

import teambot, sys, traceback, requests, random, words, imp, plugin, os
from titlecase import titlecase
BOTOP = "~minerobber@127.0.0.1"
PREFIX = "!"
HELP = dict(admin="GO AWAY YOU DINKLEBERG",rollcall="hmmst",mbtilde="<ask/add/sub/mult/div/alphabetize/pow/unscramble> [args]",note="<target> <message>",backronym="<word to backronym>",stevenuniverse="<help/fake-leak> [args]")
HELP["su"]=HELP["stevenuniverse"]
class MinerbotPhoenix(teambot.Handler):
def load_module(self,modname):
try:
fp, pathname, desc = imp.find_module(modname,["plugins"])
imp.load_module(modname,fp,pathname,desc)
except:
print("Unable to load plugin {}".format(modname))
traceback.print_exc()
def on_pubmsg(self,channel,nick,message):
for listener in plugin.listeners:
plugin.listeners[listener](self,channel,nick,message)
if not message.startswith(PREFIX): return
self.is_admin = self.event.source.userhost == BOTOP
args = message[len(PREFIX):].split(" ")
cmd = args.pop(0).lower()
self.cmd = cmd
if cmd in plugin.cmds:
try:
plugin.cmds[cmd](self,channel,nick,*args)
except ValueError:
self.say(channel,"Usage: {}{} {}".format(PREFIX,cmd,HELP.get(cmd,"")))
except Exception as e:
errcls,err,tb = sys.exc_info()
self.say(channel,"ACCESS VIOLATION: "+traceback.format_exception_only(errcls,err)[0].strip())
print("On command `{}{} {}` by {}:".format(PREFIX,cmd," ".join(args),self.event.source))
traceback.print_exc()
def on_mbtilde(self,channel,nick,subcmd,*args):
# if channel != "#bots":
# self.say(channel,"{}: tildes are only awarded in #bots.")
# return
if subcmd=="ask":
self.say(channel,"!tilde")
elif subcmd=="parrot":
self.say(channel," ".join(args))
elif subcmd=="add" and len(args)==2:
self.say(channel,str(int(args[0])+int(args[1])))
elif subcmd=="sub" and len(args)==2:
self.say(channel,str(int(args[0])-int(args[1])))
elif subcmd=="mult" and len(args)==2:
self.say(channel,str(int(args[0])*int(args[1])))
elif subcmd=="div" and len(args)==2:
self.say(channel,str(int(args[0])/int(args[1])))
elif subcmd=="mod" and len(args)==2:
self.say(channel,str(int(args[0])%int(args[1])))
elif subcmd=="pow" and len(args)==2:
self.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()
self.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:
self.say(channel,args[0])
elif len(r["best"])==1:
self.say(channel,r["best"][0])
else:
# self.say(channel,random.choice(r["best"]))
self.say(channel,r["best"][0])
def on_backronym(self,channel,nick,word):
result = []
for char in word:
result.append(random.choice(words.getWords("^{}.*".format(char))))
self.say(channel,nick+": "+titlecase(" ".join(result)))
def on_kwam(self,channel,nick,*a):
self.on_backronym(channel,nick,"kwam")
if __name__=="__main__":
words.loadDict("words")
# print(list(filter(lambda x: x.startswith("on_"),dir(MinerbotPhoenix))))
channels = "#khuxkm-bots".split()
bot = teambot.TeamBot(channels,"minerbot","localhost",chandler=MinerbotPhoenix)
for name in os.listdir("plugins"):
if name.endswith(".py"):
bot.handler.load_module(name[:-3])
bot.start()