feat(tally): friendlier option labels + dev-tally only counts matching target (#1340)
Rename /tally-claim and /tally-transfer options to username/squadron with clearer descriptions. Fix /dev-tally to only apply a win/loss when the passed username/squadron actually matches what the VC is tracking, instead of bumping any active tally. Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+38
-16
@@ -4261,11 +4261,11 @@ def _invoker_voice_channel(interaction: discord.Interaction):
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
@app_commands.describe(
|
@app_commands.describe(
|
||||||
ign=command_locale("The player IGN to track", "commands.tally.ign"),
|
username=command_locale("Username", "commands.tally.username"),
|
||||||
squadron_short=command_locale("The squadron short name to track", "commands.tally.squadron_short"),
|
squadron=command_locale("Squadron Name (like DSPL)", "commands.tally.squadron"),
|
||||||
)
|
)
|
||||||
@discord.app_commands.autocomplete(ign=player_autocomplete, squadron_short=squadron_autocomplete)
|
@discord.app_commands.autocomplete(username=player_autocomplete, squadron=squadron_autocomplete)
|
||||||
async def tally_claim(interaction: discord.Interaction, ign: str = "", squadron_short: str = ""):
|
async def tally_claim(interaction: discord.Interaction, username: str = "", squadron: str = ""):
|
||||||
lang = await guild_lang(interaction.guild.id) if interaction.guild else "en"
|
lang = await guild_lang(interaction.guild.id) if interaction.guild else "en"
|
||||||
if not interaction.guild_id or not await is_guild_entitled(interaction.guild_id):
|
if not interaction.guild_id or not await is_guild_entitled(interaction.guild_id):
|
||||||
await interaction.response.send_message(t(lang, "commands.tally.premium_required"), ephemeral=True)
|
await interaction.response.send_message(t(lang, "commands.tally.premium_required"), ephemeral=True)
|
||||||
@@ -4274,9 +4274,9 @@ async def tally_claim(interaction: discord.Interaction, ign: str = "", squadron_
|
|||||||
if vc is None:
|
if vc is None:
|
||||||
await interaction.response.send_message(t(lang, "commands.tally.not_in_vc"), ephemeral=True)
|
await interaction.response.send_message(t(lang, "commands.tally.not_in_vc"), ephemeral=True)
|
||||||
return
|
return
|
||||||
ign = ign.strip()
|
username = username.strip()
|
||||||
squadron_short = squadron_short.strip()
|
squadron = squadron.strip()
|
||||||
if bool(ign) == bool(squadron_short): # neither or both
|
if bool(username) == bool(squadron): # neither or both
|
||||||
await interaction.response.send_message(t(lang, "commands.tally.need_one_input"), ephemeral=True)
|
await interaction.response.send_message(t(lang, "commands.tally.need_one_input"), ephemeral=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -4288,10 +4288,10 @@ async def tally_claim(interaction: discord.Interaction, ign: str = "", squadron_
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
if ign:
|
if username:
|
||||||
mode, target, display = "player", ign, ign
|
mode, target, display = "player", username, username
|
||||||
else:
|
else:
|
||||||
mode, target, display = "squadron", squadron_short, squadron_short
|
mode, target, display = "squadron", squadron, squadron
|
||||||
|
|
||||||
tly = tally.claim(interaction.guild_id, vc.id, mode, target, display, interaction.user.id)
|
tly = tally.claim(interaction.guild_id, vc.id, mode, target, display, interaction.user.id)
|
||||||
await tally.push_status(tly)
|
await tally.push_status(tly)
|
||||||
@@ -4307,9 +4307,9 @@ async def tally_claim(interaction: discord.Interaction, ign: str = "", squadron_
|
|||||||
"commands.tally.description_transfer",
|
"commands.tally.description_transfer",
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
@app_commands.describe(ign=command_locale("The player IGN to track", "commands.tally.ign"))
|
@app_commands.describe(username=command_locale("Username", "commands.tally.username"))
|
||||||
@discord.app_commands.autocomplete(ign=player_autocomplete)
|
@discord.app_commands.autocomplete(username=player_autocomplete)
|
||||||
async def tally_transfer(interaction: discord.Interaction, ign: str):
|
async def tally_transfer(interaction: discord.Interaction, username: str):
|
||||||
lang = await guild_lang(interaction.guild.id) if interaction.guild else "en"
|
lang = await guild_lang(interaction.guild.id) if interaction.guild else "en"
|
||||||
if not interaction.guild_id or not await is_guild_entitled(interaction.guild_id):
|
if not interaction.guild_id or not await is_guild_entitled(interaction.guild_id):
|
||||||
await interaction.response.send_message(t(lang, "commands.tally.premium_required"), ephemeral=True)
|
await interaction.response.send_message(t(lang, "commands.tally.premium_required"), ephemeral=True)
|
||||||
@@ -4323,8 +4323,8 @@ async def tally_transfer(interaction: discord.Interaction, ign: str):
|
|||||||
t(lang, "commands.tally.no_active", channel=vc.name), ephemeral=True
|
t(lang, "commands.tally.no_active", channel=vc.name), ephemeral=True
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
ign = ign.strip()
|
username = username.strip()
|
||||||
tly = tally.transfer(interaction.guild_id, vc.id, ign, ign)
|
tly = tally.transfer(interaction.guild_id, vc.id, username, username)
|
||||||
if tly is None:
|
if tly is None:
|
||||||
await interaction.response.send_message(
|
await interaction.response.send_message(
|
||||||
t(lang, "commands.tally.no_active", channel=vc.name), ephemeral=True
|
t(lang, "commands.tally.no_active", channel=vc.name), ephemeral=True
|
||||||
@@ -4332,7 +4332,7 @@ async def tally_transfer(interaction: discord.Interaction, ign: str):
|
|||||||
return
|
return
|
||||||
await tally.push_status(tly)
|
await tally.push_status(tly)
|
||||||
await interaction.response.send_message(
|
await interaction.response.send_message(
|
||||||
t(lang, "commands.tally.transferred", channel=vc.name, target=ign,
|
t(lang, "commands.tally.transferred", channel=vc.name, target=username,
|
||||||
base=f"{tly.wins}W-{tly.losses}L"),
|
base=f"{tly.wins}W-{tly.losses}L"),
|
||||||
ephemeral=True,
|
ephemeral=True,
|
||||||
)
|
)
|
||||||
@@ -4402,6 +4402,28 @@ async def dev_tally(interaction: discord.Interaction, result: app_commands.Choic
|
|||||||
if not interaction.guild_id:
|
if not interaction.guild_id:
|
||||||
await interaction.response.send_message(t(lang, "commands.tally.not_in_vc"), ephemeral=True)
|
await interaction.response.send_message(t(lang, "commands.tally.not_in_vc"), ephemeral=True)
|
||||||
return
|
return
|
||||||
|
active = tally.get(interaction.guild_id, vc.id)
|
||||||
|
if active is None:
|
||||||
|
await interaction.response.send_message(
|
||||||
|
t(lang, "commands.tally.no_active", channel=vc.name), ephemeral=True
|
||||||
|
)
|
||||||
|
return
|
||||||
|
# Only attribute the result if the argument matches what this VC tracks —
|
||||||
|
# a player arg must match a player-mode tally's target; a squadron arg must
|
||||||
|
# match a squadron-mode tally's target (tag-insensitive). Mirrors how a real
|
||||||
|
# finished game only counts when the tracked entity actually played.
|
||||||
|
if username:
|
||||||
|
matches = active.mode == "player" and active.target.strip().lower() == username.lower()
|
||||||
|
else:
|
||||||
|
matches = active.mode == "squadron" and \
|
||||||
|
tally.strip_tag(active.target).lower() == tally.strip_tag(squadron).lower()
|
||||||
|
if not matches:
|
||||||
|
await interaction.response.send_message(
|
||||||
|
f"This VC is tracking the {active.mode} **{active.display_target}** — "
|
||||||
|
f"**{username or squadron}** doesn't match it, so nothing was recorded.",
|
||||||
|
ephemeral=True,
|
||||||
|
)
|
||||||
|
return
|
||||||
tly = tally.apply_manual_result(interaction.guild_id, vc.id, result.value)
|
tly = tally.apply_manual_result(interaction.guild_id, vc.id, result.value)
|
||||||
if tly is None:
|
if tly is None:
|
||||||
await interaction.response.send_message(
|
await interaction.response.send_message(
|
||||||
|
|||||||
+2
-2
@@ -852,8 +852,8 @@
|
|||||||
"description_claim": "Track a live SQB scoreline on your current voice channel",
|
"description_claim": "Track a live SQB scoreline on your current voice channel",
|
||||||
"description_transfer": "Transfer the active voice-channel tally to a different player",
|
"description_transfer": "Transfer the active voice-channel tally to a different player",
|
||||||
"description_wipe": "Clear the active tally on your current voice channel",
|
"description_wipe": "Clear the active tally on your current voice channel",
|
||||||
"ign": "The player IGN to track",
|
"username": "Username",
|
||||||
"squadron_short": "The squadron short name to track",
|
"squadron": "Squadron Name (like DSPL)",
|
||||||
"result_win": "Win",
|
"result_win": "Win",
|
||||||
"result_loss": "Loss",
|
"result_loss": "Loss",
|
||||||
"result_draw": "Draw",
|
"result_draw": "Draw",
|
||||||
|
|||||||
Reference in New Issue
Block a user