minerbot-phoenix/bot.py

93 lines
3.6 KiB
Python

import teambot, sys, traceback, requests, random, notes, words, markovuniverse
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>")
NOTEBOOK = notes.DatedNotebook()
NOTEBOOK.load("messages.json")
class MinerbotPhoenix(teambot.Handler):
def on_pubmsg(self,channel,nick,message):
if NOTEBOOK.checkNotes(nick):
for note in NOTEBOOK.readNotes(nick):
self.say(nick,note)
if not message.startswith(PREFIX): return
self.is_admin = self.event.source.userhost == BOTOP
args = message[len(PREFIX):].split(" ")
cmd = args.pop(0).lower()
if hasattr(self,"on_{}".format(cmd)):
try:
getattr(self,"on_{}".format(cmd))(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_admin(self,channel,nick,subcmd,*args):
if not self.is_admin: return
if subcmd=="down":
self._bot.die("Stopping...")
def on_rollcall(self,channel,nick,*a):
self.say(channel,nick+": Hey! I'm minerbot! Commands: !mbtilde, !note, !backronym, !kwam")
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_note(self,channel,nick,target,*msg):
msg = " ".join(msg)
NOTEBOOK.addNote(target,nick,msg)
NOTEBOOK.save("messages.json")
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")
def on_su(self,channel,nick,subcmd="help",*args):
if subcmd=="help":
self.say(channel,nick+": Current subcommands: !su fake-leak")
elif subcmd=="fake-leak":
self.say(channel,nick+": {} - {}".format(*markovuniverse.new_episode()))
if __name__=="__main__":
words.loadDict("american-english-small")
channels = "#bots".split()
bot = teambot.TeamBot(channels,"minerbot","localhost",chandler=MinerbotPhoenix)
bot.start()