def _load_config(self, config, init=False): """ Load bot settings from config object. The init parameter indicates whether this is a first-time initialization or a reload. """ logger.info('Configuring jabber bot') xmpp_config = dict(config.items('xmpp')) # Get DB file if config.has_option('global', 'dbfile'): dbfile = config.get('global', 'dbfile') if dbfile: self.db_enable(LudolphDB(dbfile), init=True) # Get nick name nick = xmpp_config.get('nick', '').strip() if nick: self.nick = nick # Warning: do not change the nick during runtime after this # If you are working with an OpenFire server, you will # need to use a different SSL version: if config.has_option('xmpp', 'sslv3') and config.getboolean( 'xmpp', 'sslv3'): # noinspection PyUnresolvedReferences self.client.ssl_version = ssl.PROTOCOL_SSLv3 # Users self.users.clear() self.users.update(self.read_jid_array(xmpp_config, 'users')) logger.info('Current users: %s', ', '.join(self.users)) # Admins self.admins.clear() self.admins.update( self.read_jid_array(xmpp_config, 'admins', users=self.users)) logger.info('Current admins: %s', ', '.join(self.admins)) # Broadcast blacklist self.broadcast_blacklist.clear() self.broadcast_blacklist.update( self.read_jid_array(xmpp_config, 'broadcast_blacklist', admins=self.admins)) logger.info('Broadcast blacklist: %s', ', '.join(self.broadcast_blacklist)) # Admins vs. users if not self.admins.issubset(self.users): for i in self.admins.difference(self.users): logger.error( 'Admin "%s" is not specified in users. ' 'This may lead to unexpected behaviour.', i) # MUC room room = xmpp_config.get('room', '').strip() if room: self.room = room self.room_jid = '%s/%s' % (self.room, self.nick) else: self.room = None self.room_jid = None # MUC room invites sending if config.has_option('xmpp', 'room_invites'): self.room_invites = config.getboolean('xmpp', 'room_invites') else: self.room_invites = LudolphBot.room_invites # MUC room affiliations and roles valid_affiliations = ('owner', 'admin', 'member', 'outcast', 'none') valid_roles = ('moderator', 'participant', 'visitor', 'none') for setting, valid_values in (('room_bot_affiliation', valid_affiliations), ('room_user_affiliation', valid_affiliations), ('room_admin_affiliation', valid_affiliations), ('room_bot_role', valid_roles), ('room_user_role', valid_roles), ('room_admin_role', valid_roles)): config_value = xmpp_config.get(setting, getattr(LudolphBot, setting)).strip() if config_value: if config_value not in valid_values: logger.error( 'Invalid value "%s" for "%s" setting. Must be one of: %s.', config_value, setting, ','.join(valid_values)) config_value = None else: config_value = None setattr(self, setting, config_value) # MUC room users self.room_users.clear() if self.room: self.room_users.update( self.read_jid_array(xmpp_config, 'room_users', users=self.users, admins=self.admins)) logger.info('Current room users: %s', ', '.join(self.room_users)) # MUC room admins self.room_admins.clear() if self.room: self.room_admins.update( self.read_jid_array(xmpp_config, 'room_admins', users=self.users, admins=self.admins, room_users=self.room_users)) logger.info('Current room admins: %s', ', '.join(self.room_admins)) # Room admins vs. users if not self.room_admins.issubset(self.room_users): for i in self.room_admins.difference(self.room_users): logger.error( 'Room admin "%s" is not specified in room_users. ' 'This may lead to unexpected behaviour.', i) # Room users vs. room_users_invited if self.room_users_invited: self.room_users_invited.intersection_update(self.room_users) # Web server (any change in configuration requires restart) if init and not self.webserver: if config.has_option('webserver', 'host') and config.has_option( 'webserver', 'port'): host = config.get('webserver', 'host').strip() port = config.getint('webserver', 'port') if host and port: # Enable server (will be started in __init__) self.webserver = WebServer(host, port) # Cron (any change in configuration requires restart) if init and not self.cron: if config.has_option('cron', 'enabled') and config.getboolean( 'cron', 'enabled'): self.cron = Cron(db=self.db) if self._reloaded: if self.cron and self.db is None: # DB support was disabled during reload self.cron.db_disable()