Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
70cefec
Add web, discord and in-game reporting and safe server links. (#105)
benrobson Oct 8, 2024
410a8bb
Add a Vault and Map Archive page and discord command. (#104)
benrobson Oct 9, 2024
7404438
Fix /vault command feature not defined.
benrobson Oct 9, 2024
ad9a3cf
Add Shopping Directory page and a search command on Discord. (#109)
benrobson Nov 15, 2024
da3bb45
Add Punishments View (#103)
birdwing Nov 15, 2024
632ac17
Add support for cake day feature.
benrobson Dec 15, 2024
b22b2e8
Update config example.
benrobson Jan 7, 2025
0078547
Fixed up some query and formatting in the shopping command, other tin…
benrobson Jan 19, 2025
535f68e
Implement profanity.dev as the swear filter with filter notifications…
benrobson Feb 23, 2025
c757eb4
Fix editing error on applications and announcements.
benrobson Mar 23, 2025
1a1062a
Add shopping and friends setting
benrobson Mar 30, 2025
449407d
Revert "Add shopping and friends setting"
benrobson Mar 30, 2025
ec5a64d
may 4th amendment
benrobson May 3, 2025
b8896e9
Improve administration panel UI (#117)
benrobson Aug 13, 2025
afebaf6
Fix /shopdirectory command, embed limit, and out of stock (#114)
benrobson Aug 25, 2025
5a40912
Fix JSON import syntax for Node.js 18 (#119)
google-labs-jules[bot] Aug 25, 2025
2546671
This commit addresses a 502 Bad Gateway error on announcement deletio…
benrobson Sep 3, 2025
bd916ec
feat: Complete migration to Bootstrap 5 (#122)
google-labs-jules[bot] Sep 4, 2025
b87eb46
Fix the sdd schema due to a QuickShop update
benrobson Sep 8, 2025
73808ed
Feat: Add item image thumbnail to shop directory command (#124)
google-labs-jules[bot] Sep 8, 2025
8110c1b
feat(shop): Add enchantment search and display to shop directory
google-labs-jules[bot] Sep 10, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
646 changes: 326 additions & 320 deletions api/common.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion api/internal_redirect/announcement.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { hasPermission, postAPIRequest } from "../common";
import { hasPermission, postAPIRequest } from "../common.js";

export default function announcementRedirectRoute(app, config, lang) {
const baseEndpoint = "/redirect/announcement";
Expand Down
4 changes: 2 additions & 2 deletions api/internal_redirect/application.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { hasPermission, postAPIRequest } from "../common";
import { hasPermission, postAPIRequest } from "../common.js";

export default function applicationRedirectRoute(app, config, lang) {
const baseEndpoint = "/redirect/application";
const baseEndpoint = "/redirect/applications";

app.post(baseEndpoint + "/create", async function (req, res) {
if (!hasPermission("zander.web.application", req, res)) return;
Expand Down
23 changes: 23 additions & 0 deletions api/internal_redirect/bridge.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { hasPermission, postAPIRequest } from "../common.js";

export default function bridgeRedirectRoute(app, config, lang) {
const baseEndpoint = "/redirect/bridge";

app.post(baseEndpoint + "/command/add", async function (req, res) {
if (!hasPermission("zander.web.bridge", req, res)) return;

// Add userId to req.body
req.body.actioningUser = req.session.user.userId;

postAPIRequest(
`${process.env.siteAddress}/api/bridge/command/add`,
req.body,
`${process.env.siteAddress}/dashboard/bridge`,
res
);

res.redirect(`${process.env.siteAddress}/dashboard/bridge`);

return res;
});
}
14 changes: 10 additions & 4 deletions api/internal_redirect/index.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
import applicationRedirectRoute from "./application";
import serverRedirectRoute from "./server";
import webRedirectRoute from "./web";
import announcementsRedirectRoute from "./announcement";
import applicationRedirectRoute from "./application.js";
import serverRedirectRoute from "./server.js";
import webRedirectRoute from "./web.js";
import announcementsRedirectRoute from "./announcement.js";
import reportRedirectRoute from "./report.js";
import vaultRedirectRoute from "./vault.js";
import bridgeRedirectRoute from "./bridge.js";

export default (app, config, lang) => {
applicationRedirectRoute(app, config, lang);
serverRedirectRoute(app, config, lang);
reportRedirectRoute(app, config, lang);
webRedirectRoute(app, config, lang);
announcementsRedirectRoute(app, config, lang);
vaultRedirectRoute(app, config, lang);
bridgeRedirectRoute(app, config, lang);
};
20 changes: 20 additions & 0 deletions api/internal_redirect/report.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { hasPermission, postAPIRequest } from "../common.js";

export default function reportRedirectRoute(app, config, lang) {
const baseEndpoint = "/redirect/report";

app.post(baseEndpoint + "/create", async function (req, res) {
req.body.reporterUser = req.session.user.username;

postAPIRequest(
`${process.env.siteAddress}/api/report/create`,
req.body,
`${process.env.siteAddress}/report`,
res
);

res.redirect(`${process.env.siteAddress}/`);

return res;
});
}
2 changes: 1 addition & 1 deletion api/internal_redirect/server.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { hasPermission, postAPIRequest } from "../common";
import { hasPermission, postAPIRequest } from "../common.js";

export default function serverRedirectRoute(app, config, lang) {
const baseEndpoint = "/redirect/server";
Expand Down
59 changes: 59 additions & 0 deletions api/internal_redirect/vault.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import { hasPermission, postAPIRequest } from "../common.js";

export default function vaultRedirectRoute(app, config, lang) {
const baseEndpoint = "/redirect/vault";

app.post(baseEndpoint + "/create", async function (req, res) {
if (!hasPermission("zander.web.vault", req, res)) return;

// Add userId to req.body
req.body.actioningUser = req.session.user.userId;

postAPIRequest(
`${process.env.siteAddress}/api/vault/create`,
req.body,
`${process.env.siteAddress}/dashboard/vault`,
res
);

res.redirect(`${process.env.siteAddress}/dashboard/vault`);

return res;
});

app.post(baseEndpoint + "/edit", async function (req, res) {
if (!hasPermission("zander.web.vault", req, res)) return;

// Add userId to req.body
req.body.actioningUser = req.session.user.userId;

postAPIRequest(
`${process.env.siteAddress}/api/vault/edit`,
req.body,
`${process.env.siteAddress}/dashboard/vault`,
res
);

res.redirect(`${process.env.siteAddress}/dashboard/vault`);

return res;
});

app.post(baseEndpoint + "/delete", async function (req, res) {
if (!hasPermission("zander.web.vault", req, res)) return;

// Add userId to req.body
req.body.actioningUser = req.session.user.userId;

postAPIRequest(
`${process.env.siteAddress}/api/vault/delete`,
req.body,
`${process.env.siteAddress}/dashboard/vault`,
res
);

res.redirect(`${process.env.siteAddress}/dashboard/vault`);

return res;
});
}
2 changes: 1 addition & 1 deletion api/internal_redirect/web.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { postAPIRequest } from "../common";
import { postAPIRequest } from "../common.js";

export default function webRedirectRoute(app, config, lang) {
const baseEndpoint = "/redirect/web";
Expand Down
30 changes: 19 additions & 11 deletions api/routes/announcement.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
import { isFeatureEnabled, required, optional, generateLog } from "../common";
import {
isFeatureEnabled,
required,
optional,
generateLog,
} from "../common.js";

export default function announcementApiRoute(app, config, db, features, lang) {
const baseEndpoint = "/api/announcement";

app.get(baseEndpoint + "/get", async function (req, res) {
isFeatureEnabled(features.announcements, res, lang);
const announcementId = optional(req.query, "id");
const announcementId = optional(req.query, "announcementId");
const announcementType = optional(req.query, "announcementType");

Check failure

Code scanning / CodeQL

Database query built from user-controlled sources High

This query string depends on a
user-provided value
.
const enabled = optional(req.query, "enabled");

try {
Expand All @@ -26,6 +31,8 @@
});
}

console.log(results);

res.send({
success: true,
data: results,
Expand All @@ -34,7 +41,7 @@
}

// Get Announcement by specific ID.
if (req.query === "announcementId") {
if (announcementId) {
let dbQuery = `SELECT * FROM announcements WHERE announcementId=${announcementId};`;
getAnnouncements(dbQuery);
return res;
Expand Down Expand Up @@ -157,14 +164,14 @@
try {
db.query(
`
UPDATE announcements
SET
enabled=?,
announcementType=?,
body=?,
colourMessageFormat=?,
link=?
WHERE announcementId=?;`,
UPDATE announcements
SET
enabled=?,
announcementType=?,
body=?,
colourMessageFormat=?,
link=?
WHERE announcementId=?;`,
[
enabled,
announcementType,
Expand Down Expand Up @@ -208,6 +215,7 @@
app.post(baseEndpoint + "/delete", async function (req, res) {
isFeatureEnabled(features.announcements, res, lang);

const actioningUser = required(req.body, "actioningUser", res);
const announcementId = required(req.body, "announcementId", res);

try {
Expand Down
12 changes: 9 additions & 3 deletions api/routes/application.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,24 @@
import { isFeatureEnabled, required, optional, generateLog } from "../common";
import {
isFeatureEnabled,
required,
optional,
generateLog,
} from "../common.js";

export default function applicationApiRoute(app, config, db, features, lang) {
const baseEndpoint = "/api/application";

app.get(baseEndpoint + "/get", async function (req, res) {
isFeatureEnabled(features.applications, res, lang);
const applicationId = optional(req.query, "applicationId");
const applicationId = optional(req.query, "id");

try {
function getApplications(dbQuery) {
db.query(dbQuery, function (error, results, fields) {

Check failure

Code scanning / CodeQL

Database query built from user-controlled sources High

This query string depends on a
user-provided value
.
console.log(results);

if (error) {
res.send({
return res.send({
success: false,
message: `${error}`,
});
Expand All @@ -37,6 +42,7 @@
if (applicationId) {
let dbQuery = `SELECT * FROM applications WHERE applicationId=${applicationId};`;
getApplications(dbQuery);
return; // Add return statement here
}

// Return all Servers by default
Expand Down
Loading