add active_time quests support
This commit is contained in:
@ -350,6 +350,67 @@ class DailyQuestsService:
|
||||
}
|
||||
await user_daily_quests_collection.insert_one(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:
|
||||
# если в пуле есть "title" как шаблон — используем
|
||||
|
||||
@ -28,6 +28,14 @@ class EventService:
|
||||
|
||||
# Преобразуем ваши типы событий в нужные форматы
|
||||
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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user