add autoclaim to dailyreward
This commit is contained in:
@ -182,6 +182,59 @@ class DailyQuestsService:
|
|||||||
|
|
||||||
return {"claimed": True, "quest_key": quest_key, "coins_added": reward, "day": day_key}
|
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:
|
async def on_mob_kill(self, username: str, mob: str, count: int = 1) -> dict:
|
||||||
"""
|
"""
|
||||||
Вызывается EventService при событии mob_kill.
|
Вызывается EventService при событии mob_kill.
|
||||||
@ -243,7 +296,8 @@ class DailyQuestsService:
|
|||||||
{"$set": {"quests": doc2["quests"]}},
|
{"$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:
|
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})
|
existing = await user_daily_quests_collection.find_one({"username": username, "day": day_key})
|
||||||
|
|||||||
Reference in New Issue
Block a user