import os import sys import signal import interactions import database from dotenv import load_dotenv from steamid import SteamID from loguru import logger class GracefulDeath: """Catch signals to allow graceful shutdown.""" def __init__(self): self.receivedSignal=self.receivedSignalTermSignal=False catchSignals = [ 1, 2, 3, 10, 12, 15, ] for signum in catchSignals: signal.signal(signum, self.handler) def handler(self, signum, frame): self.lastSignal=signum self.receivedSignal=True if signum in [2, 3, 15]: self.receivedSignalTermSignal=True def main(args): sighandler = GracefulDeath() load_dotenv() token = os.getenv('DISCORD_TOKEN') host = os.getenv('MYSQL_HOST') user = os.getenv('MYSQL_USER') password = os.getenv('MYSQL_PASSWORD') db = os.getenv('MYSQL_DATABASE') bot = interactions.Client(token=token) mysql = database.create_connection(host, user, password, db) try: if args[0] == "init_database": database.init_test_database(mysql) logger.info(f"First init of database... Please disable this afterwards with the flag init_dabase") except: logger.info(f"Skipping database init...") pass @bot.command( name="reserve_slot", description="Claim your reserved slot on the DM Server", scope=433600034983116810, options=[ interactions.Option( name="steamid", description="Please provide your SteamID, from https://steamid.xyz/", type=interactions.OptionType.STRING, required=True, ), ], ) async def reserve_slot(ctx: interactions.CommandContext, steamid: str): channel = ctx.channel.id user = ctx.user if channel != "433738529898627073": await ctx.send(f"This command only works in the Channel <#433738529898627073>!", ephemeral=True) logger.debug(f"Command was used in the wrong channel. ({channel})") return try: steam_id = SteamID(steamid) except: await ctx.send(f"You failed to give a valid SteamID as it seems, please head to and check.", ephemeral=True) logger.debug(f"User ({user.id}) has give a invalid SteamID. Could not convert!") return if steam_id.isValid() == False: await ctx.send(f"You failed to give a valid SteamID as it seems, please head to and check.", ephemeral=True) logger.debug(f"User ({user.id}) has given a invalid SteamID!") return try: database.create_reserved_slot(mysql, user, steam_id.steam2(1)) await ctx.send(f"You just claimed a reserved slot for: `{steam_id.steam2(1)}`!") logger.debug(f"{steam_id.steam2(1)} has just claimed a reserved slot.") except Exception as err: if str(err) != "Duplicate entrys": await ctx.send(f"Something failed with the database, please try again later.", ephemeral=True) logger.warning(f"Error while trying to access database.", err) return await ctx.send(f"You have already claimed a reserved slot!", ephemeral=True) logger.debug(f"{steam_id.steam2(1)} or {user.id} is already in the database.") bot.start() while True: logger.info("Trying graceful shutdown...") if sighandler.receivedSignal: bot.remove("reserve_slot", remove_commands=True) exit() if __name__ == '__main__': main(sys.argv[1:])