import os import sys import signal import interactions from database 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): 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) con = Database(host, user, password, db) try: if args[0] == "init_database": con.init_test_database() 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" and channel != "441985560144379912": 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.username} ({user.id}) has give a invalid SteamID. Could not convert! {steamid}") 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.username} ({user.id}) has given a invalid SteamID! Value: {steamid}") return try: con.create_reserved_slot(user, steam_id.steam2(1)) await ctx.send(f"You just claimed a reserved slot for: `{steam_id.steam2(1)}`!") logger.debug(f"{user.id} with SteamID: {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.") 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 {user.username} ({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:])