@valoranchi/riot-client 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -1
- package/dist/RiotClient.d.ts +8 -1
- package/dist/RiotClient.d.ts.map +1 -1
- package/dist/RiotClient.js +18 -3
- package/dist/RiotClient.js.map +1 -1
- package/dist/analysis/collectionValue.d.ts +4 -0
- package/dist/analysis/collectionValue.d.ts.map +1 -0
- package/dist/analysis/collectionValue.js +119 -0
- package/dist/analysis/collectionValue.js.map +1 -0
- package/dist/analysis/loadoutDiff.d.ts +6 -0
- package/dist/analysis/loadoutDiff.d.ts.map +1 -0
- package/dist/analysis/loadoutDiff.js +258 -0
- package/dist/analysis/loadoutDiff.js.map +1 -0
- package/dist/analysis/matchSync.d.ts +8 -0
- package/dist/analysis/matchSync.d.ts.map +1 -0
- package/dist/analysis/matchSync.js +66 -0
- package/dist/analysis/matchSync.js.map +1 -0
- package/dist/analysis/performanceSummary.d.ts +4 -0
- package/dist/analysis/performanceSummary.d.ts.map +1 -0
- package/dist/analysis/performanceSummary.js +184 -0
- package/dist/analysis/performanceSummary.js.map +1 -0
- package/dist/analysis/playerAssessment.d.ts +10 -0
- package/dist/analysis/playerAssessment.d.ts.map +1 -0
- package/dist/analysis/playerAssessment.js +47 -0
- package/dist/analysis/playerAssessment.js.map +1 -0
- package/dist/analysis/ratingTrend.d.ts +5 -0
- package/dist/analysis/ratingTrend.d.ts.map +1 -0
- package/dist/analysis/ratingTrend.js +70 -0
- package/dist/analysis/ratingTrend.js.map +1 -0
- package/dist/analysis/storeHistory.d.ts +6 -0
- package/dist/analysis/storeHistory.d.ts.map +1 -0
- package/dist/analysis/storeHistory.js +74 -0
- package/dist/analysis/storeHistory.js.map +1 -0
- package/dist/analysis/wishlist.d.ts +5 -0
- package/dist/analysis/wishlist.d.ts.map +1 -0
- package/dist/analysis/wishlist.js +122 -0
- package/dist/analysis/wishlist.js.map +1 -0
- package/dist/bin.js +3 -1
- package/dist/bin.js.map +1 -1
- package/dist/catalogue/Catalogue.d.ts +1 -0
- package/dist/catalogue/Catalogue.d.ts.map +1 -1
- package/dist/catalogue/Catalogue.js +11 -0
- package/dist/catalogue/Catalogue.js.map +1 -1
- package/dist/catalogue/ValorantApi.d.ts.map +1 -1
- package/dist/catalogue/ValorantApi.js +1 -1
- package/dist/catalogue/ValorantApi.js.map +1 -1
- package/dist/cli.d.ts +15 -9
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +371 -46
- package/dist/cli.js.map +1 -1
- package/dist/client/AccountService.d.ts +6 -1
- package/dist/client/AccountService.d.ts.map +1 -1
- package/dist/client/AccountService.js +39 -4
- package/dist/client/AccountService.js.map +1 -1
- package/dist/client/AccountValidator.d.ts.map +1 -1
- package/dist/client/AccountValidator.js +9 -3
- package/dist/client/AccountValidator.js.map +1 -1
- package/dist/client/ChatValidator.d.ts.map +1 -1
- package/dist/client/ChatValidator.js +2 -4
- package/dist/client/ChatValidator.js.map +1 -1
- package/dist/client/ClientContext.d.ts +5 -0
- package/dist/client/ClientContext.d.ts.map +1 -1
- package/dist/client/ClientContext.js.map +1 -1
- package/dist/client/LiveMatchService.d.ts +1 -1
- package/dist/client/LiveMatchService.d.ts.map +1 -1
- package/dist/client/LiveMatchService.js +30 -20
- package/dist/client/LiveMatchService.js.map +1 -1
- package/dist/client/LoadoutValidator.d.ts.map +1 -1
- package/dist/client/LoadoutValidator.js +1 -3
- package/dist/client/LoadoutValidator.js.map +1 -1
- package/dist/client/MatchService.d.ts +17 -1
- package/dist/client/MatchService.d.ts.map +1 -1
- package/dist/client/MatchService.js +123 -2
- package/dist/client/MatchService.js.map +1 -1
- package/dist/client/MatchValidator.d.ts.map +1 -1
- package/dist/client/MatchValidator.js.map +1 -1
- package/dist/client/OfficialService.d.ts +35 -0
- package/dist/client/OfficialService.d.ts.map +1 -0
- package/dist/client/OfficialService.js +141 -0
- package/dist/client/OfficialService.js.map +1 -0
- package/dist/client/PartyService.d.ts.map +1 -1
- package/dist/client/PartyService.js +3 -1
- package/dist/client/PartyService.js.map +1 -1
- package/dist/client/PartyValidator.d.ts.map +1 -1
- package/dist/client/PartyValidator.js +1 -2
- package/dist/client/PartyValidator.js.map +1 -1
- package/dist/client/SocialService.d.ts.map +1 -1
- package/dist/client/SocialService.js +4 -5
- package/dist/client/SocialService.js.map +1 -1
- package/dist/client/StoreService.d.ts +9 -1
- package/dist/client/StoreService.d.ts.map +1 -1
- package/dist/client/StoreService.js +90 -2
- package/dist/client/StoreService.js.map +1 -1
- package/dist/client/StoreValidator.d.ts.map +1 -1
- package/dist/client/StoreValidator.js +4 -2
- package/dist/client/StoreValidator.js.map +1 -1
- package/dist/client/api.d.ts +55 -1
- package/dist/client/api.d.ts.map +1 -1
- package/dist/collection/CustomGameConfigsBuilder.d.ts.map +1 -1
- package/dist/collection/CustomGameConfigsBuilder.js.map +1 -1
- package/dist/collection/LiveMatchBuilder.d.ts +2 -2
- package/dist/collection/LiveMatchBuilder.d.ts.map +1 -1
- package/dist/collection/LiveMatchBuilder.js +10 -8
- package/dist/collection/LiveMatchBuilder.js.map +1 -1
- package/dist/collection/LoadoutBuilder.d.ts.map +1 -1
- package/dist/collection/LoadoutBuilder.js +1 -1
- package/dist/collection/LoadoutBuilder.js.map +1 -1
- package/dist/collection/LoadoutWriter.d.ts.map +1 -1
- package/dist/collection/LoadoutWriter.js +0 -1
- package/dist/collection/LoadoutWriter.js.map +1 -1
- package/dist/collection/MmrBuilder.d.ts +1 -1
- package/dist/collection/MmrBuilder.d.ts.map +1 -1
- package/dist/collection/MmrBuilder.js +5 -2
- package/dist/collection/MmrBuilder.js.map +1 -1
- package/dist/collection/PlayerSettingsBuilder.d.ts.map +1 -1
- package/dist/collection/PlayerSettingsBuilder.js +1 -3
- package/dist/collection/PlayerSettingsBuilder.js.map +1 -1
- package/dist/collection/RankFit.d.ts +11 -0
- package/dist/collection/RankFit.d.ts.map +1 -0
- package/dist/collection/RankFit.js +56 -0
- package/dist/collection/RankFit.js.map +1 -0
- package/dist/errors.d.ts +5 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +8 -1
- package/dist/errors.js.map +1 -1
- package/dist/formatError.d.ts +10 -0
- package/dist/formatError.d.ts.map +1 -0
- package/dist/formatError.js +29 -0
- package/dist/formatError.js.map +1 -0
- package/dist/index.d.ts +15 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -2
- package/dist/index.js.map +1 -1
- package/dist/local/ChatApi.d.ts.map +1 -1
- package/dist/local/ChatApi.js +3 -1
- package/dist/local/ChatApi.js.map +1 -1
- package/dist/local/RiotSocket.d.ts.map +1 -1
- package/dist/local/RiotSocket.js.map +1 -1
- package/dist/mcp/McpServer.d.ts +21 -0
- package/dist/mcp/McpServer.d.ts.map +1 -0
- package/dist/mcp/McpServer.js +135 -0
- package/dist/mcp/McpServer.js.map +1 -0
- package/dist/mcp/index.d.ts +4 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +3 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/tools.d.ts +9 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +83 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +46 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +2 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/model/index.d.ts +201 -0
- package/dist/model/index.d.ts.map +1 -1
- package/dist/official/OfficialApi.d.ts +35 -0
- package/dist/official/OfficialApi.d.ts.map +1 -0
- package/dist/official/OfficialApi.js +148 -0
- package/dist/official/OfficialApi.js.map +1 -0
- package/dist/official/OfficialMatchAdapter.d.ts +11 -0
- package/dist/official/OfficialMatchAdapter.d.ts.map +1 -0
- package/dist/official/OfficialMatchAdapter.js +157 -0
- package/dist/official/OfficialMatchAdapter.js.map +1 -0
- package/dist/official/RateLimiter.d.ts +20 -0
- package/dist/official/RateLimiter.d.ts.map +1 -0
- package/dist/official/RateLimiter.js +56 -0
- package/dist/official/RateLimiter.js.map +1 -0
- package/dist/official/types.d.ts +214 -0
- package/dist/official/types.d.ts.map +1 -0
- package/dist/official/types.js +2 -0
- package/dist/official/types.js.map +1 -0
- package/dist/raw.d.ts +4 -0
- package/dist/raw.d.ts.map +1 -1
- package/dist/raw.js +4 -0
- package/dist/raw.js.map +1 -1
- package/dist/riot/HttpGateway.d.ts.map +1 -1
- package/dist/riot/HttpGateway.js +9 -2
- package/dist/riot/HttpGateway.js.map +1 -1
- package/dist/riot/ResponseCache.d.ts +2 -0
- package/dist/riot/ResponseCache.d.ts.map +1 -1
- package/dist/riot/ResponseCache.js +9 -5
- package/dist/riot/ResponseCache.js.map +1 -1
- package/dist/riot/RiotApi.d.ts.map +1 -1
- package/dist/riot/RiotApi.js.map +1 -1
- package/dist/riot/types.d.ts.map +1 -1
- package/dist/serve/index.d.ts +7 -0
- package/dist/serve/index.d.ts.map +1 -0
- package/dist/serve/index.js +6 -0
- package/dist/serve/index.js.map +1 -0
- package/dist/serve/indexHtml.d.ts +2 -0
- package/dist/serve/indexHtml.d.ts.map +1 -0
- package/dist/serve/indexHtml.js +36 -0
- package/dist/serve/indexHtml.js.map +1 -0
- package/dist/serve/openapi.d.ts +2 -0
- package/dist/serve/openapi.d.ts.map +1 -0
- package/dist/serve/openapi.js +125 -0
- package/dist/serve/openapi.js.map +1 -0
- package/dist/serve/routes.d.ts +9 -0
- package/dist/serve/routes.d.ts.map +1 -0
- package/dist/serve/routes.js +1631 -0
- package/dist/serve/routes.js.map +1 -0
- package/dist/serve/server.d.ts +6 -0
- package/dist/serve/server.d.ts.map +1 -0
- package/dist/serve/server.js +149 -0
- package/dist/serve/server.js.map +1 -0
- package/dist/serve/sse.d.ts +4 -0
- package/dist/serve/sse.d.ts.map +1 -0
- package/dist/serve/sse.js +89 -0
- package/dist/serve/sse.js.map +1 -0
- package/dist/serve/types.d.ts +32 -0
- package/dist/serve/types.d.ts.map +1 -0
- package/dist/serve/types.js +2 -0
- package/dist/serve/types.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +12 -0
- package/dist/version.js.map +1 -0
- package/dist/watch/AsyncQueue.d.ts +13 -0
- package/dist/watch/AsyncQueue.d.ts.map +1 -0
- package/dist/watch/AsyncQueue.js +50 -0
- package/dist/watch/AsyncQueue.js.map +1 -0
- package/dist/watch/FriendsWatcher.d.ts +26 -0
- package/dist/watch/FriendsWatcher.d.ts.map +1 -0
- package/dist/watch/FriendsWatcher.js +152 -0
- package/dist/watch/FriendsWatcher.js.map +1 -0
- package/dist/watch/MatchWatcher.d.ts +44 -0
- package/dist/watch/MatchWatcher.d.ts.map +1 -0
- package/dist/watch/MatchWatcher.js +272 -0
- package/dist/watch/MatchWatcher.js.map +1 -0
- package/dist/watch/StoreWatcher.d.ts +27 -0
- package/dist/watch/StoreWatcher.d.ts.map +1 -0
- package/dist/watch/StoreWatcher.js +116 -0
- package/dist/watch/StoreWatcher.js.map +1 -0
- package/dist/watch/WebhookNotifier.d.ts +8 -0
- package/dist/watch/WebhookNotifier.d.ts.map +1 -0
- package/dist/watch/WebhookNotifier.js +42 -0
- package/dist/watch/WebhookNotifier.js.map +1 -0
- package/dist/watch/index.d.ts +26 -0
- package/dist/watch/index.d.ts.map +1 -0
- package/dist/watch/index.js +31 -0
- package/dist/watch/index.js.map +1 -0
- package/dist/watch/types.d.ts +114 -0
- package/dist/watch/types.d.ts.map +1 -0
- package/dist/watch/types.js +2 -0
- package/dist/watch/types.js.map +1 -0
- package/package.json +17 -5
- package/schema/CollectionValue.json +153 -0
- package/schema/LiveMatch.json +8 -1
- package/schema/LoadoutDiff.json +73 -0
- package/schema/MatchSyncResult.json +54 -0
- package/schema/Mmr.json +38 -1
- package/schema/OfficialAccount.json +25 -0
- package/schema/OfficialProfile.json +354 -0
- package/schema/PerformanceSummary.json +284 -0
- package/schema/PlayerAssessment.json +48 -0
- package/schema/RatingTrend.json +107 -0
- package/schema/StoreHistory.json +61 -0
- package/schema/Wishlist.json +35 -0
- package/schema/WishlistCheck.json +67 -0
- package/schema/WishlistHit.json +51 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export function loadKnownMatches(cacheDir, puuid) {
|
|
4
|
+
const filePath = path.join(cacheDir, "matches", `${puuid}.json`);
|
|
5
|
+
try {
|
|
6
|
+
if (fs.existsSync(filePath)) {
|
|
7
|
+
const raw = JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
8
|
+
if (Array.isArray(raw)) {
|
|
9
|
+
return raw;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
catch { }
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
export function saveKnownMatches(cacheDir, puuid, matches) {
|
|
17
|
+
const dir = path.join(cacheDir, "matches");
|
|
18
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
19
|
+
const filePath = path.join(dir, `${puuid}.json`);
|
|
20
|
+
const tempPath = path.join(dir, `${puuid}.${Date.now()}.tmp`);
|
|
21
|
+
const map = new Map();
|
|
22
|
+
for (const match of matches) {
|
|
23
|
+
if (match.id) {
|
|
24
|
+
map.set(match.id, match);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const sorted = Array.from(map.values()).sort((a, b) => new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime());
|
|
28
|
+
const content = JSON.stringify(sorted, null, 2);
|
|
29
|
+
try {
|
|
30
|
+
fs.writeFileSync(tempPath, content, "utf-8");
|
|
31
|
+
fs.renameSync(tempPath, filePath);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
fs.writeFileSync(filePath, content, "utf-8");
|
|
35
|
+
try {
|
|
36
|
+
if (fs.existsSync(tempPath))
|
|
37
|
+
fs.unlinkSync(tempPath);
|
|
38
|
+
}
|
|
39
|
+
catch { }
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function syncMatches(fetcher, knownIds, options) {
|
|
43
|
+
const maxPages = options?.maxPages ?? 5;
|
|
44
|
+
const pageSize = options?.pageSize ?? 20;
|
|
45
|
+
const newlyDiscovered = [];
|
|
46
|
+
for (let page = 0; page < maxPages; page++) {
|
|
47
|
+
const startIndex = page * pageSize;
|
|
48
|
+
const matches = await fetcher(startIndex);
|
|
49
|
+
if (!matches || matches.length === 0)
|
|
50
|
+
break;
|
|
51
|
+
let hitKnown = false;
|
|
52
|
+
for (const match of matches) {
|
|
53
|
+
if (knownIds.has(match.id)) {
|
|
54
|
+
hitKnown = true;
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
knownIds.add(match.id);
|
|
58
|
+
newlyDiscovered.push(match);
|
|
59
|
+
}
|
|
60
|
+
if (hitKnown || matches.length < pageSize) {
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return newlyDiscovered;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=matchSync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matchSync.js","sourceRoot":"","sources":["../../src/analysis/matchSync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Catalogue } from "../catalogue/Catalogue.js";
|
|
2
|
+
import type { Match, PerformanceSummary } from "../model/index.js";
|
|
3
|
+
export declare function performanceSummary(matches: Match[], puuid: string, catalogue?: Catalogue): PerformanceSummary;
|
|
4
|
+
//# sourceMappingURL=performanceSummary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performanceSummary.d.ts","sourceRoot":"","sources":["../../src/analysis/performanceSummary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAIV,KAAK,EAIL,kBAAkB,EACnB,MAAM,mBAAmB,CAAC;AA6I3B,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,KAAK,EAAE,EAChB,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,SAAS,GACpB,kBAAkB,CA4DpB"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
function getPlayer(match, puuid) {
|
|
2
|
+
return match.players.find((p) => p.puuid === puuid);
|
|
3
|
+
}
|
|
4
|
+
function isWin(match, puuid) {
|
|
5
|
+
if (match.self?.won !== null && match.self?.won !== undefined) {
|
|
6
|
+
const selfPlayer = getPlayer(match, puuid);
|
|
7
|
+
if (selfPlayer?.team === match.self.team) {
|
|
8
|
+
return Boolean(match.self.won);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const player = getPlayer(match, puuid);
|
|
12
|
+
if (!player)
|
|
13
|
+
return false;
|
|
14
|
+
return Boolean(match.teams.find((t) => t.id === player.team)?.won);
|
|
15
|
+
}
|
|
16
|
+
function computeStats(matches, puuid) {
|
|
17
|
+
const games = matches.length;
|
|
18
|
+
if (games === 0) {
|
|
19
|
+
return {
|
|
20
|
+
games: 0,
|
|
21
|
+
wins: 0,
|
|
22
|
+
winRate: 0,
|
|
23
|
+
kd: 0,
|
|
24
|
+
kda: 0,
|
|
25
|
+
headshotRate: 0,
|
|
26
|
+
averageScore: 0,
|
|
27
|
+
averageDamagePerRound: 0,
|
|
28
|
+
firstBloodsPerGame: 0,
|
|
29
|
+
plantsPerGame: 0,
|
|
30
|
+
defusesPerGame: 0,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
let wins = 0;
|
|
34
|
+
let kills = 0;
|
|
35
|
+
let deaths = 0;
|
|
36
|
+
let assists = 0;
|
|
37
|
+
let score = 0;
|
|
38
|
+
let damage = 0;
|
|
39
|
+
let rounds = 0;
|
|
40
|
+
let headshots = 0;
|
|
41
|
+
let bodyshots = 0;
|
|
42
|
+
let legshots = 0;
|
|
43
|
+
let firstBloods = 0;
|
|
44
|
+
let plants = 0;
|
|
45
|
+
let defuses = 0;
|
|
46
|
+
for (const m of matches) {
|
|
47
|
+
if (isWin(m, puuid))
|
|
48
|
+
wins++;
|
|
49
|
+
const p = getPlayer(m, puuid);
|
|
50
|
+
if (p?.stats) {
|
|
51
|
+
kills += p.stats.kills;
|
|
52
|
+
deaths += p.stats.deaths;
|
|
53
|
+
assists += p.stats.assists;
|
|
54
|
+
score += p.stats.score;
|
|
55
|
+
damage += p.stats.damage;
|
|
56
|
+
rounds += p.stats.roundsPlayed;
|
|
57
|
+
headshots += p.stats.headshots;
|
|
58
|
+
bodyshots += p.stats.bodyshots;
|
|
59
|
+
legshots += p.stats.legshots;
|
|
60
|
+
firstBloods += p.stats.firstBloods;
|
|
61
|
+
plants += p.stats.plants;
|
|
62
|
+
defuses += p.stats.defuses;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const totalShots = headshots + bodyshots + legshots;
|
|
66
|
+
return {
|
|
67
|
+
games,
|
|
68
|
+
wins,
|
|
69
|
+
winRate: Math.round((wins / games) * 100) / 100,
|
|
70
|
+
kd: deaths === 0 ? kills : Math.round((kills / deaths) * 100) / 100,
|
|
71
|
+
kda: deaths === 0 ? kills + assists : Math.round(((kills + assists) / deaths) * 100) / 100,
|
|
72
|
+
headshotRate: totalShots === 0 ? 0 : Math.round((headshots / totalShots) * 100) / 100,
|
|
73
|
+
averageScore: Math.round(score / games),
|
|
74
|
+
averageDamagePerRound: rounds === 0 ? 0 : Math.round((damage / rounds) * 10) / 10,
|
|
75
|
+
firstBloodsPerGame: Math.round((firstBloods / games) * 10) / 10,
|
|
76
|
+
plantsPerGame: Math.round((plants / games) * 10) / 10,
|
|
77
|
+
defusesPerGame: Math.round((defuses / games) * 10) / 10,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function computeConsistency(matches, puuid) {
|
|
81
|
+
if (matches.length === 0) {
|
|
82
|
+
return { scoreStdDev: 0, gamesNonNegative: 0, longestNonNegativeStreak: 0 };
|
|
83
|
+
}
|
|
84
|
+
const scores = [];
|
|
85
|
+
let gamesNonNegative = 0;
|
|
86
|
+
let longestNonNegativeStreak = 0;
|
|
87
|
+
let currentStreak = 0;
|
|
88
|
+
for (const m of matches) {
|
|
89
|
+
const p = getPlayer(m, puuid);
|
|
90
|
+
const s = p?.stats?.score ?? 0;
|
|
91
|
+
scores.push(s);
|
|
92
|
+
const k = p?.stats?.kills ?? 0;
|
|
93
|
+
const d = p?.stats?.deaths ?? 0;
|
|
94
|
+
if (k >= d) {
|
|
95
|
+
gamesNonNegative++;
|
|
96
|
+
currentStreak++;
|
|
97
|
+
if (currentStreak > longestNonNegativeStreak) {
|
|
98
|
+
longestNonNegativeStreak = currentStreak;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
currentStreak = 0;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const mean = scores.reduce((sum, val) => sum + val, 0) / scores.length;
|
|
106
|
+
const variance = scores.reduce((sum, val) => sum + (val - mean) ** 2, 0) / scores.length;
|
|
107
|
+
const scoreStdDev = Math.round(Math.sqrt(variance) * 10) / 10;
|
|
108
|
+
return {
|
|
109
|
+
scoreStdDev,
|
|
110
|
+
gamesNonNegative,
|
|
111
|
+
longestNonNegativeStreak,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function pickBestAndWorst(items) {
|
|
115
|
+
const eligible = items.filter((item) => item.games >= 3);
|
|
116
|
+
if (eligible.length === 0) {
|
|
117
|
+
return { best: null, worst: null };
|
|
118
|
+
}
|
|
119
|
+
const sorted = [...eligible].sort((a, b) => {
|
|
120
|
+
if (a.winRate !== b.winRate)
|
|
121
|
+
return b.winRate - a.winRate;
|
|
122
|
+
return b.kd - a.kd;
|
|
123
|
+
});
|
|
124
|
+
return {
|
|
125
|
+
best: sorted[0],
|
|
126
|
+
worst: sorted[sorted.length - 1],
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
export function performanceSummary(matches, puuid, catalogue) {
|
|
130
|
+
const overall = computeStats(matches, puuid);
|
|
131
|
+
const consistency = computeConsistency(matches, puuid);
|
|
132
|
+
const agentGroups = new Map();
|
|
133
|
+
for (const m of matches) {
|
|
134
|
+
const p = getPlayer(m, puuid);
|
|
135
|
+
const key = p?.agent?.uuid ?? "unknown";
|
|
136
|
+
const list = agentGroups.get(key) ?? [];
|
|
137
|
+
list.push(m);
|
|
138
|
+
agentGroups.set(key, list);
|
|
139
|
+
}
|
|
140
|
+
const byAgent = Array.from(agentGroups.entries()).map(([uuid, list]) => {
|
|
141
|
+
const firstPlayer = getPlayer(list[0], puuid);
|
|
142
|
+
return {
|
|
143
|
+
uuid,
|
|
144
|
+
name: firstPlayer?.agent?.name ?? "Unknown",
|
|
145
|
+
icon: firstPlayer?.agent?.icon ?? null,
|
|
146
|
+
...computeStats(list, puuid),
|
|
147
|
+
};
|
|
148
|
+
});
|
|
149
|
+
const mapGroups = new Map();
|
|
150
|
+
for (const m of matches) {
|
|
151
|
+
const key = m.map.path || (m.map.uuid ?? "unknown");
|
|
152
|
+
const list = mapGroups.get(key) ?? [];
|
|
153
|
+
list.push(m);
|
|
154
|
+
mapGroups.set(key, list);
|
|
155
|
+
}
|
|
156
|
+
const byMap = Array.from(mapGroups.entries()).map(([pathKey, list]) => {
|
|
157
|
+
const firstMatch = list[0];
|
|
158
|
+
const catMap = catalogue?.getMapByPath(firstMatch.map.path);
|
|
159
|
+
const icon = catMap?.displayIcon ?? null;
|
|
160
|
+
return {
|
|
161
|
+
uuid: firstMatch.map.uuid,
|
|
162
|
+
name: firstMatch.map.name ?? pathKey,
|
|
163
|
+
icon,
|
|
164
|
+
...computeStats(list, puuid),
|
|
165
|
+
};
|
|
166
|
+
});
|
|
167
|
+
const agentBestWorst = pickBestAndWorst(byAgent);
|
|
168
|
+
const mapBestWorst = pickBestAndWorst(byMap);
|
|
169
|
+
return {
|
|
170
|
+
overall,
|
|
171
|
+
byAgent,
|
|
172
|
+
byMap,
|
|
173
|
+
best: {
|
|
174
|
+
agent: agentBestWorst.best,
|
|
175
|
+
map: mapBestWorst.best,
|
|
176
|
+
},
|
|
177
|
+
worst: {
|
|
178
|
+
agent: agentBestWorst.worst,
|
|
179
|
+
map: mapBestWorst.worst,
|
|
180
|
+
},
|
|
181
|
+
consistency,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=performanceSummary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"performanceSummary.js","sourceRoot":"","sources":["../../src/analysis/performanceSummary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Mmr, PlayerAssessment } from "../model/index.js";
|
|
2
|
+
import type { RiotCompetitiveUpdate } from "../riot/types.js";
|
|
3
|
+
export interface PlayerAssessmentInput {
|
|
4
|
+
puuid: string;
|
|
5
|
+
accountLevel: number | null;
|
|
6
|
+
mmr: Mmr | null;
|
|
7
|
+
updates: RiotCompetitiveUpdate[];
|
|
8
|
+
}
|
|
9
|
+
export declare function playerAssessment(input: PlayerAssessmentInput): PlayerAssessment;
|
|
10
|
+
//# sourceMappingURL=playerAssessment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playerAssessment.d.ts","sourceRoot":"","sources":["../../src/analysis/playerAssessment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,GAAG,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAG9D,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IAChB,OAAO,EAAE,qBAAqB,EAAE,CAAC;CAClC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,gBAAgB,CAoD/E"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { calculateStreak } from "./ratingTrend.js";
|
|
2
|
+
export function playerAssessment(input) {
|
|
3
|
+
const flags = [];
|
|
4
|
+
const tier = input.mmr?.current?.tier ?? 0;
|
|
5
|
+
const level = input.accountLevel ?? 0;
|
|
6
|
+
if (input.accountLevel !== null &&
|
|
7
|
+
input.accountLevel !== undefined &&
|
|
8
|
+
input.accountLevel < 50 &&
|
|
9
|
+
tier >= 15) {
|
|
10
|
+
flags.push({
|
|
11
|
+
flag: "low-level-high-rank",
|
|
12
|
+
reason: `Account level ${level} under 50 with Platinum or higher rank (tier ${tier})`,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
if (input.mmr?.fit?.verdict === "above") {
|
|
16
|
+
flags.push({
|
|
17
|
+
flag: "inflated",
|
|
18
|
+
reason: "Rank fit indicates account is above its expected rank",
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
if (input.mmr?.fit?.verdict === "below" && input.mmr.fit.ranksAbove === 2) {
|
|
22
|
+
flags.push({
|
|
23
|
+
flag: "underranked",
|
|
24
|
+
reason: "Rank fit indicates account is two ranks below its expected rank",
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
const streak = calculateStreak(input.updates);
|
|
28
|
+
if (streak.kind && streak.length >= 5) {
|
|
29
|
+
flags.push({
|
|
30
|
+
flag: "long-streak",
|
|
31
|
+
reason: `${streak.length}-game ${streak.kind} streak`,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (input.mmr?.act && input.mmr.act.games < 5) {
|
|
35
|
+
flags.push({
|
|
36
|
+
flag: "new-act",
|
|
37
|
+
reason: `Fewer than 5 competitive games played this act (${input.mmr.act.games})`,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
puuid: input.puuid,
|
|
42
|
+
accountLevel: level,
|
|
43
|
+
flags,
|
|
44
|
+
warnings: flags.map((f) => f.flag),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=playerAssessment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"playerAssessment.js","sourceRoot":"","sources":["../../src/analysis/playerAssessment.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AASnD,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC3D,MAAM,KAAK,GAAwB,EAAE,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC;IAEtC,IACE,KAAK,CAAC,YAAY,KAAK,IAAI;QAC3B,KAAK,CAAC,YAAY,KAAK,SAAS;QAChC,KAAK,CAAC,YAAY,GAAG,EAAE;QACvB,IAAI,IAAI,EAAE,EACV,CAAC;QACD,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,qBAAqB;YAC3B,MAAM,EAAE,iBAAiB,KAAK,gDAAgD,IAAI,GAAG;SACtF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,uDAAuD;SAChE,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QAC1E,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,iEAAiE;SAC1E,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,IAAI,SAAS;SACtD,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,mDAAmD,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG;SAClF,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,YAAY,EAAE,KAAK;QACnB,KAAK;QACL,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;KACnC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Rank, RatingTrend } from "../model/index.js";
|
|
2
|
+
import type { RiotCompetitiveUpdate } from "../riot/types.js";
|
|
3
|
+
export declare function calculateStreak(updates: RiotCompetitiveUpdate[]): RatingTrend["streak"];
|
|
4
|
+
export declare function ratingTrend(updates: RiotCompetitiveUpdate[], currentRank?: Rank | null): RatingTrend;
|
|
5
|
+
//# sourceMappingURL=ratingTrend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ratingTrend.d.ts","sourceRoot":"","sources":["../../src/analysis/ratingTrend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAG9D,wBAAgB,eAAe,CAAC,OAAO,EAAE,qBAAqB,EAAE,GAAG,WAAW,CAAC,QAAQ,CAAC,CAiBvF;AAuCD,wBAAgB,WAAW,CACzB,OAAO,EAAE,qBAAqB,EAAE,EAChC,WAAW,GAAE,IAAI,GAAG,IAAW,GAC9B,WAAW,CA0Bb"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { calculateRankAverages } from "../collection/RankFit.js";
|
|
2
|
+
export function calculateStreak(updates) {
|
|
3
|
+
if (updates.length === 0)
|
|
4
|
+
return { kind: null, length: 0 };
|
|
5
|
+
const firstEarned = updates[0].RankedRatingEarned;
|
|
6
|
+
if (firstEarned === 0)
|
|
7
|
+
return { kind: null, length: 0 };
|
|
8
|
+
const kind = firstEarned > 0 ? "win" : "loss";
|
|
9
|
+
let length = 0;
|
|
10
|
+
for (const u of updates) {
|
|
11
|
+
if ((kind === "win" && u.RankedRatingEarned > 0) ||
|
|
12
|
+
(kind === "loss" && u.RankedRatingEarned < 0)) {
|
|
13
|
+
length++;
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
break;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return { kind, length };
|
|
20
|
+
}
|
|
21
|
+
function calculateNet(updates) {
|
|
22
|
+
const sum = (items) => items.reduce((acc, u) => acc + u.RankedRatingEarned, 0);
|
|
23
|
+
return {
|
|
24
|
+
last5: sum(updates.slice(0, 5)),
|
|
25
|
+
last10: sum(updates.slice(0, 10)),
|
|
26
|
+
last20: sum(updates.slice(0, 20)),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function calculateTargets(currentRating, tier, averages) {
|
|
30
|
+
const isRadiant = tier >= 27;
|
|
31
|
+
const ratingToNext = isRadiant ? 0 : Math.max(0, 100 - currentRating);
|
|
32
|
+
const winsAtCurrentPace = !isRadiant && averages.averageGain && averages.averageGain > 0
|
|
33
|
+
? Math.ceil(ratingToNext / averages.averageGain)
|
|
34
|
+
: null;
|
|
35
|
+
const isUnranked = tier === 0;
|
|
36
|
+
const ratingToDemote = isUnranked ? 0 : currentRating;
|
|
37
|
+
const lossesAtCurrentPace = !isUnranked && averages.averageLoss && averages.averageLoss > 0
|
|
38
|
+
? currentRating === 0
|
|
39
|
+
? 1
|
|
40
|
+
: Math.ceil(currentRating / averages.averageLoss)
|
|
41
|
+
: null;
|
|
42
|
+
return {
|
|
43
|
+
toNextRank: { rating: ratingToNext, winsAtCurrentPace },
|
|
44
|
+
toDemotion: { rating: ratingToDemote, lossesAtCurrentPace },
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
export function ratingTrend(updates, currentRank = null) {
|
|
48
|
+
const streak = calculateStreak(updates);
|
|
49
|
+
const net = calculateNet(updates);
|
|
50
|
+
const { averageGain, averageLoss, gains } = calculateRankAverages(updates);
|
|
51
|
+
const totalGames = updates.length;
|
|
52
|
+
const winRate = totalGames === 0 ? 0 : Math.round((gains.length / totalGames) * 100) / 100;
|
|
53
|
+
const currentRating = currentRank?.rating ?? updates[0]?.RankedRatingAfterUpdate ?? 0;
|
|
54
|
+
const tier = currentRank?.tier ?? updates[0]?.TierAfterUpdate ?? 0;
|
|
55
|
+
const { toNextRank, toDemotion } = calculateTargets(currentRating, tier, {
|
|
56
|
+
averageGain,
|
|
57
|
+
averageLoss,
|
|
58
|
+
});
|
|
59
|
+
const pace = net.last10 > 0 ? "climbing" : net.last10 < 0 ? "falling" : "holding";
|
|
60
|
+
return {
|
|
61
|
+
streak,
|
|
62
|
+
net,
|
|
63
|
+
winRate,
|
|
64
|
+
perGame: { averageGain, averageLoss },
|
|
65
|
+
toNextRank,
|
|
66
|
+
toDemotion,
|
|
67
|
+
pace,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=ratingTrend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ratingTrend.js","sourceRoot":"","sources":["../../src/analysis/ratingTrend.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Store, StoreHistory, StoreSeen } from "../model/index.js";
|
|
2
|
+
export declare function recordStoreRotation(history: StoreHistory, currentStore: Store, date?: Date): StoreHistory;
|
|
3
|
+
export declare function querySkinSeen(history: StoreHistory, skinUuid: string): StoreSeen;
|
|
4
|
+
export declare function loadStoreHistory(cacheDir: string, puuid: string): StoreHistory;
|
|
5
|
+
export declare function saveStoreHistory(cacheDir: string, puuid: string, history: StoreHistory): void;
|
|
6
|
+
//# sourceMappingURL=storeHistory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storeHistory.d.ts","sourceRoot":"","sources":["../../src/analysis/storeHistory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAmB,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEzF,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,KAAK,EACnB,IAAI,GAAE,IAAiB,GACtB,YAAY,CA0Bd;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAahF;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,CAgB9E;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAgB7F"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export function recordStoreRotation(history, currentStore, date = new Date()) {
|
|
4
|
+
const day = date.toISOString().slice(0, 10);
|
|
5
|
+
const daily = currentStore.daily?.offers.map((o) => o.item.uuid.toLowerCase()) ?? [];
|
|
6
|
+
const nightMarket = currentStore.nightMarket
|
|
7
|
+
? currentStore.nightMarket.offers.map((o) => o.item.uuid.toLowerCase())
|
|
8
|
+
: null;
|
|
9
|
+
const bundles = currentStore.bundles
|
|
10
|
+
? currentStore.bundles.items.map((b) => b.uuid.toLowerCase())
|
|
11
|
+
: null;
|
|
12
|
+
const newDay = { day, daily, nightMarket, bundles };
|
|
13
|
+
const existingIndex = history.days.findIndex((d) => d.day === day);
|
|
14
|
+
let days;
|
|
15
|
+
if (existingIndex >= 0) {
|
|
16
|
+
days = [...history.days];
|
|
17
|
+
days[existingIndex] = newDay;
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
days = [...history.days, newDay];
|
|
21
|
+
}
|
|
22
|
+
if (days.length > 400) {
|
|
23
|
+
days = days.slice(-400);
|
|
24
|
+
}
|
|
25
|
+
return { days };
|
|
26
|
+
}
|
|
27
|
+
export function querySkinSeen(history, skinUuid) {
|
|
28
|
+
const target = skinUuid.toLowerCase();
|
|
29
|
+
let times = 0;
|
|
30
|
+
let lastSeen = null;
|
|
31
|
+
for (const day of history.days) {
|
|
32
|
+
if (day.daily.some((id) => id.toLowerCase() === target)) {
|
|
33
|
+
times++;
|
|
34
|
+
lastSeen = day.day;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return { lastSeen, times };
|
|
38
|
+
}
|
|
39
|
+
export function loadStoreHistory(cacheDir, puuid) {
|
|
40
|
+
const filePath = path.join(cacheDir, "storeHistory", `${puuid}.json`);
|
|
41
|
+
try {
|
|
42
|
+
if (fs.existsSync(filePath)) {
|
|
43
|
+
const raw = JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
44
|
+
if (raw &&
|
|
45
|
+
typeof raw === "object" &&
|
|
46
|
+
"days" in raw &&
|
|
47
|
+
Array.isArray(raw.days)) {
|
|
48
|
+
return { days: raw.days };
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch { }
|
|
53
|
+
return { days: [] };
|
|
54
|
+
}
|
|
55
|
+
export function saveStoreHistory(cacheDir, puuid, history) {
|
|
56
|
+
const dir = path.join(cacheDir, "storeHistory");
|
|
57
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
58
|
+
const filePath = path.join(dir, `${puuid}.json`);
|
|
59
|
+
const tempPath = path.join(dir, `${puuid}.${Date.now()}.tmp`);
|
|
60
|
+
const content = JSON.stringify(history, null, 2);
|
|
61
|
+
try {
|
|
62
|
+
fs.writeFileSync(tempPath, content, "utf-8");
|
|
63
|
+
fs.renameSync(tempPath, filePath);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
fs.writeFileSync(filePath, content, "utf-8");
|
|
67
|
+
try {
|
|
68
|
+
if (fs.existsSync(tempPath))
|
|
69
|
+
fs.unlinkSync(tempPath);
|
|
70
|
+
}
|
|
71
|
+
catch { }
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=storeHistory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storeHistory.js","sourceRoot":"","sources":["../../src/analysis/storeHistory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Store, Wishlist, WishlistHit } from "../model/index.js";
|
|
2
|
+
export declare function wishlistHits(store: Store, wishlist: Wishlist): WishlistHit[];
|
|
3
|
+
export declare function loadWishlist(cacheDir: string, puuid: string): Wishlist;
|
|
4
|
+
export declare function saveWishlist(cacheDir: string, puuid: string, wishlist: Wishlist): void;
|
|
5
|
+
//# sourceMappingURL=wishlist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wishlist.d.ts","sourceRoot":"","sources":["../../src/analysis/wishlist.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAqEtE,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,WAAW,EAAE,CAW5E;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,CAuBtE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAgBtF"}
|