Merge branch 'dev' into 'main'

Dev

See merge request illegitimate/illegitimate-bot!296
This commit is contained in:
2024-10-03 14:25:06 +00:00
20 changed files with 59 additions and 40 deletions

14
dev-db.yml Normal file
View File

@@ -0,0 +1,14 @@
---
services:
db:
container_name: postgres-dev
image: postgres
restart: unless-stopped
volumes:
- ./dev/data:/var/lib/postgresql/data
ports:
- 5432:5432
environment:
- POSTGRES_PASSWORD=dev
- POSTGRES_USER=dev
- POSTGRES_DB=illegitimate

View File

@@ -2,6 +2,7 @@ import { FlatCompat } from "@eslint/eslintrc"
import js from "@eslint/js" import js from "@eslint/js"
import typescriptEslint from "@typescript-eslint/eslint-plugin" import typescriptEslint from "@typescript-eslint/eslint-plugin"
import tsParser from "@typescript-eslint/parser" import tsParser from "@typescript-eslint/parser"
import drizzle from "eslint-plugin-drizzle"
import globals from "globals" import globals from "globals"
import path from "node:path" import path from "node:path"
import { fileURLToPath } from "node:url" import { fileURLToPath } from "node:url"
@@ -20,10 +21,11 @@ export default [
{ {
ignores: ["**/node_modules", "**/dist", "**/dev"] ignores: ["**/node_modules", "**/dist", "**/dev"]
}, },
...compat.extends("eslint:recommended", "plugin:@typescript-eslint/recommended"), ...compat.extends("eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:drizzle/all"),
{ {
plugins: { plugins: {
"@typescript-eslint": typescriptEslint "@typescript-eslint": typescriptEslint,
"drizzle": drizzle
}, },
languageOptions: { languageOptions: {
@@ -87,6 +89,12 @@ export default [
"ts-ignore": "allow-with-description", "ts-ignore": "allow-with-description",
"ts-nocheck": "allow-with-description", "ts-nocheck": "allow-with-description",
"ts-check": "allow-with-description" "ts-check": "allow-with-description"
}],
"drizzle/enforce-delete-with-where": ["error", {
"drizzleObjectName": ["db"]
}],
"drizzle/enforce-update-with-where": ["error", {
"drizzleObjectName": ["db"]
}] }]
} }
}, },

View File

@@ -27,6 +27,8 @@
"db:generate": "drizzle-kit generate", "db:generate": "drizzle-kit generate",
"db:migrate": "drizzle-kit migrate", "db:migrate": "drizzle-kit migrate",
"db:studio": "drizzle-kit studio", "db:studio": "drizzle-kit studio",
"db:start": "docker compose -f dev-db.yml up -d",
"db:stop": "docker compose -f dev-db.yml down",
"push:prod": "tsx scripts/deploy-commands.ts", "push:prod": "tsx scripts/deploy-commands.ts",
"push:dev": "tsx scripts/dev-deploy.ts", "push:dev": "tsx scripts/dev-deploy.ts",
"delete:dev": "tsx scripts/delete-commands.ts" "delete:dev": "tsx scripts/delete-commands.ts"
@@ -65,6 +67,7 @@
"dprint": "^0.47.2", "dprint": "^0.47.2",
"drizzle-kit": "^0.24.2", "drizzle-kit": "^0.24.2",
"eslint": "^9.11.1", "eslint": "^9.11.1",
"eslint-plugin-drizzle": "^0.2.3",
"globals": "^15.9.0", "globals": "^15.9.0",
"sqlite3": "^5.1.7", "sqlite3": "^5.1.7",
"tsx": "^4.19.1", "tsx": "^4.19.1",

12
pnpm-lock.yaml generated
View File

@@ -104,6 +104,9 @@ importers:
eslint: eslint:
specifier: ^9.11.1 specifier: ^9.11.1
version: 9.11.1 version: 9.11.1
eslint-plugin-drizzle:
specifier: ^0.2.3
version: 0.2.3(eslint@9.11.1)
globals: globals:
specifier: ^15.9.0 specifier: ^15.9.0
version: 15.9.0 version: 15.9.0
@@ -1466,6 +1469,11 @@ packages:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'} engines: {node: '>=12'}
eslint-plugin-drizzle@0.2.3:
resolution: {integrity: sha512-BO+ymHo33IUNoJlC0rbd7HP9EwwpW4VIp49R/tWQF/d2E1K2kgTf0tCXT0v9MSiBr6gGR1LtPwMLapTKEWSg9A==}
peerDependencies:
eslint: '>=8.0.0'
eslint-scope@8.0.2: eslint-scope@8.0.2:
resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -3927,6 +3935,10 @@ snapshots:
escape-string-regexp@5.0.0: {} escape-string-regexp@5.0.0: {}
eslint-plugin-drizzle@0.2.3(eslint@9.11.1):
dependencies:
eslint: 9.11.1
eslint-scope@8.0.2: eslint-scope@8.0.2:
dependencies: dependencies:
esrecurse: 4.3.0 esrecurse: 4.3.0

View File

@@ -1,10 +1,8 @@
import { devMessage, embedColor, hypixelGuildID } from "config/options.js" import { devMessage, embedColor, hypixelGuildID } from "config/options.js"
import { waitingListRole } from "config/roles.js" import { waitingListRole } from "config/roles.js"
import { ApplicationCommandType, ContextMenuCommandBuilder, PermissionFlagsBits, userMention } from "discord.js" import { ApplicationCommandType, ContextMenuCommandBuilder, PermissionFlagsBits, userMention } from "discord.js"
import { eq } from "drizzle-orm"
import { IContextMenu } from "interfaces" import { IContextMenu } from "interfaces"
import db from "src/db/db.js" import db from "src/db/db.js"
import { verifies } from "src/db/schema.js"
import roleManage from "utils/functions/rolesmanage.js" import roleManage from "utils/functions/rolesmanage.js"
import { getGuild, getHeadURL, getIGN } from "utils/Hypixel.js" import { getGuild, getHeadURL, getIGN } from "utils/Hypixel.js"
@@ -25,7 +23,7 @@ export default {
const user = await interaction.guild!.members.fetch(targetId) const user = await interaction.guild!.members.fetch(targetId)
const usermentioned = userMention(user.user.id) const usermentioned = userMention(user.user.id)
const verifyData = await db.query.verifies.findFirst({ const verifyData = await db.query.verifies.findFirst({
where: eq(verifies.userID, user.user.id) where: ({ userID }, { eq }) => eq(userID, user.id)
}) })
if (!verifyData) { if (!verifyData) {

View File

@@ -1,5 +1,6 @@
import { embedColor } from "config/options.js" import { embedColor } from "config/options.js"
import { InteractionContextType, PermissionFlagsBits, SlashCommandBuilder } from "discord.js" import { InteractionContextType, PermissionFlagsBits, SlashCommandBuilder } from "discord.js"
import { eq } from "drizzle-orm"
import { ICommand } from "interfaces" import { ICommand } from "interfaces"
import db from "src/db/db.js" import db from "src/db/db.js"
import { settings } from "src/db/schema.js" import { settings } from "src/db/schema.js"
@@ -38,7 +39,7 @@ export default {
const setting = interaction.options.getString("setting")! const setting = interaction.options.getString("setting")!
const value = interaction.options.getString("value")! const value = interaction.options.getString("value")!
const settingsData = await db.query.settings.findFirst({ const settingsData = await db.query.settings.findFirst({
where: (settings, { eq }) => eq(settings.name, setting) where: ({ name }, { eq }) => eq(name, setting)
}) })
if (!settingsData) { if (!settingsData) {
@@ -56,7 +57,7 @@ export default {
} else { } else {
await db.update(settings).set({ await db.update(settings).set({
value: value value: value
}) }).where(eq(settings.name, setting))
await interaction.editReply({ await interaction.editReply({
embeds: [{ embeds: [{

View File

@@ -1,9 +1,7 @@
import { devMessage, embedColor } from "config/options.js" import { devMessage, embedColor } from "config/options.js"
import { InteractionContextType, PermissionFlagsBits, SlashCommandBuilder, userMention } from "discord.js" import { InteractionContextType, PermissionFlagsBits, SlashCommandBuilder, userMention } from "discord.js"
import { eq } from "drizzle-orm"
import { ICommand } from "interfaces" import { ICommand } from "interfaces"
import db from "src/db/db.js" import db from "src/db/db.js"
import { verifies } from "src/db/schema.js"
import { getHeadURL, getIGN, getUUID } from "utils/Hypixel.js" import { getHeadURL, getIGN, getUUID } from "utils/Hypixel.js"
export default { export default {
@@ -40,7 +38,7 @@ export default {
} }
const verifyData = await db.query.verifies.findFirst({ const verifyData = await db.query.verifies.findFirst({
where: eq(verifies.uuid, uuid) where: ({ uuid: uuidfromdb }, { eq }) => eq(uuidfromdb, uuid)
}) })
if (!verifyData) { if (!verifyData) {
await interaction.editReply({ await interaction.editReply({

View File

@@ -29,7 +29,7 @@ export default {
async execute({ interaction }) { async execute({ interaction }) {
const member = interaction.options.getMember("user") as GuildMember const member = interaction.options.getMember("user") as GuildMember
const verifiedUser = await db.query.verifies.findFirst({ const verifiedUser = await db.query.verifies.findFirst({
where: eq(verifies.userID, member.user.id) where: ({ userID }, { eq }) => eq(userID, member.user.id)
}) })
const mod = interaction.user const mod = interaction.user

View File

@@ -1,10 +1,8 @@
import { devMessage, embedColor, hypixelGuildID } from "config/options.js" import { devMessage, embedColor, hypixelGuildID } from "config/options.js"
import { waitingListRole } from "config/roles.js" import { waitingListRole } from "config/roles.js"
import { GuildMember, InteractionContextType, PermissionFlagsBits, SlashCommandBuilder, userMention } from "discord.js" import { GuildMember, InteractionContextType, PermissionFlagsBits, SlashCommandBuilder, userMention } from "discord.js"
import { eq } from "drizzle-orm"
import { ICommand } from "interfaces" import { ICommand } from "interfaces"
import db from "src/db/db.js" import db from "src/db/db.js"
import { verifies } from "src/db/schema.js"
import roleManage from "utils/functions/rolesmanage.js" import roleManage from "utils/functions/rolesmanage.js"
import { getGuild, getHeadURL, getIGN } from "utils/Hypixel.js" import { getGuild, getHeadURL, getIGN } from "utils/Hypixel.js"
@@ -32,7 +30,7 @@ export default {
const user = interaction.options.getMember("user") as GuildMember const user = interaction.options.getMember("user") as GuildMember
const usermentioned = userMention(user.user.id) const usermentioned = userMention(user.user.id)
const verifyData = await db.query.verifies.findFirst({ const verifyData = await db.query.verifies.findFirst({
where: eq(verifies.userID, user.user.id) where: ({ userID }, { eq }) => eq(userID, user.user.id)
}) })
if (!verifyData) { if (!verifyData) {

View File

@@ -1,6 +1,5 @@
import { devMessage, embedColor, hypixelGuildID } from "config/options.js" import { devMessage, embedColor, hypixelGuildID } from "config/options.js"
import { GuildMember, InteractionContextType, PermissionFlagsBits, SlashCommandBuilder, userMention } from "discord.js" import { GuildMember, InteractionContextType, PermissionFlagsBits, SlashCommandBuilder, userMention } from "discord.js"
import { eq } from "drizzle-orm"
import { ICommand } from "interfaces" import { ICommand } from "interfaces"
import db from "src/db/db.js" import db from "src/db/db.js"
import { verifies } from "src/db/schema.js" import { verifies } from "src/db/schema.js"
@@ -38,7 +37,7 @@ export default {
const mod = interaction.user const mod = interaction.user
const verifyData = await db.query.verifies.findFirst({ const verifyData = await db.query.verifies.findFirst({
where: eq(verifies.userID, user.user.id) where: ({ userID }, { eq }) => eq(userID, user.user.id)
}) })
if (verifyData) { if (verifyData) {
interaction.editReply("That user is already verified.") interaction.editReply("That user is already verified.")

View File

@@ -38,7 +38,7 @@ export default {
const reason = interaction.options.getString("reason") ?? "No reason provided." const reason = interaction.options.getString("reason") ?? "No reason provided."
const mod = interaction.user! const mod = interaction.user!
const waiting = await db.query.waitingLists.findFirst({ const waiting = await db.query.waitingLists.findFirst({
where: eq(waitingLists.userID, member.user.id) where: ({ userID }, { eq }) => eq(userID, member.user.id)
}) })
if (!waiting) { if (!waiting) {

View File

@@ -1,10 +1,8 @@
import { devMessage, embedColor, hypixelGuildID } from "config/options.js" import { devMessage, embedColor, hypixelGuildID } from "config/options.js"
import { waitingListRole } from "config/roles.js" import { waitingListRole } from "config/roles.js"
import { GuildMember, InteractionContextType, SlashCommandBuilder } from "discord.js" import { GuildMember, InteractionContextType, SlashCommandBuilder } from "discord.js"
import { eq } from "drizzle-orm"
import { ICommand } from "interfaces" import { ICommand } from "interfaces"
import db from "src/db/db.js" import db from "src/db/db.js"
import { verifies } from "src/db/schema.js"
import roleManage from "utils/functions/rolesmanage.js" import roleManage from "utils/functions/rolesmanage.js"
import { getGuild, getHeadURL, getIGN } from "utils/Hypixel.js" import { getGuild, getHeadURL, getIGN } from "utils/Hypixel.js"
@@ -24,7 +22,7 @@ export default {
const user = interaction.member as GuildMember const user = interaction.member as GuildMember
const verifyData = await db.query.verifies.findFirst({ const verifyData = await db.query.verifies.findFirst({
where: eq(verifies.userID, user.user.id) where: ({ userID }, { eq }) => eq(userID, user.user.id)
}) })
if (!verifyData) { if (!verifyData) {

View File

@@ -1,6 +1,5 @@
import { devMessage, embedColor, hypixelGuildID } from "config/options.js" import { devMessage, embedColor, hypixelGuildID } from "config/options.js"
import { GuildMember, InteractionContextType, SlashCommandBuilder } from "discord.js" import { GuildMember, InteractionContextType, SlashCommandBuilder } from "discord.js"
import { eq } from "drizzle-orm"
import { ICommand } from "interfaces" import { ICommand } from "interfaces"
import { IPlayerData } from "interfaces" import { IPlayerData } from "interfaces"
import { IGuildData } from "interfaces" import { IGuildData } from "interfaces"
@@ -35,7 +34,7 @@ export default {
const ign = interaction.options.getString("ign")! const ign = interaction.options.getString("ign")!
const verifyData = await db.query.verifies.findFirst({ const verifyData = await db.query.verifies.findFirst({
where: eq(verifies.userID, user.user.id) where: ({ userID }, { eq }) => eq(userID, user.id)
}) })
if (verifyData) { if (verifyData) {
interaction.editReply("You are already verified.\n" + "Try running /update to update your roles.") interaction.editReply("You are already verified.\n" + "Try running /update to update your roles.")

View File

@@ -1,9 +1,7 @@
import { devMessage, embedColor } from "config/options.js" import { devMessage, embedColor } from "config/options.js"
import { InteractionContextType, SlashCommandBuilder, userMention } from "discord.js" import { InteractionContextType, SlashCommandBuilder, userMention } from "discord.js"
import { eq } from "drizzle-orm"
import { ICommand } from "interfaces" import { ICommand } from "interfaces"
import db from "src/db/db.js" import db from "src/db/db.js"
import { verifies } from "src/db/schema.js"
import { getHeadURL, getIGN } from "utils/Hypixel.js" import { getHeadURL, getIGN } from "utils/Hypixel.js"
export default { export default {
@@ -22,7 +20,7 @@ export default {
const user = interaction.user const user = interaction.user
const verifyData = await db.query.verifies.findFirst({ const verifyData = await db.query.verifies.findFirst({
where: eq(verifies.userID, user.id) where: ({ userID }, { eq }) => eq(userID, user.id)
}) })
if (!verifyData) { if (!verifyData) {

View File

@@ -1,9 +1,7 @@
import { devMessage, embedColor } from "config/options.js" import { devMessage, embedColor } from "config/options.js"
import { InteractionContextType, PermissionFlagsBits, SlashCommandBuilder, userMention } from "discord.js" import { InteractionContextType, PermissionFlagsBits, SlashCommandBuilder, userMention } from "discord.js"
import { eq } from "drizzle-orm"
import { ICommand } from "interfaces" import { ICommand } from "interfaces"
import db from "src/db/db.js" import db from "src/db/db.js"
import { verifies } from "src/db/schema.js"
import { getHeadURL, getIGN } from "utils/Hypixel.js" import { getHeadURL, getIGN } from "utils/Hypixel.js"
export default { export default {
@@ -29,7 +27,7 @@ export default {
const user = interaction.options.getUser("user")! const user = interaction.options.getUser("user")!
const verifiedUser = await db.query.verifies.findFirst({ const verifiedUser = await db.query.verifies.findFirst({
where: eq(verifies.userID, user.id) where: ({ userID }, { eq }) => eq(userID, user.id)
}) })
if (!verifiedUser) { if (!verifiedUser) {
interaction.editReply({ interaction.editReply({

View File

@@ -1,9 +1,7 @@
import { devMessage, embedColor } from "config/options.js" import { devMessage, embedColor } from "config/options.js"
import { bwfkdr, bwstars, bwwins, duelswins, duelswlr, swkdr, swstars } from "config/reqs.js" import { bwfkdr, bwstars, bwwins, duelswins, duelswlr, swkdr, swstars } from "config/reqs.js"
import { eq } from "drizzle-orm"
import { IButton } from "interfaces" import { IButton } from "interfaces"
import db from "src/db/db.js" import db from "src/db/db.js"
import { guildApps } from "src/db/schema.js"
import { bedwarsLevel, getGuild, getHeadURL, getPlayer, hypixelLevel, skywarsLevel } from "utils/Hypixel.js" import { bedwarsLevel, getGuild, getHeadURL, getPlayer, hypixelLevel, skywarsLevel } from "utils/Hypixel.js"
export default { export default {
@@ -17,7 +15,7 @@ export default {
const embed = message.embeds[0] const embed = message.embeds[0]
const applicantId = embed.footer!.text.split(" ")[1] const applicantId = embed.footer!.text.split(" ")[1]
const guildappdata = await db.query.guildApps.findFirst({ const guildappdata = await db.query.guildApps.findFirst({
where: eq(guildApps.userID, applicantId) where: ({ userID }, { eq }) => eq(userID, applicantId)
}) })
const uuid = guildappdata!.uuid const uuid = guildappdata!.uuid

View File

@@ -55,7 +55,7 @@ export default {
}) })
const applicantEntry = await db.query.guildApps.findFirst({ const applicantEntry = await db.query.guildApps.findFirst({
where: eq(guildApps.userID, applicantId) where: ({ userID }, { eq }) => eq(userID, applicantId)
}) })
const applicantUUID = applicantEntry!.uuid const applicantUUID = applicantEntry!.uuid
const time = Date.now() const time = Date.now()

View File

@@ -3,7 +3,6 @@ import { applicationsChannel, embedColor } from "config/options.js"
import { guild as guildQuestions } from "config/questions.js" import { guild as guildQuestions } from "config/questions.js"
import { guildRole } from "config/roles.js" import { guildRole } from "config/roles.js"
import { ActionRowBuilder, ButtonBuilder, ButtonStyle, GuildMember, TextChannel } from "discord.js" import { ActionRowBuilder, ButtonBuilder, ButtonStyle, GuildMember, TextChannel } from "discord.js"
import { eq } from "drizzle-orm"
import { IButton } from "interfaces" import { IButton } from "interfaces"
import db from "src/db/db.js" import db from "src/db/db.js"
import { guildApps } from "src/db/schema.js" import { guildApps } from "src/db/schema.js"
@@ -33,7 +32,7 @@ export default {
} }
const application = await db.query.guildApps.findFirst({ const application = await db.query.guildApps.findFirst({
where: eq(guildApps.userID, user.user.id) where: ({ userID }, { eq }) => eq(userID, user.user.id)
}) })
if (application) { if (application) {

View File

@@ -3,10 +3,9 @@ import { embedColor, staffApplicationsChannel } from "config/options.js"
import { staff as staffQuestions } from "config/questions.js" import { staff as staffQuestions } from "config/questions.js"
import { guildRole, guildStaff } from "config/roles.js" import { guildRole, guildStaff } from "config/roles.js"
import { ActionRowBuilder, ButtonBuilder, ButtonStyle, GuildMember, TextChannel } from "discord.js" import { ActionRowBuilder, ButtonBuilder, ButtonStyle, GuildMember, TextChannel } from "discord.js"
import { eq } from "drizzle-orm"
import { IButton } from "interfaces" import { IButton } from "interfaces"
import db from "src/db/db.js" import db from "src/db/db.js"
import { settings, staffApps } from "src/db/schema.js" import { staffApps } from "src/db/schema.js"
import env from "utils/Env.js" import env from "utils/Env.js"
import applicationQuestions from "utils/functions/applicationquestions.js" import applicationQuestions from "utils/functions/applicationquestions.js"
@@ -19,7 +18,7 @@ export default {
const guild = interaction.guild! const guild = interaction.guild!
const userRoles = user.roles.cache const userRoles = user.roles.cache
const setting = await db.query.settings.findFirst({ const setting = await db.query.settings.findFirst({
where: eq(settings.name, "staffApplications") where: ({ name }, { eq }) => eq(name, "staffApplications")
}) })
const status = setting?.value || "0" const status = setting?.value || "0"
@@ -52,7 +51,7 @@ export default {
} }
const application = await db.query.staffApps.findFirst({ const application = await db.query.staffApps.findFirst({
where: eq(staffApps.userID, user.user.id) where: ({ userID }, { eq }) => eq(userID, user.user.id)
}) })
if (application) { if (application) {

View File

@@ -1,6 +1,5 @@
import { devMessage, embedColor, hypixelGuildID } from "config/options.js" import { devMessage, embedColor, hypixelGuildID } from "config/options.js"
import { GuildMember } from "discord.js" import { GuildMember } from "discord.js"
import { eq } from "drizzle-orm"
import { IModal } from "interfaces" import { IModal } from "interfaces"
import db from "src/db/db.js" import db from "src/db/db.js"
import { verifies } from "src/db/schema.js" import { verifies } from "src/db/schema.js"
@@ -17,7 +16,7 @@ export default {
const user = interaction.member as GuildMember const user = interaction.member as GuildMember
const ign = interaction.fields.fields.get("verifyign")!.value const ign = interaction.fields.fields.get("verifyign")!.value
const verifyData = await db.query.verifies.findFirst({ const verifyData = await db.query.verifies.findFirst({
where: eq(verifies.userID, user.user.id) where: ({ userID }, { eq }) => eq(userID, user.id)
}) })
if (verifyData) { if (verifyData) {
interaction.editReply("You are already verified.\n" + "Try running /update to update your roles.") interaction.editReply("You are already verified.\n" + "Try running /update to update your roles.")