Compare commits

4 Commits

4 changed files with 43 additions and 5 deletions

View File

@@ -0,0 +1,31 @@
"""chuni_subtrophy_db_fix
Revision ID: 318d52559e83
Revises: 8b57e9646449
Create Date: 2026-01-08 19:13:29.803912
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import mysql
# revision identifiers, used by Alembic.
revision = '318d52559e83'
down_revision = '8b57e9646449'
branch_labels = None
depends_on = None
def upgrade():
op.alter_column('chuni_profile_data', 'trophyIdSub1', existing_type=mysql.INTEGER(), server_default='-1')
op.alter_column('chuni_profile_data', 'trophyIdSub2', existing_type=mysql.INTEGER(), server_default='-1')
# fix any current profiles where the bad defaults were used
op.execute("UPDATE chuni_profile_data SET trophyIdSub1=-1 WHERE trophyIdSub1 IS NULL")
op.execute("UPDATE chuni_profile_data SET trophyIdSub2=-1 WHERE trophyIdSub2 IS NULL")
def downgrade():
# dont bother "unfixing" the table
pass

View File

@@ -121,7 +121,9 @@ class ChuniServlet(BaseServlet):
f"{ChuniConstants.VER_CHUNITHM_LUMINOUS}_chn": 8, f"{ChuniConstants.VER_CHUNITHM_LUMINOUS}_chn": 8,
ChuniConstants.VER_CHUNITHM_LUMINOUS_PLUS: 56, ChuniConstants.VER_CHUNITHM_LUMINOUS_PLUS: 56,
ChuniConstants.VER_CHUNITHM_VERSE: 42, ChuniConstants.VER_CHUNITHM_VERSE: 42,
f"{ChuniConstants.VER_CHUNITHM_VERSE}_chn": 37,
ChuniConstants.VER_CHUNITHM_X_VERSE: 14, ChuniConstants.VER_CHUNITHM_X_VERSE: 14,
f"{ChuniConstants.VER_CHUNITHM_X_VERSE}_int": 96,
} }
for version, keys in self.game_cfg.crypto.keys.items(): for version, keys in self.game_cfg.crypto.keys.items():
@@ -306,8 +308,10 @@ class ChuniServlet(BaseServlet):
internal_ver = ChuniConstants.VER_CHUNITHM_LUMINOUS internal_ver = ChuniConstants.VER_CHUNITHM_LUMINOUS
elif version >= 135 and version < 140: # LUMINOUS PLUS elif version >= 135 and version < 140: # LUMINOUS PLUS
internal_ver = ChuniConstants.VER_CHUNITHM_LUMINOUS_PLUS internal_ver = ChuniConstants.VER_CHUNITHM_LUMINOUS_PLUS
elif version >= 140: elif version >= 140 and version < 150: # VERSE
internal_ver = ChuniConstants.VER_CHUNITHM_VERSE internal_ver = ChuniConstants.VER_CHUNITHM_VERSE
elif version >= 150: # X-VERSE
internal_ver = ChuniConstants.VER_CHUNITHM_X_VERSE
elif game_code == "SDHJ": # Chn elif game_code == "SDHJ": # Chn
if version < 110: # NEW if version < 110: # NEW
internal_ver = ChuniConstants.VER_CHUNITHM_NEW internal_ver = ChuniConstants.VER_CHUNITHM_NEW
@@ -315,8 +319,10 @@ class ChuniServlet(BaseServlet):
version >= 110 and version < 120 version >= 110 and version < 120
): # NEW *Cursed but needed due to different encryption key ): # NEW *Cursed but needed due to different encryption key
internal_ver = ChuniConstants.VER_CHUNITHM_NEW_PLUS internal_ver = ChuniConstants.VER_CHUNITHM_NEW_PLUS
elif version >= 120: # LUMINOUS elif version >= 120 and version < 130: # LUMINOUS
internal_ver = ChuniConstants.VER_CHUNITHM_LUMINOUS internal_ver = ChuniConstants.VER_CHUNITHM_LUMINOUS
elif version >= 130: # VERSE
internal_ver = ChuniConstants.VER_CHUNITHM_VERSE
if all(c in string.hexdigits for c in endpoint) and len(endpoint) == 32: if all(c in string.hexdigits for c in endpoint) and len(endpoint) == 32:
# If we get a 32 character long hex string, it's a hash and we're # If we get a 32 character long hex string, it's a hash and we're

View File

@@ -69,7 +69,8 @@ class ChuniReader(BaseReader):
await self.read_system_voice(f"{dir}/systemVoice", this_opt_id) await self.read_system_voice(f"{dir}/systemVoice", this_opt_id)
await self.read_unlock_challenge(f"{dir}/unlockChallenge") await self.read_unlock_challenge(f"{dir}/unlockChallenge")
await self.read_linked_verse(f"{dir}/linkedVerse") await self.read_linked_verse(f"{dir}/linkedVerse")
await self.read_stage(f"{dir}/stage", this_opt_id) if self.version >= ChuniConstants.VER_CHUNITHM_X_VERSE:
await self.read_stage(f"{dir}/stage", this_opt_id)
async def read_login_bonus(self, root_dir: str, opt_id: Optional[int] = None) -> None: async def read_login_bonus(self, root_dir: str, opt_id: Optional[int] = None) -> None:
for root, dirs, files in walk(f"{root_dir}loginBonusPreset"): for root, dirs, files in walk(f"{root_dir}loginBonusPreset"):

View File

@@ -26,8 +26,8 @@ profile = Table(
Column("frameId", Integer), Column("frameId", Integer),
Column("isMaimai", Boolean), Column("isMaimai", Boolean),
Column("trophyId", Integer), Column("trophyId", Integer),
Column("trophyIdSub1", Integer), Column("trophyIdSub1", Integer, server_default="-1"),
Column("trophyIdSub2", Integer), Column("trophyIdSub2", Integer, server_default="-1"),
Column("userName", String(25)), Column("userName", String(25)),
Column("isWebJoin", Boolean), Column("isWebJoin", Boolean),
Column("playCount", Integer), Column("playCount", Integer),