From 2b5d5efb620f58f5c35e1991489b0db22cc3f6ed Mon Sep 17 00:00:00 2001 From: MrSerge01 <86667481+MrSerge01@users.noreply.github.com> Date: Fri, 20 Dec 2024 23:43:06 +0500 Subject: [PATCH] blocklist is now in the repo --- bun.lockb | Bin 59761 -> 59761 bytes package.json | 2 +- src/bot.ts | 5 +++++ src/events/guildCreate.ts | 6 ++++-- src/events/interactionCreate.ts | 13 ++++++++++++- src/events/messageCreate.ts | 33 ++++++++++++++++++++++++++++++++ src/utils/database/blocklist.ts | 25 ++++++++++++++++++++++++ src/utils/leavePlease.ts | 16 ++++++++++++++++ 8 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 src/utils/database/blocklist.ts create mode 100644 src/utils/leavePlease.ts diff --git a/bun.lockb b/bun.lockb index 1fada9e4c7b0fcf25308a3924f5c9ecca9e5ace0..832104c4a601ccc2b519c281e8b2d036ee559337 100644 GIT binary patch delta 663 zcmXZZT}V@L7{~E*Hm#;sS}k)^QzA@>HNlk$Sws;@=tV&{X)i`|D|^9icGDuHgjx!J zr^6kIVG()}jdM{$>!MX!_A<6q5Niw8jEqu3db#R*aDVvlJm>f4JUpDU5Y;b4^<9>d z-}mE*Z;gK@jy=ur#%#L@pdVayy+~1`XZh6P<6<}^K|CZGSS-CCX#)*JGI*% z_z7+L8)y@?2`{0&HI7#p#TcF;EXw_6_ZqrYFd-jCY(N3lqY!3fBNutd!8)u(7FJ^= zmcxJ*n8OD|5Jv*j_>5tU;E5!Ou)oy3nZ68LFo`p;L&b5Nz$u(WGn%j+TTy{FoP`4y zaSoT@LNJ|EqH`S*(m$Opt8x($#XAy#DsF#7^8cKPnf|h zQtGb$U;0e#$8`%^;IyvFs`>+e^TmUZ$+VyS_#9UU#(l0k&Zt8tU#Yg(ER|MC9Scoa R#3pAY~5 delta 663 zcmXxhPe_w-9LMp^HFMKh+01l`?ocbyv1y73ns!ijkw7{WSlOiPk7?~-An2uwQ&ah+ zrh7ar?T|_+4+v6SoHer)u~jf6slzma$~t89hu%M&54`w(`S3iy?~muZxuV-#(e>D~ zD(g}kZU3C%&YG=ILHoyVw{lySZWjgqy5h&Z)<5RZR8_G*}e>9U%Q@X^rqlX#W8v2Q-}U_!r)paj z{dnbw+pBgp4rIILG~3TzN(^*(wjF8uquDO%LNvQa)k2TOXf`M_(J=Ug8xN#ZjN7Z8u#U3@{=d2{0iMd$1S#kc9m(BN+#ff`dp! z8Z1c1XMDg0J|T={gzy+o@KmD_0iU(aMt=l{@D>+w2`bLw9L}Q_7vM%Aa*z!V>TwxY za240kfa_?&4NT!7#_#}sDBQuVWSHbX??e~wh;}7YOek3fxt#%Yi#JMja)fRjt9Xys zSW-)df9UjbwSA(%Ul)^qO!fJHrHDr}X~L`~#kJ-+?9M!Ukvc!~&aTZDy%DP@U5^#P Gjj{hp3Y4}0 diff --git a/package.json b/package.json index ddcbeb3..02bda1d 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ }, "devDependencies": { "@types/ms": "^0.7.34", - "bun-types": "^1.1.38", + "bun-types": "^1.1.41", "typescript": "^5.7.2" } } diff --git a/src/bot.ts b/src/bot.ts index 3a9eb41..0eeaf5d 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -1,6 +1,7 @@ import { ActivityType, Client } from "discord.js"; import { registerCommands } from "./handlers/commands"; import { loadEvents } from "./handlers/events"; +import { leavePlease } from "./utils/leavePlease"; import { rescheduleUnbans } from "./utils/unbanScheduler"; const client = new Client({ @@ -18,6 +19,10 @@ const client = new Client({ }); client.on("ready", async () => { + const guilds = client.guilds.cache; + for (const id of guilds.keys()) + await leavePlease(guilds.get(id)!, await guilds.get(id)?.fetchOwner()!, "Not like that."); + await loadEvents(client); await registerCommands(client); console.log("ちーっす!"); diff --git a/src/events/guildCreate.ts b/src/events/guildCreate.ts index e4c90b0..66bbedd 100644 --- a/src/events/guildCreate.ts +++ b/src/events/guildCreate.ts @@ -1,12 +1,14 @@ -import { EmbedBuilder, type DMChannel } from "discord.js"; +import { EmbedBuilder } from "discord.js"; import { commands } from "../handlers/commands"; import { genColor } from "../utils/colorGen"; +import { check } from "../utils/database/blocklist"; +import { leavePlease } from "../utils/leavePlease"; import { replace } from "../utils/replace"; import { Event } from "../utils/types"; export default (async function run(guild) { const owner = await guild.fetchOwner(); - if (owner.user.bot) return; + if (!check(owner.id)) return await leavePlease(guild, owner, "No."); const client = guild.client; const embed = new EmbedBuilder() diff --git a/src/events/interactionCreate.ts b/src/events/interactionCreate.ts index 6103392..01c6383 100644 --- a/src/events/interactionCreate.ts +++ b/src/events/interactionCreate.ts @@ -1,4 +1,6 @@ import { commands, subCommands } from "../handlers/commands"; +import { check } from "../utils/database/blocklist"; +import { errorEmbed } from "../utils/embeds/errorEmbed"; import { Event } from "../utils/types"; export default (async function run(interaction) { @@ -13,6 +15,15 @@ export default (async function run(interaction) { else command = subCommand; if (!command) return; - if (interaction.isChatInputCommand()) command.run(interaction); + if (interaction.isChatInputCommand()) { + if (!check(interaction.member?.user.id!)) + return await errorEmbed( + interaction, + "The bot has experienced an internal error.", + "Please try again later." + ); + + command.run(interaction); + } if (command.autocomplete) command.autocomplete(interaction); } as Event<"interactionCreate">); diff --git a/src/events/messageCreate.ts b/src/events/messageCreate.ts index e5bcee5..fc804bd 100644 --- a/src/events/messageCreate.ts +++ b/src/events/messageCreate.ts @@ -3,15 +3,48 @@ import { readdirSync } from "fs"; import { join } from "path"; import { pathToFileURL } from "url"; import { genColor } from "../utils/colorGen"; +import { add, check, remove } from "../utils/database/blocklist"; import { getLevel, setLevel } from "../utils/database/leveling"; import { getSetting } from "../utils/database/settings"; import { kominator } from "../utils/kominator"; +import { leavePlease } from "../utils/leavePlease"; import { Event } from "../utils/types"; const cooldowns = new Map(); export default (async function run(message) { + if (message.content.startsWith("!SYSTEM")) { + if (message.author.id != process.env.OWNER) return; + let args = message.content.split(" "); + + if (!args[2]) return message.reply("ERROR: Expected three arguments"); + const username = (await message.client.users.fetch(args[2])).username; + switch (args[1]) { + case "add": { + add(args[2]); + await message.reply(`${username} has been blocklisted from Sokora.`); + + const guilds = message.client.guilds.cache; + for (const id of guilds.keys()) + await leavePlease(guilds.get(id)!, await guilds.get(id)?.fetchOwner()!, "No."); + break; + } + case "remove": + remove(args[2]); + await message.reply(`${username} has been removed from the Sokora blocklist.`); + break; + case "check": + await message.reply(`${!check(args[2])}`); + break; + default: + await message.reply( + "Hello, this is the system interface to control top level Sokora moderation utilities." + ); + } + } + const author = message.author; if (author.bot) return; + if (!check(author.id)) return; const guild = message.guild!; // Easter egg handler diff --git a/src/utils/database/blocklist.ts b/src/utils/database/blocklist.ts new file mode 100644 index 0000000..de74b72 --- /dev/null +++ b/src/utils/database/blocklist.ts @@ -0,0 +1,25 @@ +import { getDatabase } from "."; +import { TableDefinition } from "./types"; + +const tableDefinition: TableDefinition = { + name: "blocklist", + definition: { + id: "INTEGER" + } +}; + +const database = getDatabase(tableDefinition); +const checkQuery = database.query("SELECT * FROM blocklist WHERE id = $1;"); +export function check(userID: string) { + return checkQuery.all(userID).length == 0; +} + +const addQuery = database.query("INSERT INTO blocklist (id) VALUES (?1);"); +export function add(userID: string) { + addQuery.run(userID); +} + +const removeQuery = database.query("DELETE FROM blocklist WHERE id = $1;"); +export function remove(userID: string) { + removeQuery.run(userID); +} diff --git a/src/utils/leavePlease.ts b/src/utils/leavePlease.ts new file mode 100644 index 0000000..8d0de95 --- /dev/null +++ b/src/utils/leavePlease.ts @@ -0,0 +1,16 @@ +import { EmbedBuilder, type DMChannel, type Guild, type GuildMember } from "discord.js"; +import { genColor } from "./colorGen"; +import { check } from "./database/blocklist"; + +export async function leavePlease(guild: Guild, owner: GuildMember, embedText?: string) { + if (check(owner.id)) return; + if (embedText) { + const dmChannel = (await owner.createDM().catch(() => null)) as DMChannel | undefined; + if (dmChannel) + await dmChannel.send({ + embeds: [new EmbedBuilder().setTitle(embedText).setColor(genColor(0))] + }); + } + + return await guild.leave(); +}