Files
drb-server-discord-bot/app/commands/drb.py
Logan Cusano f34241acac Init
2025-05-24 02:09:35 -04:00

97 lines
4.0 KiB
Python

import discord
from discord.ext import commands
from discord import app_commands # Import the app_commands module
from internal.drb_srv_api import SystemAPIWrapper, NodeAPIWrapper
# This is a standard setup for a command module (often called a "Cog")
# It inherits from commands.Cog
class DrbCommands(commands.Cog):
"""A collection of example slash commands."""
# The __init__ method takes the bot instance as an argument
def __init__(self, bot):
self.bot = bot
self.drb_sys_api = SystemAPIWrapper()
self.drb_node_api = NodeAPIWrapper()
# Connect a bot with the selected system to the channel the requester is in / move the bot to the channel the requester is in
@commands.hybrid_command(name="join", description="Request a bot to join your channel listening to a system.")
@app_commands.describe(system_name="The name of the system to join.")
async def join(self, ctx: commands.Context, system_name:str):
# Get the system details
sys_search_results = await self.drb_sys_api.search_systems(name=system_name)
selected_system = None
# Make sure there is a system found
if len(sys_search_results) == 1:
selected_system = sys_search_results[0]
else:
pass # Replace with code to ask the user which they would like
if not selected_system: return
# Get all the nodes that have this system
avail_on_nodes = selected_system['avail_on_nodes']
selected_node_id = None
if len(avail_on_nodes) == 0:
return
if len(avail_on_nodes) == 1:
selected_node_id = avail_on_nodes[0]
else:
return # TODO - Implement this
# Check to see if there is a preferred node for the system, if not select one
# check to make sure it's available, if not loop back and select the next one
if not selected_node_id: return
# Get the channel the user is currently in
channel_id = ctx.author.voice.channel.id
# Get the guild the user messaged from
guild_id = ctx.guild.id
print(selected_node_id, selected_system['_id'], guild_id, channel_id)
api_response = await self.drb_node_api.join(selected_node_id, selected_system['_id'], guild_id, channel_id)
if isinstance(ctx, commands.Context):
# This was invoked as a prefix command (e.g., !hello)
await ctx.send(f"{api_response}!")
elif isinstance(ctx, discord.Interaction):
# This was invoked as a slash command (/hello)
await ctx.response.send_message(f"{api_response}!")
@join.autocomplete("system_name")
async def system_name_autocomplete(self,
interaction: discord.Interaction,
current: str,
) -> list[app_commands.Choice[str]]:
"""
Autocomplete for system_name, fetches systems.
"""
# Fetch systems from your database (async call)
systems = await self.drb_sys_api.search_systems(name=current)
# Create app_commands.Choice objects
return [
app_commands.Choice(name=system, value=system)
for system in systems[:25] # Discord has a limit of 25 choices
]
@commands.hybrid_command(name="leave", description="Request that a bot leave your server.")
async def leave(self, ctx: commands.Context):
if isinstance(ctx, commands.Context):
# This was invoked as a prefix command (e.g., !hello)
await ctx.send(f"Hello, {ctx.author.display_name}!")
elif isinstance(ctx, discord.Interaction):
# This was invoked as a slash command (/hello)
await ctx.response.send_message(f"Hello, {ctx.user.display_name}!")
# Disconnect the selected bot from the server the requster is in
# --- Setup Function ---
async def setup(bot):
"""Adds the SlashExampleCommands cog to the bot and syncs slash commands."""
await bot.add_cog(DrbCommands(bot))
print("Hybrid commands cog loaded. Remember to sync commands!")