返回提交历史
Modified
src/controllers/api/evolveWeaponController.ts
+2
-0
Modified
src/controllers/custom/equipmentFeaturesController.ts
+11
-4
Modified
src/controllers/custom/setEvolutionProgressController.ts
+22
-19
Modified
static/webui/script.js
+32
-15
XFEstudio/XFESpaceNinjaServer
chore(webui): improve incarnon stuff (#3845)
Closes #3841 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/3845 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
c2731fbe
代码差异
4 个文件
+67
-38
@@ -5,6 +5,7 @@ import { getJSONfromString } from "../../helpers/stringHelpers.ts";
5
5
import type { WeaponTypeInternal } from "../../services/itemDataService.ts";
6
6
import { getRecipe } from "../../services/itemDataService.ts";
7
7
import { EquipmentFeatures } from "../../types/equipmentTypes.ts";
8
import { broadcastInventoryUpdate } from "../../services/wsService.ts";
8
9
9
10
export const evolveWeaponController: RequestHandler = async (req, res) => {
10
11
const accountId = await getAccountIdForRequest(req);
@@ -48,6 +49,7 @@ export const evolveWeaponController: RequestHandler = async (req, res) => {
48
49
49
50
await inventory.save();
50
51
res.end();
52
broadcastInventoryUpdate(req); // let webui know that the feature flag has changed (for detailed view)
51
53
};
52
54
53
55
interface IEvolveWeaponRequest {
@@ -3,7 +3,7 @@ import { getAccountIdForRequest } from "../../services/loginService.ts";
3
3
import type { TEquipmentKey } from "../../types/inventoryTypes/inventoryTypes.ts";
4
4
import { getInventory } from "../../services/inventoryService.ts";
5
5
import { EquipmentFeatures } from "../../types/equipmentTypes.ts";
6
import { sendWsBroadcastTo } from "../../services/wsService.ts";
6
import { broadcastInventoryUpdate, sendWsBroadcastTo } from "../../services/wsService.ts";
7
7
import allIncarnons from "../../../static/fixed_responses/allIncarnonList.json" with { type: "json" };
8
8
import { ExportWeapons } from "warframe-public-export-plus";
9
9
@@ -15,17 +15,19 @@ export const equipmentFeaturesController: RequestHandler = async (req, res) => {
15
15
`${category} EvolutionProgress unlockDoubleCapacityPotatoesEverywhere unlockExilusEverywhere unlockArcanesEverywhere`
16
16
);
17
17
const bit = Number(req.query.bit) as EquipmentFeatures;
18
if (
18
/*if (
19
19
(inventory.unlockDoubleCapacityPotatoesEverywhere && bit === EquipmentFeatures.DOUBLE_CAPACITY) ||
20
20
(inventory.unlockExilusEverywhere && bit === EquipmentFeatures.UTILITY_SLOT) ||
21
21
(inventory.unlockArcanesEverywhere &&
22
22
(bit === EquipmentFeatures.ARCANE_SLOT || bit === EquipmentFeatures.SECOND_ARCANE_SLOT))
23
23
) {
24
24
res.status(400).end();
25
}
25
return;
26
}*/
26
27
const item = inventory[category].id(req.query.ItemId as string);
27
28
if (item) {
28
29
item.Features ??= 0;
30
let requesterNeedsInventoryUpdateToo = false;
29
31
if (bit == EquipmentFeatures.INCARNON_GENESIS) {
30
32
const parentName = ExportWeapons[item.ItemType].parentName;
31
33
let searchType: string | undefined;
@@ -45,6 +47,7 @@ export const equipmentFeaturesController: RequestHandler = async (req, res) => {
45
47
Rank: 1,
46
48
ItemType: searchType
47
49
});
50
requesterNeedsInventoryUpdateToo = true;
48
51
}
49
52
} else {
50
53
res.status(400).end();
@@ -52,8 +55,12 @@ export const equipmentFeaturesController: RequestHandler = async (req, res) => {
52
55
}
53
56
item.Features ^= bit;
54
57
await inventory.save();
55
sendWsBroadcastTo(accountId, { sync_inventory: true });
56
58
res.status(200).end();
59
if (requesterNeedsInventoryUpdateToo) {
60
sendWsBroadcastTo(accountId, { sync_inventory: true, update_inventory: true });
61
} else {
62
broadcastInventoryUpdate(req);
63
}
57
64
} else {
58
65
res.status(400).end();
59
66
}
@@ -5,31 +5,34 @@ import { broadcastInventoryUpdate } from "../../services/wsService.ts";
5
5
6
6
export const setEvolutionProgressController: RequestHandler = async (req, res) => {
7
7
const accountId = await getAccountIdForRequest(req);
8
const inventory = await getInventory(accountId);
9
const payload = req.body as ISetEvolutionProgressRequest;
8
const inventory = await getInventory(accountId, "EvolutionProgress");
9
const payload = req.body as ISetEvolutionProgressRequest[];
10
10
11
11
inventory.EvolutionProgress ??= [];
12
payload.forEach(element => {
13
const entry = inventory.EvolutionProgress!.find(entry => entry.ItemType === element.ItemType);
14
15
if (entry) {
16
entry.Progress = 0;
17
entry.Rank = element.Rank;
12
for (const element of payload) {
13
if ("Delete" in element) {
14
const index = inventory.EvolutionProgress.findIndex(entry => entry.ItemType == element.ItemType);
15
if (index != -1) {
16
inventory.EvolutionProgress.splice(index, 1);
17
}
18
18
} else {
19
inventory.EvolutionProgress!.push({
20
Progress: 0,
21
Rank: element.Rank,
22
ItemType: element.ItemType
23
});
19
const entry = inventory.EvolutionProgress.find(entry => entry.ItemType == element.ItemType);
20
if (entry) {
21
entry.Progress = 0;
22
entry.Rank = element.Rank;
23
} else {
24
inventory.EvolutionProgress.push({
25
Progress: 0,
26
Rank: element.Rank,
27
ItemType: element.ItemType
28
});
29
}
24
30
}
25
});
31
}
26
32
27
33
await inventory.save();
28
res.end();
34
res.json(inventory.EvolutionProgress);
29
35
broadcastInventoryUpdate(req);
30
36
};
31
37
32
type ISetEvolutionProgressRequest = {
33
ItemType: string;
34
Rank: number;
35
}[];
38
type ISetEvolutionProgressRequest = { ItemType: string } & ({ Rank: number } | { Delete: true });
@@ -1261,7 +1261,7 @@ const U5Mods = [
1261
1261
"/Lotus/Upgrades/Modules/Crafted/IncendiaryRifleMod"
1262
1262
];
1263
1263
1264
single.getRoute("/webui/inventory").on("beforeload", async function () {
1264
async function populateInventoryRoute() {
1265
1265
const [data, itemMap] = await Promise.all([awaitAuthz().then(getInventoryData), window.itemListPromise]);
1266
1266
1267
1267
document.getElementById("typeName-tab").classList.remove("active");
@@ -1479,31 +1479,44 @@ single.getRoute("/webui/inventory").on("beforeload", async function () {
1479
1479
1480
1480
document.getElementById("EvolutionProgress-list").innerHTML = "";
1481
1481
data.EvolutionProgress?.forEach(item => {
1482
const maxRank = permanentEvolutionWeapons.has(item.ItemType) ? 5 : 4;
1482
1483
const tr = document.createElement("tr");
1483
1484
tr.setAttribute("data-item-type", item.ItemType);
1484
1485
{
1485
1486
const td = document.createElement("td");
1486
1487
td.textContent = itemMap[item.ItemType]?.name ?? item.ItemType;
1487
1488
if (item.Rank != null) {
1488
td.textContent += " | " + loc("code_rank") + ": [" + item.Rank + "/5]";
1489
td.textContent += " | " + loc("code_rank") + ": [" + item.Rank + "/" + maxRank + "]";
1489
1490
}
1490
1491
tr.appendChild(td);
1491
1492
}
1492
1493
{
1493
1494
const td = document.createElement("td");
1494
1495
td.classList = "text-end text-nowrap";
1495
if (item.Rank < 5) {
1496
if (item.Rank < maxRank) {
1496
1497
const a = document.createElement("a");
1497
1498
a.href = "#";
1498
1499
a.onclick = function (event) {
1499
1500
event.preventDefault();
1500
setEvolutionProgress([{ ItemType: item.ItemType, Rank: 5 }]);
1501
setEvolutionProgress([{ ItemType: item.ItemType, Rank: maxRank }]);
1501
1502
};
1502
1503
a.title = loc("code_maxRank");
1503
1504
a.innerHTML = icons.arrowUp;
1504
1505
1505
1506
td.appendChild(a);
1506
1507
}
1508
if (item.Rank < maxRank) {
1509
const a = document.createElement("a");
1510
a.href = "#";
1511
a.onclick = function (event) {
1512
event.preventDefault();
1513
setEvolutionProgress([{ ItemType: item.ItemType, Rank: item.Rank + 1 }]);
1514
};
1515
a.title = loc("code_rankUp");
1516
a.innerHTML = icons.angleUp;
1517
1518
td.appendChild(a);
1519
}
1507
1520
if ((permanentEvolutionWeapons.has(item.ItemType) && item.Rank > 0) || item.Rank > 1) {
1508
1521
const a = document.createElement("a");
1509
1522
a.href = "#";
@@ -1516,15 +1529,15 @@ single.getRoute("/webui/inventory").on("beforeload", async function () {
1516
1529
1517
1530
td.appendChild(a);
1518
1531
}
1519
if (item.Rank < 5) {
1532
{
1520
1533
const a = document.createElement("a");
1521
1534
a.href = "#";
1522
1535
a.onclick = function (event) {
1523
1536
event.preventDefault();
1524
setEvolutionProgress([{ ItemType: item.ItemType, Rank: item.Rank + 1 }]);
1537
setEvolutionProgress([{ ItemType: item.ItemType, Delete: true }]);
1525
1538
};
1526
a.title = loc("code_rankUp");
1527
a.innerHTML = icons.angleUp;
1539
a.title = loc("code_remove");
1540
a.innerHTML = icons.trash;
1528
1541
1529
1542
td.appendChild(a);
1530
1543
}
@@ -1809,7 +1822,8 @@ single.getRoute("/webui/inventory").on("beforeload", async function () {
1809
1822
}
1810
1823
document.getElementById("QuestKeys-list").appendChild(tr);
1811
1824
});
1812
});
1825
}
1826
single.getRoute("/webui/inventory").on("beforeload", populateInventoryRoute);
1813
1827
1814
1828
single.getRoute("/webui/mods").on("beforeload", async function () {
1815
1829
const [data, itemMap] = await Promise.all([awaitAuthz().then(getInventoryData), window.itemListPromise]);
@@ -2070,7 +2084,7 @@ dictPromise.then(() => {
2070
2084
butDiv.appendChild(a);
2071
2085
}
2072
2086
}
2073
if (!["EvolutionProgress", "Boosters"].includes(cardType)) {
2087
if (cardType != "Boosters") {
2074
2088
const a = document.createElement("a");
2075
2089
a.href = "#";
2076
2090
a.onclick = function (event) {
@@ -2831,10 +2845,11 @@ function maxRankAllEvolutions() {
2831
2845
const requests = [];
2832
2846
2833
2847
data.EvolutionProgress.forEach(item => {
2834
if (item.Rank < 5) {
2848
const maxRank = permanentEvolutionWeapons.has(item.ItemType) ? 5 : 4;
2849
if (item.Rank < maxRank) {
2835
2850
requests.push({
2836
2851
ItemType: item.ItemType,
2837
Rank: 5
2852
Rank: maxRank
2838
2853
});
2839
2854
}
2840
2855
});
@@ -3027,7 +3042,8 @@ function equipmentFeatures(category, oid, bit) {
3027
3042
$.get(
3028
3043
"/custom/equipmentFeatures?" + window.authz + "&ItemId=" + oid + "&Category=" + category + "&bit=" + bit
3029
3044
).done(function () {
3030
updateInventory();
3045
inventory_data[category].find(x => x.ItemId.$oid == oid).Features ^= bit;
3046
// toggle state was already updated when the user clicked on it
3031
3047
});
3032
3048
});
3033
3049
}
@@ -3071,8 +3087,9 @@ function setEvolutionProgress(requests) {
3071
3087
contentType: "application/json",
3072
3088
data: JSON.stringify(requests)
3073
3089
});
3074
req.done(() => {
3075
updateInventory();
3090
req.done(newEvolutionProgress => {
3091
inventory_data.EvolutionProgress = newEvolutionProgress;
3092
populateInventoryRoute();
3076
3093
resolve();
3077
3094
});
3078
3095
});