From 6b6d919a04a356e6ba46c34d282e5b304d92e4c3 Mon Sep 17 00:00:00 2001 From: spacemeowx2 Date: Sun, 4 Dec 2022 03:19:32 +0800 Subject: [PATCH] feat(RankTracker): add timestamp --- deno.lock | 1 + src/RankTracker.ts | 18 +++++++++++++++++- src/state.ts | 4 ++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/deno.lock b/deno.lock index 4628b8a..27fbada 100644 --- a/deno.lock +++ b/deno.lock @@ -60,6 +60,7 @@ "https://deno.land/x/msgpack@v1.4/utils/stream.ts": "1315e29af5c1a40d97bfa6f1c4f7f73d26067b912236f56851981f2f049500b8", "https://deno.land/x/msgpack@v1.4/utils/typedArrays.ts": "bb819c2f28cf7f85ed50b2e57f108462715555cc61ce315e8134cf1eef2ae662", "https://deno.land/x/msgpack@v1.4/utils/utf8.ts": "93183055a7a41986080eeb711e83d553e7c8b121642da4379a5adf253b7beefd", + "https://deno.land/x/murmurhash@v1.0.0/mod.ts": "13fd2c5534dfd22ffbfcd4255ea13e47a2f2b99e9c90a83dc43e814a0e278829", "https://deno.land/x/progress@v1.2.8/deps.ts": "e0abdc972a0c152508b28ced5ae9c4be26a5773f0aa4a3caa72371c84d2e28a2", "https://deno.land/x/progress@v1.2.8/mod.ts": "5ef7c7ff079d71effed5055666af81cc58a566bc98e2df8473526bd6457976c5", "https://deno.land/x/progress@v1.2.8/multi.ts": "392553552243204539d83ee53cadda990db20b1b421520411318ff9bd0320646", diff --git a/src/RankTracker.ts b/src/RankTracker.ts index 3892100..022f08a 100644 --- a/src/RankTracker.ts +++ b/src/RankTracker.ts @@ -81,6 +81,7 @@ export const RANK_PARAMS: RankParam[] = [{ type Delta = { beforeGameId: string; gameId: string; + timestamp: number; rankAfter?: string; rankPoint: number; isPromotion: boolean; @@ -91,7 +92,14 @@ type Delta = { // TODO: auto rank up using rank params and delta. function addRank(state: RankState, delta: Delta): RankState { const { rank, rankPoint } = state; - const { gameId, rankAfter, isPromotion, isRankUp, isChallengeFirst } = delta; + const { + gameId, + timestamp, + rankAfter, + isPromotion, + isRankUp, + isChallengeFirst, + } = delta; const rankIndex = RANK_PARAMS.findIndex((r) => r.rank === rank); @@ -104,6 +112,7 @@ function addRank(state: RankState, delta: Delta): RankState { if (isChallengeFirst) { return { gameId, + timestamp, rank, rankPoint: rankPoint - rankParam.charge, }; @@ -112,6 +121,7 @@ function addRank(state: RankState, delta: Delta): RankState { // S+50 is the highest rank if (rankIndex === RANK_PARAMS.length - 1) { return { + timestamp, gameId, rank, rankPoint: Math.min(rankPoint + delta.rankPoint, rankParam.pointRange[1]), @@ -123,6 +133,7 @@ function addRank(state: RankState, delta: Delta): RankState { return { gameId, + timestamp, rank: nextRankParam.rank, rankPoint: nextRankParam.pointRange[0], }; @@ -130,6 +141,7 @@ function addRank(state: RankState, delta: Delta): RankState { return { gameId, + timestamp, rank: rankAfter ?? rank, rankPoint: rankPoint + delta.rankPoint, }; @@ -147,6 +159,7 @@ const battleTime = (id: string) => { }; type FlattenItem = { + id: string; gameId: string; time: Date; bankaraMatchChallenge: BankaraMatchChallenge | null; @@ -177,6 +190,7 @@ function generateDeltaList( let delta: Delta = { beforeGameId, gameId: i.gameId, + timestamp: Math.floor(i.time.getTime() / 1000), rankPoint: 0, isPromotion: false, isRankUp: false, @@ -230,6 +244,7 @@ function getRankState(i: FlattenItem): RankState { } return { gameId: i.gameId, + timestamp: Math.floor(i.time.getTime() / 1000), rank, rankPoint: -1, }; @@ -287,6 +302,7 @@ export class RankTracker { .flatMap( ({ historyDetails, bankaraMatchChallenge }) => { return historyDetails.nodes.map((j, index) => ({ + id: j.id, time: battleTime(j.id), gameId: gameId(j.id), bankaraMatchChallenge, diff --git a/src/state.ts b/src/state.ts index 9a07a02..7ddeb6f 100644 --- a/src/state.ts +++ b/src/state.ts @@ -8,9 +8,9 @@ export type LoginState = { }; export type RankState = { // generated by gameId(battle.id) - // TODO: If the gameId does not exist, the tracker will assume that the user has - // not played a bankara match. And it will start tracking from the first match gameId: string; + // extract from battle.id + timestamp?: number; // C-, B, A+, S, S+0, S+12 rank: string; rankPoint: number;