# bot.py # The main file for lcars-bot. Imports required modules, sets everything up, defines commands and gets the bot running. # https://discordpy.readthedocs.io/ import discord from discord import app_commands from discord.ext import commands # https://pypi.org/project/python-dotenv/ from dotenv import dotenv_values ### Setup ### # Load bot tokens and other config from a file named `.env` in the bot's main directory (see README.md): config = dotenv_values(".env") # config = {"TOKEN": ""} intents = discord.Intents.default() intents.message_content = True # `when_mentioned` means the only commands that will work with the bot are slash commands: bot = commands.Bot(command_prefix=commands.when_mentioned, intents=intents) @bot.event async def on_ready() -> None: print(f"Logged into Discord as {bot.user}") # Used for ready() and notready() (temporary): user_ready = False ### Commands ### # Remember to use `ephemeral=True` for messages that only the user of the command should see. # There's no sense in clogging up the channel with unnecessary messages. @bot.hybrid_command(description="Shows the bot's latency (ping)") async def ping(ctx): await ctx.send(f"This bot's ping is {round(bot.latency * 1000)} ms.", ephemeral=True) @bot.hybrid_command(description="Explain how the bot's commands work") async def helpme(ctx: commands.Context): await ctx.send(f"""Here's some help: `/ready n` marks you as ready for a game for *n* hours with a special role. `/notready` removes the ready for a game role. `/helpme` shows this explanation.""", ephemeral=True) # @bot.hybrid_command(description="/ready n if you'll be ready for a game for n hours") # async def ready(ctx: commands.Context, hours: int): # global user_ready # if 12 > hours > 0: # await ctx.send(f"āœ…\nšŸŽ® You'll be marked **ready for a game** for the next **{str(hours)} hours**.", ephemeral=True) # else: # await ctx.send(f"🚫\nYou must enter a value from **1** to **12** for **hours**.", ephemeral=True) # user_ready = True # @bot.hybrid_command(description="Undo marking yourself as ready for a game") # async def notready(ctx: commands.Context): # global user_ready # if user_ready: # await ctx.send(f"āœ…\nYou're **no longer** marked as ready for a game.", ephemeral=True) # user_ready = False # else: # await ctx.send(f"🚫\nYou weren't marked as ready anyway!", ephemeral=True) # Sync the above commands with Discord: async def setup_hook() -> None: await bot.tree.sync() print("Command tree should be synced with Discord.") await bot.load_extension('extensions.ready') print("Extensions should be loaded.") bot.setup_hook = setup_hook ### Start the bot ### bot.run(config["TOKEN"])