feat(teams): place new team roles under their game's divider role
Auto-created team roles now land directly under the CS2 / LoL "divider" role in the community guild's role list, keeping it grouped by game. - config: CS2_DIVIDER_ROLE_ID / LOL_DIVIDER_ROLE_ID (season-specific, env overridable) exposed as TEAM_DIVIDER_ROLE_IDS keyed by game code. - core/sheets: tag each team with its game (CS2/LoL) from the section title it sits under; shared _scan_sections generator feeds both parse_team_rosters and the new parse_team_games; get_game_for_team accessor + _team_game cache. - core/member_sync: on creating a team role, position it at its game divider's slot (best-effort; left in place if game/divider unknown or move refused). - .env.example + tests for game tagging and role placement. Each participant is in exactly one game, so one role per team is unambiguous. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R6JZkyszyDFuFtk25WBbcR
This commit is contained in:
@@ -247,6 +247,35 @@ async def sync_member(
|
||||
return result
|
||||
|
||||
|
||||
async def _position_team_role_under_divider(
|
||||
guild: discord.Guild,
|
||||
role: discord.Role,
|
||||
team_name: str,
|
||||
result: TeamSyncResult,
|
||||
) -> None:
|
||||
"""Move a freshly-created team role directly under its game's divider role.
|
||||
|
||||
The team's game comes from the registration sheet; the divider role IDs come
|
||||
from config (``TEAM_DIVIDER_ROLE_IDS``). Best-effort: if the game/divider is
|
||||
unknown or the move is refused, the role just stays where it was created.
|
||||
"""
|
||||
game = sheets.get_game_for_team(team_name)
|
||||
divider_id = config.TEAM_DIVIDER_ROLE_IDS.get(game) if game else None
|
||||
if not divider_id:
|
||||
return
|
||||
divider = guild.get_role(divider_id)
|
||||
if divider is None:
|
||||
log.warning("Divider role %s for game %s not found in guild", divider_id, game)
|
||||
return
|
||||
try:
|
||||
await role.edit(position=divider.position, reason="Team sync: paiguta tiimide alla")
|
||||
log.info("Positioned team role %r under the %s divider", team_name, game)
|
||||
except discord.Forbidden:
|
||||
result.errors.append(f"Tiimirolli '{team_name}' paigutamiseks puudub õigus")
|
||||
except discord.HTTPException as e:
|
||||
result.errors.append(f"Tiimirolli '{team_name}' paigutamine ebaõnnestus: {e}")
|
||||
|
||||
|
||||
async def sync_team_role(
|
||||
member: discord.Member,
|
||||
guild: discord.Guild,
|
||||
@@ -284,6 +313,8 @@ async def sync_team_role(
|
||||
result.errors.append(f"Tiimirolli '{team_name}' loomiseks puudub õigus")
|
||||
except discord.HTTPException as e:
|
||||
result.errors.append(f"Tiimirolli '{team_name}' loomine ebaõnnestus: {e}")
|
||||
if result.created and desired is not None:
|
||||
await _position_team_role_under_divider(guild, desired, team_name, result)
|
||||
|
||||
# Team roles held but no longer registered for (switched teams / dropped out).
|
||||
to_remove = [r for r in member.roles if r.name in all_teams and r.name != team_name]
|
||||
|
||||
Reference in New Issue
Block a user