From 8db9d98b2b3db2e47c37d960421d69cf11afaf99 Mon Sep 17 00:00:00 2001 From: DitFranXX Date: Fri, 11 Dec 2020 17:48:27 +0900 Subject: [PATCH] Use newer API for Custom MDB, Fix profile bug. --- gitadora@asphyxia/data/.gitignore | 3 +- gitadora@asphyxia/data/Exchain.ts | 9 ++- gitadora@asphyxia/data/Matixx.ts | 9 ++- gitadora@asphyxia/data/helper.ts | 35 +++++++++-- gitadora@asphyxia/handlers/MusicList.ts | 38 ++++++------ gitadora@asphyxia/handlers/profiles.ts | 79 ++++++++++++++----------- gitadora@asphyxia/index.ts | 14 +++-- gitadora@asphyxia/utils.ts | 7 +++ 8 files changed, 117 insertions(+), 77 deletions(-) diff --git a/gitadora@asphyxia/data/.gitignore b/gitadora@asphyxia/data/.gitignore index 49bbf00..fc9251a 100644 --- a/gitadora@asphyxia/data/.gitignore +++ b/gitadora@asphyxia/data/.gitignore @@ -1,4 +1,5 @@ mdb_ex.xml mdb_mt.xml mdb_ex.b64 -mdb_mt.b64 \ No newline at end of file +mdb_mt.b64 +custom_mdb.xml \ No newline at end of file diff --git a/gitadora@asphyxia/data/Exchain.ts b/gitadora@asphyxia/data/Exchain.ts index 0ae6002..4d17f47 100644 --- a/gitadora@asphyxia/data/Exchain.ts +++ b/gitadora@asphyxia/data/Exchain.ts @@ -1,15 +1,14 @@ -import * as path from "path"; -import { readJSON, readXML } from './helper'; +import { CommonMusicData, readJSONOrXML, readXML } from './helper'; export async function processData() { - const { music } = await readJSON(path.resolve(__dirname, './mdb_ex.json')) + const { music } = await readJSONOrXML('data/mdb_ex.json', 'data/mdb_ex.xml', processRawData) return { music, }; } -export async function processRawData() { - const data = await readXML(path.resolve(__dirname, './mdb_ex.xml')) +export async function processRawData(path: string): Promise { + const data = await readXML(path) const mdb = $(data).elements("mdb.mdb_data"); const music: any[] = []; for (const m of mdb) { diff --git a/gitadora@asphyxia/data/Matixx.ts b/gitadora@asphyxia/data/Matixx.ts index 6ec3db2..8a56303 100644 --- a/gitadora@asphyxia/data/Matixx.ts +++ b/gitadora@asphyxia/data/Matixx.ts @@ -1,15 +1,14 @@ -import * as path from "path"; -import { readJSON, readXML } from './helper'; +import { CommonMusicData, readJSONOrXML, readXML } from './helper'; export async function processData() { - const { music } = await readJSON(path.resolve(__dirname, './mdb_ex.json')) + const { music } = await readJSONOrXML('data/mdb_mt.json', 'data/mdb_mt.xml', processRawData) return { music, }; } -export async function processRawData() { - const data = await readXML(path.resolve(__dirname, './mdb_mt.xml')) +export async function processRawData(path: string): Promise { + const data = await readXML(path) const mdb = $(data).elements("mdb.mdb_data"); const music: any[] = []; for (const m of mdb) { diff --git a/gitadora@asphyxia/data/helper.ts b/gitadora@asphyxia/data/helper.ts index b2c6e99..88e14c5 100644 --- a/gitadora@asphyxia/data/helper.ts +++ b/gitadora@asphyxia/data/helper.ts @@ -1,11 +1,36 @@ +export interface CommonMusicDataField { + id: KITEM<"s32">; + cont_gf: KITEM<"bool">; + cont_dm: KITEM<"bool">; + is_secret: KITEM<"bool">; + is_hot: KITEM<"bool">; + data_ver: KITEM<"s32">; + diff: KARRAY<"u16">; +} + +export interface CommonMusicData { + music: CommonMusicDataField[] +} + export async function readXML(path: string) { - const xml = await IO.ReadFile(path, 'utf-8'); - const json = U.parseXML(xml, false) - return json + const xml = await IO.ReadFile(path, 'utf-8'); + const json = U.parseXML(xml, false) + return json } export async function readJSON(path: string) { - const str = await IO.ReadFile(path, 'utf-8'); - const json = JSON.parse(str) + const str = await IO.ReadFile(path, 'utf-8'); + const json = JSON.parse(str) + return json +} + +export async function readJSONOrXML(jsonPath: string, xmlPath: string, processHandler: (path: string) => Promise): Promise { + if (!IO.Exists(jsonPath)) { + const data = await processHandler(xmlPath) + await IO.WriteFile(jsonPath, JSON.stringify(data)) + return data + } else { + const json = JSON.parse(await IO.ReadFile(jsonPath, 'utf-8')) return json + } } \ No newline at end of file diff --git a/gitadora@asphyxia/handlers/MusicList.ts b/gitadora@asphyxia/handlers/MusicList.ts index e739822..50ce39b 100644 --- a/gitadora@asphyxia/handlers/MusicList.ts +++ b/gitadora@asphyxia/handlers/MusicList.ts @@ -1,34 +1,32 @@ import { getVersion } from "../utils"; import { processData as ExchainMusic } from "../data/Exchain" import { processData as MatixxMusic } from "../data/Matixx" -import { readXML } from "../data/helper"; -import * as path from "path"; +import { CommonMusicDataField, readJSONOrXML, readXML } from "../data/helper"; export const playableMusic: EPR = async (info, data, send) => { const version = getVersion(info); - - let musicList: any[] = []; + let music: CommonMusicDataField[] = []; try { if (U.GetConfig("enable_custom_mdb")) { - const data = await readXML(path.normalize(U.GetConfig("custom_mdb_path"))) + const data = await readXML('data/custom_mdb.xml') const mdb = $(data).elements("mdb.mdb_data"); - + for (const m of mdb) { const d = m.numbers("xg_diff_list"); const contain = m.numbers("contain_stat"); const gf = contain[0]; const dm = contain[1]; - + if (gf == 0 && dm == 0) { continue; } - + let type = gf; if (gf == 0) { type = dm; } - - musicList.push({ + + music.push({ id: K.ITEM('s32', m.number("music_id")), cont_gf: K.ITEM('bool', gf == 0 ? 0 : 1), cont_dm: K.ITEM('bool', dm == 0 ? 0 : 1), @@ -56,15 +54,16 @@ export const playableMusic: EPR = async (info, data, send) => { } } } catch (e) { - console.log(e.stack); - send.deny(); + console.error(e.stack); + console.error("Fallback: Using default MDB method.") + music = []; } - if (musicList.length == 0) { + if (music.length == 0) { if (version == 'exchain') { - musicList = _.get(await ExchainMusic(), 'music', []); + music = _.get(await ExchainMusic(), 'music', []); } else { - musicList = _.get(await MatixxMusic(), 'music', []); + music = _.get(await MatixxMusic(), 'music', []); } } @@ -74,11 +73,8 @@ export const playableMusic: EPR = async (info, data, send) => { major: K.ITEM('s32', 1), minor: K.ITEM('s32', 1), }, - musicinfo: { - '@attr': { - nr: musicList.length, - }, - 'music': musicList, - }, + musicinfo: K.ATTR({ nr: `${music.length}` }, { + music, + }), }); }; \ No newline at end of file diff --git a/gitadora@asphyxia/handlers/profiles.ts b/gitadora@asphyxia/handlers/profiles.ts index 399f87d..77ebab8 100644 --- a/gitadora@asphyxia/handlers/profiles.ts +++ b/gitadora@asphyxia/handlers/profiles.ts @@ -713,16 +713,28 @@ async function registerUser(refid: string, version: string, id = _.random(0, 999 } } + const defaultScores = (game: 'gf' | 'dm'): Scores => { + return { + collection: 'scores', + version, + pluginVer: PLUGIN_VER, + game, + scores: {} + } + }; + const gf = { game: 'gf', version }; const dm = { game: 'dm', version }; - await DB.Upsert(refid, { collection: 'playerinfo', version }, defaultInfo) - await DB.Upsert(refid, { collection: 'profile', ...gf }, defaultProfile('gf')) - await DB.Upsert(refid, { collection: 'profile', ...dm }, defaultProfile('dm')) - await DB.Upsert(refid, { collection: 'record', ...gf }, defaultRecord('gf')) - await DB.Upsert(refid, { collection: 'record', ...dm }, defaultRecord('dm')) - await DB.Upsert(refid, { collection: 'extra', ...gf }, defaultExtra('gf')) - await DB.Upsert(refid, { collection: 'extra', ...dm }, defaultExtra('dm')) + await DB.Upsert(refid, { collection: 'playerinfo', version }, defaultInfo); + await DB.Upsert(refid, { collection: 'profile', ...gf }, defaultProfile('gf')); + await DB.Upsert(refid, { collection: 'profile', ...dm }, defaultProfile('dm')); + await DB.Upsert(refid, { collection: 'record', ...gf }, defaultRecord('gf')); + await DB.Upsert(refid, { collection: 'record', ...dm }, defaultRecord('dm')); + await DB.Upsert(refid, { collection: 'extra', ...gf }, defaultExtra('gf')); + await DB.Upsert(refid, { collection: 'extra', ...dm }, defaultExtra('dm')); + await DB.Upsert(refid, { collection: 'scores', ...gf }, defaultScores('gf')); + await DB.Upsert(refid, { collection: 'scores', ...dm }, defaultScores('dm')); return defaultInfo } @@ -868,6 +880,7 @@ export const savePlayer: EPR = async (info, data, send) => { await DB.Upsert(refid, { collection: 'extra', game, version }, extra) const stages = $(data).elements('player.stage'); + const scores = (await getScore(refid, version, game)).scores; for (const stage of stages) { const mid = stage.number('musicid', -1); const seq = stage.number('seq', -1); @@ -885,41 +898,31 @@ export const savePlayer: EPR = async (info, data, send) => { const meter = stage.bigint('meter', BigInt(0)); const prog = stage.number('meter_prog', 0); - - const score = (await getScore(refid, version, game) - || { - collection: 'scores', - game, - version, - pluginVer: PLUGIN_VER, - scores: {} - }).scores; - - if(!score[mid]) { - score[mid] = { - update: [0,0], + if(!scores[mid]) { + scores[mid] = { + update: [0, 0], diffs: {} } } - if (newSkill > score.update[1]) { - score.update[0] = seq; - score.update[1] = newSkill; + if (newSkill > scores[mid].update[1]) { + scores[mid].update[0] = seq; + scores[mid].update[1] = newSkill; } - score.diffs[seq] = { - perc: Math.max(_.get(score.diffs[seq], 'perc', 0), perc), - rank: Math.max(_.get(score.diffs[seq], 'rank', 0), rank), + scores[mid].diffs[seq] = { + perc: Math.max(_.get(scores[mid].diffs[seq], 'perc', 0), perc), + rank: Math.max(_.get(scores[mid].diffs[seq], 'rank', 0), rank), meter: meter.toString(), - prog: Math.max(_.get(score.diffs[seq], 'prog', 0), prog), - clear: _.get(score.diffs[seq], 'clear') || clear, - fc: _.get(score.diffs[seq], 'fc') || fc, - ex: _.get(score.diffs[seq], 'ex') || ex, + prog: Math.max(_.get(scores[mid].diffs[seq], 'prog', 0), prog), + clear: _.get(scores[mid].diffs[seq], 'clear') || clear, + fc: _.get(scores[mid].diffs[seq], 'fc') || fc, + ex: _.get(scores[mid].diffs[seq], 'ex') || ex, }; - - await saveScore(refid, version, game, score); } + await saveScore(refid, version, game, scores); + await send.object({ player: K.ATTR({ no: `${no}` }, { skill: { rank: K.ITEM('s32', 1), total_nr: K.ITEM('s32', 1) }, @@ -962,12 +965,18 @@ async function getRecord(refid: string, version: string, game: 'gf' | 'dm') { }) } -async function getScore(refid: string, version: string, game: 'gf' | 'dm') { - return await DB.FindOne(refid, { +async function getScore(refid: string, version: string, game: 'gf' | 'dm'): Promise { + return (await DB.FindOne(refid, { collection: 'scores', version: version, game: game - }) + })) || { + collection: 'scores', + version: version, + pluginVer: PLUGIN_VER, + game: game, + scores: {} + } } async function saveScore(refid: string, version: string, game: 'gf' | 'dm', scores: Scores['scores']) { diff --git a/gitadora@asphyxia/index.ts b/gitadora@asphyxia/index.ts index 9dabe37..a34cb42 100644 --- a/gitadora@asphyxia/index.ts +++ b/gitadora@asphyxia/index.ts @@ -2,8 +2,13 @@ import { gameInfoGet, shopInfoRegist } from "./handlers/info"; import { playableMusic } from "./handlers/MusicList" import { getPlayer, check, regist, savePlayer } from "./handlers/profiles"; import { updatePlayerInfo } from "./handlers/webui"; +import { isRequiredVersion } from "./utils"; export function register() { + if(!isRequiredVersion(1, 20)) { + console.error("You need newer version of Core. v1.20 or newer required.") + } + R.GameCode('M32'); R.Config("enable_custom_mdb", { @@ -13,11 +18,10 @@ export function register() { default: false, }) - R.Config("custom_mdb_path", { - name: "Custom MDB PATH", - desc: "You need to enable Custom MDB option first. USE ABSOLUTE PATH !!", - type: "string", - default: "", + R.DataFile("data/custom_mdb.xml", { + accept: ".xml", + name: "Custom MDB", + desc: "You need to enable Custom MDB option first." }) R.WebUIEvent('updatePlayerInfo', updatePlayerInfo); diff --git a/gitadora@asphyxia/utils.ts b/gitadora@asphyxia/utils.ts index 8ad0bf1..8fd47b7 100644 --- a/gitadora@asphyxia/utils.ts +++ b/gitadora@asphyxia/utils.ts @@ -10,3 +10,10 @@ export const getVersion = (info: EamuseInfo) => { const moduleName: string = info.module; return moduleName.match(/([^_]*)_(.*)/)[1]; }; + +export function isRequiredVersion(major: number, minor: number) { + // version value exposed since Core v1.19 + const core_major = typeof CORE_VERSION_MAJOR === "number" ? CORE_VERSION_MAJOR : 1 + const core_minor = typeof CORE_VERSION_MINOR === "number" ? CORE_VERSION_MINOR : 18 + return core_major >= major && core_minor >= minor +} \ No newline at end of file