返回提交历史
Modified
src/controllers/api/addToGuildController.ts
+74
-67
Modified
src/routes/api.ts
+3
-2
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
代码差异
2 个文件
+77
-69
@@ -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
@@ -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);