feat: update queries and version (#40)

* feat: update queries and version

* feat: add skip tip to user

* fix: find-coop-map

* build: bump version
main
imspace 2022-11-29 22:15:07 +08:00 committed by GitHub
parent 2a0bc5ff56
commit 5409ecdb16
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 87 additions and 50 deletions

View File

@ -1,3 +1,11 @@
## 0.1.35
feat: update Queries and `WEB_VIEW_VERSION` to match the latest version of the
NSO.
feat: disable Salmon Run export for now.
([#42](https://github.com/spacemeowx2/s3si.ts/issues/42))
## 0.1.34
feat: add `--with-summary` to export summary data to file

View File

@ -15,7 +15,6 @@ for (const dir of dirs) {
const events = new Map<number, string>();
const uniforms = new Map<number, string>();
const specials = new Map<number, string>();
const bosses = new Map<number, string>();
for (const file of files) {
@ -41,14 +40,6 @@ for (const file of files) {
uniforms.set(b64Number(id), name);
}
for (
const { id, name } of data.detail.waveResults.flatMap((i) =>
i.specialWeapons
)
) {
specials.set(b64Number(id), name);
}
for (const { id, name } of data.detail.enemyResults.map((i) => i.enemy)) {
bosses.set(b64Number(id), name);
}
@ -60,5 +51,4 @@ for (const file of files) {
console.log([...events.entries()].sort((a, b) => a[0] - b[0]));
console.log([...uniforms.entries()].sort((a, b) => a[0] - b[0]));
console.log([...specials.entries()].sort((a, b) => a[0] - b[0]));
console.log([...bosses.entries()].sort((a, b) => a[0] - b[0]));

View File

@ -51,8 +51,10 @@ async function getWebViewVer(): Promise<string> {
const mainJSBody = await (await fetch(SPLATNET3_URL + mainJS)).text();
const revision = /"([0-9a-f]{40})"/.exec(mainJSBody)?.[1];
const version = /revision_info_not_set.*?="(\d+\.\d+\.\d+)/.exec(mainJSBody)
?.[1];
const version = /revision_info_not_set.*?=("|`)(\d+\.\d+\.\d+)-/.exec(
mainJSBody,
)
?.[2];
if (!version || !revision) {
throw new Error("No version and revision found");

View File

@ -1,9 +1,9 @@
import type { StatInkPostBody, VsHistoryDetail } from "./types.ts";
export const AGENT_NAME = "s3si.ts";
export const S3SI_VERSION = "0.1.34";
export const S3SI_VERSION = "0.1.35";
export const NSOAPP_VERSION = "2.3.1";
export const WEB_VIEW_VERSION = "1.0.0-433ec0e8";
export const WEB_VIEW_VERSION = "2.0.0-8a061f6c";
export const S3SI_LINK = "https://github.com/spacemeowx2/s3si.ts";
export const USERAGENT = `${AGENT_NAME}/${S3SI_VERSION} (${S3SI_LINK})`;
@ -37,7 +37,6 @@ export const SPLATNET3_STATINK_MAP: {
| "white"
| undefined
>;
COOP_SPECIAL_MAP: Record<number, string>;
WATER_LEVEL_MAP: Record<0 | 1 | 2, "low" | "normal" | "high">;
} = {
RULE: {
@ -81,15 +80,6 @@ export const SPLATNET3_STATINK_MAP: {
6: "black",
7: "white",
},
COOP_SPECIAL_MAP: {
20006: "nicedama",
20007: "hopsonar",
20009: "megaphone51",
20010: "jetpack",
20012: "kanitank",
20013: "sameride",
20014: "tripletornado",
},
WATER_LEVEL_MAP: {
0: "low",
1: "normal",

View File

@ -22,6 +22,7 @@ import {
StatInkPlayer,
StatInkPostBody,
StatInkPostResponse,
StatInkSpecialWeapon,
StatInkStage,
StatInkUuidList,
StatInkWeapon,
@ -182,6 +183,29 @@ class StatInkAPI {
}
}
_specialMap = new Map<string, string>();
async getSpecialMap() {
if (this._specialMap.size === 0) {
const specials = await this.getSpecial();
for (const special of specials) {
for (
const name of Object.values(special.name).flatMap((n) =>
this._getAliasName(n)
)
) {
const prevKey = this._specialMap.get(name);
if (prevKey !== undefined && prevKey !== special.key) {
console.warn(`Duplicate weapon name: ${name}`);
}
this._specialMap.set(name, special.key);
}
}
if (this._specialMap.size === 0) {
throw new Error("Failed to get salmon weapon map");
}
}
return this._specialMap;
}
_salmonWeaponMap = new Map<string, string>();
async getSalmonWeaponMap() {
if (this._salmonWeaponMap.size === 0) {
@ -205,6 +229,10 @@ class StatInkAPI {
}
return this._salmonWeaponMap;
}
getSpecial = (): Promise<StatInkSpecialWeapon> => {
// TODO: fix this after stat.ink supports special API
throw new Error("Not implemented");
};
getSalmonWeapon = () =>
this._getCached<StatInkWeapon>(
`${this.statInk}/api/v3/salmon/weapon?full=1`,
@ -262,13 +290,18 @@ export class StatInkExporter implements GameExporter {
url,
};
} else {
const body = await this.mapCoop(game);
const { url } = await this.api.postCoop(body);
return {
status: "success",
url,
status: "skip",
reason:
"Can not export Salmon Run for now. See https://github.com/spacemeowx2/s3si.ts/issues/42",
};
// const body = await this.mapCoop(game);
// const { url } = await this.api.postCoop(body);
// return {
// status: "success",
// url,
// };
}
}
async notExported(
@ -559,6 +592,16 @@ export class StatInkExporter implements GameExporter {
return weapon;
}
async mapSpecial(name: string): Promise<string> {
const specialMap = await this.api.getSpecialMap();
const special = specialMap.get(name);
if (!special) {
throw new Error(`Special not found: ${name}`);
}
return special;
}
async mapCoopPlayer({
player,
weapons,
@ -578,7 +621,7 @@ export class StatInkExporter implements GameExporter {
uniform:
SPLATNET3_STATINK_MAP.COOP_UNIFORM_MAP[b64Number(player.uniform.id)],
special: specialWeapon
? SPLATNET3_STATINK_MAP.COOP_SPECIAL_MAP[b64Number(specialWeapon.id)]
? await this.mapSpecial(specialWeapon.name)
: undefined,
weapons: await Promise.all(weapons.map((w) => this.mapCoopWeapon(w))),
golden_eggs: goldenDeliverCount,
@ -598,18 +641,18 @@ export class StatInkExporter implements GameExporter {
return nid;
}
mapWave(wave: CoopHistoryDetail["waveResults"]["0"]): StatInkCoopWave {
async mapWave(
wave: CoopHistoryDetail["waveResults"]["0"],
): Promise<StatInkCoopWave> {
const event = wave.eventWave
? SPLATNET3_STATINK_MAP.COOP_EVENT_MAP[b64Number(wave.eventWave.id)]
: undefined;
const special_uses = wave.specialWeapons.reduce((p, { id }) => {
const key = SPLATNET3_STATINK_MAP.COOP_SPECIAL_MAP[b64Number(id)];
return {
const special_uses = (await Promise.all(
wave.specialWeapons.map((w) => this.mapSpecial(w.name)),
)).reduce((p, key) => ({
...p,
[key]: (p[key] ?? 0) + 1,
};
}, {} as Record<string, number | undefined>) as Record<string, number>;
}), {} as Record<string, number | undefined>) as Record<string, number>;
return {
tide: SPLATNET3_STATINK_MAP.WATER_LEVEL_MAP[wave.waterLevel],
@ -717,7 +760,7 @@ export class StatInkExporter implements GameExporter {
job_score: detail.jobScore,
job_rate: detail.jobRate,
job_bonus: detail.jobBonus,
waves: detail.waveResults.map((w) => this.mapWave(w)),
waves: await Promise.all(detail.waveResults.map((w) => this.mapWave(w))),
players: await Promise.all([
this.mapCoopPlayer(myResult),
...memberResults.map((p) => this.mapCoopPlayer(p)),

View File

@ -2,17 +2,17 @@ import { RankState } from "./state.ts";
export enum Queries {
HomeQuery = "dba47124d5ec3090c97ba17db5d2f4b3",
LatestBattleHistoriesQuery = "7d8b560e31617e981cf7c8aa1ca13a00",
RegularBattleHistoriesQuery = "f6e7e0277e03ff14edfef3b41f70cd33",
BankaraBattleHistoriesQuery = "c1553ac75de0a3ea497cdbafaa93e95b",
PrivateBattleHistoriesQuery = "38e0529de8bc77189504d26c7a14e0b8",
VsHistoryDetailQuery = "2b085984f729cd51938fc069ceef784a",
CoopHistoryQuery = "817618ce39bcf5570f52a97d73301b30",
CoopHistoryDetailQuery = "f3799a033f0a7ad4b1b396f9a3bafb1e",
LatestBattleHistoriesQuery = "4f5f26e64bca394b45345a65a2f383bd",
RegularBattleHistoriesQuery = "d5b795d09e67ce153e622a184b7e7dfa",
BankaraBattleHistoriesQuery = "de4754588109b77dbcb90fbe44b612ee",
PrivateBattleHistoriesQuery = "1d6ed57dc8b801863126ad4f351dfb9a",
VsHistoryDetailQuery = "291295ad311b99a6288fc95a5c4cb2d2",
CoopHistoryQuery = "6ed02537e4a65bbb5e7f4f23092f6154",
CoopHistoryDetailQuery = "3cc5f826a6646b85f3ae45db51bd0707",
myOutfitCommonDataFilteringConditionQuery =
"d02ab22c9dccc440076055c8baa0fa7a",
myOutfitCommonDataEquipmentsQuery = "d29cd0c2b5e6bac90dd5b817914832f8",
HistoryRecordQuery = "9d4ef9fba3f84d6933bb1f6f436f7200",
HistoryRecordQuery = "32b6771f94083d8f04848109b7300af5",
ConfigureAnalyticsQuery = "f8ae00773cc412a50dd41a6d9a159ddd",
}
export type VarsMap = {
@ -224,7 +224,6 @@ export type CoopHistoryPlayerResult = {
weapons: { name: string; image: Image | null }[];
specialWeapon: null | {
name: string;
id: string;
};
defeatEnemyCount: number;
deliverCount: number;
@ -270,7 +269,6 @@ export type CoopHistoryDetail = {
goldenPopCount: number;
teamDeliverCount: number;
specialWeapons: {
id: string;
name: string;
}[];
}[];
@ -570,6 +568,12 @@ export type StatInkWeapon = {
name: Record<string, string>;
}[];
// TODO: Change when the API is released
export type StatInkSpecialWeapon = {
key: string;
name: Record<string, string>;
}[];
export type StatInkGear = {
primary_ability: string;
secondary_abilities: (string | null)[];