add autoclaim to dailyreward

This commit is contained in:
2025-12-13 17:49:41 +05:00
parent 04cf6a325a
commit c111a15d5b

View File

@ -182,6 +182,59 @@ class DailyQuestsService:
return {"claimed": True, "quest_key": quest_key, "coins_added": reward, "day": day_key}
async def _auto_claim_completed(self, username: str, day_key: str) -> int:
"""
Автоматически забирает награду за все completed квесты, которые ещё не claimed.
Возвращает сумму начисленных коинов.
"""
now_utc = datetime.now(timezone.utc)
doc = await user_daily_quests_collection.find_one({"username": username, "day": day_key})
if not doc:
return 0
total_added = 0
# IMPORTANT: идём по каждому completed и пытаемся атомарно "перевести" в claimed
for q in doc.get("quests", []):
if q.get("status") != "completed":
continue
quest_key = q.get("key")
reward = int(q.get("reward", 0) or 0)
if not quest_key or reward <= 0:
continue
# атомарно: только если всё ещё completed
res = await user_daily_quests_collection.update_one(
{
"username": username,
"day": day_key,
"quests": {"$elemMatch": {"key": quest_key, "status": "completed"}},
},
{"$set": {"quests.$.status": "claimed", "quests.$.claimed_at": now_utc.replace(tzinfo=None)}},
)
if res.modified_count == 0:
continue # уже claimed/не completed
# начисляем coins
await users_collection.update_one({"username": username}, {"$inc": {"coins": reward}})
total_added += reward
# лог (как в claim) :contentReference[oaicite:2]{index=2}
await coins_sessions_collection.insert_one({
"player_name": username,
"update_type": "daily_quest",
"timestamp": now_utc.replace(tzinfo=None),
"quest_key": quest_key,
"coins_added": reward,
"day": day_key,
"auto": True,
})
return total_added
async def on_mob_kill(self, username: str, mob: str, count: int = 1) -> dict:
"""
Вызывается EventService при событии mob_kill.
@ -243,7 +296,8 @@ class DailyQuestsService:
{"$set": {"quests": doc2["quests"]}},
)
return {"ok": True, "updated": updated}
coins_added = await self._auto_claim_completed(username, day_key)
return {"ok": True, "updated": updated, "coins_added": coins_added}
async def _get_or_generate_for_day(self, username: str, day_key: str) -> dict:
existing = await user_daily_quests_collection.find_one({"username": username, "day": day_key})