feat(custom-rulesets): support custom rulesets (#23)

* feat(custom_ruleset): add custom rulesets support

* feat(custom-ruleset): add version check

* feat(custom-ruleset): add LegacyIO API to get ruleset hashes

* feat(pp): add check for rulesets whose pp cannot be calculated

* docs(readme): update README to include support for custom rulesets

* fix(custom-ruleset): make `rulesets` empty instead of throw a error when version check is disabled

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* chore(custom-ruleset): apply the latest changes of generator

c891bcd159

and

e25041ad3b

* feat(calculator): add fallback performance calculation for unsupported modes

* fix(calculator): remove debug print

* fix: resolve reviews

* feat(calculator): add difficulty calculation checks

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
MingxuanGame
2025-10-26 21:10:36 +08:00
committed by GitHub
parent 8f4a9d5fed
commit 33f321952d
24 changed files with 3134 additions and 74 deletions

View File

@@ -13,11 +13,12 @@ from .create_banchobot import create_banchobot
from .daily_challenge import daily_challenge_job, process_daily_challenge_top
from .geoip import init_geoip
from .load_achievements import load_achievements
from .osu_rx_statistics import create_rx_statistics
from .special_statistics import create_custom_ruleset_statistics, create_rx_statistics
__all__ = [
"calculate_user_rank",
"create_banchobot",
"create_custom_ruleset_statistics",
"create_rx_statistics",
"daily_challenge_job",
"init_geoip",

View File

@@ -57,3 +57,34 @@ async def create_rx_statistics():
logger.success(
f"Created {rx_created} RX statistics rows and {ap_created} AP statistics rows during backfill"
)
async def create_custom_ruleset_statistics():
async with with_db() as session:
users = (await session.exec(select(User.id))).all()
total_users = len(users)
logger.info(f"Ensuring custom ruleset statistics exist for {total_users} users")
created_count = 0
for i in users:
if i == BANCHOBOT_ID:
continue
for mode in GameMode:
if not mode.is_custom_ruleset():
continue
is_exist = (
await session.exec(
select(exists()).where(
UserStatistics.user_id == i,
UserStatistics.mode == mode,
)
)
).first()
if not is_exist:
statistics = UserStatistics(mode=mode, user_id=i)
session.add(statistics)
created_count += 1
await session.commit()
if created_count:
logger.success(f"Created {created_count} custom ruleset statistics rows during backfill")