Esempio n. 1
0
    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()