feat(stats): Ollie's Crash Course Rewards #1260

Merged
Sainan merged 1 commits from AMelonInsideLemon/SpaceNinjaServer:race-rewards into main 2025-03-21 03:40:20 -07:00
2 changed files with 25 additions and 6 deletions

View File

@ -1,6 +1,6 @@
import { getJSONfromString } from "@/src/helpers/stringHelpers"; import { getJSONfromString } from "@/src/helpers/stringHelpers";
import { getAccountIdForRequest } from "@/src/services/loginService"; import { getAccountIdForRequest } from "@/src/services/loginService";
import { getStats, updateStats } from "@/src/services/statsService"; import { updateStats } from "@/src/services/statsService";
import { IStatsUpdate } from "@/src/types/statTypes"; import { IStatsUpdate } from "@/src/types/statTypes";
import { RequestHandler } from "express"; import { RequestHandler } from "express";
@ -8,8 +8,7 @@ const uploadController: RequestHandler = async (req, res) => {
// eslint-disable-next-line @typescript-eslint/no-unused-vars // eslint-disable-next-line @typescript-eslint/no-unused-vars
const { PS, ...payload } = getJSONfromString<IStatsUpdate>(String(req.body)); const { PS, ...payload } = getJSONfromString<IStatsUpdate>(String(req.body));
const accountId = await getAccountIdForRequest(req); const accountId = await getAccountIdForRequest(req);
const playerStats = await getStats(accountId); await updateStats(accountId, payload);
await updateStats(playerStats, payload);
res.status(200).end(); res.status(200).end();
}; };

View File

@ -9,7 +9,8 @@ import {
IUploadEntry, IUploadEntry,
IWeapon IWeapon
} from "@/src/types/statTypes"; } from "@/src/types/statTypes";
import { logger } from "../utils/logger"; import { logger } from "@/src/utils/logger";
import { addEmailItem, getInventory } from "@/src/services/inventoryService";
export const createStats = async (accountId: string): Promise<TStatsDatabaseDocument> => { export const createStats = async (accountId: string): Promise<TStatsDatabaseDocument> => {
const stats = new Stats({ accountOwnerId: accountId }); const stats = new Stats({ accountOwnerId: accountId });
@ -25,8 +26,9 @@ export const getStats = async (accountOwnerId: string): Promise<TStatsDatabaseDo
return stats; return stats;
}; };
export const updateStats = async (playerStats: TStatsDatabaseDocument, payload: IStatsUpdate): Promise<void> => { export const updateStats = async (accountOwnerId: string, payload: IStatsUpdate): Promise<void> => {
const unknownCategories: Record<string, string[]> = {}; const unknownCategories: Record<string, string[]> = {};
const playerStats = await getStats(accountOwnerId);
for (const [action, actionData] of Object.entries(payload)) { for (const [action, actionData] of Object.entries(payload)) {
switch (action) { switch (action) {
@ -308,12 +310,30 @@ export const updateStats = async (playerStats: TStatsDatabaseDocument, payload:
case "ZephyrScore": case "ZephyrScore":
case "SentinelGameScore": case "SentinelGameScore":
case "CaliberChicksScore": case "CaliberChicksScore":
case "OlliesCrashCourseScore":
case "DojoObstacleScore": case "DojoObstacleScore":
playerStats[category] ??= 0; playerStats[category] ??= 0;
if (data > playerStats[category]) playerStats[category] = data; if (data > playerStats[category]) playerStats[category] = data;
break; break;
case "OlliesCrashCourseScore":
playerStats[category] ??= 0;
if (!playerStats[category]) {
const inventory = await getInventory(accountOwnerId, "EmailItems");
await addEmailItem(
inventory,
"/Lotus/Types/Items/EmailItems/PlayedOlliesCrashCourseEmailItem"
);
}
if (data >= 9991000 && playerStats[category] < 9991000) {
const inventory = await getInventory(accountOwnerId, "EmailItems");
await addEmailItem(
inventory,
"/Lotus/Types/Items/EmailItems/BeatOlliesCrashCourseInNinetySecEmailItem"
);
}
if (data > playerStats[category]) playerStats[category] = data;
break;
default: default:
if (!ignoredCategories.includes(category)) { if (!ignoredCategories.includes(category)) {
if (!unknownCategories[action]) { if (!unknownCategories[action]) {