s3si.ts/src/types.ts

699 lines
16 KiB
TypeScript
Raw Normal View History

2022-10-28 08:45:56 -04:00
import { RankState } from "./state.ts";
2022-10-20 09:45:59 -04:00
export enum Queries {
HomeQuery = "dba47124d5ec3090c97ba17db5d2f4b3",
LatestBattleHistoriesQuery = "7d8b560e31617e981cf7c8aa1ca13a00",
RegularBattleHistoriesQuery = "f6e7e0277e03ff14edfef3b41f70cd33",
BankaraBattleHistoriesQuery = "c1553ac75de0a3ea497cdbafaa93e95b",
PrivateBattleHistoriesQuery = "38e0529de8bc77189504d26c7a14e0b8",
VsHistoryDetailQuery = "2b085984f729cd51938fc069ceef784a",
CoopHistoryQuery = "817618ce39bcf5570f52a97d73301b30",
CoopHistoryDetailQuery = "f3799a033f0a7ad4b1b396f9a3bafb1e",
myOutfitCommonDataFilteringConditionQuery =
"d02ab22c9dccc440076055c8baa0fa7a",
2022-11-14 14:29:31 -05:00
myOutfitCommonDataEquipmentsQuery = "d29cd0c2b5e6bac90dd5b817914832f8",
2022-11-26 08:42:23 -05:00
HistoryRecordQuery = "9d4ef9fba3f84d6933bb1f6f436f7200",
ConfigureAnalyticsQuery = "f8ae00773cc412a50dd41a6d9a159ddd",
2022-10-20 09:45:59 -04:00
}
export type VarsMap = {
[Queries.HomeQuery]: [];
[Queries.LatestBattleHistoriesQuery]: [];
[Queries.RegularBattleHistoriesQuery]: [];
[Queries.BankaraBattleHistoriesQuery]: [];
[Queries.PrivateBattleHistoriesQuery]: [];
[Queries.VsHistoryDetailQuery]: [{
vsResultId: string;
}];
[Queries.CoopHistoryQuery]: [];
[Queries.CoopHistoryDetailQuery]: [{
coopHistoryDetailId: string;
}];
[Queries.myOutfitCommonDataFilteringConditionQuery]: [];
2022-11-14 14:29:31 -05:00
[Queries.myOutfitCommonDataEquipmentsQuery]: [];
2022-11-26 08:42:23 -05:00
[Queries.HistoryRecordQuery]: [];
[Queries.ConfigureAnalyticsQuery]: [];
2022-10-20 09:45:59 -04:00
};
export type Image = {
url?: string;
2022-10-20 09:45:59 -04:00
width?: number;
height?: number;
};
2022-10-20 22:47:56 -04:00
export type BankaraMatchChallenge = {
winCount: number;
loseCount: number;
maxWinCount: number;
maxLoseCount: number;
state: "FAILED" | "SUCCEEDED" | "INPROGRESS";
isPromo: boolean;
2022-10-21 04:14:44 -04:00
isUdemaeUp: boolean | null;
2022-10-20 22:47:56 -04:00
udemaeAfter: string | null;
2022-10-21 04:14:44 -04:00
earnedUdemaePoint: number | null;
2022-10-20 22:47:56 -04:00
};
export type BattleListNode = {
id: string;
udemae: string;
2022-10-26 05:05:16 -04:00
judgement: "LOSE" | "WIN" | "DEEMED_LOSE" | "EXEMPTED_LOSE" | "DRAW";
2022-10-28 08:45:56 -04:00
bankaraMatch: null | {
2022-10-29 05:03:14 -04:00
earnedUdemaePoint: null | number;
2022-10-28 08:45:56 -04:00
};
2022-10-20 22:47:56 -04:00
};
2022-10-24 14:45:36 -04:00
export type CoopListNode = {
id: string;
};
export type HistoryGroups<T> = {
2022-10-20 09:45:59 -04:00
nodes: {
2022-10-20 22:47:56 -04:00
bankaraMatchChallenge: null | BankaraMatchChallenge;
2022-10-24 14:45:36 -04:00
2022-10-20 09:45:59 -04:00
historyDetails: {
2022-10-24 14:45:36 -04:00
nodes: T[];
2022-10-20 09:45:59 -04:00
};
}[];
};
export type CoopHistoryGroup = {
startTime: null | string;
endTime: null | string;
highestResult: null | {
grade: {
id: string;
};
gradePoint: number;
jobScore: number;
};
mode: "PRIVATE_CUSTOM" | "REGULAR";
rule: "REGULAR";
historyDetails: {
nodes: CoopListNode[];
};
};
export type CoopHistoryGroups = {
nodes: CoopHistoryGroup[];
};
2022-11-04 11:34:07 -04:00
export type PlayerGear = {
name: string;
2022-11-26 08:42:23 -05:00
image: Image;
2022-11-04 11:34:07 -04:00
primaryGearPower: {
name: string;
2022-11-26 08:42:23 -05:00
image: Image;
2022-11-04 11:34:07 -04:00
};
additionalGearPowers: {
name: string;
2022-11-26 08:42:23 -05:00
image: Image;
2022-11-04 11:34:07 -04:00
}[];
brand: {
name: string;
id: string;
};
};
2022-10-20 20:06:25 -04:00
export type VsPlayer = {
id: string;
nameId: string | null;
name: string;
isMyself: boolean;
byname: string;
weapon: {
id: string;
subWeapon: {
id: string;
};
};
species: "INKLING" | "OCTOLING";
result: {
kill: number;
death: number;
assist: number;
special: number;
} | null;
paint: number;
2022-11-04 11:34:07 -04:00
headGear: PlayerGear;
clothingGear: PlayerGear;
shoesGear: PlayerGear;
2022-10-20 20:06:25 -04:00
};
export type VsTeam = {
players: VsPlayer[];
2022-10-21 04:14:44 -04:00
result: null | {
2022-10-20 20:06:25 -04:00
paintRatio: null | number;
score: null | number;
};
};
2022-10-20 22:47:56 -04:00
export type VsRule =
| "TURF_WAR"
| "AREA"
| "LOFT"
| "GOAL"
| "CLAM"
| "TRI_COLOR";
export type ChallengeProgress = {
index: number;
winCount: number;
loseCount: number;
};
2022-10-20 22:47:56 -04:00
// With challenge info
2022-10-24 14:45:36 -04:00
export type VsInfo = {
type: "VsInfo";
2022-10-20 22:47:56 -04:00
listNode: null | BattleListNode;
bankaraMatchChallenge: null | BankaraMatchChallenge;
challengeProgress: null | ChallengeProgress;
2022-10-28 08:45:56 -04:00
rankState: null | RankState;
2022-10-29 04:51:55 -04:00
rankBeforeState: null | RankState;
2022-10-20 22:47:56 -04:00
detail: VsHistoryDetail;
};
2022-10-24 14:45:36 -04:00
// Salmon run
export type CoopInfo = {
type: "CoopInfo";
listNode: null | CoopListNode;
groupInfo: null | Omit<CoopHistoryGroup, "historyDetails">;
2022-10-24 14:45:36 -04:00
detail: CoopHistoryDetail;
};
export type Game = VsInfo | CoopInfo;
2022-10-20 09:45:59 -04:00
export type VsHistoryDetail = {
id: string;
vsRule: {
name: string;
id: string;
2022-10-20 22:47:56 -04:00
rule: VsRule;
2022-10-20 09:45:59 -04:00
};
vsMode: {
id: string;
mode: "REGULAR" | "BANKARA" | "PRIVATE" | "FEST";
};
vsStage: {
id: string;
name: string;
image: Image;
};
playedTime: string; // 2021-01-01T00:00:00Z
2022-10-20 20:06:25 -04:00
bankaraMatch: {
earnedUdemaePoint: null | number;
2022-10-20 20:06:25 -04:00
mode: "OPEN" | "CHALLENGE";
} | null;
festMatch: {
dragonMatchType: "NORMAL" | "DECUPLE" | "DRAGON" | "DOUBLE_DRAGON";
contribution: number;
myFestPower: number | null;
} | null;
myTeam: VsTeam;
otherTeams: VsTeam[];
2022-10-26 05:05:16 -04:00
judgement: "LOSE" | "WIN" | "DEEMED_LOSE" | "EXEMPTED_LOSE" | "DRAW";
2022-10-20 20:06:25 -04:00
knockout: null | undefined | "NEITHER" | "WIN" | "LOSE";
awards: { name: string; rank: string }[];
duration: number;
2022-10-20 09:45:59 -04:00
};
export type CoopHistoryPlayerResult = {
player: {
byname: string | null;
name: string;
nameId: string;
uniform: {
name: string;
id: string;
};
isMyself: boolean;
};
weapons: { name: string; image: Image | null }[];
2022-11-25 08:29:11 -05:00
specialWeapon: null | {
name: string;
id: string;
};
defeatEnemyCount: number;
deliverCount: number;
goldenAssistCount: number;
goldenDeliverCount: number;
rescueCount: number;
rescuedCount: number;
};
2022-10-24 14:45:36 -04:00
export type CoopHistoryDetail = {
id: string;
afterGrade: null | {
name: string;
id: string;
};
rule: "REGULAR";
myResult: CoopHistoryPlayerResult;
memberResults: CoopHistoryPlayerResult[];
bossResult: null | {
hasDefeatBoss: boolean;
boss: {
name: string;
id: string;
};
};
enemyResults: {
defeatCount: number;
teamDefeatCount: number;
popCount: number;
enemy: {
name: string;
id: string;
};
}[];
waveResults: {
waveNumber: number;
waterLevel: 0 | 1 | 2;
eventWave: null | {
name: string;
id: string;
};
deliverNorm: number;
goldenPopCount: number;
teamDeliverCount: number;
specialWeapons: {
id: string;
name: string;
}[];
}[];
resultWave: number;
playedTime: string;
coopStage: {
name: string;
id: string;
};
dangerRate: number;
scenarioCode: null;
smellMeter: null | number;
weapons: { name: string }[];
afterGradePoint: null | number;
scale: null | {
gold: number;
silver: number;
bronze: number;
};
jobPoint: null | number;
jobScore: null | number;
jobRate: null | number;
jobBonus: null | number;
2022-10-24 14:45:36 -04:00
};
2022-10-20 09:45:59 -04:00
2022-11-22 15:36:38 -05:00
export type GameExporter = {
2022-10-20 09:45:59 -04:00
name: string;
2022-10-24 14:45:36 -04:00
notExported: (
2022-11-22 15:36:38 -05:00
{ type, list }: { type: Game["type"]; list: string[] },
2022-10-24 14:45:36 -04:00
) => Promise<string[]>;
2022-11-22 15:36:38 -05:00
exportGame: (game: Game) => Promise<{ url?: string }>;
2022-10-20 09:45:59 -04:00
};
2022-10-28 08:45:56 -04:00
export type BankaraBattleHistories = {
bankaraBattleHistories: {
historyGroups: HistoryGroups<BattleListNode>;
};
};
2022-10-20 09:45:59 -04:00
export type RespMap = {
[Queries.HomeQuery]: {
currentPlayer: {
weapon: {
image: Image;
id: string;
};
};
banners: { image: Image; message: string; jumpTo: string }[];
friends: {
nodes: {
id: number;
nickname: string;
userIcon: Image;
}[];
totalCount: number;
};
footerMessages: unknown[];
};
[Queries.LatestBattleHistoriesQuery]: {
latestBattleHistories: {
2022-10-24 14:45:36 -04:00
historyGroups: HistoryGroups<BattleListNode>;
2022-10-20 09:45:59 -04:00
};
};
[Queries.RegularBattleHistoriesQuery]: {
regularBattleHistories: {
2022-10-24 14:45:36 -04:00
historyGroups: HistoryGroups<BattleListNode>;
2022-10-20 09:45:59 -04:00
};
};
2022-10-28 08:45:56 -04:00
[Queries.BankaraBattleHistoriesQuery]: BankaraBattleHistories;
2022-10-20 09:45:59 -04:00
[Queries.PrivateBattleHistoriesQuery]: {
privateBattleHistories: {
2022-10-24 14:45:36 -04:00
historyGroups: HistoryGroups<BattleListNode>;
2022-10-20 09:45:59 -04:00
};
};
[Queries.VsHistoryDetailQuery]: {
vsHistoryDetail: VsHistoryDetail;
};
2022-10-24 14:45:36 -04:00
[Queries.CoopHistoryQuery]: {
2022-11-26 08:42:23 -05:00
regularAverageClearWave: number | null;
regularGrade: {
id: string;
name: string;
} | null;
regularGradePoint: number | null;
monthlyGear: {
__typename: string;
name: string;
image: Image;
} | null;
scale: {
gold: number;
silver: number;
bronze: number;
} | null;
pointCard: {
defeatBossCount: number;
deliverCount: number;
goldenDeliverCount: number;
playCount: number;
rescueCount: number;
regularPoint: number;
totalPoint: number;
} | null;
2022-10-24 14:45:36 -04:00
coopResult: {
historyGroups: CoopHistoryGroups;
2022-10-24 14:45:36 -04:00
};
};
[Queries.CoopHistoryDetailQuery]: {
coopHistoryDetail: CoopHistoryDetail;
};
[Queries.myOutfitCommonDataFilteringConditionQuery]: {
gearPowers: {
nodes: {
name: string;
}[];
};
};
2022-11-14 14:29:31 -05:00
[Queries.myOutfitCommonDataEquipmentsQuery]: {
weapons: unknown[];
headGears: unknown[];
clothingGears: unknown[];
shoesGears: unknown[];
};
2022-11-26 08:42:23 -05:00
[Queries.HistoryRecordQuery]: {
currentPlayer: {
name: string | null;
byname: string | null;
nameId: string | null;
nameplate: Nameplate;
weapon: {
id: string;
name: string;
subWeapon: {
id: string;
name: string;
image: Image;
};
specialWeapon: {
id: string;
name: string;
image: Image;
};
};
headGear: PlayerGear;
clothingGear: PlayerGear;
shoesGear: PlayerGear;
userIcon: Image;
};
playHistory: {
currentTime: string;
gameStartTime: string;
rank: number;
udemae: string;
udemaeMax: string;
winCountTotal: number;
paintPointTotal: number;
battleNumTotal: number;
xMatchMaxAr: XRank;
xMatchMaxCl: XRank;
xMatchMaxGl: XRank;
xMatchMaxLf: XRank;
} | null;
};
[Queries.ConfigureAnalyticsQuery]: {
playHistory: {
udemaeMax: string;
paintPointTotal: number;
gameStartTime: string;
battleNumTotal: number;
xMatchMaxAr: SimpleXRank;
xMatchMaxCl: SimpleXRank;
xMatchMaxGl: SimpleXRank;
xMatchMaxLf: SimpleXRank;
} | null;
};
};
export type HistoryGear = Pick<
PlayerGear,
"name" | "primaryGearPower" | "additionalGearPowers" | "image"
>;
export type Nameplate = {
badges: {
id: string;
image: Image;
}[];
background: {
textColor: { r: number; g: number; b: number; a: number };
image: Image;
id: string;
};
};
export type SimpleXRank = {
rank: null;
};
export type XRank = {
power: null;
rank: null;
rankUpdateSeasonName: null;
powerUpdateTime: null;
2022-10-20 09:45:59 -04:00
};
export type GraphQLResponse<T> = {
data: T;
} | {
errors: {
message: string;
}[];
};
export enum BattleListType {
Latest,
Regular,
Bankara,
Private,
2022-10-24 14:45:36 -04:00
Coop,
2022-10-20 09:45:59 -04:00
}
2022-11-04 11:34:07 -04:00
export type StatInkAbility = {
key: string;
name: Record<string, string>;
primary_only: boolean;
}[];
export type StatInkWeapon = {
key: string;
name: Record<string, string>;
}[];
2022-11-04 11:34:07 -04:00
export type StatInkGear = {
primary_ability: string;
secondary_abilities: (string | null)[];
};
export type StatInkGears = {
headgear: StatInkGear;
clothing: StatInkGear;
shoes: StatInkGear;
};
export type StatInkPlayer = {
me: "yes" | "no";
rank_in_team: number;
name: string;
2022-10-20 20:06:25 -04:00
number: string | undefined;
splashtag_title: string;
weapon: string;
inked: number;
2022-10-20 20:06:25 -04:00
kill?: number;
assist?: number;
kill_or_assist?: number;
death?: number;
special?: number;
2022-11-04 11:34:07 -04:00
gears?: StatInkGears;
disconnected: "yes" | "no";
};
2022-10-20 20:06:25 -04:00
export type StatInkStage = {
key: string;
aliases: string[];
name: Record<string, string>;
short_name: Record<string, string>;
area: number;
release_at: {
time: number;
iso8601: string;
};
}[];
export type StatInkCoopWave = {
tide: "low" | "normal" | "high";
// https://stat.ink/api-info/salmon-event3
event?: string;
golden_quota: number;
golden_delivered: number;
golden_appearances: number;
special_uses?: Record<string, number>;
};
export type StatInkCoopPlayer = {
me: "yes" | "no";
name: string;
number: string;
splashtag_title: string | null;
uniform?: "orange" | "green" | "yellow" | "pink" | "blue" | "black" | "white";
2022-11-25 08:29:11 -05:00
special?: string;
weapons: (string | null)[];
golden_eggs: number;
golden_assist: number;
power_eggs: number;
rescue: number;
rescued: number;
defeat_boss: number;
disconnected: "yes" | "no";
};
export type StatInkCoopBoss = {
appearances: number;
defeated: number;
defeated_by_me: number;
};
export type StatInkCoopPostBody = {
test?: "yes" | "no";
uuid: string;
private: "yes" | "no";
big_run: "no";
stage: string;
// [0, 333]
danger_rate: number;
// [0, 3]
clear_waves: number;
fail_reason?: null | "wipe_out" | "time_limit";
2022-11-25 07:03:09 -05:00
king_smell?: number | null;
king_salmonid?: string;
clear_extra: "yes" | "no";
title_before?: string;
// [0, 999]
title_exp_before?: number;
title_after?: string;
// [0, 999]
title_exp_after: null | number;
golden_eggs: number;
power_eggs: number;
gold_scale?: null | number;
silver_scale?: null | number;
bronze_scale?: null | number;
job_point: null | number;
job_score: null | number;
job_rate: null | number;
job_bonus: null | number;
waves: StatInkCoopWave[];
players: StatInkCoopPlayer[];
bosses: Record<string, StatInkCoopBoss>;
note?: string;
private_note?: string;
link_url?: string;
agent: string;
agent_version: string;
agent_variables: Record<string, string>;
automated: "yes";
start_at: number;
end_at?: number;
};
export type StatInkPostBody = {
2022-10-20 20:53:04 -04:00
test?: "yes" | "no";
uuid: string;
lobby:
| "regular"
| "bankara_challenge"
| "bankara_open"
| "splatfest_challenge"
| "splatfest_open"
| "private";
rule: "nawabari" | "area" | "hoko" | "yagura" | "asari";
stage: string;
weapon: string;
result: "win" | "lose" | "draw" | "exempted_lose";
2022-10-20 20:06:25 -04:00
knockout?: "yes" | "no"; // for TW, set null or not sending
rank_in_team: number; // position in scoreboard
kill?: number;
assist?: number;
kill_or_assist?: number; // equals to kill + assist if you know them
death?: number;
special?: number; // use count
inked: number; // not including bonus
medals: string[]; // 0-3 elements
2022-10-20 20:06:25 -04:00
our_team_inked?: number; // TW, not including bonus
their_team_inked?: number; // TW, not including bonus
our_team_percent?: number; // TW
their_team_percent?: number; // TW
our_team_count?: number; // Anarchy
their_team_count?: number; // Anarchy
level_before?: number;
level_after?: number;
rank_before?: string; // one of c- ... s+, lowercase only /^[abcs][+-]?$/ except s-
rank_before_s_plus?: number;
rank_before_exp?: number;
rank_after?: string;
rank_after_s_plus?: number;
rank_after_exp?: number;
rank_exp_change?: number; // Set rank_after_exp - rank_before_exp. It can be negative. Set only this value if you don't know their exact values.
rank_up_battle?: "yes" | "no"; // Set "yes" if now "Rank-up Battle" mode.
challenge_win?: number; // Win count for Anarchy (Series) If rank_up_battle is truthy("yes"), the value range is limited to [0, 3].
challenge_lose?: number;
fest_power?: number; // Splatfest Power (Pro)
fest_dragon?:
| "10x"
| "decuple"
| "100x"
| "dragon"
| "333x"
| "double_dragon";
2022-10-20 20:06:25 -04:00
clout_before?: number; // Splatfest Clout, before the battle
clout_after?: number; // Splatfest Clout, after the battle
clout_change?: number; // Splatfest Clout, equals to clout_after - clout_before if you know them
cash_before?: number;
cash_after?: number;
our_team_players: StatInkPlayer[];
their_team_players: StatInkPlayer[];
agent: string;
agent_version: string;
2022-10-20 20:53:04 -04:00
agent_variables?: Record<string, string>;
automated: "yes";
start_at: number; // the battle starts at e.g. 1599577200
end_at: number;
};
2022-10-31 00:33:00 -04:00
export type StatInkPostResponse = {
error?: unknown;
} & {
id: string;
url: string;
};
2022-10-28 08:45:56 -04:00
export type RankParam = {
rank: string;
pointRange: [number, number];
charge: number;
promotion?: boolean;
};
2022-11-26 08:42:23 -05:00
export enum SummaryEnum {
ConfigureAnalyticsQuery,
HistoryRecordQuery,
CoopHistoryQuery,
}