Exemplo n.º 1
0
class Charfred(commands.Bot):
    def __init__(self):
        super().__init__(command_prefix=_get_prefixes,
                         description=description,
                         pm_help=False,
                         intents=Intents.all())
        self.session = aiohttp.ClientSession(loop=self.loop)

        self.dir = Path(__file__).parent
        self.cfg = Config(f'{self.dir}/configs/botCfg.toml',
                          load=True,
                          loop=self.loop)
        if 'prefix' not in self.cfg:
            self.cfg['prefix'] = {}
        if 'nodes' not in self.cfg:
            self.cfg['nodes'] = {}
        if 'hierarchy' not in self.cfg:
            self.cfg['hierarchy'] = []
        if 'cogcfgs' not in self.cfg:
            self.cfg['cogcfgs'] = {}
        self.cfg._save()

        self.keywords = Config(
            f'{self.dir}/configs/keywords.json',
            load=True,
            loop=self.loop,
            default=f'{self.dir}/configs/keywords.json_default')

        try:
            os.chdir(self.dir)
            for admincog in _admincogs('admincogs'):
                self.load_extension(
                    admincog.replace('/', '.').replace('\\', '.'))
        except ClientException:
            log.critical('Could not load administrative cogs!')
        except ImportError:
            log.critical('Administrative cogs could not be imported!')
            traceback.print_exc()

    def register_nodes(self, nodes):
        for node in nodes:
            if node not in self.cfg['nodes']:
                self.cfg['nodes'][node] = None

    def register_cfg(self, cfg, prompt=None, defaultvalue=None):
        if cfg not in self.cfg['cogcfgs']:
            self.cfg['cogcfgs'][cfg] = (defaultvalue, prompt)

    async def get_context(self, message, *, cls=CharfredContext):
        return await super().get_context(message, cls=cls)

    async def on_command(self, ctx):
        log.info(f'[{ctx.author.name}]: {ctx.message.content}')

    async def on_ready(self):
        log.info(f'{self.user} reporting for duty!')
        log.info(f'ID: {self.user.id}')
        if not hasattr(self, 'uptime'):
            self.uptime = datetime.datetime.now()

    async def on_message(self, message):
        if message.author.bot:
            return
        if message.guild is None:
            is_owner = await self.is_owner(message.author)
            if not is_owner:
                return
        ctx = await self.get_context(message)
        await self.invoke(ctx)

    async def close(self):
        log.info('Shutting down, this may take a couple seconds...')
        await super().close()
        log.info('Client disconnected.')
        await self.session.close()
        log.info('Session closed.')
        log.info('All done, goodbye sir!')

    def run(self, token=None):
        if token is None:
            log.info('Using pre-configured Token...')
            try:
                token = self.cfg['botToken']
            except KeyError:
                log.error('No token given, no token saved, abort!')
                return
        else:
            self.cfg['botToken'] = token
            self.cfg._save()
            log.info('Token saved for future use!')

        super().run(token, reconnect=True)