import asyncio import logging import slixmpp from getpass import getpass from argparse import ArgumentParser from slixmpp import ClientXMPP """ This bot announces when someone enters or leaves the space. On line 39, you can edit the message when someone enters by editing what goes after 'mbody="': mbody="%s has just entered..." % (presence['muc']['nick']), On line 45, you can edit the message when someone leaves by editing what goes after 'mbody="': mbody="%s has just left..." % (presence['muc']['nick']), To run this bot, type the following command in your terminal: python3 usher.py -d -j administratorbot@conversejs.org -r botsofconduct@muc.vvvvvvaria.org -n usherbot -p testing """ class MUCBot(slixmpp.ClientXMPP): def __init__(self, jid, password, room, nick): slixmpp.ClientXMPP.__init__(self, jid, password) self.room = room self.nick = nick self.add_event_handler("session_start", self.start) self.add_event_handler("muc::%s::got_online" % self.room, self.muc_online) self.add_event_handler("muc::%s::got_offline" % self.room, self.muc_offline) def start(self, event): self.get_roster() self.send_presence() self.plugin['xep_0045'].join_muc(self.room, self.nick, wait=True) def muc_online(self, presence): if presence['muc']['nick'] != self.nick: self.send_message(mto=presence['from'].bare, mbody="%s has just entered..." % (presence['muc']['nick']), mtype='groupchat') def muc_offline(self, presence): if presence['muc']['nick'] != self.nick: self.send_message(mto=presence['from'].bare, mbody="%s has just left..." % (presence['muc']['nick']), mtype='groupchat') if __name__ == '__main__': # Setup the command line arguments. parser = ArgumentParser() # Output verbosity options. parser.add_argument("-q", "--quiet", help="set logging to ERROR", action="store_const", dest="loglevel", const=logging.ERROR, default=logging.INFO) parser.add_argument("-d", "--debug", help="set logging to DEBUG", action="store_const", dest="loglevel", const=logging.DEBUG, default=logging.INFO) # JID and password options. parser.add_argument("-j", "--jid", dest="jid", help="JID to use") parser.add_argument("-p", "--password", dest="password", help="password to use") parser.add_argument("-r", "--room", dest="room", help="MUC room to join") parser.add_argument("-n", "--nick", dest="nick", help="MUC nickname") args = parser.parse_args() # Setup logging. logging.basicConfig(level=args.loglevel, format='%(levelname)-8s %(message)s') if args.jid is None: args.jid = input("Username: ") if args.password is None: args.password = getpass("Password: ") if args.room is None: args.room = input("MUC room: ") if args.nick is None: args.nick = input("MUC nickname: ") # Setup the MUCBot and register plugins. Note that while plugins may # have interdependencies, the order in which you register them does # not matter. xmpp = MUCBot(args.jid, args.password, args.room, args.nick) xmpp.register_plugin('xep_0030') # Service Discovery xmpp.register_plugin('xep_0045') # Multi-User Chat xmpp.register_plugin('xep_0199') # XMPP Ping # Connect to the XMPP server and start processing XMPP stanzas. xmpp.connect() xmpp.process() """ Slixmpp: The Slick XMPP Library Copyright (C) 2010 Nathanael C. Fritz This file is part of Slixmpp. See the file LICENSE for copying permission. https://lab.louiz.org/poezio/slixmpp/blob/master/LICENSE The code has been modified at various times, by various people. This version was edited for the Collective Conditions work session in Brussels, 2019, by Varia. http://constantvzw.org/site/-Collective-Conditions,220-.html """