add active_time quests support
This commit is contained in:
@ -351,6 +351,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" как шаблон — используем
|
||||||
title = tpl.get("title") or tpl.get("key")
|
title = tpl.get("title") or tpl.get("key")
|
||||||
|
|||||||
@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user