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)