106 lines
3.0 KiB
Python
106 lines
3.0 KiB
Python
from decimal import Decimal, getcontext
|
|
import hashlib
|
|
|
|
import orjson as json
|
|
from diskcache import Cache
|
|
|
|
getcontext().prec = 28
|
|
|
|
CACHE = Cache("target")
|
|
|
|
|
|
def salted_hash_userid(user_id: int):
|
|
hex = CACHE.get(user_id)
|
|
if hex is not None:
|
|
return hex
|
|
|
|
SALT = b"Lt2N5xgjJOqRsT5qVt7wWYw6SqOPZDI7"
|
|
|
|
hash_uid = hashlib.sha256(f"{user_id}".encode("utf-8") + SALT)
|
|
result = hash_uid.hexdigest()[:16]
|
|
|
|
CACHE.add(user_id, result)
|
|
return result
|
|
|
|
|
|
def dx_rating(difficulty: Decimal, achievement: int) -> int:
|
|
# Constants
|
|
SSS_PLUS_THRESHOLD = Decimal("100.5")
|
|
SSS_PLUS_FACTOR = Decimal("0.224")
|
|
SSS_PRO_THRESHOLD = Decimal("100.4999")
|
|
SSS_PRO_FACTOR = Decimal("0.222")
|
|
SSS_THRESHOLD = Decimal("100.0")
|
|
SSS_FACTOR = Decimal("0.216")
|
|
SS_PLUS_PRO_THRESHOLD = Decimal("99.9999")
|
|
SS_PLUS_PRO_FACTOR = Decimal("0.214")
|
|
SS_PLUS_THRESHOLD = Decimal("99.5")
|
|
SS_PLUS_FACTOR = Decimal("0.211")
|
|
SS_THRESHOLD = Decimal("99.0")
|
|
SS_FACTOR = Decimal("0.208")
|
|
S_PLUS_PRO_THRESHOLD = Decimal("98.9999")
|
|
S_PLUS_PRO_FACTOR = Decimal("0.206")
|
|
S_PLUS_THRESHOLD = Decimal("98.0")
|
|
S_PLUS_FACTOR = Decimal("0.203")
|
|
S_THRESHOLD = Decimal("97.0")
|
|
S_FACTOR = Decimal("0.2")
|
|
AAA_PRO_THRESHOLD = Decimal("96.9999")
|
|
AAA_PRO_FACTOR = Decimal("0.176")
|
|
AAA_THRESHOLD = Decimal("94.0")
|
|
AAA_FACTOR = Decimal("0.168")
|
|
AA_THRESHOLD = Decimal("90.0")
|
|
AA_FACTOR = Decimal("0.152")
|
|
A_THRESHOLD = Decimal("80.0")
|
|
A_FACTOR = Decimal("0.136")
|
|
|
|
ach = Decimal(achievement) / Decimal("10000")
|
|
if ach > Decimal("101.0") or ach < A_THRESHOLD:
|
|
return 0
|
|
if ach >= SSS_PLUS_THRESHOLD:
|
|
factor = SSS_PLUS_FACTOR
|
|
ach = Decimal("100.5")
|
|
elif ach >= SSS_PRO_THRESHOLD:
|
|
factor = SSS_PRO_FACTOR
|
|
elif ach >= SSS_THRESHOLD:
|
|
factor = SSS_FACTOR
|
|
elif ach >= SS_PLUS_PRO_THRESHOLD:
|
|
factor = SS_PLUS_PRO_FACTOR
|
|
elif ach >= SS_PLUS_THRESHOLD:
|
|
factor = SS_PLUS_FACTOR
|
|
elif ach >= SS_THRESHOLD:
|
|
factor = SS_FACTOR
|
|
elif ach >= S_PLUS_PRO_THRESHOLD:
|
|
factor = S_PLUS_PRO_FACTOR
|
|
elif ach >= S_PLUS_THRESHOLD:
|
|
factor = S_PLUS_FACTOR
|
|
elif ach >= S_THRESHOLD:
|
|
factor = S_FACTOR
|
|
elif ach >= AAA_PRO_THRESHOLD:
|
|
factor = AAA_PRO_FACTOR
|
|
elif ach >= AAA_THRESHOLD:
|
|
factor = AAA_FACTOR
|
|
elif ach >= AA_THRESHOLD:
|
|
factor = AA_FACTOR
|
|
elif ach >= A_THRESHOLD:
|
|
factor = A_FACTOR
|
|
else:
|
|
return 0
|
|
result = (factor * difficulty * ach).quantize(Decimal("1."), rounding="ROUND_FLOOR")
|
|
return int(result)
|
|
|
|
|
|
with open("musicDB.json", "r", encoding="utf-8") as f:
|
|
MUSIC_DB = json.loads(f.read())
|
|
|
|
MUSIC_DB = {entry["id"]: entry for entry in MUSIC_DB}
|
|
|
|
|
|
def query_music_db(music_id: int):
|
|
music_info = MUSIC_DB.get(music_id)
|
|
if music_info is None:
|
|
return
|
|
return music_info
|
|
|
|
|
|
def find_level(music_info: dict, level_id: int):
|
|
return [level for level in music_info["levels"] if level["level"] == level_id]
|