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: handle addToGuild request from U10 (#3436)

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

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

代码差异

2 个文件 +77 -69
Modified src/controllers/api/addToGuildController.ts +74 -67
@@ -10,79 +10,19 @@ import type { IOid } from "../../types/commonTypes.ts";
10 10 import type { IGuildMemberClient } from "../../types/guildTypes.ts";
11 11 import { GuildPermission } from "../../types/guildTypes.ts";
12 12 import { logger } from "../../utils/logger.ts";
13 import type { RequestHandler } from "express";
13 import type { Request, Response, RequestHandler } from "express";
14 14 import { ExportFlavour } from "warframe-public-export-plus";
15 15
16 export const addToGuildController: RequestHandler = async (req, res) => {
16 export const addToGuildGetController: RequestHandler = async (req, res) => {
17 await inviteToGuild(req, res, req.query.userName as string);
18 };
19
20 export const addToGuildPostController: RequestHandler = async (req, res) => {
17 21 const payload = JSON.parse(String(req.body)) as IAddToGuildRequest;
18 22
19 23 if ("UserName" in payload || "userName" in payload) {
20 24 // Clan recruiter sending an invite
21
22 const account = await Account.findOne({ DisplayName: payload.UserName ?? payload.userName });
23 if (!account) {
24 res.status(400).json("Username does not exist");
25 return;
26 }
27
28 const senderAccount = await getAccountForRequest(req);
29 const inventory = await getInventory(account._id.toString(), "Settings");
30 if (
31 inventory.Settings?.GuildInvRestriction == "GIFT_MODE_NONE" ||
32 (inventory.Settings?.GuildInvRestriction == "GIFT_MODE_FRIENDS" &&
33 !(await areFriends(account._id, senderAccount._id)))
34 ) {
35 res.status(400).json("Invite restricted");
36 return;
37 }
38
39 const senderInventory = await getInventory(senderAccount._id.toString(), "GuildId ActiveAvatarImageType");
40 const guild = (await Guild.findById(senderInventory.GuildId!, "Name Ranks"))!;
41 if (!(await hasGuildPermission(guild, senderAccount._id.toString(), GuildPermission.Recruiter))) {
42 res.status(400).json("Invalid permission");
43 }
44
45 try {
46 await GuildMember.insertOne({
47 accountId: account._id,
48 guildId: senderInventory.GuildId!,
49 status: 2 // outgoing invite
50 });
51 } catch (e) {
52 logger.debug(`guild invite failed due to ${String(e)}`);
53 res.status(400).json("User already invited to clan");
54 return;
55 }
56
57 await createMessage(account._id, [
58 {
59 sndr: getSuffixedName(senderAccount),
60 msg: "/Lotus/Language/Menu/Mailbox_ClanInvite_Body",
61 arg: [
62 {
63 Key: "clan",
64 Tag: guild.Name
65 }
66 ],
67 sub: "/Lotus/Language/Menu/Mailbox_ClanInvite_Title",
68 icon: ExportFlavour[getEffectiveAvatarImageType(senderInventory)].icon,
69 contextInfo: senderInventory.GuildId!.toString(),
70 highPriority: true,
71 acceptAction: "GUILD_INVITE",
72 declineAction: "GUILD_INVITE",
73 hasAccountAction: true
74 }
75 ]);
76
77 const member: IGuildMemberClient = {
78 _id: { $oid: account._id.toString() },
79 DisplayName: account.DisplayName,
80 LastLogin: toMongoDate(account.LastLogin),
81 Rank: 7,
82 Status: 2
83 };
84 await addInventoryDataToFriendInfo(member);
85 res.json({ NewMember: member });
25 await inviteToGuild(req, res, (payload.UserName ?? payload.userName)!);
86 26 } else if ("RequestMsg" in payload) {
87 27 // Player applying to join a clan
88 28 const accountId = await getAccountIdForRequest(req);
@@ -105,6 +45,73 @@ export const addToGuildController: RequestHandler = async (req, res) => {
105 45 }
106 46 };
107 47
48 const inviteToGuild = async (req: Request, res: Response, userName: string): Promise<void> => {
49 const account = await Account.findOne({ DisplayName: userName });
50 if (!account) {
51 res.status(400).send("Username does not exist");
52 return;
53 }
54
55 const senderAccount = await getAccountForRequest(req);
56 const inventory = await getInventory(account._id.toString(), "Settings");
57 if (
58 inventory.Settings?.GuildInvRestriction == "GIFT_MODE_NONE" ||
59 (inventory.Settings?.GuildInvRestriction == "GIFT_MODE_FRIENDS" &&
60 !(await areFriends(account._id, senderAccount._id)))
61 ) {
62 res.status(400).send("Invite restricted");
63 return;
64 }
65
66 const senderInventory = await getInventory(senderAccount._id.toString(), "GuildId ActiveAvatarImageType");
67 const guild = (await Guild.findById(senderInventory.GuildId!, "Name Ranks"))!;
68 if (!(await hasGuildPermission(guild, senderAccount._id.toString(), GuildPermission.Recruiter))) {
69 res.status(400).send("Invalid permission");
70 }
71
72 try {
73 await GuildMember.insertOne({
74 accountId: account._id,
75 guildId: senderInventory.GuildId!,
76 status: 2 // outgoing invite
77 });
78 } catch (e) {
79 logger.debug(`guild invite failed due to ${String(e)}`);
80 res.status(400).send("User already invited to clan");
81 return;
82 }
83
84 await createMessage(account._id, [
85 {
86 sndr: getSuffixedName(senderAccount),
87 msg: "/Lotus/Language/Menu/Mailbox_ClanInvite_Body",
88 arg: [
89 {
90 Key: "clan",
91 Tag: guild.Name
92 }
93 ],
94 sub: "/Lotus/Language/Menu/Mailbox_ClanInvite_Title",
95 icon: ExportFlavour[getEffectiveAvatarImageType(senderInventory)].icon,
96 contextInfo: senderInventory.GuildId!.toString(),
97 highPriority: true,
98 acceptAction: "GUILD_INVITE",
99 declineAction: "GUILD_INVITE",
100 hasAccountAction: true
101 }
102 ]);
103
104 const member: IGuildMemberClient = {
105 _id: { $oid: account._id.toString() },
106 DisplayName: account.DisplayName,
107 LastLogin: toMongoDate(account.LastLogin),
108 Rank: 7,
109 Status: 2
110 };
111 await addInventoryDataToFriendInfo(member);
112 res.json({ NewMember: member });
113 };
114
108 115 interface IAddToGuildRequest {
109 116 UserName?: string;
110 117 userName?: string; // U22.13.4 provides this instead of UserName
Modified src/routes/api.ts +3 -2
@@ -9,7 +9,7 @@ import { addFriendTitleController } from "../controllers/api/addFriendTitleContr
9 9 import { addIgnoredUserController } from "../controllers/api/addIgnoredUserController.ts";
10 10 import { addPendingFriendGetController, addPendingFriendPostController } from "../controllers/api/addPendingFriendController.ts";
11 11 import { addToAllianceController } from "../controllers/api/addToAllianceController.ts";
12 import { addToGuildController } from "../controllers/api/addToGuildController.ts";
12 import { addToGuildGetController, addToGuildPostController } from "../controllers/api/addToGuildController.ts";
13 13 import { adoptPetController } from "../controllers/api/adoptPetController.ts";
14 14 import { aggregateSessionsController } from "../controllers/dynamic/aggregateSessionsController.ts";
15 15 import { apartmentController } from "../controllers/api/apartmentController.ts";
@@ -186,6 +186,7 @@ apiRouter.get("/abortDojoComponentDestruction.php", abortDojoComponentDestructio
186 186 apiRouter.get("/addFriend.php", addFriendGetController); // ~U16 and below
187 187 apiRouter.get("/addFriendImage.php", addFriendImageGetController) // U17 and below
188 188 apiRouter.get("/addPendingFriend.php", addPendingFriendGetController); // ~U10 and below
189 apiRouter.get("/addToGuild.php", addToGuildGetController); // ~U10
189 190 apiRouter.get("/apartment.php", apartmentController);
190 191 apiRouter.get("/cancelGuildAdvertisement.php", cancelGuildAdvertisementController);
191 192 apiRouter.get("/changeDojoRoot.php", changeDojoRootController);
@@ -262,7 +263,7 @@ apiRouter.post("/addFriendTitle.php", addFriendTitleController);
262 263 apiRouter.post("/addIgnoredUser.php", addIgnoredUserController);
263 264 apiRouter.post("/addPendingFriend.php", addPendingFriendPostController);
264 265 apiRouter.post("/addToAlliance.php", addToAllianceController);
265 apiRouter.post("/addToGuild.php", addToGuildController);
266 apiRouter.post("/addToGuild.php", addToGuildPostController);
266 267 apiRouter.post("/adoptPet.php", adoptPetController);
267 268 apiRouter.post("/aggregateSessions.php", aggregateSessionsController); // Pre-Specters of the Rail builds
268 269 apiRouter.post("/arcaneCommon.php", arcaneCommonController);