import slixmpp import logging from systemd.journal import JournalHandler from hintTables import annecdotetable, topictable from commands import commandtable # Logging log = logging.getLogger(__name__) log.addHandler(JournalHandler()) log.setLevel(logging.INFO) class MUCBot(slixmpp.ClientXMPP): def __init__(self, jid, password, rooms, nick): slixmpp.ClientXMPP.__init__(self, jid + "/Isengard", password) self.rooms = rooms self.nick = nick # Per channel owners self.owners = {} self.datastore = None # The session_start event will be triggered when # the bot establishes its connection with the server # and the XML streams are ready for use. We want to # listen for this event so that we we can initialize # our roster. self.add_event_handler("session_start", self.start) # The groupchat_message event is triggered whenever a message # stanza is received from any chat room. If you also also # register a handler for the 'message' event, MUC messages # will be processed by both handlers. self.add_event_handler("groupchat_message", self.muc_message) # The groupchat_presence event is triggered whenever a # presence stanza is received from any chat room, including # any presences you send yourself. To limit event handling # to a single room, use the events muc::room@server::presence, # muc::room@server::got_online, or muc::room@server::got_offline. self.add_event_handler("muc::%s::got_online" % self.room, self.muc_online) async def start(self, event): """ Requestthe roster and broadcast initial presence stanza. """ await self.get_roster() self.send_presence() self.plugin['xep_0045'].join_muc(self.rooms[0], self.nick, # password=the_room_password, ) def push(self, destmuc, msg): self.send_message( mto=destmuc, mbody=msg, mtype='groupchat') print("To: %s\nBody: %s" % (destmuc, msg)) def muc_message(self, msg): """ Whenever the bot's nickname is mentioned, respond to the message from any muc """ if msg['mucnick'] == self.nick: return # Commands cmdhints = list(commandtable.keys()) random.shuffle(cmdhints) for opcod in cmdhints: if msg['body'][0] == "!" and opcod in msg['body']: self.send_message(mto=msg['from'].bare, mbody="%s, %s" % (msg['mucnick'], commandtable[opcod](self.owners[msg['from'].bare], msg['mucnick'], msg['body'], self.datastore)), mtype='groupchat') return # When people speak to each other without necessarily highlighting Isengard anechints = list(annecdotetable.keys()) random.shuffle(anechints) for hint in anechints: if hint in msg['body']: self.send_message(mto=msg['from'].bare, mbody="%s" % (annecdotetable[hint][ random.randrange(0,len(annecdotetable[hint])) ]), mtype='groupchat') return if self.nick not in msg['body']: return # When people talk to Isengard topichints = list(topictable.keys()) random.shuffle(topichints) for hint in topichints: if hint in msg['body']: self.send_message(mto=msg['from'].bare, mbody="%s, %s" % (msg['mucnick'], topictable[hint][ random.randrange(0,len(topictable[hint])) ]), mtype='groupchat') return # And fallback self.send_message(mto=msg['from'].bare, mbody="%s, je n'ai pas compris (je suis un peu bot)" % msg['mucnick'], mtype='groupchat') def muc_online(self, presence): """ Send a welcome message that includes the user's nickname """ if presence['muc']['nick'] in self.datastore.maintainerData: self.send_message(mto=presence['from'].bare, mbody="Salut %s, vos services ont produit des " + "alertes en votre absence !\nUtilisez la commande"+ " `hist` pour consulter l'historique" % (presence['muc']['nick']), mtype='groupchat') if presence['muc']['affiliation'] == "owner": if not presence['from'].bare in self.owners: self.owners[presence['from'].bare] = [] self.owners[presence['from'].bare].append(presence['muc']['nick'])