返回提交历史
Modified
src/constants/gameToBuildVersion.ts
+0
-1
Added
src/controllers/api/giveLoginRewardController.ts
+38
-0
Modified
src/controllers/api/loginRewardsController.ts
+15
-3
Modified
src/routes/api.ts
+2
-0
Modified
src/services/loginRewardService.ts
+1
-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
代码差异
5 个文件
+56
-4
@@ -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",
@@ -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
}
@@ -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
@@ -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);
@@ -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