add active_time quests support

This commit is contained in:
2025-12-13 18:30:27 +05:00
parent 13fcd40eb4
commit 1bacb8d78f
2 changed files with 69 additions and 0 deletions

View File

@ -350,6 +350,67 @@ class DailyQuestsService:
} }
await user_daily_quests_collection.insert_one(doc) await user_daily_quests_collection.insert_one(doc)
return doc return doc
async def on_active_time_tick(self, username: str, seconds: int) -> dict:
"""
Начисляет активное время игроку (секунды) и обновляет квесты event == active_time.
"""
if seconds <= 0:
return {"ok": True, "updated": 0, "coins_added": 0}
now_utc = datetime.now(timezone.utc)
today_local, _, _, _ = _day_bounds_utc(now_utc)
day_key = today_local.isoformat()
doc = await self._get_or_generate_for_day(username=username, day_key=day_key)
quests = doc.get("quests", [])
updated = 0
# инкрементим прогресс (секунды)
for q in quests:
if q.get("status") in ("claimed",):
continue
if q.get("event") != "active_time":
continue
need = int(q.get("required", 0) or 0)
if need <= 0:
continue
res = await user_daily_quests_collection.update_one(
{"username": username, "day": day_key, "quests.key": q.get("key")},
{"$inc": {"quests.$.progress": int(seconds)}},
)
if res.modified_count:
updated += 1
# доводим статусы до completed
doc2 = await user_daily_quests_collection.find_one({"username": username, "day": day_key})
if not doc2:
return {"ok": True, "updated": updated, "coins_added": 0}
changed = False
for q in doc2.get("quests", []):
if q.get("status") in ("completed", "claimed"):
continue
if q.get("event") != "active_time":
continue
need = int(q.get("required", 0) or 0)
prog = int(q.get("progress", 0) or 0)
if need > 0 and prog >= need:
q["status"] = "completed"
q["completed_at"] = now_utc.replace(tzinfo=None)
changed = True
if changed:
await user_daily_quests_collection.update_one(
{"_id": doc2["_id"]},
{"$set": {"quests": doc2["quests"]}},
)
coins_added = await self._auto_claim_completed(username, day_key)
return {"ok": True, "updated": updated, "coins_added": coins_added}
def _render_title(self, tpl: dict, required: int) -> str: def _render_title(self, tpl: dict, required: int) -> str:
# если в пуле есть "title" как шаблон — используем # если в пуле есть "title" как шаблон — используем

View File

@ -28,6 +28,14 @@ class EventService:
# Преобразуем ваши типы событий в нужные форматы # Преобразуем ваши типы событий в нужные форматы
if event_type == "online_players_update": if event_type == "online_players_update":
tick_seconds = 60
for p in players:
name = p.get("player_name")
if not name:
continue
await DailyQuestsService().on_active_time_tick(name, tick_seconds)
# Регистрируем сервер, если его нет # Регистрируем сервер, если его нет
await self._register_server(server_ip, event_data) await self._register_server(server_ip, event_data)