disagreement/examples/context_menus.py
2025-06-09 22:25:14 -06:00

72 lines
2.0 KiB
Python

"""Examples showing how to use context menu commands."""
import os
import sys
# Allow running example from repository root
if os.path.join(os.getcwd(), "examples") == os.path.dirname(os.path.abspath(__file__)):
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
from disagreement.client import Client
from disagreement.ext.app_commands import (
user_command,
message_command,
AppCommandContext,
)
from disagreement.models import User, Message
from dotenv import load_dotenv
load_dotenv()
BOT_TOKEN = os.environ.get("DISCORD_BOT_TOKEN", "")
APP_ID = os.environ.get("DISCORD_APPLICATION_ID", "")
client = Client(token=BOT_TOKEN, application_id=APP_ID)
@client.event
async def on_ready():
"""Called when the bot is ready and connected to Discord."""
if client.user:
print(f"Bot is ready! Logged in as {client.user.username}")
print("Attempting to sync application commands...")
try:
if client.application_id:
await client.app_command_handler.sync_commands(
application_id=client.application_id
)
print("Application commands synced successfully.")
else:
print("Skipping command sync: application ID is not set.")
except Exception as e:
print(f"Error syncing application commands: {e}")
else:
print("Bot is ready, but client.user is missing!")
print("------")
@user_command(name="User Info")
async def user_info(ctx: AppCommandContext, user: User) -> None:
await ctx.send(
f"Selected user: {user.username}#{user.discriminator}", ephemeral=True
)
@message_command(name="Quote")
async def quote(ctx: AppCommandContext, message: Message) -> None:
await ctx.send(f"Quoted message: {message.content}", ephemeral=True)
client.app_command_handler.add_command(user_info)
client.app_command_handler.add_command(quote)
async def main() -> None:
await client.run()
if __name__ == "__main__":
import asyncio
asyncio.run(main())