返回提交历史
Modified
src/controllers/api/contributeGuildClassController.ts
+3
-40
Modified
src/services/guildService.ts
+45
-0
XFEstudio/SpaceNinjaServer
fix: check ascension ceremony contributors when changing clan tier (#1656)
Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/1656 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
7d607b73
代码差异
2 个文件
+48
-40
@@ -1,8 +1,7 @@
1
1
import { toMongoDate } from "@/src/helpers/inventoryHelpers";
2
2
import { getJSONfromString } from "@/src/helpers/stringHelpers";
3
import { Guild, GuildMember } from "@/src/models/guildModel";
4
import { config } from "@/src/services/configService";
5
import { createMessage } from "@/src/services/inboxService";
3
import { Guild } from "@/src/models/guildModel";
4
import { checkClanAscensionHasRequiredContributors } from "@/src/services/guildService";
6
5
import { getInventory } from "@/src/services/inventoryService";
7
6
import { getAccountIdForRequest } from "@/src/services/loginService";
8
7
import { RequestHandler } from "express";
@@ -31,43 +30,7 @@ export const contributeGuildClassController: RequestHandler = async (req, res) =
31
30
32
31
guild.CeremonyContributors.push(new Types.ObjectId(accountId));
33
32
34
// Once required contributor count is hit, the class is committed and there's 72 hours to claim endo.
35
if (guild.CeremonyContributors.length == payload.RequiredContributors) {
36
guild.Class = guild.CeremonyClass!;
37
guild.CeremonyClass = undefined;
38
guild.CeremonyResetDate = new Date(Date.now() + (config.fastClanAscension ? 5_000 : 72 * 3600_000));
39
if (!config.fastClanAscension) {
40
// Send message to all active guild members
41
const members = await GuildMember.find({ guildId: payload.GuildId, status: 0 }, "accountId");
42
for (const member of members) {
43
// somewhat unfaithful as on live the "msg" is not a loctag, but since we don't have the string, we'll let the client fill it in with "arg".
44
await createMessage(member.accountId, [
45
{
46
sndr: guild.Name,
47
msg: "/Lotus/Language/Clan/Clan_AscensionCeremonyInProgressDetails",
48
arg: [
49
{
50
Key: "RESETDATE",
51
Tag:
52
guild.CeremonyResetDate.getUTCMonth() +
53
"/" +
54
guild.CeremonyResetDate.getUTCDate() +
55
"/" +
56
(guild.CeremonyResetDate.getUTCFullYear() % 100) +
57
" " +
58
guild.CeremonyResetDate.getUTCHours().toString().padStart(2, "0") +
59
":" +
60
guild.CeremonyResetDate.getUTCMinutes().toString().padStart(2, "0")
61
}
62
],
63
sub: "/Lotus/Language/Clan/Clan_AscensionCeremonyInProgress",
64
icon: "/Lotus/Interface/Graphics/ClanTileImages/ClanEnterDojo.png",
65
highPriority: true
66
}
67
]);
68
}
69
}
70
}
33
await checkClanAscensionHasRequiredContributors(guild);
71
34
72
35
await guild.save();
73
36
@@ -31,6 +31,7 @@ import { IFusionTreasure, ITypeCount } from "../types/inventoryTypes/inventoryTy
31
31
import { IInventoryChanges } from "../types/purchaseTypes";
32
32
import { parallelForeach } from "../utils/async-utils";
33
33
import allDecoRecipes from "@/static/fixed_responses/allDecoRecipes.json";
34
import { createMessage } from "./inboxService";
34
35
35
36
export const getGuildForRequest = async (req: Request): Promise<TGuildDatabaseDocument> => {
36
37
const accountId = await getAccountIdForRequest(req);
@@ -601,6 +602,50 @@ const setGuildTier = async (guild: TGuildDatabaseDocument, newTier: number): Pro
601
602
await processGuildTechProjectContributionsUpdate(guild, project);
602
603
}
603
604
}
605
if (guild.CeremonyContributors) {
606
await checkClanAscensionHasRequiredContributors(guild);
607
}
608
};
609
610
export const checkClanAscensionHasRequiredContributors = async (guild: TGuildDatabaseDocument): Promise<void> => {
611
const requiredContributors = [1, 5, 15, 30, 50][guild.Tier - 1];
612
// Once required contributor count is hit, the class is committed and there's 72 hours to claim endo.
613
if (guild.CeremonyContributors!.length >= requiredContributors) {
614
guild.Class = guild.CeremonyClass!;
615
guild.CeremonyClass = undefined;
616
guild.CeremonyResetDate = new Date(Date.now() + (config.fastClanAscension ? 5_000 : 72 * 3600_000));
617
if (!config.fastClanAscension) {
618
// Send message to all active guild members
619
const members = await GuildMember.find({ guildId: guild._id, status: 0 }, "accountId");
620
await parallelForeach(members, async member => {
621
// somewhat unfaithful as on live the "msg" is not a loctag, but since we don't have the string, we'll let the client fill it in with "arg".
622
await createMessage(member.accountId, [
623
{
624
sndr: guild.Name,
625
msg: "/Lotus/Language/Clan/Clan_AscensionCeremonyInProgressDetails",
626
arg: [
627
{
628
Key: "RESETDATE",
629
Tag:
630
guild.CeremonyResetDate!.getUTCMonth() +
631
"/" +
632
guild.CeremonyResetDate!.getUTCDate() +
633
"/" +
634
(guild.CeremonyResetDate!.getUTCFullYear() % 100) +
635
" " +
636
guild.CeremonyResetDate!.getUTCHours().toString().padStart(2, "0") +
637
":" +
638
guild.CeremonyResetDate!.getUTCMinutes().toString().padStart(2, "0")
639
}
640
],
641
sub: "/Lotus/Language/Clan/Clan_AscensionCeremonyInProgress",
642
icon: "/Lotus/Interface/Graphics/ClanTileImages/ClanEnterDojo.png",
643
highPriority: true
644
}
645
]);
646
});
647
}
648
}
604
649
};
605
650
606
651
export const removeDojoKeyItems = (inventory: TInventoryDatabaseDocument): IInventoryChanges => {