import contextlib import logging import sys from argparse import ArgumentParser from logging import Logger from pathlib import Path from discord import LoginFailure, Intents from libbot.utils import config_get from classes.holo_bot import HoloBot from modules.migrator import migrate_database from modules.scheduler import scheduler logging.basicConfig( level=logging.INFO, format="%(name)s.%(funcName)s | %(levelname)s | %(message)s", datefmt="[%X]", ) logger: Logger = logging.getLogger(__name__) # Declare the parser that retrieves the command line arguments parser = ArgumentParser( prog="HoloUA Discord", description="Discord bot for the HoloUA community.", ) # Add a switch argument --migrate to be parsed... parser.add_argument("--migrate", action="store_true") # ...and parse the arguments we added args = parser.parse_args() # Try to import the module that improves performance # and ignore errors when module is not installed with contextlib.suppress(ImportError): import uvloop uvloop.install() def main() -> None: if not Path("config.json").exists(): logger.error( "Config file is missing: Make sure the configuration file 'config.json' is in place." ) sys.exit() # Perform migration if command line argument was provided if args.migrate: logger.info("Performing migrations...") migrate_database() intents: Intents = Intents().all() client: HoloBot = HoloBot(intents=intents, scheduler=scheduler) client.load_extension("cogs") try: client.run(config_get("bot_token", "bot")) except LoginFailure as exc: logger.error("Provided bot token is invalid: %s", exc) except KeyboardInterrupt: logger.info("KeyboardInterrupt received: Shutting down gracefully.") finally: sys.exit() if __name__ == "__main__": main()