Esempio n. 1
0
    def __init__(self, config=None, *, plugins: Sequence[Type[Plugin]] = None, loop=None):
        # Record available plugins
        if plugins is None:
            self.available_plugins = build_plugin_dict(find_plugins())
        else:
            self.available_plugins = build_plugin_dict(plugins)

        # Load configuration
        self.config_root = config
        if self.config_root is None:
            self.config_root = {}
        if not isinstance(self.config_root, collections.abc.Mapping):
            raise TypeError("expected 'config' to be a dict-like object")

        # Initialise plugin
        SpecialPlugin.__init__(self, self)

        # Initialise IRCClient from Bot configuration
        IRCClient.__init__(
            self,
            loop=loop,
            ircv3=self.config.ircv3,
            nick=self.config.nickname,
            username=self.config.username,
            host=self.config.irc_host,
            port=self.config.irc_port,
            password=self.config.password,
            auth_method=self.config.auth_method,
            bind_addr=self.config.bind_addr,
            client_ping_enabled=(self.config.client_ping > 0),
            client_ping_interval=self.config.client_ping,
            rate_limit_enabled=(self.config.rate_limit_period > 0 and
                                self.config.rate_limit_count > 0),
            rate_limit_period=self.config.rate_limit_period,
            rate_limit_count=self.config.rate_limit_count,
        )

        self._recent_messages = collections.deque(maxlen=10)

        # Plumb in reply(...) method
        if self.config.use_notice:
            self.reply = self.notice
        else:
            self.reply = self.msg

        # Plugin management
        self.plugins = PluginManager([self], self.available_plugins,
                                     self.config.plugins,
                                     [self])
        self.commands = {}

        # Event runner
        self.events = events.HybridEventRunner(self._get_hooks, self.loop)

        # Keeps partial name lists between RPL_NAMREPLY and
        # RPL_ENDOFNAMES events
        self.names_accumulator = collections.defaultdict(list)