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=" [args]",note=" ",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()