Compare commits

..

1 Commits

Author SHA1 Message Date
fc943c98f5 chore: simplify config 2025-03-06 14:31:04 +01:00
20 changed files with 21 additions and 71 deletions

View File

@ -5,11 +5,9 @@
"level": "trace"
},
"myAddress": "localhost",
"hubAddress": "https://localhost/api/",
"platformCDNs": ["https://localhost/"],
"NRS": ["localhost"],
"httpPort": 80,
"httpsPort": 443,
"NRS": ["localhost"],
"administratorNames": [],
"autoCreateAccount": true,
"skipTutorial": true,
@ -33,7 +31,6 @@
"noDailyStandingLimits": true,
"instantResourceExtractorDrones": false,
"noDojoRoomBuildStage": true,
"fastDojoRoomDestruction": true,
"noDojoResearchCosts": true,
"noDojoResearchTime": true,
"spoofMasteryRank": -1

View File

@ -9,6 +9,7 @@ export const abortDojoComponentController: RequestHandler = async (req, res) =>
const guild = await getGuildForRequestEx(req, inventory);
const request = JSON.parse(String(req.body)) as IAbortDojoComponentRequest;
// TODO: Move already-contributed credits & items to the clan vault
if (request.DecoId) {
removeDojoDeco(guild, request.ComponentId, request.DecoId);
} else {
@ -16,7 +17,7 @@ export const abortDojoComponentController: RequestHandler = async (req, res) =>
}
await guild.save();
res.json(await getDojoClient(guild, 0, request.ComponentId));
res.json(getDojoClient(guild, 0, request.ComponentId));
};
interface IAbortDojoComponentRequest {

View File

@ -1,12 +0,0 @@
import { getDojoClient, getGuildForRequest } from "@/src/services/guildService";
import { RequestHandler } from "express";
export const abortDojoComponentDestructionController: RequestHandler = async (req, res) => {
const guild = await getGuildForRequest(req);
const componentId = req.query.componentId as string;
guild.DojoComponents.id(componentId)!.DestructionTime = undefined;
await guild.save();
res.json(await getDojoClient(guild, 0, componentId));
};

View File

@ -58,7 +58,7 @@ export const changeDojoRootController: RequestHandler = async (req, res) => {
await guild.save();
res.json(await getDojoClient(guild, 0));
res.json(getDojoClient(guild, 0));
};
interface INode {

View File

@ -50,7 +50,7 @@ export const contributeToDojoComponentController: RequestHandler = async (req, r
await guild.save();
await inventory.save();
res.json({
...(await getDojoClient(guild, 0, component._id)),
...getDojoClient(guild, 0, component._id),
InventoryChanges: inventoryChanges
});
};

View File

@ -6,9 +6,10 @@ export const destroyDojoDecoController: RequestHandler = async (req, res) => {
const request = JSON.parse(String(req.body)) as IDestroyDojoDecoRequest;
removeDojoDeco(guild, request.ComponentId, request.DecoId);
// TODO: The client says this is supposed to refund the resources to the clan vault, so we should probably do that.
await guild.save();
res.json(await getDojoClient(guild, 0, request.ComponentId));
res.json(getDojoClient(guild, 0, request.ComponentId));
};
interface IDestroyDojoDecoRequest {

View File

@ -35,7 +35,7 @@ export const dojoComponentRushController: RequestHandler = async (req, res) => {
await guild.save();
await inventory.save();
res.json({
...(await getDojoClient(guild, 0, component._id)),
...getDojoClient(guild, 0, component._id),
InventoryChanges: inventoryChanges
});
};

View File

@ -24,5 +24,5 @@ export const getGuildDojoController: RequestHandler = async (req, res) => {
await guild.save();
}
res.json(await getDojoClient(guild, 0));
res.json(getDojoClient(guild, 0));
};

View File

@ -85,8 +85,8 @@ const createLoginResponse = (account: IDatabaseAccountJson, buildLabel: string):
Nonce: account.Nonce,
Groups: [],
IRC: config.myIrcAddresses ?? [config.myAddress],
platformCDNs: config.platformCDNs,
HUB: config.hubAddress,
platformCDNs: [`https://${config.myAddress}/`],
HUB: `https://${config.myAddress}/api/`,
NRS: config.NRS,
DTLS: 99,
BuildLabel: buildLabel,

View File

@ -30,7 +30,7 @@ export const placeDecoInComponentController: RequestHandler = async (req, res) =
}
await guild.save();
res.json(await getDojoClient(guild, 0, component._id));
res.json(getDojoClient(guild, 0, component._id));
};
interface IPlaceDecoInComponentRequest {

View File

@ -1,15 +1,12 @@
import { config } from "@/src/services/configService";
import { getDojoClient, getGuildForRequest } from "@/src/services/guildService";
import { getDojoClient, getGuildForRequest, removeDojoRoom } from "@/src/services/guildService";
import { RequestHandler } from "express";
export const queueDojoComponentDestructionController: RequestHandler = async (req, res) => {
const guild = await getGuildForRequest(req);
const componentId = req.query.componentId as string;
guild.DojoComponents.id(componentId)!.DestructionTime = new Date(
Date.now() + (config.fastDojoRoomDestruction ? 5_000 : 2 * 3600_000)
);
removeDojoRoom(guild, componentId);
await guild.save();
res.json(await getDojoClient(guild, 0, componentId));
res.json(getDojoClient(guild, 1));
};

View File

@ -12,7 +12,7 @@ export const setDojoComponentMessageController: RequestHandler = async (req, res
component.Message = payload.Message;
}
await guild.save();
res.json(await getDojoClient(guild, 0, component._id));
res.json(getDojoClient(guild, 0, component._id));
};
type SetDojoComponentMessageRequest = { Name: string } | { Message: string };

View File

@ -37,5 +37,5 @@ export const startDojoRecipeController: RequestHandler = async (req, res) => {
component.CompletionTime = new Date(Date.now());
}
await guild.save();
res.json(await getDojoClient(guild, 0));
res.json(getDojoClient(guild, 0));
};

View File

@ -1,7 +1,6 @@
import express from "express";
import { abandonLibraryDailyTaskController } from "@/src/controllers/api/abandonLibraryDailyTaskController";
import { abortDojoComponentController } from "@/src/controllers/api/abortDojoComponentController";
import { abortDojoComponentDestructionController } from "@/src/controllers/api/abortDojoComponentDestructionController";
import { activateRandomModController } from "@/src/controllers/api/activateRandomModController";
import { addFriendImageController } from "@/src/controllers/api/addFriendImageController";
import { arcaneCommonController } from "@/src/controllers/api/arcaneCommonController";
@ -106,7 +105,6 @@ const apiRouter = express.Router();
// get
apiRouter.get("/abandonLibraryDailyTask.php", abandonLibraryDailyTaskController);
apiRouter.get("/abortDojoComponentDestruction.php", abortDojoComponentDestructionController);
apiRouter.get("/checkDailyMissionBonus.php", checkDailyMissionBonusController);
apiRouter.get("/claimLibraryDailyTaskReward.php", claimLibraryDailyTaskRewardController);
apiRouter.get("/credits.php", creditsController);

View File

@ -33,8 +33,6 @@ interface IConfig {
httpPort?: number;
httpsPort?: number;
myIrcAddresses?: string[];
platformCDNs?: string[];
hubAddress?: string;
NRS?: string[];
administratorNames?: string[] | string;
autoCreateAccount?: boolean;
@ -59,7 +57,6 @@ interface IConfig {
noDailyStandingLimits?: boolean;
instantResourceExtractorDrones?: boolean;
noDojoRoomBuildStage?: boolean;
fastDojoRoomDestruction?: boolean;
noDojoResearchCosts?: boolean;
noDojoResearchTime?: boolean;
spoofMasteryRank?: number;

View File

@ -7,7 +7,6 @@ import { IDojoClient, IDojoComponentClient } from "@/src/types/guildTypes";
import { toMongoDate, toOid } from "@/src/helpers/inventoryHelpers";
import { Types } from "mongoose";
import { ExportDojoRecipes } from "warframe-public-export-plus";
import { logger } from "../utils/logger";
export const getGuildForRequest = async (req: Request): Promise<TGuildDatabaseDocument> => {
const accountId = await getAccountIdForRequest(req);
@ -30,11 +29,11 @@ export const getGuildForRequestEx = async (
return guild;
};
export const getDojoClient = async (
export const getDojoClient = (
guild: TGuildDatabaseDocument,
status: number,
componentId: Types.ObjectId | string | undefined = undefined
): Promise<IDojoClient> => {
): IDojoClient => {
const dojo: IDojoClient = {
_id: { $oid: guild._id.toString() },
Name: guild.Name,
@ -47,7 +46,6 @@ export const getDojoClient = async (
DojoRequestStatus: status,
DojoComponents: []
};
const roomsToRemove: Types.ObjectId[] = [];
guild.DojoComponents.forEach(dojoComponent => {
if (!componentId || dojoComponent._id.equals(componentId)) {
const clientComponent: IDojoComponentClient = {
@ -65,13 +63,6 @@ export const getDojoClient = async (
}
if (dojoComponent.CompletionTime) {
clientComponent.CompletionTime = toMongoDate(dojoComponent.CompletionTime);
if (dojoComponent.DestructionTime) {
if (Date.now() >= dojoComponent.DestructionTime.getTime()) {
roomsToRemove.push(dojoComponent._id);
return;
}
clientComponent.DestructionTime = toMongoDate(dojoComponent.DestructionTime);
}
} else {
clientComponent.RegularCredits = dojoComponent.RegularCredits;
clientComponent.MiscItems = dojoComponent.MiscItems;
@ -93,13 +84,6 @@ export const getDojoClient = async (
dojo.DojoComponents.push(clientComponent);
}
});
if (roomsToRemove.length) {
logger.debug(`removing now-destroyed rooms`, roomsToRemove);
for (const id of roomsToRemove) {
removeDojoRoom(guild, id);
}
await guild.save();
}
return dojo;
};
@ -108,7 +92,7 @@ export const scaleRequiredCount = (count: number): number => {
return Math.max(1, Math.trunc(count / 100));
};
export const removeDojoRoom = (guild: TGuildDatabaseDocument, componentId: Types.ObjectId | string): void => {
export const removeDojoRoom = (guild: TGuildDatabaseDocument, componentId: string): void => {
const component = guild.DojoComponents.splice(
guild.DojoComponents.findIndex(x => x._id.equals(componentId)),
1
@ -118,14 +102,9 @@ export const removeDojoRoom = (guild: TGuildDatabaseDocument, componentId: Types
guild.DojoCapacity -= meta.capacity;
guild.DojoEnergy -= meta.energy;
}
// TODO: Add resources spent to the clan vault
};
export const removeDojoDeco = (
guild: TGuildDatabaseDocument,
componentId: Types.ObjectId | string,
decoId: Types.ObjectId | string
): void => {
export const removeDojoDeco = (guild: TGuildDatabaseDocument, componentId: string, decoId: string): void => {
const component = guild.DojoComponents.id(componentId)!;
const deco = component.Decos!.splice(
component.Decos!.findIndex(x => x._id.equals(decoId)),
@ -135,5 +114,4 @@ export const removeDojoDeco = (
if (meta && meta.capacityCost) {
component.DecoCapacity! += meta.capacityCost;
}
// TODO: Add resources spent to the clan vault
};

View File

@ -525,10 +525,6 @@
<input class="form-check-input" type="checkbox" id="noDojoRoomBuildStage" />
<label class="form-check-label" for="noDojoRoomBuildStage" data-loc="cheats_noDojoRoomBuildStage"></label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="fastDojoRoomDestruction" />
<label class="form-check-label" for="fastDojoRoomDestruction" data-loc="cheats_fastDojoRoomDestruction"></label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="noDojoResearchCosts" />
<label class="form-check-label" for="noDojoResearchCosts" data-loc="cheats_noDojoResearchCosts"></label>

View File

@ -111,7 +111,6 @@ dict = {
cheats_noDailyStandingLimits: `No Daily Standing Limits`,
cheats_instantResourceExtractorDrones: `Instant Resource Extractor Drones`,
cheats_noDojoRoomBuildStage: `No Dojo Room Build Stage`,
cheats_fastDojoRoomDestruction: `Fast Dojo Room Destruction`,
cheats_noDojoResearchCosts: `No Dojo Research Costs`,
cheats_noDojoResearchTime: `No Dojo Research Time`,
cheats_spoofMasteryRank: `Spoofed Mastery Rank (-1 to disable)`,

View File

@ -112,7 +112,6 @@ dict = {
cheats_noDailyStandingLimits: `Pas de limite de réputation journalière`,
cheats_instantResourceExtractorDrones: `Ressources de drone d'extraction instantannées`,
cheats_noDojoRoomBuildStage: `No Dojo Room Build Stage`,
cheats_fastDojoRoomDestruction: `[UNTRANSLATED] Fast Dojo Room Destruction`,
cheats_noDojoResearchCosts: `Aucun coût de recherche (Dojo)`,
cheats_noDojoResearchTime: `Aucun temps de recherche (Dojo)`,
cheats_spoofMasteryRank: `Spoofed Mastery Rank (-1 to disable)`,

View File

@ -112,7 +112,6 @@ dict = {
cheats_noDailyStandingLimits: `Без ежедневных ограничений репутации`,
cheats_instantResourceExtractorDrones: `[UNTRANSLATED] Instant Resource Extractor Drones`,
cheats_noDojoRoomBuildStage: `[UNTRANSLATED] No Dojo Room Build Stage`,
cheats_fastDojoRoomDestruction: `[UNTRANSLATED] Fast Dojo Room Destruction`,
cheats_noDojoResearchCosts: `[UNTRANSLATED] No Dojo Research Costs`,
cheats_noDojoResearchTime: `[UNTRANSLATED] No Dojo Research Time`,
cheats_spoofMasteryRank: `Подделанный ранг мастерства (-1 для отключения)`,