add warning webhook

This commit is contained in:
Michael C 2023-02-22 00:08:27 -05:00
parent df279cf48a
commit 76ce1017ea
No known key found for this signature in database
GPG key ID: FFB04FB3B878B7B4
4 changed files with 62 additions and 0 deletions

View file

@ -5,6 +5,7 @@ import { isUserVIP } from "../utils/isUserVIP";
import { getHashCache } from "../utils/getHashCache";
import { HashedUserID, UserID } from "../types/user.model";
import { config } from "../config";
import { generateWarningDiscord, warningData, dispatchEvent } from "../utils/webhookUtils";
type warningEntry = {
userID: HashedUserID,
@ -21,6 +22,8 @@ function checkExpiredWarning(warning: warningEntry): boolean {
return warning.issueTime > expiry && !warning.enabled;
}
const getUsername = (userID: HashedUserID) => db.prepare("get", `SELECT "userName" FROM "userNames" WHERE "userID" = ?`, [userID], { useReplica: true });
export async function postWarning(req: Request, res: Response): Promise<Response> {
if (!req.body.userID) return res.status(400).json({ "message": "Missing parameters" });
@ -62,6 +65,27 @@ export async function postWarning(req: Request, res: Response): Promise<Response
resultStatus = "removed from";
}
const targetUsername = await getUsername(userID) ?? null;
const issuerUsername = await getUsername(issuerUserID) ?? null;
const webhookData = {
target: {
userID,
username: targetUsername
},
issuer: {
userID: issuerUserID,
username: issuerUsername
},
reason
} as warningData;
try {
const warning = generateWarningDiscord(webhookData);
dispatchEvent("warning", warning);
} catch /* istanbul ignore next */ (err) {
Logger.error(`Error sending warning to Discord ${err}`);
}
return res.status(200).json({
message: `Warning ${resultStatus} user '${userID}'.`,
});

View file

@ -1,6 +1,7 @@
import { config } from "../config";
import { Logger } from "../utils/logger";
import axios from "axios";
import { HashedUserID } from "../types/user.model";
function getVoteAuthorRaw(submissionCount: number, isTempVIP: boolean, isVIP: boolean, isOwnSubmission: boolean): string {
if (isOwnSubmission) {
@ -57,8 +58,35 @@ function dispatchEvent(scope: string, data: Record<string, unknown>): void {
}
}
interface warningData {
target: {
userID: HashedUserID
username: string | null
},
issuer: {
userID: HashedUserID,
username: string | null
},
reason: string
}
function generateWarningDiscord(data: warningData) {
return {
embeds: [
{
title: "Warning",
description: `**User:** ${data.target.username} (${data.target.userID})\n**Issuer:** ${data.issuer.username} (${data.issuer.userID})\n**Reason:** ${data.reason}`,
color: 0xff0000,
timestamp: new Date().toISOString()
}
]
};
}
export {
getVoteAuthorRaw,
getVoteAuthor,
dispatchEvent,
generateWarningDiscord,
warningData
};

View file

@ -42,6 +42,12 @@
"vote.up",
"vote.down"
]
}, {
"url": "http://127.0.0.1:8081/WarningWebhook",
"key": "superSecretKey",
"scopes": [
"warning"
]
}
],
"maxNumberOfActiveWarnings": 3,

View file

@ -13,6 +13,10 @@ app.post("/webhook/FirstTimeSubmissions", (req, res) => {
res.sendStatus(200);
});
app.post("/webhook/WarningWebhook", (req, res) => {
res.sendStatus(200);
});
app.post("/webhook/CompletelyIncorrectReport", (req, res) => {
res.sendStatus(200);
});