2025-04-05 06:52:35 -07:00
|
|
|
import { IKeyChainRequest } from "@/src/types/requestTypes";
|
2024-01-25 14:49:45 +01:00
|
|
|
import { getIndexAfter } from "@/src/helpers/stringHelpers";
|
2024-06-17 16:41:02 +02:00
|
|
|
import {
|
2024-12-22 20:38:50 +01:00
|
|
|
dict_de,
|
2024-06-17 16:41:02 +02:00
|
|
|
dict_en,
|
2024-12-22 20:38:50 +01:00
|
|
|
dict_es,
|
|
|
|
dict_fr,
|
|
|
|
dict_it,
|
|
|
|
dict_ja,
|
|
|
|
dict_ko,
|
|
|
|
dict_pl,
|
|
|
|
dict_pt,
|
|
|
|
dict_ru,
|
|
|
|
dict_tc,
|
|
|
|
dict_th,
|
|
|
|
dict_tr,
|
|
|
|
dict_uk,
|
|
|
|
dict_zh,
|
2024-12-23 14:37:21 +01:00
|
|
|
ExportArcanes,
|
|
|
|
ExportCustoms,
|
2025-03-09 11:15:45 -07:00
|
|
|
ExportDrones,
|
2024-12-23 14:37:21 +01:00
|
|
|
ExportGear,
|
|
|
|
ExportKeys,
|
2024-06-17 16:41:02 +02:00
|
|
|
ExportRecipes,
|
2024-12-23 14:37:21 +01:00
|
|
|
ExportResources,
|
|
|
|
ExportSentinels,
|
2024-06-17 16:41:02 +02:00
|
|
|
ExportWarframes,
|
|
|
|
ExportWeapons,
|
2025-03-17 05:10:44 -07:00
|
|
|
IDefaultUpgrade,
|
2025-02-26 12:16:31 +01:00
|
|
|
IInboxMessage,
|
2025-02-28 03:04:59 -08:00
|
|
|
IMissionReward,
|
2025-01-24 14:13:21 +01:00
|
|
|
IRecipe,
|
2025-02-28 03:04:59 -08:00
|
|
|
TReward
|
2024-06-17 16:41:02 +02:00
|
|
|
} from "warframe-public-export-plus";
|
2025-03-02 04:18:59 -08:00
|
|
|
import { IMessage } from "../models/inboxModel";
|
2024-01-25 14:49:45 +01:00
|
|
|
|
2024-06-10 14:03:03 +02:00
|
|
|
export type WeaponTypeInternal =
|
|
|
|
| "LongGuns"
|
|
|
|
| "Pistols"
|
|
|
|
| "Melee"
|
|
|
|
| "SpaceMelee"
|
|
|
|
| "SpaceGuns"
|
|
|
|
| "SentinelWeapons"
|
|
|
|
| "OperatorAmps"
|
|
|
|
| "SpecialItems";
|
2024-01-25 14:49:45 +01:00
|
|
|
|
2024-06-19 10:32:16 +02:00
|
|
|
export const getRecipe = (uniqueName: string): IRecipe | undefined => {
|
2024-06-17 16:41:02 +02:00
|
|
|
return ExportRecipes[uniqueName];
|
2024-01-25 14:49:45 +01:00
|
|
|
};
|
|
|
|
|
2025-01-02 08:54:27 +01:00
|
|
|
export const getRecipeByResult = (resultType: string): IRecipe | undefined => {
|
|
|
|
return Object.values(ExportRecipes).find(x => x.resultType == resultType);
|
|
|
|
};
|
|
|
|
|
2024-10-17 22:12:28 +02:00
|
|
|
export const getItemCategoryByUniqueName = (uniqueName: string): string => {
|
2024-01-25 14:49:45 +01:00
|
|
|
//Lotus/Types/Items/MiscItems/PolymerBundle
|
|
|
|
|
|
|
|
let splitWord = "Items/";
|
|
|
|
if (!uniqueName.includes("/Items/")) {
|
|
|
|
splitWord = "/Types/";
|
|
|
|
}
|
|
|
|
|
|
|
|
const index = getIndexAfter(uniqueName, splitWord);
|
|
|
|
if (index === -1) {
|
|
|
|
throw new Error(`error parsing item category ${uniqueName}`);
|
|
|
|
}
|
|
|
|
const category = uniqueName.substring(index).split("/")[0];
|
|
|
|
return category;
|
|
|
|
};
|
|
|
|
|
2024-12-23 14:37:21 +01:00
|
|
|
export const getItemName = (uniqueName: string): string | undefined => {
|
|
|
|
if (uniqueName in ExportArcanes) {
|
|
|
|
return ExportArcanes[uniqueName].name;
|
|
|
|
}
|
|
|
|
if (uniqueName in ExportCustoms) {
|
|
|
|
return ExportCustoms[uniqueName].name;
|
|
|
|
}
|
2025-03-09 11:15:45 -07:00
|
|
|
if (uniqueName in ExportDrones) {
|
|
|
|
return ExportDrones[uniqueName].name;
|
|
|
|
}
|
2024-12-23 14:37:21 +01:00
|
|
|
if (uniqueName in ExportKeys) {
|
|
|
|
return ExportKeys[uniqueName].name;
|
|
|
|
}
|
|
|
|
if (uniqueName in ExportGear) {
|
|
|
|
return ExportGear[uniqueName].name;
|
|
|
|
}
|
|
|
|
if (uniqueName in ExportResources) {
|
|
|
|
return ExportResources[uniqueName].name;
|
|
|
|
}
|
|
|
|
if (uniqueName in ExportSentinels) {
|
|
|
|
return ExportSentinels[uniqueName].name;
|
|
|
|
}
|
|
|
|
if (uniqueName in ExportWarframes) {
|
|
|
|
return ExportWarframes[uniqueName].name;
|
|
|
|
}
|
|
|
|
if (uniqueName in ExportWeapons) {
|
|
|
|
return ExportWeapons[uniqueName].name;
|
|
|
|
}
|
|
|
|
return undefined;
|
|
|
|
};
|
|
|
|
|
2024-12-22 20:38:50 +01:00
|
|
|
export const getDict = (lang: string): Record<string, string> => {
|
|
|
|
switch (lang) {
|
|
|
|
case "de":
|
|
|
|
return dict_de;
|
|
|
|
case "es":
|
|
|
|
return dict_es;
|
|
|
|
case "fr":
|
|
|
|
return dict_fr;
|
|
|
|
case "it":
|
|
|
|
return dict_it;
|
|
|
|
case "ja":
|
|
|
|
return dict_ja;
|
|
|
|
case "ko":
|
|
|
|
return dict_ko;
|
|
|
|
case "pl":
|
|
|
|
return dict_pl;
|
|
|
|
case "pt":
|
|
|
|
return dict_pt;
|
|
|
|
case "ru":
|
|
|
|
return dict_ru;
|
|
|
|
case "tc":
|
|
|
|
return dict_tc;
|
|
|
|
case "th":
|
|
|
|
return dict_th;
|
|
|
|
case "tr":
|
|
|
|
return dict_tr;
|
|
|
|
case "uk":
|
|
|
|
return dict_uk;
|
|
|
|
case "zh":
|
|
|
|
return dict_zh;
|
|
|
|
}
|
|
|
|
return dict_en;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const getString = (key: string, dict: Record<string, string>): string => {
|
|
|
|
return dict[key] ?? key;
|
2024-06-02 17:37:09 +02:00
|
|
|
};
|
2025-01-24 14:13:21 +01:00
|
|
|
|
2025-01-31 17:24:42 +01:00
|
|
|
export const getKeyChainItems = ({ KeyChain, ChainStage }: IKeyChainRequest): string[] => {
|
2025-01-24 14:13:21 +01:00
|
|
|
const chainStages = ExportKeys[KeyChain].chainStages;
|
|
|
|
if (!chainStages) {
|
|
|
|
throw new Error(`KeyChain ${KeyChain} does not contain chain stages`);
|
|
|
|
}
|
|
|
|
|
|
|
|
const keyChainStage = chainStages[ChainStage];
|
2025-02-26 12:16:31 +01:00
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
2025-01-24 14:13:21 +01:00
|
|
|
if (!keyChainStage) {
|
|
|
|
throw new Error(`KeyChainStage ${ChainStage} not found`);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (keyChainStage.itemsToGiveWhenTriggered.length === 0) {
|
2025-01-31 17:24:42 +01:00
|
|
|
throw new Error(
|
|
|
|
`client requested key chain items in KeyChain ${KeyChain} at stage ${ChainStage}, but they did not exist`
|
|
|
|
);
|
2025-01-24 14:13:21 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return keyChainStage.itemsToGiveWhenTriggered;
|
|
|
|
};
|
|
|
|
|
2025-02-28 03:04:59 -08:00
|
|
|
export const getLevelKeyRewards = (
|
|
|
|
levelKey: string
|
|
|
|
): { levelKeyRewards?: IMissionReward; levelKeyRewards2?: TReward[] } => {
|
2025-02-26 12:16:31 +01:00
|
|
|
if (!(levelKey in ExportKeys)) {
|
2025-02-24 08:50:07 -08:00
|
|
|
throw new Error(`LevelKey ${levelKey} not found`);
|
2025-01-24 14:13:21 +01:00
|
|
|
}
|
|
|
|
|
2025-02-26 12:16:31 +01:00
|
|
|
const levelKeyRewards = ExportKeys[levelKey].missionReward;
|
|
|
|
const levelKeyRewards2 = ExportKeys[levelKey].rewards;
|
2025-02-24 08:50:07 -08:00
|
|
|
|
|
|
|
if (!levelKeyRewards && !levelKeyRewards2) {
|
|
|
|
throw new Error(`LevelKey ${levelKey} does not contain either rewards1 or rewards2`);
|
2025-01-24 14:13:21 +01:00
|
|
|
}
|
|
|
|
|
2025-02-24 08:50:07 -08:00
|
|
|
return {
|
|
|
|
levelKeyRewards,
|
|
|
|
levelKeyRewards2
|
|
|
|
};
|
2025-01-24 14:13:21 +01:00
|
|
|
};
|
|
|
|
|
2025-03-02 04:18:59 -08:00
|
|
|
export const getKeyChainMessage = ({ KeyChain, ChainStage }: IKeyChainRequest): IMessage => {
|
2025-02-26 12:16:31 +01:00
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
2025-01-31 17:24:42 +01:00
|
|
|
const chainStages = ExportKeys[KeyChain]?.chainStages;
|
|
|
|
if (!chainStages) {
|
|
|
|
throw new Error(`KeyChain ${KeyChain} does not contain chain stages`);
|
|
|
|
}
|
|
|
|
|
|
|
|
const keyChainStage = chainStages[ChainStage];
|
2025-02-26 12:16:31 +01:00
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
2025-01-31 17:24:42 +01:00
|
|
|
if (!keyChainStage) {
|
|
|
|
throw new Error(`KeyChainStage ${ChainStage} not found`);
|
|
|
|
}
|
|
|
|
|
|
|
|
const chainStageMessage = keyChainStage.messageToSendWhenTriggered;
|
|
|
|
|
|
|
|
if (!chainStageMessage) {
|
|
|
|
throw new Error(
|
|
|
|
`client requested key chain message in keychain ${KeyChain} at stage ${ChainStage} but they did not exist`
|
|
|
|
);
|
|
|
|
}
|
2025-03-02 04:18:59 -08:00
|
|
|
return convertInboxMessage(chainStageMessage);
|
|
|
|
};
|
|
|
|
|
|
|
|
export const convertInboxMessage = (message: IInboxMessage): IMessage => {
|
|
|
|
return {
|
|
|
|
sndr: message.sender,
|
|
|
|
msg: message.body,
|
|
|
|
sub: message.title,
|
|
|
|
att: message.attachments.length > 0 ? message.attachments : undefined,
|
|
|
|
countedAtt: message.countedAttachments.length > 0 ? message.countedAttachments : undefined,
|
|
|
|
icon: message.icon ?? "",
|
|
|
|
transmission: message.transmission ?? "",
|
|
|
|
highPriority: message.highPriority ?? false,
|
|
|
|
r: false
|
|
|
|
} satisfies IMessage;
|
2025-01-31 17:24:42 +01:00
|
|
|
};
|
2025-03-09 07:42:55 -07:00
|
|
|
|
2025-03-25 06:38:44 -07:00
|
|
|
export const isStoreItem = (type: string): boolean => {
|
|
|
|
return type.startsWith("/Lotus/StoreItems/");
|
|
|
|
};
|
|
|
|
|
2025-03-09 07:42:55 -07:00
|
|
|
export const toStoreItem = (type: string): string => {
|
|
|
|
return "/Lotus/StoreItems/" + type.substring("/Lotus/".length);
|
|
|
|
};
|
|
|
|
|
|
|
|
export const fromStoreItem = (type: string): string => {
|
|
|
|
return "/Lotus/" + type.substring("/Lotus/StoreItems/".length);
|
|
|
|
};
|
2025-03-17 05:10:44 -07:00
|
|
|
|
|
|
|
export const getDefaultUpgrades = (parts: string[]): IDefaultUpgrade[] | undefined => {
|
|
|
|
const allDefaultUpgrades: IDefaultUpgrade[] = [];
|
|
|
|
for (const part of parts) {
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
|
|
const defaultUpgrades = ExportWeapons[part]?.defaultUpgrades;
|
|
|
|
if (defaultUpgrades) {
|
|
|
|
allDefaultUpgrades.push(...defaultUpgrades);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return allDefaultUpgrades.length == 0 ? undefined : allDefaultUpgrades;
|
|
|
|
};
|