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

chore: warn when sell category is unhandled (#3090)

Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/3090 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>

1d75716c
Sainan <63328889+Sainan@users.noreply.github.com>
提交于

代码差异

1 个文件 +220 -230
Modified src/controllers/api/sellController.ts +220 -230
@@ -19,6 +19,7 @@ import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
19 19 import type { TInventoryDatabaseDocument } from "../../models/inventoryModels/inventoryModel.ts";
20 20 import { broadcastInventoryUpdate } from "../../services/wsService.ts";
21 21 import { parseFusionTreasure } from "../../helpers/inventoryHelpers.ts";
22 import { logger } from "../../utils/logger.ts";
22 23
23 24 export const sellController: RequestHandler = async (req, res) => {
24 25 const payload = JSON.parse(String(req.body)) as ISellRequest;
@@ -53,44 +54,44 @@ export const sellController: RequestHandler = async (req, res) => {
53 54 if (requiredFields.has("Upgrades")) {
54 55 requiredFields.add("RawUpgrades");
55 56 }
56 if (payload.Items.Suits) {
57 if ("Suits" in payload.Items) {
57 58 requiredFields.add(InventorySlot.SUITS);
58 59 }
59 if (payload.Items.LongGuns || payload.Items.Pistols || payload.Items.Melee) {
60 if ("LongGuns" in payload.Items || "Pistols" in payload.Items || "Melee" in payload.Items) {
60 61 requiredFields.add(InventorySlot.WEAPONS);
61 62 }
62 if (payload.Items.SpaceSuits) {
63 if ("SpaceSuits" in payload.Items) {
63 64 requiredFields.add(InventorySlot.SPACESUITS);
64 65 }
65 if (payload.Items.SpaceGuns || payload.Items.SpaceMelee) {
66 if ("SpaceGuns" in payload.Items || "SpaceMelee" in payload.Items) {
66 67 requiredFields.add(InventorySlot.SPACEWEAPONS);
67 68 }
68 if (payload.Items.MechSuits) {
69 if ("MechSuits" in payload.Items) {
69 70 requiredFields.add(InventorySlot.MECHSUITS);
70 71 }
71 if (payload.Items.Sentinels || payload.Items.SentinelWeapons || payload.Items.MoaPets) {
72 if ("Sentinels" in payload.Items || "SentinelWeapons" in payload.Items || "MoaPets" in payload.Items) {
72 73 requiredFields.add(InventorySlot.SENTINELS);
73 74 }
74 if (payload.Items.OperatorAmps) {
75 if ("OperatorAmps" in payload.Items) {
75 76 requiredFields.add(InventorySlot.AMPS);
76 77 }
77 if (payload.Items.Hoverboards) {
78 if ("Hoverboards" in payload.Items) {
78 79 requiredFields.add(InventorySlot.SPACESUITS);
79 80 }
80 if (payload.Items.CrewMembers) {
81 if ("CrewMembers" in payload.Items) {
81 82 requiredFields.add(InventorySlot.CREWMEMBERS);
82 83 }
83 if (payload.Items.CrewShipWeapons || payload.Items.CrewShipWeaponSkins) {
84 if ("CrewShipWeapons" in payload.Items || "CrewShipWeaponSkins" in payload.Items) {
84 85 requiredFields.add(InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
85 86 requiredFields.add("CrewShipRawSalvage");
86 if (payload.Items.CrewShipWeapons) {
87 if ("CrewShipWeapons" in payload.Items) {
87 88 requiredFields.add("CrewShipSalvagedWeapons");
88 89 }
89 if (payload.Items.CrewShipWeaponSkins) {
90 if ("CrewShipWeaponSkins" in payload.Items) {
90 91 requiredFields.add("CrewShipSalvagedWeaponSkins");
91 92 }
92 93 }
93 if (payload.Items.WeaponSkins) {
94 if ("WeaponSkins" in payload.Items) {
94 95 requiredFields.add("WeaponSkins");
95 96 }
96 97 const inventory = await getInventory(accountId, Array.from(requiredFields).join(" "));
@@ -125,203 +126,217 @@ export const sellController: RequestHandler = async (req, res) => {
125 126 const inventoryChanges: IInventoryChanges = {};
126 127
127 128 // Remove item(s)
128 if (payload.Items.Suits) {
129 payload.Items.Suits.forEach(sellItem => {
130 inventory.Suits.pull({ _id: sellItem.String });
131 freeUpSlot(inventory, InventorySlot.SUITS);
132 });
133 }
134 if (payload.Items.LongGuns) {
135 payload.Items.LongGuns.forEach(sellItem => {
136 inventory.LongGuns.pull({ _id: sellItem.String });
137 freeUpSlot(inventory, InventorySlot.WEAPONS);
138 });
139 }
140 if (payload.Items.Pistols) {
141 payload.Items.Pistols.forEach(sellItem => {
142 inventory.Pistols.pull({ _id: sellItem.String });
143 freeUpSlot(inventory, InventorySlot.WEAPONS);
144 });
145 }
146 if (payload.Items.Melee) {
147 payload.Items.Melee.forEach(sellItem => {
148 inventory.Melee.pull({ _id: sellItem.String });
149 freeUpSlot(inventory, InventorySlot.WEAPONS);
150 });
151 }
152 if (payload.Items.SpaceSuits) {
153 payload.Items.SpaceSuits.forEach(sellItem => {
154 inventory.SpaceSuits.pull({ _id: sellItem.String });
155 freeUpSlot(inventory, InventorySlot.SPACESUITS);
156 });
157 }
158 if (payload.Items.SpaceGuns) {
159 payload.Items.SpaceGuns.forEach(sellItem => {
160 inventory.SpaceGuns.pull({ _id: sellItem.String });
161 freeUpSlot(inventory, InventorySlot.SPACEWEAPONS);
162 });
163 }
164 if (payload.Items.SpaceMelee) {
165 payload.Items.SpaceMelee.forEach(sellItem => {
166 inventory.SpaceMelee.pull({ _id: sellItem.String });
167 freeUpSlot(inventory, InventorySlot.SPACEWEAPONS);
168 });
169 }
170 if (payload.Items.MechSuits) {
171 payload.Items.MechSuits.forEach(sellItem => {
172 inventory.MechSuits.pull({ _id: sellItem.String });
173 freeUpSlot(inventory, InventorySlot.MECHSUITS);
174 });
175 }
176 if (payload.Items.Sentinels) {
177 payload.Items.Sentinels.forEach(sellItem => {
178 inventory.Sentinels.pull({ _id: sellItem.String });
179 freeUpSlot(inventory, InventorySlot.SENTINELS);
180 });
181 }
182 if (payload.Items.SentinelWeapons) {
183 payload.Items.SentinelWeapons.forEach(sellItem => {
184 inventory.SentinelWeapons.pull({ _id: sellItem.String });
185 freeUpSlot(inventory, InventorySlot.SENTINELS);
186 });
187 }
188 if (payload.Items.MoaPets) {
189 payload.Items.MoaPets.forEach(sellItem => {
190 inventory.MoaPets.pull({ _id: sellItem.String });
191 freeUpSlot(inventory, InventorySlot.SENTINELS);
192 });
193 }
194 if (payload.Items.OperatorAmps) {
195 payload.Items.OperatorAmps.forEach(sellItem => {
196 inventory.OperatorAmps.pull({ _id: sellItem.String });
197 freeUpSlot(inventory, InventorySlot.AMPS);
198 });
199 }
200 if (payload.Items.Hoverboards) {
201 payload.Items.Hoverboards.forEach(sellItem => {
202 inventory.Hoverboards.pull({ _id: sellItem.String });
203 freeUpSlot(inventory, InventorySlot.SPACESUITS);
204 });
205 }
206 if (payload.Items.Drones) {
207 payload.Items.Drones.forEach(sellItem => {
208 inventory.Drones.pull({ _id: sellItem.String });
209 });
210 }
211 if (payload.Items.KubrowPetPrints) {
212 payload.Items.KubrowPetPrints.forEach(sellItem => {
213 inventory.KubrowPetPrints.pull({ _id: sellItem.String });
214 });
215 }
216 if (payload.Items.CrewMembers) {
217 payload.Items.CrewMembers.forEach(sellItem => {
218 inventory.CrewMembers.pull({ _id: sellItem.String });
219 freeUpSlot(inventory, InventorySlot.CREWMEMBERS);
220 });
221 }
222 if (payload.Items.CrewShipWeapons) {
223 payload.Items.CrewShipWeapons.forEach(sellItem => {
224 if (sellItem.String[0] == "/") {
225 addCrewShipRawSalvage(inventory, [
226 {
227 ItemType: sellItem.String,
228 ItemCount: sellItem.Count * -1
129 for (const key in payload.Items) {
130 switch (key) {
131 case "Suits":
132 payload.Items.Suits.forEach(sellItem => {
133 inventory.Suits.pull({ _id: sellItem.String });
134 freeUpSlot(inventory, InventorySlot.SUITS);
135 });
136 break;
137 case "LongGuns":
138 payload.Items.LongGuns.forEach(sellItem => {
139 inventory.LongGuns.pull({ _id: sellItem.String });
140 freeUpSlot(inventory, InventorySlot.WEAPONS);
141 });
142 break;
143 case "Pistols":
144 payload.Items.Pistols.forEach(sellItem => {
145 inventory.Pistols.pull({ _id: sellItem.String });
146 freeUpSlot(inventory, InventorySlot.WEAPONS);
147 });
148 break;
149 case "Melee":
150 payload.Items.Melee.forEach(sellItem => {
151 inventory.Melee.pull({ _id: sellItem.String });
152 freeUpSlot(inventory, InventorySlot.WEAPONS);
153 });
154 break;
155 case "SpaceSuits":
156 payload.Items.SpaceSuits.forEach(sellItem => {
157 inventory.SpaceSuits.pull({ _id: sellItem.String });
158 freeUpSlot(inventory, InventorySlot.SPACESUITS);
159 });
160 break;
161 case "SpaceGuns":
162 payload.Items.SpaceGuns.forEach(sellItem => {
163 inventory.SpaceGuns.pull({ _id: sellItem.String });
164 freeUpSlot(inventory, InventorySlot.SPACEWEAPONS);
165 });
166 break;
167 case "SpaceMelee":
168 payload.Items.SpaceMelee.forEach(sellItem => {
169 inventory.SpaceMelee.pull({ _id: sellItem.String });
170 freeUpSlot(inventory, InventorySlot.SPACEWEAPONS);
171 });
172 break;
173 case "MechSuits":
174 payload.Items.MechSuits.forEach(sellItem => {
175 inventory.MechSuits.pull({ _id: sellItem.String });
176 freeUpSlot(inventory, InventorySlot.MECHSUITS);
177 });
178 break;
179 case "Sentinels":
180 payload.Items.Sentinels.forEach(sellItem => {
181 inventory.Sentinels.pull({ _id: sellItem.String });
182 freeUpSlot(inventory, InventorySlot.SENTINELS);
183 });
184 break;
185 case "SentinelWeapons":
186 payload.Items.SentinelWeapons.forEach(sellItem => {
187 inventory.SentinelWeapons.pull({ _id: sellItem.String });
188 freeUpSlot(inventory, InventorySlot.SENTINELS);
189 });
190 break;
191 case "MoaPets":
192 payload.Items.MoaPets.forEach(sellItem => {
193 inventory.MoaPets.pull({ _id: sellItem.String });
194 freeUpSlot(inventory, InventorySlot.SENTINELS);
195 });
196 break;
197 case "OperatorAmps":
198 payload.Items.OperatorAmps.forEach(sellItem => {
199 inventory.OperatorAmps.pull({ _id: sellItem.String });
200 freeUpSlot(inventory, InventorySlot.AMPS);
201 });
202 break;
203 case "Hoverboards":
204 payload.Items.Hoverboards.forEach(sellItem => {
205 inventory.Hoverboards.pull({ _id: sellItem.String });
206 freeUpSlot(inventory, InventorySlot.SPACESUITS);
207 });
208 break;
209 case "Drones":
210 payload.Items.Drones.forEach(sellItem => {
211 inventory.Drones.pull({ _id: sellItem.String });
212 });
213 break;
214 case "KubrowPetPrints":
215 payload.Items.KubrowPetPrints.forEach(sellItem => {
216 inventory.KubrowPetPrints.pull({ _id: sellItem.String });
217 });
218 break;
219 case "CrewMembers":
220 payload.Items.CrewMembers.forEach(sellItem => {
221 inventory.CrewMembers.pull({ _id: sellItem.String });
222 freeUpSlot(inventory, InventorySlot.CREWMEMBERS);
223 });
224 break;
225 case "CrewShipWeapons":
226 payload.Items.CrewShipWeapons.forEach(sellItem => {
227 if (sellItem.String[0] == "/") {
228 addCrewShipRawSalvage(inventory, [
229 {
230 ItemType: sellItem.String,
231 ItemCount: sellItem.Count * -1
232 }
233 ]);
234 } else {
235 const index = inventory.CrewShipWeapons.findIndex(x => x._id.equals(sellItem.String));
236 if (index != -1) {
237 if (sellCurrency == "SC_Resources") {
238 refundPartialBuildCosts(
239 inventory,
240 inventory.CrewShipWeapons[index].ItemType,
241 inventoryChanges
242 );
243 }
244 inventory.CrewShipWeapons.splice(index, 1);
245 freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
246 } else {
247 inventory.CrewShipSalvagedWeapons.pull({ _id: sellItem.String });
248 }
229 249 }
230 ]);
231 } else {
232 const index = inventory.CrewShipWeapons.findIndex(x => x._id.equals(sellItem.String));
233 if (index != -1) {
234 if (sellCurrency == "SC_Resources") {
235 refundPartialBuildCosts(inventory, inventory.CrewShipWeapons[index].ItemType, inventoryChanges);
250 });
251 break;
252 case "CrewShipWeaponSkins":
253 payload.Items.CrewShipWeaponSkins.forEach(sellItem => {
254 if (sellItem.String[0] == "/") {
255 addCrewShipRawSalvage(inventory, [
256 {
257 ItemType: sellItem.String,
258 ItemCount: sellItem.Count * -1
259 }
260 ]);
261 } else {
262 const index = inventory.CrewShipWeaponSkins.findIndex(x => x._id.equals(sellItem.String));
263 if (index != -1) {
264 if (sellCurrency == "SC_Resources") {
265 refundPartialBuildCosts(
266 inventory,
267 inventory.CrewShipWeaponSkins[index].ItemType,
268 inventoryChanges
269 );
270 }
271 inventory.CrewShipWeaponSkins.splice(index, 1);
272 freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
273 } else {
274 inventory.CrewShipSalvagedWeaponSkins.pull({ _id: sellItem.String });
275 }
236 276 }
237 inventory.CrewShipWeapons.splice(index, 1);
238 freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
239 } else {
240 inventory.CrewShipSalvagedWeapons.pull({ _id: sellItem.String });
241 }
242 }
243 });
244 }
245 if (payload.Items.CrewShipWeaponSkins) {
246 payload.Items.CrewShipWeaponSkins.forEach(sellItem => {
247 if (sellItem.String[0] == "/") {
248 addCrewShipRawSalvage(inventory, [
249 {
250 ItemType: sellItem.String,
251 ItemCount: sellItem.Count * -1
252 }
253 ]);
254 } else {
255 const index = inventory.CrewShipWeaponSkins.findIndex(x => x._id.equals(sellItem.String));
256 if (index != -1) {
257 if (sellCurrency == "SC_Resources") {
258 refundPartialBuildCosts(
259 inventory,
260 inventory.CrewShipWeaponSkins[index].ItemType,
261 inventoryChanges
262 );
277 });
278 break;
279 case "Consumables":
280 {
281 const consumablesChanges = [];
282 for (const sellItem of payload.Items.Consumables) {
283 consumablesChanges.push({
284 ItemType: sellItem.String,
285 ItemCount: sellItem.Count * -1
286 });
263 287 }
264 inventory.CrewShipWeaponSkins.splice(index, 1);
265 freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
266 } else {
267 inventory.CrewShipSalvagedWeaponSkins.pull({ _id: sellItem.String });
288 addConsumables(inventory, consumablesChanges);
268 289 }
269 }
270 });
271 }
272 if (payload.Items.Consumables) {
273 const consumablesChanges = [];
274 for (const sellItem of payload.Items.Consumables) {
275 consumablesChanges.push({
276 ItemType: sellItem.String,
277 ItemCount: sellItem.Count * -1
278 });
279 }
280 addConsumables(inventory, consumablesChanges);
281 }
282 if (payload.Items.Recipes) {
283 const recipeChanges = [];
284 for (const sellItem of payload.Items.Recipes) {
285 recipeChanges.push({
286 ItemType: sellItem.String,
287 ItemCount: sellItem.Count * -1
288 });
289 }
290 addRecipes(inventory, recipeChanges);
291 }
292 if (payload.Items.Upgrades) {
293 payload.Items.Upgrades.forEach(sellItem => {
294 if (sellItem.Count == 0) {
295 inventory.Upgrades.pull({ _id: sellItem.String });
296 } else {
297 addMods(inventory, [
298 {
299 ItemType: sellItem.String,
300 ItemCount: sellItem.Count * -1
301 }
302 ]);
303 }
304 });
305 }
306 if (payload.Items.MiscItems) {
307 payload.Items.MiscItems.forEach(sellItem => {
308 addMiscItems(inventory, [
290 break;
291 case "Recipes":
309 292 {
310 ItemType: sellItem.String,
311 ItemCount: sellItem.Count * -1
293 const recipeChanges = [];
294 for (const sellItem of payload.Items.Recipes) {
295 recipeChanges.push({
296 ItemType: sellItem.String,
297 ItemCount: sellItem.Count * -1
298 });
299 }
300 addRecipes(inventory, recipeChanges);
312 301 }
313 ]);
314 });
315 }
316 if (payload.Items.FusionTreasures) {
317 payload.Items.FusionTreasures.forEach(sellItem => {
318 addFusionTreasures(inventory, [parseFusionTreasure(sellItem.String, sellItem.Count * -1)]);
319 });
320 }
321 if (payload.Items.WeaponSkins) {
322 payload.Items.WeaponSkins.forEach(sellItem => {
323 inventory.WeaponSkins.pull({ _id: sellItem.String });
324 });
302 break;
303 case "Upgrades":
304 payload.Items.Upgrades.forEach(sellItem => {
305 if (sellItem.Count == 0) {
306 inventory.Upgrades.pull({ _id: sellItem.String });
307 } else {
308 addMods(inventory, [
309 {
310 ItemType: sellItem.String,
311 ItemCount: sellItem.Count * -1
312 }
313 ]);
314 }
315 });
316 break;
317 case "MiscItems":
318 payload.Items.MiscItems.forEach(sellItem => {
319 addMiscItems(inventory, [
320 {
321 ItemType: sellItem.String,
322 ItemCount: sellItem.Count * -1
323 }
324 ]);
325 });
326 break;
327 case "FusionTreasures":
328 payload.Items.FusionTreasures.forEach(sellItem => {
329 addFusionTreasures(inventory, [parseFusionTreasure(sellItem.String, sellItem.Count * -1)]);
330 });
331 break;
332 case "WeaponSkins": // SNS specific field, only used by webui
333 payload.Items.WeaponSkins.forEach(sellItem => {
334 inventory.WeaponSkins.pull({ _id: sellItem.String });
335 });
336 break;
337 default:
338 logger.warn(`unhandled sell category: ${key}`);
339 }
325 340 }
326 341
327 342 await inventory.save();
@@ -332,32 +347,7 @@ export const sellController: RequestHandler = async (req, res) => {
332 347 };
333 348
334 349 interface ISellRequest {
335 Items: {
336 Suits?: ISellItem[];
337 LongGuns?: ISellItem[];
338 Pistols?: ISellItem[];
339 Melee?: ISellItem[];
340 Consumables?: ISellItem[];
341 Recipes?: ISellItem[];
342 Upgrades?: ISellItem[];
343 MiscItems?: ISellItem[];
344 SpaceSuits?: ISellItem[];
345 SpaceGuns?: ISellItem[];
346 SpaceMelee?: ISellItem[];
347 MechSuits?: ISellItem[];
348 Sentinels?: ISellItem[];
349 SentinelWeapons?: ISellItem[];
350 MoaPets?: ISellItem[];
351 OperatorAmps?: ISellItem[];
352 Hoverboards?: ISellItem[];
353 Drones?: ISellItem[];
354 KubrowPetPrints?: ISellItem[];
355 CrewMembers?: ISellItem[];
356 CrewShipWeapons?: ISellItem[];
357 CrewShipWeaponSkins?: ISellItem[];
358 FusionTreasures?: ISellItem[];
359 WeaponSkins?: ISellItem[]; // SNS specific field
360 };
350 Items: Record<string, ISellItem[]>;
361 351 SellPrice: number;
362 352 SellCurrency?:
363 353 | "SC_RegularCredits"