Changed status lookup to only queue okay enemies for attack

This commit is contained in:
2026-01-26 15:51:44 -05:00
parent 7ea6f146e1
commit f45f02501a
4 changed files with 69 additions and 26 deletions

View File

@@ -102,13 +102,21 @@ class BotAssignmentManager:
def get_next_enemy_in_group(self, group_id: str, enemy_ids: list) -> Optional[int]:
"""
Get the next enemy in the group who needs to be assigned.
Returns None if all enemies are already assigned.
Returns None if all enemies are already assigned or not attackable.
"""
for eid in enemy_ids:
key = f"{group_id}:{eid}"
# If enemy is not currently assigned, return it
if key not in self.active_targets:
return eid
# If enemy is already assigned, skip them
if key in self.active_targets:
continue
# Check if enemy is attackable (status must be "Okay")
enemy = STATE.enemy.get(eid)
if not enemy or enemy.status.lower() != "okay":
continue
# This enemy is available for assignment
return eid
return None
async def assignment_loop(self):
@@ -176,18 +184,30 @@ class BotAssignmentManager:
print(f"Cannot assign: friendly {friendly_id} or enemy {enemy_id} not found")
return
# Only assign if enemy status is "Okay" (not traveling, hospitalized, etc.)
if enemy.status.lower() != "okay":
print(f"Skipping assignment: {enemy.name} status is '{enemy.status}' (must be 'Okay')")
return
# Get Discord user
discord_id = self.get_discord_id(friendly_id)
if not discord_id:
print(f"No Discord mapping for Torn ID {friendly_id}")
print(f"No Discord mapping for Torn ID {friendly_id} - skipping assignment")
# Record assignment to prevent infinite retries
key = f"{group_id}:{enemy_id}"
self.active_targets[key] = {
"group_id": group_id,
"friendly_id": friendly_id,
"enemy_id": enemy_id,
"discord_id": None,
"assigned_at": datetime.now(),
"reminded": False,
"failed": True
}
return
discord_user = await self.bot.fetch_user(discord_id)
if not discord_user:
print(f"Discord user {discord_id} not found")
return
# Record assignment
# Record assignment BEFORE attempting to send message
# This prevents infinite retries if message sending fails
key = f"{group_id}:{enemy_id}"
self.active_targets[key] = {
"group_id": group_id,
@@ -195,22 +215,32 @@ class BotAssignmentManager:
"enemy_id": enemy_id,
"discord_id": discord_id,
"assigned_at": datetime.now(),
"reminded": False
"reminded": False,
"failed": False
}
# Send Discord message to channel
attack_link = f"https://www.torn.com/loader.php?sid=attack&user2ID={enemy_id}"
message = f"**New target for {discord_user.mention}!**\n\n[**{enemy.name}** (Level {enemy.level})]({attack_link})\n\nYou have {ASSIGNMENT_TIMEOUT} seconds!"
# Fetch Discord user and send message
try:
discord_user = await self.bot.fetch_user(discord_id)
if not discord_user:
print(f"Discord user {discord_id} not found")
self.active_targets[key]["failed"] = True
return
# Send Discord message to channel
attack_link = f"https://www.torn.com/loader.php?sid=attack&user2ID={enemy_id}"
message = f"**New target for {discord_user.mention}!**\n\n[**{enemy.name}** (Level {enemy.level})]({attack_link})\n\nYou have {ASSIGNMENT_TIMEOUT} seconds!"
channel = self.bot.get_channel(ALLOWED_CHANNEL_ID)
if channel:
await channel.send(message)
print(f"Assigned {enemy.name} to {friendly.name} (Discord: {discord_user.name})")
else:
print(f"Assignment channel {ALLOWED_CHANNEL_ID} not found")
self.active_targets[key]["failed"] = True
except Exception as e:
print(f"Failed to send Discord message to channel: {e}")
self.active_targets[key]["failed"] = True
async def monitor_active_targets(self):
"""Monitor active targets for status changes or timeouts"""
@@ -220,12 +250,24 @@ class BotAssignmentManager:
for key, data in list(self.active_targets.items()):
elapsed = (now - data["assigned_at"]).total_seconds()
# Remove failed assignments after a short delay (don't reassign them)
if data.get("failed", False):
if elapsed >= 30: # Clean up after 30 seconds
print(f"Removing failed assignment: {key}")
del self.active_targets[key]
continue
# Check enemy status
enemy_id = data["enemy_id"]
enemy = STATE.enemy.get(enemy_id)
if enemy and "hospital" in enemy.status.lower():
# Enemy is hospitalized - success!
if not enemy:
# Enemy no longer exists, remove assignment
del self.active_targets[key]
continue
# Check if enemy is hospitalized (success!)
if "hospital" in enemy.status.lower():
friendly_id = data["friendly_id"]
if friendly_id in STATE.friendly:
# Increment hit count
@@ -236,7 +278,13 @@ class BotAssignmentManager:
del self.active_targets[key]
continue
# Send reminder
# Check if enemy is no longer attackable (traveling, etc.)
if enemy.status.lower() != "okay":
print(f"Target {enemy.name} is now '{enemy.status}' - removing assignment")
del self.active_targets[key]
continue
# Send reminder (only for successful assignments)
if elapsed >= ASSIGNMENT_REMINDER and not data["reminded"]:
discord_id = data["discord_id"]
try: