108 lines
2.6 KiB
TypeScript
108 lines
2.6 KiB
TypeScript
/**
|
|
* Export your gear database to json format used in:
|
|
* https://leanny.github.io/splat3seedchecker/#/settings
|
|
*
|
|
* This script get token from `./profile.json` or login interactively.
|
|
* And export geardata to `./geardata_${timestamp}.json`.
|
|
*/
|
|
|
|
import Murmurhash3 from "https://deno.land/x/murmurhash@v1.0.0/mod.ts";
|
|
import { base64, flags } from "../deps.ts";
|
|
import { DEFAULT_ENV } from "../src/env.ts";
|
|
import { loginManually } from "../src/iksm.ts";
|
|
import { Splatnet3 } from "../src/splatnet3.ts";
|
|
import {
|
|
FileStateBackend,
|
|
InMemoryStateBackend,
|
|
Profile,
|
|
} from "../src/state.ts";
|
|
import { parseHistoryDetailId } from "../src/utils.ts";
|
|
|
|
function encryptKey(uid: string) {
|
|
const hasher = new Murmurhash3();
|
|
hasher.hash(uid);
|
|
const hash = hasher.result();
|
|
const key = hash & 0xff;
|
|
const encrypted = base64.encode(
|
|
new TextEncoder().encode(uid).map((i) => i ^ key),
|
|
);
|
|
return {
|
|
key: encrypted,
|
|
h: hash,
|
|
};
|
|
}
|
|
|
|
const parseArgs = (args: string[]) => {
|
|
const parsed = flags.parse(args, {
|
|
string: ["profilePath"],
|
|
alias: {
|
|
"help": "h",
|
|
"profilePath": ["p", "profile-path"],
|
|
},
|
|
});
|
|
return parsed;
|
|
};
|
|
|
|
const opts = parseArgs(Deno.args);
|
|
if (opts.help) {
|
|
console.log(
|
|
`Usage: deno run -A ${Deno.mainModule} [options]
|
|
|
|
Options:
|
|
--profile-path <path>, -p Path to config file (default: null, login token will be dropped)
|
|
--help Show this help message and exit`,
|
|
);
|
|
Deno.exit(0);
|
|
}
|
|
|
|
const env = DEFAULT_ENV;
|
|
const stateBackend = opts.profilePath
|
|
? new FileStateBackend(opts.profilePath)
|
|
: new InMemoryStateBackend();
|
|
const profile = new Profile({ stateBackend, env });
|
|
await profile.readState();
|
|
|
|
if (!profile.state.loginState?.sessionToken) {
|
|
const sessionToken = await loginManually(env);
|
|
|
|
await profile.writeState({
|
|
...profile.state,
|
|
loginState: {
|
|
...profile.state.loginState,
|
|
sessionToken,
|
|
},
|
|
});
|
|
}
|
|
|
|
const splatnet = new Splatnet3({ profile, env });
|
|
|
|
console.log("Fetching uid...");
|
|
const { latestBattleHistories: { historyGroups } } = await splatnet
|
|
.getLatestBattleHistoriesQuery();
|
|
|
|
const id = historyGroups.nodes?.[0].historyDetails.nodes?.[0].id;
|
|
|
|
if (!id) {
|
|
console.log("No battle history found");
|
|
Deno.exit(0);
|
|
}
|
|
|
|
const { uid } = parseHistoryDetailId(id);
|
|
|
|
console.log("Fetching gears...");
|
|
const data = await splatnet.getGears();
|
|
const timestamp = Math.floor(new Date().getTime() / 1000);
|
|
|
|
await Deno.writeTextFile(
|
|
`./geardata_${timestamp}.json`,
|
|
JSON.stringify({
|
|
...encryptKey(uid),
|
|
timestamp,
|
|
gear: {
|
|
data,
|
|
},
|
|
}),
|
|
);
|
|
|
|
console.log("Done");
|