This repository has been archived on 2022-02-23. You can view files and clone it, but cannot push or open issues or pull requests.
lets/secret/achievements/common.py

57 lines
2.1 KiB
Python

import math
if __name__ != "common":
from objects import glob
import time
import json
from common.ripple import userUtils
def load_achievement_data(ACHIEVEMENT_BASE, ACHIEVEMENT_KEYS, ACHIEVEMENT_STRUCT):
LENGTH = 0
ACHIEVEMENTS = []
for struct in ACHIEVEMENT_STRUCT:
LENGTH = max(LENGTH, len(ACHIEVEMENT_KEYS[struct]) * ACHIEVEMENT_STRUCT[struct])
entry = {x:0 for x in ACHIEVEMENT_STRUCT}
for i in range(LENGTH):
for struct in ACHIEVEMENT_STRUCT:
entry[struct] = math.floor(i / ACHIEVEMENT_STRUCT[struct]) % len(ACHIEVEMENT_KEYS[struct])
format_data = {x:ACHIEVEMENT_KEYS[x][entry[x]] for x in ACHIEVEMENT_KEYS}
ACHIEVEMENTS.append({x: ACHIEVEMENT_BASE[x].format_map(format_data) for x in ACHIEVEMENT_BASE})
return ACHIEVEMENTS, LENGTH
def get_usercache(userID):
user_cache = glob.redis.get("lets:user_achievement_cache:{}".format(userID))
if user_cache is None:
user_cache = {}
else:
user_cache = json.loads(user_cache.decode("utf-8"))
if "version" not in user_cache:
# Load from sql database
user_cache["version"] = userUtils.getAchievementsVersion(userID)
db_achievements = [x["achievement_id"] for x in glob.db.fetchAll("SELECT achievement_id FROM users_achievements WHERE user_id = %s", [userID])]
if "achievements" in user_cache:
user_cache["achievements"] += db_achievements
else:
user_cache["achievements"] = db_achievements
# Remove duplicates after merge
user_cache["achievements"] = list(set(user_cache["achievements"]))
return user_cache
def add_pending_achievement(userID, achievementID):
user_cache = get_usercache(userID)
if len([x for x in user_cache["achievements"] if x in [achievementID, -achievementID]]) > 0:
print("Tried to add achievement:{} to user:{}, but failed due to duplicate entry.".format(achievementID, userID))
return
user_cache["achievements"].append(-achievementID)
# Remove duplicates after merge
user_cache["achievements"] = list(set(user_cache["achievements"]))
glob.redis.set("lets:user_achievement_cache:{}".format(userID), json.dumps(user_cache), 1800)
userUtils.unlockAchievement(userID, achievementID)