@@ -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