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

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
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

2 个文件 +48 -40
Modified src/controllers/api/contributeGuildClassController.ts +3 -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
Modified src/services/guildService.ts +45 -0
@@ -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 => {