From a998f426cc6313faa73eeb76c0ff126509610186 Mon Sep 17 00:00:00 2001 From: Kalle <38327916+Sendouc@users.noreply.github.com> Date: Fri, 18 Aug 2023 16:36:11 +0300 Subject: [PATCH] Ban feature --- app/db/types.ts | 1 + app/root.tsx | 2 ++ app/routes/u.$identifier.tsx | 4 +++- migrations/033-banned.js | 5 +++++ package.json | 2 ++ scripts/ban-user.ts | 14 ++++++++++++++ scripts/delete-skill.ts | 16 ++++++++++++++++ 7 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 migrations/033-banned.js create mode 100644 scripts/ban-user.ts create mode 100644 scripts/delete-skill.ts diff --git a/app/db/types.ts b/app/db/types.ts index 241a3cb4a..afa9ffb42 100644 --- a/app/db/types.ts +++ b/app/db/types.ts @@ -37,6 +37,7 @@ export interface User { favoriteBadgeId: number | null; commissionsOpen: number; commissionText: string | null; + banned: number; } /** User table after joined with PlusTier table */ diff --git a/app/root.tsx b/app/root.tsx index 52f4f7c54..101445cd4 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -105,6 +105,8 @@ export const loader: LoaderFunction = async ({ request }) => { invariant(process.env["BASE_URL"], "BASE_URL env var is not set"); + if (user?.banned) throw new Response(null, { status: 403 }); + return json( { locale, diff --git a/app/routes/u.$identifier.tsx b/app/routes/u.$identifier.tsx index 71fd42019..bfaf7ddd8 100644 --- a/app/routes/u.$identifier.tsx +++ b/app/routes/u.$identifier.tsx @@ -19,7 +19,7 @@ import { findVods } from "~/features/vods"; import { useTranslation } from "~/hooks/useTranslation"; import { useUser } from "~/modules/auth"; import { getUserId } from "~/modules/auth/user.server"; -import { canAddCustomizedColorsToUserProfile } from "~/permissions"; +import { canAddCustomizedColorsToUserProfile, isAdmin } from "~/permissions"; import styles from "~/styles/u.css"; import { notFoundIfFalsy, type SendouRouteHandle } from "~/utils/remix"; import { discordFullName, makeTitle } from "~/utils/strings"; @@ -103,6 +103,7 @@ export const loader = async ({ params, request }: LoaderArgs) => { weapons: user.weapons, team: user.team, country: user.country, + banned: isAdmin(loggedInUser) ? user.banned : undefined, css: canAddCustomizedColorsToUserProfile(user) ? user.css : undefined, badges: db.badges.findByOwnerId(user.id), // TODO: could load only on results page @@ -167,6 +168,7 @@ export default function UserPageLayout() { )} + {data.banned ?
Banned
: null} ); diff --git a/migrations/033-banned.js b/migrations/033-banned.js new file mode 100644 index 000000000..ef8d16442 --- /dev/null +++ b/migrations/033-banned.js @@ -0,0 +1,5 @@ +module.exports.up = function (db) { + db.prepare( + /* sql */ `alter table "User" add "banned" integer default 0` + ).run(); +}; diff --git a/package.json b/package.json index 7b83091c6..e0fb50fda 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,8 @@ "hex-to-filter": "node --experimental-specifier-resolution=node --loader ts-node/esm -r tsconfig-paths/register scripts/hex-to-filter.ts", "sync-xp-badges": "node --experimental-specifier-resolution=node --loader ts-node/esm -r tsconfig-paths/register scripts/sync-xp-badges.ts", "delete-user": "node --experimental-specifier-resolution=node --loader ts-node/esm -r tsconfig-paths/register scripts/delete-user.ts", + "ban-user": "node --experimental-specifier-resolution=node --loader ts-node/esm -r tsconfig-paths/register scripts/ban-user.ts", + "delete-skill": "node --experimental-specifier-resolution=node --loader ts-node/esm -r tsconfig-paths/register scripts/delete-skill.ts", "lint:ts": "eslint . --ext .ts,.tsx", "lint:css": "stylelint \"app/styles/**/*.css\"", "prettier:check": "prettier --check . --loglevel warn", diff --git a/scripts/ban-user.ts b/scripts/ban-user.ts new file mode 100644 index 000000000..278c351b3 --- /dev/null +++ b/scripts/ban-user.ts @@ -0,0 +1,14 @@ +/* eslint-disable no-console */ +import "dotenv/config"; +import invariant from "tiny-invariant"; +import { sql } from "~/db/sql"; + +const discordId = process.argv[2]?.trim(); + +invariant(discordId, "discord id is required (argument 1)"); + +sql + .prepare('update "User" set banned = 1 where discordId = @discordId') + .run({ discordId }); + +console.log(`Banned user with discord id: ${discordId}`); diff --git a/scripts/delete-skill.ts b/scripts/delete-skill.ts new file mode 100644 index 000000000..66b2ba10c --- /dev/null +++ b/scripts/delete-skill.ts @@ -0,0 +1,16 @@ +/* eslint-disable no-console */ +import "dotenv/config"; +import invariant from "tiny-invariant"; +import { sql } from "~/db/sql"; + +const discordId = process.argv[2]?.trim(); + +invariant(discordId, "discord id is required (argument 1)"); + +sql + .prepare( + 'delete from "Skill" where "userId" = (select id from "User" where discordId = @discordId)' + ) + .run({ discordId }); + +console.log(`Deleted skill of user with discord id: ${discordId}`);