返回提交历史
Added
src/controllers/custom/addCurrencyController.ts
+17
-0
Modified
src/routes/custom.ts
+3
-1
Modified
static/webui/index.html
+50
-0
Modified
static/webui/script.js
+22
-0
Modified
static/webui/translations/en.js
+6
-1
Modified
static/webui/translations/ru.js
+5
-0
XFEstudio/SpaceNinjaServer
feat(webui): currencies (#931)
Closes #854 Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/931
7c59d4fe
代码差异
6 个文件
+103
-2
@@ -0,0 +1,17 @@
1
import { RequestHandler } from "express";
2
import { getAccountIdForRequest } from "@/src/services/loginService";
3
import { getInventory } from "@/src/services/inventoryService";
4
5
export const addCurrencyController: RequestHandler = async (req, res) => {
6
const accountId = await getAccountIdForRequest(req);
7
const inventory = await getInventory(accountId);
8
const request = req.body as IAddCurrencyRequest;
9
inventory[request.currency] += request.delta;
10
await inventory.save();
11
res.end();
12
};
13
14
interface IAddCurrencyRequest {
15
currency: "RegularCredits" | "PremiumCredits" | "FusionPoints" | "PrimeTokens";
16
delta: number;
17
}
@@ -8,13 +8,14 @@ import { deleteAccountController } from "@/src/controllers/custom/deleteAccountC
8
8
import { renameAccountController } from "@/src/controllers/custom/renameAccountController";
9
9
10
10
import { createAccountController } from "@/src/controllers/custom/createAccountController";
11
import { createMessageController } from "@/src/controllers/custom/createMessageController";
12
import { addCurrencyController } from "../controllers/custom/addCurrencyController";
11
13
import { addItemsController } from "@/src/controllers/custom/addItemsController";
12
14
import { addXpController } from "@/src/controllers/custom/addXpController";
13
15
import { importController } from "@/src/controllers/custom/importController";
14
16
15
17
import { getConfigDataController } from "@/src/controllers/custom/getConfigDataController";
16
18
import { updateConfigDataController } from "@/src/controllers/custom/updateConfigDataController";
17
import { createMessageController } from "@/src/controllers/custom/createMessageController";
18
19
19
20
const customRouter = express.Router();
20
21
@@ -27,6 +28,7 @@ customRouter.get("/renameAccount", renameAccountController);
27
28
28
29
customRouter.post("/createAccount", createAccountController);
29
30
customRouter.post("/createMessage", createMessageController);
31
customRouter.post("/addCurrency", addCurrencyController);
30
32
customRouter.post("/addItems", addItemsController);
31
33
customRouter.post("/addXp", addXpController);
32
34
customRouter.post("/import", importController);
@@ -94,6 +94,56 @@
94
94
<button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
95
95
</form>
96
96
</div>
97
<div class="row g-3">
98
<div class="col-md-3">
99
<div class="card mb-3">
100
<h5 class="card-header" data-loc="currency_RegularCredits"></h5>
101
<div class="card-body">
102
<p class="card-text" id="RegularCredits-owned"></p>
103
<form class="input-group" onsubmit="doAddCurrency('RegularCredits');return false;">
104
<input class="form-control" id="RegularCredits-delta" type="number" value="1000000" step="1000000" />
105
<button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
106
</form>
107
</div>
108
</div>
109
</div>
110
<div class="col-md-3">
111
<div class="card mb-3">
112
<h5 class="card-header" data-loc="currency_PremiumCredits"></h5>
113
<div class="card-body">
114
<p class="card-text" id="PremiumCredits-owned"></p>
115
<form class="input-group" onsubmit="doAddCurrency('PremiumCredits');return false;">
116
<input class="form-control" id="PremiumCredits-delta" type="number" value="100" step="100" />
117
<button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
118
</form>
119
</div>
120
</div>
121
</div>
122
<div class="col-md-3">
123
<div class="card mb-3">
124
<h5 class="card-header" data-loc="currency_FusionPoints"></h5>
125
<div class="card-body">
126
<p class="card-text" id="FusionPoints-owned"></p>
127
<form class="input-group" onsubmit="doAddCurrency('FusionPoints');return false;">
128
<input class="form-control" id="FusionPoints-delta" type="number" value="1000" step="1000" />
129
<button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
130
</form>
131
</div>
132
</div>
133
</div>
134
<div class="col-md-3">
135
<div class="card mb-3">
136
<h5 class="card-header" data-loc="currency_PrimeTokens"></h5>
137
<div class="card-body">
138
<p class="card-text" id="PrimeTokens-owned"></p>
139
<form class="input-group" onsubmit="doAddCurrency('PrimeTokens');return false;">
140
<input class="form-control" id="PrimeTokens-delta" type="number" value="1" step="1" />
141
<button class="btn btn-primary" type="submit" data-loc="general_addButton"></button>
142
</form>
143
</div>
144
</div>
145
</div>
146
</div>
97
147
<div class="row g-3">
98
148
<div class="col-lg-6">
99
149
<div class="card mb-3" style="height: 400px;">
@@ -227,6 +227,15 @@ function updateInventory() {
227
227
window.didInitialInventoryUpdate = true;
228
228
229
229
// Populate inventory route
230
[
231
"RegularCredits",
232
"PremiumCredits",
233
"FusionPoints",
234
"PrimeTokens"
235
].forEach(currency => {
236
document.getElementById(currency + "-owned").textContent = loc("currency_owned").split("|COUNT|").join(data[currency].toLocaleString());
237
});
238
230
239
[
231
240
"Suits",
232
241
"SpaceSuits",
@@ -1116,3 +1125,16 @@ function doChangeSupportedSyndicate() {
1116
1125
});
1117
1126
});
1118
1127
}
1128
1129
function doAddCurrency(currency) {
1130
$.post({
1131
url: "/custom/addCurrency?" + window.authz,
1132
contentType: "application/json",
1133
data: JSON.stringify({
1134
currency,
1135
delta: document.getElementById(currency + "-delta").valueAsNumber
1136
})
1137
}).then(function () {
1138
updateInventory();
1139
});
1140
}
@@ -1,5 +1,5 @@
1
1
dict = {
2
general_inventoryUpdateNote: `Note: Changes made here will only be reflected in-game when the game re-downloads your inventory. Visiting the navigation should be the easiest way to trigger that.`,
2
general_inventoryUpdateNote: `Note: Changes made here will only be applied in-game when the game syncs the inventory. Visiting the navigation should be the easiest way to trigger that.`,
3
3
general_addButton: `Add`,
4
4
general_bulkActions: `Bulk Actions`,
5
5
code_nonValidAuthz: `Your credentials are no longer valid.`,
@@ -72,6 +72,11 @@ dict = {
72
72
inventory_bulkRankUpSpaceWeapons: `Max Rank All Archwing Weapons`,
73
73
inventory_bulkRankUpSentinels: `Max Rank All Sentinels`,
74
74
inventory_bulkRankUpSentinelWeapons: `Max Rank All Sentinel Weapons`,
75
currency_RegularCredits: `Credits`,
76
currency_PremiumCredits: `Platinum`,
77
currency_FusionPoints: `Endo`,
78
currency_PrimeTokens: `Regal Aya`,
79
currency_owned: `You have |COUNT|.`,
75
80
powersuit_archonShardsLabel: `Archon Shard Slots`,
76
81
powersuit_archonShardsDescription: `You can use these unlimited slots to apply a wide range of upgrades`,
77
82
mods_addRiven: `Add Riven`,
@@ -73,6 +73,11 @@ dict = {
73
73
inventory_bulkRankUpSpaceWeapons: `Максимальный ранг всего оружия арчвингов`,
74
74
inventory_bulkRankUpSentinels: `Максимальный ранг всех стражей`,
75
75
inventory_bulkRankUpSentinelWeapons: `Максимальный ранг всего оружия стражей`,
76
currency_RegularCredits: `[UNTRANSLATED] Credits`,
77
currency_PremiumCredits: `[UNTRANSLATED] Platinum`,
78
currency_FusionPoints: `[UNTRANSLATED] Endo`,
79
currency_PrimeTokens: `[UNTRANSLATED] Regal Aya`,
80
currency_owned: `[UNTRANSLATED] You have |COUNT|.`,
76
81
powersuit_archonShardsLabel: `Ячейки осколков архонта`,
77
82
powersuit_archonShardsDescription: `Вы можете использовать эти неограниченные ячейки для установки множества улучшений.`,
78
83
mods_addRiven: `Добавить Мод Разлома`,