Skip to content

Commit 0cde9b0

Browse files
Add logic to create or get next category for team voice channels; handle category limits and improve channel creation process
1 parent 5da55a1 commit 0cde9b0

File tree

1 file changed

+35
-5
lines changed

1 file changed

+35
-5
lines changed

cogs/teams_cog.py

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,26 @@ async def sync_matcherino_teams(self):
329329
logger.error(f"Error during team sync: {e}")
330330
raise
331331

332+
async def create_or_get_next_category(self, guild: discord.Guild, base_category: discord.CategoryChannel, category_number: int = 1) -> discord.CategoryChannel:
333+
"""Create a new category or get an existing one with proper sequential numbering."""
334+
category_name = f"Team Channels #{category_number}"
335+
336+
# First try to find an existing category
337+
category = discord.utils.get(guild.categories, name=category_name)
338+
if category:
339+
# If the category has less than 50 channels, return it
340+
if len(category.channels) < 50:
341+
return category
342+
# If it's full, recursively try the next number
343+
return await self.create_or_get_next_category(guild, base_category, category_number + 1)
344+
345+
# Create new category with same permissions as base category
346+
return await guild.create_category(
347+
name=category_name,
348+
position=base_category.position + category_number,
349+
overwrites=base_category.overwrites
350+
)
351+
332352
@app_commands.command(name="create-team-voice", description="Create private voice channels for all teams")
333353
@app_commands.default_permissions(administrator=True)
334354
@app_commands.checks.cooldown(rate=1, per=300.0) # Can only run once every 5 minutes
@@ -338,10 +358,10 @@ async def create_team_voice_channels(self, interaction: discord.Interaction):
338358

339359
try:
340360
guild = interaction.guild
341-
category = guild.get_channel(self.voice_category_id)
361+
base_category = guild.get_channel(self.voice_category_id)
342362

343-
if not category:
344-
await interaction.followup.send(f"Could not find the category with ID {self.voice_category_id}", ephemeral=True)
363+
if not base_category:
364+
await interaction.followup.send(f"Could not find the base category with ID {self.voice_category_id}", ephemeral=True)
345365
return
346366

347367
# Get all active teams using the correct method
@@ -351,7 +371,17 @@ async def create_team_voice_channels(self, interaction: discord.Interaction):
351371
return
352372

353373
channels_created = 0
374+
categories_created = 1
375+
current_category = base_category
376+
354377
for team in teams:
378+
# Check if current category is full (50 channels)
379+
if len(current_category.channels) >= 50:
380+
# Get or create next category
381+
categories_created += 1
382+
await asyncio.sleep(2) # Rate limit delay for category creation
383+
current_category = await self.create_or_get_next_category(guild, base_category, categories_created)
384+
355385
# Team members are already included in the team info
356386
team_members = [member for member in team['members'] if member.get('discord_user_id')]
357387

@@ -385,7 +415,7 @@ async def create_team_voice_channels(self, interaction: discord.Interaction):
385415

386416
channel = await guild.create_voice_channel(
387417
name=channel_name,
388-
category=category,
418+
category=current_category,
389419
overwrites=overwrites
390420
)
391421

@@ -414,7 +444,7 @@ async def create_team_voice_channels(self, interaction: discord.Interaction):
414444
continue
415445

416446
await interaction.followup.send(
417-
f"Created {channels_created} team voice channels in category '{category.name}'.",
447+
f"Created {channels_created} team voice channels across {categories_created} categories.",
418448
ephemeral=True
419449
)
420450

0 commit comments

Comments
 (0)