Changed status lookup to only queue okay enemies for attack
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user