api / routers /utils.py
jamelloverz-sketch
feat: unified FastAPI v3 - merge all APIs into main org space
8c4dbdb
Raw
History Blame
3.39 kB
from database import fetch_one, fetch_all, execute
async def check_achievement(user_id: int, category: str, current: int, required: int, name: str):
achievement = await fetch_one(
"SELECT id FROM achievements WHERE name=? AND category=? AND total_required=?",
[name, category, str(required)],
)
if not achievement:
return
aid = achievement["id"]
ua = await fetch_one(
"SELECT * FROM user_achievements WHERE user_id=? AND achievement_id=?",
[str(user_id), str(aid)],
)
if ua:
if ua.get("is_unlocked"):
return
if ua.get("progress", 0) >= ua.get("total", 1):
await execute(
"UPDATE user_achievements SET is_unlocked=1, unlocked_at=datetime('now') WHERE id=?",
[str(ua["id"])],
)
await create_notification(user_id, f"إنجاز مفتوح: {name}", f"لقد حصلت على إنجاز {name}!", "achievement_unlocked")
else:
await execute(
"INSERT INTO user_achievements (user_id, achievement_id, progress, total, is_unlocked) VALUES (?, ?, ?, ?, ?)",
[str(user_id), str(aid), str(current), str(required), "1" if current >= required else "0"],
)
if current >= required:
await create_notification(user_id, f"إنجاز مفتوح: {name}", f"لقد حصلت على إنجاز {name}!", "achievement_unlocked")
async def progress_achievement(user_id: int, category: str, increment: int = 1):
achievements = await fetch_all(
"SELECT id, name, total_required FROM achievements WHERE category=?",
[category],
)
for a in achievements:
aid = a["id"]
total = a["total_required"]
name = a["name"]
ua = await fetch_one(
"SELECT * FROM user_achievements WHERE user_id=? AND achievement_id=?",
[str(user_id), str(aid)],
)
if ua:
if ua.get("is_unlocked"):
continue
new_progress = (ua.get("progress", 0) or 0) + increment
is_unlocked = "1" if new_progress >= total else "0"
await execute(
"UPDATE user_achievements SET progress=?, is_unlocked=?, unlocked_at=CASE WHEN ?=1 THEN datetime('now') ELSE NULL END WHERE id=?",
[str(new_progress), is_unlocked, is_unlocked, str(ua["id"])],
)
if new_progress >= total:
await create_notification(user_id, f"إنجاز مفتوح: {name}", f"لقد حصلت على إنجاز {name}!", "achievement_unlocked")
else:
await execute(
"INSERT INTO user_achievements (user_id, achievement_id, progress, total, is_unlocked) VALUES (?, ?, ?, ?, ?)",
[str(user_id), str(aid), str(increment), str(total), "1" if increment >= total else "0"],
)
if increment >= total:
await create_notification(user_id, f"إنجاز مفتوح: {name}", f"لقد حصلت على إنجاز {name}!", "achievement_unlocked")
async def create_notification(user_id: int, title: str, body: str, ntype: str = "info"):
try:
await execute(
"INSERT INTO notifications (user_id, title, body, type) VALUES (?, ?, ?, ?)",
[str(user_id), title, body, ntype],
)
except Exception:
pass