65 lines
2.4 KiB
Python
65 lines
2.4 KiB
Python
import asyncio
|
|
from discord.ext import commands
|
|
|
|
class Assignments(commands.Cog):
|
|
def __init__(self, bot, enemy_queue, active_assignments, enrolled_attackers, hit_check, reassign_delay):
|
|
self.bot = bot
|
|
self.enemy_queue = enemy_queue
|
|
self.active_assignments = active_assignments
|
|
self.enrolled_attackers = enrolled_attackers
|
|
self.HIT_CHECK_INTERVAL = hit_check
|
|
self.REASSIGN_DELAY = reassign_delay
|
|
|
|
# Start background task
|
|
bot.loop.create_task(self.monitor_assignments_loop())
|
|
|
|
def get_next_attacker(self):
|
|
if not self.enrolled_attackers:
|
|
return None
|
|
attacker = self.enrolled_attackers[0]
|
|
self.enrolled_attackers.append(self.enrolled_attackers.pop(0)) # round-robin
|
|
return attacker
|
|
|
|
async def monitor_assignments_loop(self):
|
|
await self.bot.wait_until_ready()
|
|
while not self.bot.is_closed():
|
|
now = asyncio.get_event_loop().time()
|
|
reassign_list = []
|
|
for enemy_id, data in list(self.active_assignments.items()):
|
|
elapsed = now - data["time_assigned"]
|
|
if elapsed >= self.HIT_CHECK_INTERVAL and elapsed < self.HIT_CHECK_INTERVAL + 5:
|
|
attacker_user = self.bot.get_user(data["attacker"])
|
|
if attacker_user:
|
|
try:
|
|
await attacker_user.send(
|
|
f"Reminder: You were assigned **{data['enemy']['name']}** and they are not down yet!"
|
|
)
|
|
except:
|
|
pass
|
|
if elapsed >= self.REASSIGN_DELAY:
|
|
reassign_list.append(enemy_id)
|
|
|
|
for enemy_id in reassign_list:
|
|
info = self.active_assignments.pop(enemy_id)
|
|
await self.reassign_target(info["enemy"])
|
|
|
|
await asyncio.sleep(5)
|
|
|
|
async def reassign_target(self, enemy):
|
|
attacker = self.get_next_attacker()
|
|
if attacker is None:
|
|
return
|
|
|
|
self.active_assignments[enemy["id"]] = {
|
|
"enemy": enemy,
|
|
"attacker": attacker,
|
|
"time_assigned": asyncio.get_event_loop().time()
|
|
}
|
|
|
|
attacker_user = self.bot.get_user(attacker)
|
|
if attacker_user:
|
|
try:
|
|
await attacker_user.send(f"Target reassigned to you: **{enemy['name']}**!")
|
|
except:
|
|
pass
|