From 3c87dd56caaf909a881d328b10d829df23097961 Mon Sep 17 00:00:00 2001 From: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Date: Fri, 21 Mar 2025 03:40:20 -0700 Subject: [PATCH] feat(stats): Ollie's Crash Course Rewards (#1260) Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1260 Co-authored-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> Co-committed-by: AMelonInsideLemon <166175391+AMelonInsideLemon@users.noreply.github.com> --- src/controllers/stats/uploadController.ts | 5 ++--- src/services/statsService.ts | 26 ++++++++++++++++++++--- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/controllers/stats/uploadController.ts b/src/controllers/stats/uploadController.ts index 89e5dfc3..c1c1d2e5 100644 --- a/src/controllers/stats/uploadController.ts +++ b/src/controllers/stats/uploadController.ts @@ -1,6 +1,6 @@ import { getJSONfromString } from "@/src/helpers/stringHelpers"; 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 { RequestHandler } from "express"; @@ -8,8 +8,7 @@ const uploadController: RequestHandler = async (req, res) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { PS, ...payload } = getJSONfromString(String(req.body)); const accountId = await getAccountIdForRequest(req); - const playerStats = await getStats(accountId); - await updateStats(playerStats, payload); + await updateStats(accountId, payload); res.status(200).end(); }; diff --git a/src/services/statsService.ts b/src/services/statsService.ts index 00612247..79c667fb 100644 --- a/src/services/statsService.ts +++ b/src/services/statsService.ts @@ -9,7 +9,8 @@ import { IUploadEntry, IWeapon } 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 => { const stats = new Stats({ accountOwnerId: accountId }); @@ -25,8 +26,9 @@ export const getStats = async (accountOwnerId: string): Promise => { +export const updateStats = async (accountOwnerId: string, payload: IStatsUpdate): Promise => { const unknownCategories: Record = {}; + const playerStats = await getStats(accountOwnerId); for (const [action, actionData] of Object.entries(payload)) { switch (action) { @@ -308,12 +310,30 @@ export const updateStats = async (playerStats: TStatsDatabaseDocument, payload: case "ZephyrScore": case "SentinelGameScore": case "CaliberChicksScore": - case "OlliesCrashCourseScore": case "DojoObstacleScore": playerStats[category] ??= 0; if (data > playerStats[category]) playerStats[category] = data; 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: if (!ignoredCategories.includes(category)) { if (!unknownCategories[action]) {