XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFESpaceNinjaServer

feat: login rewards for U18 and below (#3516)

Closes #3517 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/3516 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>

5195d365
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

5 个文件 +56 -4
Modified src/constants/gameToBuildVersion.ts +0 -1
@@ -34,7 +34,6 @@ const gameToBuildVersion = {
34 34 "24.5.1": "2019.03.15.18.11",
35 35 "24.4.0": "2019.03.07.20.21",
36 36 "24.0.0": "2018.11.08.14.45",
37 "23.10.0": "2018.10.11.23.29",
38 37 "23.2.0": "2018.08.01.08.09",
39 38 "22.13.4": "2018.02.22.14.34",
40 39 "22.8.2": "2018.01.04.13.12",
Added src/controllers/api/giveLoginRewardController.ts +38 -0
@@ -0,0 +1,38 @@
1 import type { RequestHandler } from "express";
2 import {
3 claimLoginReward,
4 getRandomLoginRewards,
5 setAccountGotLoginRewardToday,
6 type ILoginReward
7 } from "../../services/loginRewardService.ts";
8 import { getJSONfromString } from "../../helpers/stringHelpers.ts";
9 import { getAccountForRequest } from "../../services/loginService.ts";
10 import { getInventory } from "../../services/inventoryService.ts";
11 import { sendWsBroadcastTo } from "../../services/wsService.ts";
12 import { logger } from "../../utils/logger.ts";
13
14 export const giveLoginRewardController: RequestHandler = async (req, res) => {
15 const account = await getAccountForRequest(req);
16 const inventory = await getInventory(account._id);
17 const body = getJSONfromString<IGiveLoginRewardRequest>(String(req.body));
18
19 const today = Math.trunc(Date.now() / 86400000) * 86400;
20 if (account.LastLoginRewardDate == today) {
21 logger.debug(`login reward was already pre-emptively claimed server-side, so ignoring manual claim`);
22 res.json({});
23 } else {
24 const randomRewards = getRandomLoginRewards(account, inventory);
25 const chosenReward = randomRewards.find(x => x.StoreItemType == body.reward.StoreItemType)!;
26 const inventoryChanges = await claimLoginReward(inventory, chosenReward);
27
28 setAccountGotLoginRewardToday(account);
29 await Promise.all([inventory.save(), account.save()]);
30
31 sendWsBroadcastTo(account._id.toString(), { update_inventory: true });
32 res.json(inventoryChanges);
33 }
34 };
35
36 interface IGiveLoginRewardRequest {
37 reward: ILoginReward;
38 }
Modified src/controllers/api/loginRewardsController.ts +15 -3
@@ -27,6 +27,7 @@ export const loginRewardsController: RequestHandler = async (req, res) => {
27 27 Rewards: randomRewards,
28 28 IsMilestoneDay: isMilestoneDay,
29 29 IsChooseRewardSet: randomRewards.length != 1,
30 IsHiddenRewardSet: randomRewards.length != 1,
30 31 LoginDays: account.LoginDays,
31 32 NextMilestoneReward: "",
32 33 NextMilestoneDay: nextMilestoneDay,
@@ -34,9 +35,14 @@ export const loginRewardsController: RequestHandler = async (req, res) => {
34 35 },
35 36 LastLoginRewardDate: today
36 37 };
38
39 // https://wiki.warframe.com/w/Login_Rewards
40 const is_pre_daily_tribute =
41 account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["18.0.2"]) < 0;
42
37 43 if (
38 44 (!isMilestoneDay && randomRewards.length == 1) || // A choice is not needed?
39 (account.BuildLabel && version_compare(account.BuildLabel, gameToBuildVersion["23.10.0"]) < 0) // Or client is unable to make a choice?
45 is_pre_daily_tribute // Or client is unable to make a choice?
40 46 ) {
41 47 response.DailyTributeInfo.HasChosenReward = true;
42 48 response.DailyTributeInfo.ChosenReward = randomRewards[0];
@@ -46,14 +52,20 @@ export const loginRewardsController: RequestHandler = async (req, res) => {
46 52
47 53 sendWsBroadcastTo(account._id.toString(), { update_inventory: true });
48 54 }
49 res.json(response);
55 if (is_pre_daily_tribute) {
56 res.json({ Rewards: response.DailyTributeInfo.Rewards });
57 } else {
58 res.json(response);
59 }
50 60 return;
51 61 }
52 62 }
63 const pick_a_door = isLoginRewardAChoice(account);
53 64 res.json({
54 65 DailyTributeInfo: {
55 66 IsMilestoneDay: isMilestoneDay,
56 IsChooseRewardSet: isLoginRewardAChoice(account),
67 IsChooseRewardSet: pick_a_door,
68 IsHiddenRewardSet: pick_a_door,
57 69 LoginDays: account.LoginDays,
58 70 NextMilestoneReward: "",
59 71 NextMilestoneDay: nextMilestoneDay
Modified src/routes/api.ts +2 -0
@@ -85,6 +85,7 @@ import { giftingController } from "../controllers/api/giftingController.ts";
85 85 import { gildWeaponController } from "../controllers/api/gildWeaponController.ts";
86 86 import { giveKeyChainTriggeredItemsController } from "../controllers/api/giveKeyChainTriggeredItemsController.ts";
87 87 import { giveKeyChainTriggeredMessageController } from "../controllers/api/giveKeyChainTriggeredMessageController.ts";
88 import { giveLoginRewardController } from "../controllers/api/giveLoginRewardController.ts";
88 89 import { giveQuestKeyRewardController } from "../controllers/api/giveQuestKeyRewardController.ts";
89 90 import { giveShipDecoAndLoreFragmentController } from "../controllers/api/giveShipDecoAndLoreFragmentController.ts";
90 91 import { giveStartingGearGetController, giveStartingGearPostController } from "../controllers/api/giveStartingGearController.ts";
@@ -322,6 +323,7 @@ apiRouter.post("/gifting.php", giftingController);
322 323 apiRouter.post("/gildWeapon.php", gildWeaponController);
323 324 apiRouter.post("/giveKeyChainTriggeredItems.php", giveKeyChainTriggeredItemsController);
324 325 apiRouter.post("/giveKeyChainTriggeredMessage.php", giveKeyChainTriggeredMessageController);
326 apiRouter.post("/giveLoginReward.php", giveLoginRewardController); // ~U18
325 327 apiRouter.post("/giveQuestKeyReward.php", giveQuestKeyRewardController);
326 328 apiRouter.post("/giveShipDecoAndLoreFragment.php", giveShipDecoAndLoreFragmentController);
327 329 apiRouter.post("/giveStartingGear.php", giveStartingGearPostController);
Modified src/services/loginRewardService.ts +1 -0
@@ -19,6 +19,7 @@ export interface ILoginRewardsReponse {
19 19 Rewards?: ILoginReward[]; // only set on first call of the day
20 20 IsMilestoneDay?: boolean;
21 21 IsChooseRewardSet?: boolean;
22 IsHiddenRewardSet?: boolean; // Seems to be the ~U18 equivalent of IsChooseRewardSet
22 23 LoginDays?: number; // when calling multiple times per day, this is already incremented to represent "tomorrow"
23 24 NextMilestoneReward?: "";
24 25 NextMilestoneDay?: number; // seems to not be used if IsMilestoneDay