From 1bacb8d78fc1e14ba0c5f17e8129b3f059f61d4b Mon Sep 17 00:00:00 2001 From: DIKER0K Date: Sat, 13 Dec 2025 18:30:27 +0500 Subject: [PATCH] add active_time quests support --- app/services/dailyquests.py | 61 ++++++++++++++++++++++++++++++++++++ app/services/server/event.py | 8 +++++ 2 files changed, 69 insertions(+) diff --git a/app/services/dailyquests.py b/app/services/dailyquests.py index a1d6cc9..73791bf 100644 --- a/app/services/dailyquests.py +++ b/app/services/dailyquests.py @@ -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" как шаблон — используем diff --git a/app/services/server/event.py b/app/services/server/event.py index 7ef3b14..b57df89 100644 --- a/app/services/server/event.py +++ b/app/services/server/event.py @@ -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)