Ruby-Cogs/autoroom/waiting_room.py
Valerie fa6cd01476
Some checks are pending
Run pre-commit / Run pre-commit (push) Waiting to run
Add ControlPanel integration and refactor autoroom creation logic
This update introduces the ControlPanel class to the AutoRoom cog, enhancing the autoroom creation process. The autoroom source configuration has been streamlined by renaming variables for clarity. Additionally, the logic for creating associated text channels has been improved, ensuring better handling of permissions and channel creation. The waiting room functionality has also been adjusted to correctly reference the voice channel's text chat.
2025-06-13 19:29:45 -04:00

184 lines
No EOL
7.2 KiB
Python

"""Waiting room functionality for AutoRoom cog."""
from typing import Any, Optional
import discord
from discord import ui
from redbot.core import Config
from redbot.core.bot import Red
class WaitingRoomView(ui.View):
"""View for waiting room control buttons."""
def __init__(self, cog: Any):
super().__init__(timeout=None)
self.cog = cog
@discord.ui.button(label="Allow", style=discord.ButtonStyle.green, custom_id="waiting_room_allow")
async def allow_button(self, interaction: discord.Interaction, button: discord.ui.Button):
"""Allow a user into the AutoRoom."""
if not interaction.message:
return
# Get the waiting user from the message
waiting_user_id = int(interaction.message.content.split("User: <@")[1].split(">")[0])
waiting_user = interaction.guild.get_member(waiting_user_id)
if not waiting_user:
await interaction.response.send_message("User no longer in the server.", ephemeral=True)
return
# Get the AutoRoom info
autoroom_info = await self.cog.get_autoroom_info(interaction.channel)
if not autoroom_info:
await interaction.response.send_message("This is not an AutoRoom.", ephemeral=True)
return
# Check if the interaction user is the owner
if interaction.user.id != autoroom_info["owner"]:
await interaction.response.send_message("Only the AutoRoom owner can use these buttons.", ephemeral=True)
return
# Move the user to the AutoRoom
try:
await waiting_user.move_to(interaction.channel)
await interaction.message.delete()
await interaction.response.send_message(f"Allowed {waiting_user.mention} into the AutoRoom.", ephemeral=True)
except discord.HTTPException:
await interaction.response.send_message("Failed to move user to the AutoRoom.", ephemeral=True)
@discord.ui.button(label="Deny", style=discord.ButtonStyle.red, custom_id="waiting_room_deny")
async def deny_button(self, interaction: discord.Interaction, button: discord.ui.Button):
"""Deny a user access to the AutoRoom."""
if not interaction.message:
return
# Get the waiting user from the message
waiting_user_id = int(interaction.message.content.split("User: <@")[1].split(">")[0])
waiting_user = interaction.guild.get_member(waiting_user_id)
if not waiting_user:
await interaction.response.send_message("User no longer in the server.", ephemeral=True)
return
# Get the AutoRoom info
autoroom_info = await self.cog.get_autoroom_info(interaction.channel)
if not autoroom_info:
await interaction.response.send_message("This is not an AutoRoom.", ephemeral=True)
return
# Check if the interaction user is the owner
if interaction.user.id != autoroom_info["owner"]:
await interaction.response.send_message("Only the AutoRoom owner can use these buttons.", ephemeral=True)
return
# Add user to denied list
denied = autoroom_info.get("denied", [])
if waiting_user.id not in denied:
denied.append(waiting_user.id)
await self.cog.config.channel(interaction.channel).denied.set(denied)
# Move user back to waiting room
waiting_room = interaction.guild.get_channel(autoroom_info["waiting_room_channel_id"])
if waiting_room:
try:
await waiting_user.move_to(waiting_room)
except discord.HTTPException:
pass
await interaction.message.delete()
await interaction.response.send_message(f"Denied {waiting_user.mention} access to the AutoRoom.", ephemeral=True)
class WaitingRoom:
"""Handles waiting room functionality."""
def __init__(self, cog: Any):
self.cog = cog
self.bot: Red = cog.bot
self.config: Config = cog.config
async def setup_waiting_room(self, autoroom_source: discord.VoiceChannel, text_channel: discord.TextChannel) -> bool:
"""Set up the waiting room for an AutoRoom source."""
try:
# Create waiting room channel
waiting_room = await autoroom_source.guild.create_voice_channel(
name="Waiting Room",
category=autoroom_source.category,
reason="AutoRoom: Setting up waiting room."
)
# Set up permissions
perms = discord.PermissionOverwrite(
view_channel=True,
connect=True,
speak=True,
stream=True,
use_voice_activation=True
)
await waiting_room.set_permissions(autoroom_source.guild.default_role, overwrite=perms)
# Save waiting room channel ID
await self.config.custom(
"AUTOROOM_SOURCE",
str(autoroom_source.guild.id),
str(autoroom_source.id)
).waiting_room_channel_id.set(waiting_room.id)
# Enable waiting room
await self.config.custom(
"AUTOROOM_SOURCE",
str(autoroom_source.guild.id),
str(autoroom_source.id)
).waiting_room_enabled.set(True)
return True
except discord.HTTPException:
return False
async def handle_waiting_user(self, member: discord.Member, autoroom: discord.VoiceChannel) -> None:
"""Handle a user joining the waiting room."""
autoroom_info = await self.cog.get_autoroom_info(autoroom)
if not autoroom_info:
return
# Get the voice channel's text chat
text_channel = autoroom.guild.get_channel(autoroom.id)
if not text_channel:
return
# Create waiting message with buttons
view = WaitingRoomView(self.cog)
message = await text_channel.send(
f"User: {member.mention} is waiting to join the AutoRoom.",
view=view
)
# Save message ID
await self.config.channel(autoroom).waiting_room_message_id.set(message.id)
async def cleanup_waiting_room(self, autoroom_source: discord.VoiceChannel) -> None:
"""Clean up the waiting room when disabling it."""
config = await self.config.custom(
"AUTOROOM_SOURCE",
str(autoroom_source.guild.id),
str(autoroom_source.id)
).all()
if config["waiting_room_channel_id"]:
waiting_room = autoroom_source.guild.get_channel(config["waiting_room_channel_id"])
if waiting_room:
try:
await waiting_room.delete(reason="AutoRoom: Disabling waiting room.")
except discord.HTTPException:
pass
await self.config.custom(
"AUTOROOM_SOURCE",
str(autoroom_source.guild.id),
str(autoroom_source.id)
).waiting_room_enabled.set(False)
await self.config.custom(
"AUTOROOM_SOURCE",
str(autoroom_source.guild.id),
str(autoroom_source.id)
).waiting_room_channel_id.set(None)