mirror of
https://gitea.tendokyu.moe/Hay1tsme/artemis.git
synced 2026-02-13 19:27:27 +08:00
mai2: add opts to reader
This commit is contained in:
@@ -1,20 +1,16 @@
|
||||
from decimal import Decimal
|
||||
import logging
|
||||
import os
|
||||
import re
|
||||
import xml.etree.ElementTree as ET
|
||||
from typing import Any, Dict, List, Optional
|
||||
from typing import Dict, List, Optional
|
||||
from Crypto.Cipher import AES
|
||||
import zlib
|
||||
import codecs
|
||||
|
||||
from core.config import CoreConfig
|
||||
from core.data import Data
|
||||
from read import BaseReader
|
||||
from titles.mai2.const import Mai2Constants
|
||||
from titles.mai2.database import Mai2Data
|
||||
|
||||
|
||||
class Mai2Reader(BaseReader):
|
||||
def __init__(
|
||||
self,
|
||||
@@ -46,10 +42,11 @@ class Mai2Reader(BaseReader):
|
||||
|
||||
for dir in data_dirs:
|
||||
self.logger.info(f"Read from {dir}")
|
||||
await self.get_events(f"{dir}/event")
|
||||
this_opt_id = await self.read_opt_info(dir)
|
||||
await self.get_events(f"{dir}/event", this_opt_id)
|
||||
await self.disable_events(f"{dir}/information", f"{dir}/scoreRanking")
|
||||
await self.read_music(f"{dir}/music")
|
||||
await self.read_tickets(f"{dir}/ticket")
|
||||
await self.read_music(f"{dir}/music", this_opt_id)
|
||||
await self.read_tickets(f"{dir}/ticket", this_opt_id)
|
||||
|
||||
else:
|
||||
if not os.path.exists(f"{self.bin_dir}/tables"):
|
||||
@@ -179,7 +176,7 @@ class Mai2Reader(BaseReader):
|
||||
self.logger.warning("Failed load table content, skipping")
|
||||
return
|
||||
|
||||
async def get_events(self, base_dir: str) -> None:
|
||||
async def get_events(self, base_dir: str, opt_id: int = None) -> None:
|
||||
self.logger.info(f"Reading events from {base_dir}...")
|
||||
|
||||
for root, dirs, files in os.walk(base_dir):
|
||||
@@ -193,7 +190,7 @@ class Mai2Reader(BaseReader):
|
||||
event_type = int(troot.find("infoType").text)
|
||||
|
||||
await self.data.static.put_game_event(
|
||||
self.version, event_type, id, name
|
||||
self.version, event_type, id, name, opt_id
|
||||
)
|
||||
self.logger.info(f"Added event {id}...")
|
||||
|
||||
@@ -255,7 +252,7 @@ class Mai2Reader(BaseReader):
|
||||
await self.data.static.toggle_game_event(self.version, event_id, toggle=False)
|
||||
self.logger.info(f"Disabled event {event_id}...")
|
||||
|
||||
async def read_music(self, base_dir: str) -> None:
|
||||
async def read_music(self, base_dir: str, opt_id: int = None) -> None:
|
||||
self.logger.info(f"Reading music from {base_dir}...")
|
||||
|
||||
for root, dirs, files in os.walk(base_dir):
|
||||
@@ -296,13 +293,14 @@ class Mai2Reader(BaseReader):
|
||||
added_ver,
|
||||
diff_num,
|
||||
note_designer,
|
||||
opt_id
|
||||
)
|
||||
|
||||
self.logger.info(
|
||||
f"Added music id {song_id} chart {chart_id}"
|
||||
)
|
||||
|
||||
async def read_tickets(self, base_dir: str) -> None:
|
||||
async def read_tickets(self, base_dir: str, opt_id: int = None) -> None:
|
||||
self.logger.info(f"Reading tickets from {base_dir}...")
|
||||
|
||||
for root, dirs, files in os.walk(base_dir):
|
||||
@@ -317,7 +315,7 @@ class Mai2Reader(BaseReader):
|
||||
price = int(troot.find("creditNum").text)
|
||||
|
||||
await self.data.static.put_game_ticket(
|
||||
self.version, id, ticket_type, price, name
|
||||
self.version, id, ticket_type, price, name, opt_id
|
||||
)
|
||||
self.logger.info(f"Added ticket {id}...")
|
||||
|
||||
@@ -341,3 +339,51 @@ class Mai2Reader(BaseReader):
|
||||
if scores is None or text is None:
|
||||
return
|
||||
# TODO
|
||||
|
||||
async def read_opt_info(self, directory: str) -> Optional[int]:
|
||||
datacfg_file = os.path.join(directory, "DataConfig.xml")
|
||||
if not os.path.exists(datacfg_file):
|
||||
self.logger.warning(f"{datacfg_file} does not contain DataConfig.xml, opt info will not be read")
|
||||
return None
|
||||
|
||||
with open(datacfg_file, encoding="utf-8") as f:
|
||||
troot = ET.fromstring(f.read())
|
||||
|
||||
if troot.find("DataConfig/version") is None:
|
||||
self.logger.warning(f"{directory}/DataConfig.xml contains no Version section, opt info will not be read")
|
||||
return None
|
||||
|
||||
ver_maj = troot.find("DataConfig/version/major")
|
||||
ver_min = troot.find("DataConfig/version/minor")
|
||||
ver_rel = troot.find("DataConfig/version/release")
|
||||
cm_maj = troot.find("DataConfig/cardMakerVersion/major")
|
||||
cm_min = troot.find("DataConfig/cardMakerVersion/minor")
|
||||
cm_rel = troot.find("DataConfig/cardMakerVersion/release")
|
||||
|
||||
if ver_maj is None: # Probably not worth checking that the other sections exist
|
||||
self.logger.warning(f"{datacfg_file} contains no major item in the Version section, opt info will not be read")
|
||||
return None
|
||||
|
||||
if ver_min is None: # Probably not worth checking that the other sections exist
|
||||
self.logger.warning(f"{datacfg_file} contains no minor item in the Version section, opt info will not be read")
|
||||
return None
|
||||
|
||||
if ver_rel is None: # Probably not worth checking that the other sections exist
|
||||
self.logger.warning(f"{datacfg_file} contains no release item in the Version section, opt info will not be read")
|
||||
return None
|
||||
|
||||
opt_folder = os.path.basename(os.path.normpath(directory))
|
||||
opt_id = await self.data.static.get_opt_by_version_folder(self.version, opt_folder)
|
||||
|
||||
if not opt_id:
|
||||
opt_id = await self.data.static.put_opt(self.version, opt_folder, int(ver_rel.text), int(cm_rel.text) if cm_rel else None)
|
||||
if not opt_id:
|
||||
self.logger.error(f"Failed to put opt folder info for {opt_folder}")
|
||||
return None
|
||||
else:
|
||||
opt_id = opt_id['id']
|
||||
|
||||
self.logger.info(
|
||||
f"Opt folder {opt_folder} (Database ID {opt_id}) contains v{ver_maj.text}.{ver_min.text}.{ver_rel.text} (cm v{cm_maj.text if cm_maj else 'None'}.{cm_min.text if cm_min else 'None'}.{cm_rel.text if cm_rel else 'None'})"
|
||||
)
|
||||
return opt_id
|
||||
|
||||
Reference in New Issue
Block a user