From 934af0a1e80f70a59c300a200d978bd8a5ef46e5 Mon Sep 17 00:00:00 2001 From: Yusur Princeps Date: Fri, 20 Feb 2026 17:05:40 +0100 Subject: [PATCH 1/7] 0.3.1 updated package-lock --- CHANGELOG.md | 4 +++ package-lock.json | 75 ++++++++++++++++++++++++----------------------- 2 files changed, 43 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5a23f3..5382b23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 0.3.1 (February 20, 2026) + +* Updated package-lock.json + ## 0.3.0 (February 20, 2026) * Now the bot may show list of server the bot is in at startup, given the flag `GUILD_DETAIL_SHOW=1` in env. diff --git a/package-lock.json b/package-lock.json index 9393cd6..ae1e9be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sknsybot", - "version": "0.3.0-dev27", + "version": "0.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sknsybot", - "version": "0.3.0-dev27", + "version": "0.3.0", "license": "Apache-2.0", "dependencies": { "chalk": "^5.4.1", @@ -39,15 +39,15 @@ } }, "node_modules/@discordjs/builders": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.11.3.tgz", - "integrity": "sha512-p3kf5eV49CJiRTfhtutUCeivSyQ/l2JlKodW1ZquRwwvlOWmG9+6jFShX6x8rUiYhnP6wKI96rgN/SXMy5e5aw==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.13.1.tgz", + "integrity": "sha512-cOU0UDHc3lp/5nKByDxkmRiNZBpdp0kx55aarbiAfakfKJHlxv/yFW1zmIqCAmwH5CRlrH9iMFKJMpvW4DPB+w==", "license": "Apache-2.0", "dependencies": { - "@discordjs/formatters": "^0.6.1", - "@discordjs/util": "^1.1.1", + "@discordjs/formatters": "^0.6.2", + "@discordjs/util": "^1.2.0", "@sapphire/shapeshift": "^4.0.0", - "discord-api-types": "^0.38.16", + "discord-api-types": "^0.38.33", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.4", "tslib": "^2.6.3" @@ -69,12 +69,12 @@ } }, "node_modules/@discordjs/formatters": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.1.tgz", - "integrity": "sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.6.2.tgz", + "integrity": "sha512-y4UPwWhH6vChKRkGdMB4odasUbHOUwy7KL+OVwF86PvT6QVOwElx+TiI1/6kcmcEe+g5YRXJFiXSXUdabqZOvQ==", "license": "Apache-2.0", "dependencies": { - "discord-api-types": "^0.38.1" + "discord-api-types": "^0.38.33" }, "engines": { "node": ">=16.11.0" @@ -84,9 +84,9 @@ } }, "node_modules/@discordjs/rest": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.5.1.tgz", - "integrity": "sha512-Tg9840IneBcbrAjcGaQzHUJWFNq1MMWZjTdjJ0WS/89IffaNKc++iOvffucPxQTF/gviO9+9r8kEPea1X5J2Dw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.6.0.tgz", + "integrity": "sha512-RDYrhmpB7mTvmCKcpj+pc5k7POKszS4E2O9TYc+U+Y4iaCP+r910QdO43qmpOja8LRr1RJ0b3U+CqVsnPqzf4w==", "license": "Apache-2.0", "dependencies": { "@discordjs/collection": "^2.1.1", @@ -94,7 +94,7 @@ "@sapphire/async-queue": "^1.5.3", "@sapphire/snowflake": "^3.5.3", "@vladfrangu/async_event_emitter": "^2.4.6", - "discord-api-types": "^0.38.1", + "discord-api-types": "^0.38.16", "magic-bytes.js": "^1.10.0", "tslib": "^2.6.3", "undici": "6.21.3" @@ -119,10 +119,13 @@ } }, "node_modules/@discordjs/util": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.1.tgz", - "integrity": "sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.2.0.tgz", + "integrity": "sha512-3LKP7F2+atl9vJFhaBjn4nOaSWahZ/yWjOvA4e5pnXkt2qyXRCHLxoBQy81GFtLGCq7K9lPm9R517M1U+/90Qg==", "license": "Apache-2.0", + "dependencies": { + "discord-api-types": "^0.38.33" + }, "engines": { "node": ">=18" }, @@ -835,9 +838,9 @@ } }, "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -845,28 +848,28 @@ } }, "node_modules/discord-api-types": { - "version": "0.38.20", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.20.tgz", - "integrity": "sha512-wJSmFFi8eoFL/jIosUQLoXeCv7YK+l7joKmFCsnkx7HWSFt5xScNQdhvILLxC0oU6J5bK0ppR7GZ1d4NJScSNQ==", + "version": "0.38.40", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.40.tgz", + "integrity": "sha512-P/His8cotqZgQqrt+hzrocp9L8RhQQz1GkrCnC9TMJ8Uw2q0tg8YyqJyGULxhXn/8kxHETN4IppmOv+P2m82lQ==", "license": "MIT", "workspaces": [ "scripts/actions/documentation" ] }, "node_modules/discord.js": { - "version": "14.21.0", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.21.0.tgz", - "integrity": "sha512-U5w41cEmcnSfwKYlLv5RJjB8Joa+QJyRwIJz5i/eg+v2Qvv6EYpCRhN9I2Rlf0900LuqSDg8edakUATrDZQncQ==", + "version": "14.25.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.25.1.tgz", + "integrity": "sha512-2l0gsPOLPs5t6GFZfQZKnL1OJNYFcuC/ETWsW4VtKVD/tg4ICa9x+jb9bkPffkMdRpRpuUaO/fKkHCBeiCKh8g==", "license": "Apache-2.0", "dependencies": { - "@discordjs/builders": "^1.11.2", + "@discordjs/builders": "^1.13.0", "@discordjs/collection": "1.5.3", - "@discordjs/formatters": "^0.6.1", - "@discordjs/rest": "^2.5.1", - "@discordjs/util": "^1.1.1", + "@discordjs/formatters": "^0.6.2", + "@discordjs/rest": "^2.6.0", + "@discordjs/util": "^1.2.0", "@discordjs/ws": "^1.2.3", "@sapphire/snowflake": "3.5.3", - "discord-api-types": "^0.38.1", + "discord-api-types": "^0.38.33", "fast-deep-equal": "3.1.3", "lodash.snakecase": "4.1.1", "magic-bytes.js": "^1.10.0", @@ -1031,9 +1034,9 @@ "license": "MIT" }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "license": "MIT" }, "node_modules/lodash.snakecase": { From 3f13fe1ec09bbb2949b5ef4d4df52a3b5e18ec4e Mon Sep 17 00:00:00 2001 From: Yusur Princeps Date: Fri, 20 Feb 2026 18:11:03 +0100 Subject: [PATCH 2/7] 0.3.2 fixed wiki loading non-existent pages, added Wikicord and Italian Mapping Wiki as sources --- CHANGELOG.md | 5 +++++ package.json | 2 +- src/bot.ts | 6 +++++- src/commands/wiki.ts | 26 ++++++++++++++++++++++---- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5382b23..48671ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 0.3.2 (February 20, 2026) + +* Fixed `/wiki` loading non-existent pages. +* Added [Wikicord](https://wikicord.wikioasis.org/) and [Italian Mapping Wiki](https://it.mappingwiki.org/) as sources for `/wiki`. + ## 0.3.1 (February 20, 2026) * Updated package-lock.json diff --git a/package.json b/package.json index bc00975..7556119 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sknsybot", - "version": "0.3.0", + "version": "0.3.2", "private": true, "description": "", "license": "Apache-2.0", diff --git a/src/bot.ts b/src/bot.ts index 5174e8b..86bee5f 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -16,7 +16,7 @@ limitations under the License. import "./initConfig"; -import { GatewayIntentBits, Events, Interaction, ChatInputCommandInteraction, Guild } from 'discord.js'; +import { GatewayIntentBits, Events, Interaction, ChatInputCommandInteraction, Guild, MessageFlags } from 'discord.js'; import { MyClient } from './client'; import commandList from './commandList'; @@ -43,6 +43,10 @@ client.on(Events.InteractionCreate, async (interaction: Interaction) => { } catch (ex) { console.error(`${chalk.red('Error in command')} ${chalk.bold(`/${commandName}`)}`); console.error(ex); + await interaction.followUp({ + content: `Errore nel comando /${commandName}. Contattare l'amministratore del bot.`, + ephemeral: true + }); } } }); diff --git a/src/commands/wiki.ts b/src/commands/wiki.ts index 4dcd039..3385271 100644 --- a/src/commands/wiki.ts +++ b/src/commands/wiki.ts @@ -5,11 +5,21 @@ const pageSources = { 'cittadeldank': { url: 'https://wiki.cittadeldank.it', name: 'Città del Dank' + }, + 'wikicord': { + url: 'https://wikicord.wikioasis.org/api.php', + name: 'Wikicord' + }, + 'mappingwikiit': { + url: 'https://it.mappingwiki.org', + name: 'Mapping Wiki IT' } } const pageSourcesAuto = [ - 'cittadeldank' + 'cittadeldank', + 'wikicord', + 'mappingwikiit' ]; const data = new SlashCommandBuilder() @@ -23,6 +33,8 @@ const data = new SlashCommandBuilder() .setDescription('Dove guardare') .addChoices([ {name: 'Città del Dank', value: 'cittadeldank'}, + {name: 'Wikicord', value: 'wikicord'}, + {name: 'Mapping Wiki IT', value: 'mappingwikiit'}, {name: 'Automatico', value: 'auto'} ]) .setRequired(false) @@ -45,7 +57,13 @@ async function execute (interaction: ChatInputCommandInteraction) { if (siteChoice === 'auto') { for (let site of pageSourcesAuto) { - pageData = await fetchPageFromSite(site, pageName); + try { + pageData = await fetchPageFromSite(site, pageName); + } catch (error) { + console.warn(`Skipping source ${site}: ${error}`); + continue; + } + if (pageData) break; } } else { @@ -57,7 +75,7 @@ async function execute (interaction: ChatInputCommandInteraction) { const pageEmbed = new EmbedBuilder() .setTitle(pageData.title) .setURL(pageData.url) - .setDescription(pageData.summary) + .setDescription(pageData.summary || '...') .setFooter({ text: `Informazioni da ${pageData.origin}` }); @@ -71,7 +89,7 @@ async function execute (interaction: ChatInputCommandInteraction) { }); } else { await interaction.followUp({ - content: `Pagina **${pageName}** non trovata` + content: `Pagina **${pageName}** non trovata!` }); } From 5b98a2e98a7cb4fd690b6b6e1d11f0eb9670788b Mon Sep 17 00:00:00 2001 From: Yusur Princeps Date: Wed, 25 Feb 2026 10:46:15 +0100 Subject: [PATCH 3/7] 0.4.0b1 add database and /userinfo (incomplete) --- .gitignore | 2 +- CHANGELOG.md | 5 + drizzle.config.ts | 14 + drizzle/0000_strange_fabian_cortez.sql | 26 + drizzle/meta/0000_snapshot.json | 183 +++++ drizzle/meta/_journal.json | 13 + package-lock.json | 1004 +++++++++++++++++++----- package.json | 8 +- src/bot.ts | 2 +- src/commandList.ts | 3 +- src/commands/userinfo.ts | 38 + src/cron/calendar.ts | 9 - src/database.ts | 19 - src/db/database.ts | 16 + src/db/schema.ts | 38 + src/db/users.ts | 37 + src/initConfig.ts | 5 +- src/main.ts | 15 +- 18 files changed, 1194 insertions(+), 243 deletions(-) create mode 100644 drizzle.config.ts create mode 100644 drizzle/0000_strange_fabian_cortez.sql create mode 100644 drizzle/meta/0000_snapshot.json create mode 100644 drizzle/meta/_journal.json create mode 100644 src/commands/userinfo.ts delete mode 100644 src/cron/calendar.ts delete mode 100644 src/database.ts create mode 100644 src/db/database.ts create mode 100644 src/db/schema.ts create mode 100644 src/db/users.ts diff --git a/.gitignore b/.gitignore index 8962c6c..2ffd3b8 100644 --- a/.gitignore +++ b/.gitignore @@ -24,4 +24,4 @@ dist/ .err .vscode /run.sh -drizzle + diff --git a/CHANGELOG.md b/CHANGELOG.md index 48671ca..358f851 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 0.4.0 (TBA) + +* Switched database to PostgreSQL +* Added `/userinfo` command and balance + ## 0.3.2 (February 20, 2026) * Fixed `/wiki` loading non-existent pages. diff --git a/drizzle.config.ts b/drizzle.config.ts new file mode 100644 index 0000000..343b840 --- /dev/null +++ b/drizzle.config.ts @@ -0,0 +1,14 @@ +import { configDotenv } from "dotenv"; + +configDotenv(); + +import { defineConfig } from "drizzle-kit"; + + +export default defineConfig({ + dialect: 'postgresql', + schema: './src/db/schema.ts', + dbCredentials: { + url: process.env.DATABASE_URL! + } +}); diff --git a/drizzle/0000_strange_fabian_cortez.sql b/drizzle/0000_strange_fabian_cortez.sql new file mode 100644 index 0000000..f54b1ed --- /dev/null +++ b/drizzle/0000_strange_fabian_cortez.sql @@ -0,0 +1,26 @@ +CREATE TABLE "balances" ( + "userId" integer, + "guildId" integer, + "balance" bigint DEFAULT 0::bigint, + "lastMessageHour" integer, + CONSTRAINT "balances_userId_guildId_pk" PRIMARY KEY("userId","guildId") +); +--> statement-breakpoint +CREATE TABLE "guilds" ( + "id" serial PRIMARY KEY NOT NULL, + "discordId" bigint, + "displayName" varchar(80), + CONSTRAINT "guilds_discordId_unique" UNIQUE("discordId") +); +--> statement-breakpoint +CREATE TABLE "users" ( + "id" serial PRIMARY KEY NOT NULL, + "discordId" bigint, + "username" varchar(34), + "displayName" varchar(64), + "reputation" smallint DEFAULT 0, + CONSTRAINT "users_discordId_unique" UNIQUE("discordId") +); +--> statement-breakpoint +ALTER TABLE "balances" ADD CONSTRAINT "balances_userId_users_id_fk" FOREIGN KEY ("userId") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "balances" ADD CONSTRAINT "balances_guildId_guilds_id_fk" FOREIGN KEY ("guildId") REFERENCES "public"."guilds"("id") ON DELETE no action ON UPDATE no action; \ No newline at end of file diff --git a/drizzle/meta/0000_snapshot.json b/drizzle/meta/0000_snapshot.json new file mode 100644 index 0000000..331d226 --- /dev/null +++ b/drizzle/meta/0000_snapshot.json @@ -0,0 +1,183 @@ +{ + "id": "4602e85b-a3cf-4168-881e-a95e9316f325", + "prevId": "00000000-0000-0000-0000-000000000000", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.balances": { + "name": "balances", + "schema": "", + "columns": { + "userId": { + "name": "userId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "guildId": { + "name": "guildId", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "balance": { + "name": "balance", + "type": "bigint", + "primaryKey": false, + "notNull": false, + "default": "0::bigint" + }, + "lastMessageHour": { + "name": "lastMessageHour", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "balances_userId_users_id_fk": { + "name": "balances_userId_users_id_fk", + "tableFrom": "balances", + "tableTo": "users", + "columnsFrom": [ + "userId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "balances_guildId_guilds_id_fk": { + "name": "balances_guildId_guilds_id_fk", + "tableFrom": "balances", + "tableTo": "guilds", + "columnsFrom": [ + "guildId" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "balances_userId_guildId_pk": { + "name": "balances_userId_guildId_pk", + "columns": [ + "userId", + "guildId" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.guilds": { + "name": "guilds", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "discordId": { + "name": "discordId", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "displayName": { + "name": "displayName", + "type": "varchar(80)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "guilds_discordId_unique": { + "name": "guilds_discordId_unique", + "nullsNotDistinct": false, + "columns": [ + "discordId" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "serial", + "primaryKey": true, + "notNull": true + }, + "discordId": { + "name": "discordId", + "type": "bigint", + "primaryKey": false, + "notNull": false + }, + "username": { + "name": "username", + "type": "varchar(34)", + "primaryKey": false, + "notNull": false + }, + "displayName": { + "name": "displayName", + "type": "varchar(64)", + "primaryKey": false, + "notNull": false + }, + "reputation": { + "name": "reputation", + "type": "smallint", + "primaryKey": false, + "notNull": false, + "default": 0 + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_discordId_unique": { + "name": "users_discordId_unique", + "nullsNotDistinct": false, + "columns": [ + "discordId" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json new file mode 100644 index 0000000..bb36d6f --- /dev/null +++ b/drizzle/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "postgresql", + "entries": [ + { + "idx": 0, + "version": "7", + "when": 1771929740316, + "tag": "0000_strange_fabian_cortez", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ae1e9be..a1a8e06 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,25 +1,27 @@ { "name": "sknsybot", - "version": "0.3.0", + "version": "0.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sknsybot", - "version": "0.3.0", + "version": "0.4.0", "license": "Apache-2.0", "dependencies": { "chalk": "^5.4.1", "discord.js": "^14.14.1", "dotenv": "^16.4.7", - "mysql": "^2.18.1", - "mysql2": "^3.12.0", + "drizzle-orm": "^0.45.1", "node-cron": "^3.0.3", + "pg": "^8.18.0", "wikijs": "^6.4.1" }, "devDependencies": { "@types/node": "^22.10.7", "@types/node-cron": "^3.0.11", + "@types/pg": "^8.16.0", + "drizzle-kit": "^0.31.9", "ts-node": "^10.9.2", "tsx": "^4.19.2", "typescript": "^5.7.3" @@ -168,6 +170,449 @@ "url": "https://github.com/discordjs/discord.js?sponsor" } }, + "node_modules/@drizzle-team/brocli": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz", + "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@esbuild-kit/core-utils": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", + "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", + "deprecated": "Merged into tsx: https://tsx.is", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.18.20", + "source-map-support": "^0.5.21" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/@esbuild-kit/esm-loader": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", + "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", + "deprecated": "Merged into tsx: https://tsx.is", + "dev": true, + "license": "MIT", + "dependencies": { + "@esbuild-kit/core-utils": "^3.3.2", + "get-tsconfig": "^4.7.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", @@ -715,6 +1160,18 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/pg": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.16.0.tgz", + "integrity": "sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, "node_modules/@types/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", @@ -767,23 +1224,12 @@ "dev": true, "license": "MIT" }, - "node_modules/aws-ssl-profiles": { + "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", - "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/bignumber.js": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", - "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", - "license": "MIT", - "engines": { - "node": "*" - } + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" }, "node_modules/camelcase": { "version": "4.1.0", @@ -806,12 +1252,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -828,13 +1268,22 @@ "node-fetch": "^2.7.0" } }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "license": "Apache-2.0", + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=0.10" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/diff": { @@ -895,6 +1344,147 @@ "url": "https://dotenvx.com" } }, + "node_modules/drizzle-kit": { + "version": "0.31.9", + "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.9.tgz", + "integrity": "sha512-GViD3IgsXn7trFyBUUHyTFBpH/FsHTxYJ66qdbVggxef4UBPHRYxQaRzYLTuekYnk9i5FIEL9pbBIwMqX/Uwrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@drizzle-team/brocli": "^0.10.2", + "@esbuild-kit/esm-loader": "^2.5.5", + "esbuild": "^0.25.4", + "esbuild-register": "^3.5.0" + }, + "bin": { + "drizzle-kit": "bin.cjs" + } + }, + "node_modules/drizzle-orm": { + "version": "0.45.1", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.1.tgz", + "integrity": "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA==", + "license": "Apache-2.0", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=4", + "@electric-sql/pglite": ">=0.2.0", + "@libsql/client": ">=0.10.0", + "@libsql/client-wasm": ">=0.10.0", + "@neondatabase/serverless": ">=0.10.0", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1.13", + "@prisma/client": "*", + "@tidbcloud/serverless": "*", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/sql.js": "*", + "@upstash/redis": ">=1.34.7", + "@vercel/postgres": ">=0.8.0", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=14.0.0", + "gel": ">=2", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "sql.js": ">=1", + "sqlite3": ">=5" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@libsql/client-wasm": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@prisma/client": { + "optional": true + }, + "@tidbcloud/serverless": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "gel": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "prisma": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, "node_modules/esbuild": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", @@ -937,6 +1527,19 @@ "@esbuild/win32-x64": "0.25.9" } }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -958,15 +1561,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "license": "MIT", - "dependencies": { - "is-property": "^1.0.2" - } - }, "node_modules/get-tsconfig": { "version": "4.8.1", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", @@ -990,18 +1584,6 @@ "npm": ">=5.3.0" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/infobox-parser": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/infobox-parser/-/infobox-parser-3.6.2.tgz", @@ -1015,24 +1597,6 @@ "url": "https://www.buymeacoffee.com/2tmRKi9" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==", - "license": "MIT" - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, "node_modules/lodash": { "version": "4.17.23", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", @@ -1045,36 +1609,6 @@ "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", "license": "MIT" }, - "node_modules/long": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", - "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==", - "license": "Apache-2.0" - }, - "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/lru.min": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.1.tgz", - "integrity": "sha512-FbAj6lXil6t8z4z3j0E5mfRlPzxkySotzUHwRXjlpRh10vc6AI6WN62ehZj82VG7M20rqogJ0GLwar2Xa05a8Q==", - "license": "MIT", - "engines": { - "bun": ">=1.0.0", - "deno": ">=1.30.0", - "node": ">=8.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wellwelwel" - } - }, "node_modules/magic-bytes.js": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.12.1.tgz", @@ -1088,61 +1622,12 @@ "dev": true, "license": "ISC" }, - "node_modules/mysql": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", - "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", - "license": "MIT", - "dependencies": { - "bignumber.js": "9.0.0", - "readable-stream": "2.3.7", - "safe-buffer": "5.1.2", - "sqlstring": "2.3.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mysql2": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.12.0.tgz", - "integrity": "sha512-C8fWhVysZoH63tJbX8d10IAoYCyXy4fdRFz2Ihrt9jtPILYynFEKUUzpp1U7qxzDc3tMbotvaBH+sl6bFnGZiw==", - "license": "MIT", - "dependencies": { - "aws-ssl-profiles": "^1.1.1", - "denque": "^2.1.0", - "generate-function": "^2.3.1", - "iconv-lite": "^0.6.3", - "long": "^5.2.1", - "lru.min": "^1.0.0", - "named-placeholders": "^1.1.3", - "seq-queue": "^0.0.5", - "sqlstring": "^2.3.2" - }, - "engines": { - "node": ">= 8.0" - } - }, - "node_modules/mysql2/node_modules/sqlstring": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", - "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/named-placeholders": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", - "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", - "license": "MIT", - "dependencies": { - "lru-cache": "^7.14.1" - }, - "engines": { - "node": ">=12.0.0" - } + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/node-cron": { "version": "3.0.3", @@ -1176,25 +1661,132 @@ } } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "node_modules/pg": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.18.0.tgz", + "integrity": "sha512-xqrUDL1b9MbkydY/s+VZ6v+xiMUmOUk7SS9d/1kpyQxoJ6U9AO1oIJyUWVZojbfe5Cc/oluutcgFG4L9RDP1iQ==", "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "pg-connection-string": "^2.11.0", + "pg-pool": "^3.11.0", + "pg-protocol": "^1.11.0", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.3.0" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.3.0.tgz", + "integrity": "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.11.0.tgz", + "integrity": "sha512-kecgoJwhOpxYU21rZjULrmrBJ698U2RxXofKVzOn5UDj61BPj/qMb7diYUR1nLScCDbrztQFl1TaQZT0t1EtzQ==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.11.0.tgz", + "integrity": "sha512-MJYfvHwtGp870aeusDh+hg9apvOe2zmpZJpyt+BMtzUWlVqbhFmMK6bOBXLBUPd7iRtIF9fZplDc7KrPN3PN7w==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.11.0.tgz", + "integrity": "sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/resolve-pkg-maps": { @@ -1207,39 +1799,34 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" - }, - "node_modules/sqlstring": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", - "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", - "license": "MIT", + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" } }, "node_modules/tr46": { @@ -1353,12 +1940,6 @@ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "license": "MIT" }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, "node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -1430,6 +2011,15 @@ } } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index 7556119..6dfef07 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sknsybot", - "version": "0.3.2", + "version": "0.4.0.b1", "private": true, "description": "", "license": "Apache-2.0", @@ -15,14 +15,16 @@ "chalk": "^5.4.1", "discord.js": "^14.14.1", "dotenv": "^16.4.7", - "mysql": "^2.18.1", - "mysql2": "^3.12.0", + "drizzle-orm": "^0.45.1", "node-cron": "^3.0.3", + "pg": "^8.18.0", "wikijs": "^6.4.1" }, "devDependencies": { "@types/node": "^22.10.7", "@types/node-cron": "^3.0.11", + "@types/pg": "^8.16.0", + "drizzle-kit": "^0.31.9", "ts-node": "^10.9.2", "tsx": "^4.19.2", "typescript": "^5.7.3" diff --git a/src/bot.ts b/src/bot.ts index 86bee5f..023673c 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -16,7 +16,7 @@ limitations under the License. import "./initConfig"; -import { GatewayIntentBits, Events, Interaction, ChatInputCommandInteraction, Guild, MessageFlags } from 'discord.js'; +import { GatewayIntentBits, Events, Interaction, ChatInputCommandInteraction, Guild } from 'discord.js'; import { MyClient } from './client'; import commandList from './commandList'; diff --git a/src/commandList.ts b/src/commandList.ts index cf77105..a039650 100644 --- a/src/commandList.ts +++ b/src/commandList.ts @@ -18,6 +18,7 @@ import { ChatInputCommandInteraction, MessageFlags, SlashCommandBuilder } from ' import yroo from './commands/yroo'; import wiki from './commands/wiki'; import coal from './commands/coal'; +import userinfo from './commands/userinfo'; import version from './commands/version'; function fakeCommand(name: string, description?: string) { @@ -40,8 +41,8 @@ const commandList = [ wiki, coal, version, + userinfo, fakeCommand('dict', 'Cerca una parola nel dizionario nassiryota'), - fakeCommand('userinfo', 'Mostra informazioni sull\'utente'), fakeCommand('bible', 'Leggi un versetto della Bibbia'), fakeCommand('rllaw', 'Leggi un articolo della legge italiana') ]; diff --git a/src/commands/userinfo.ts b/src/commands/userinfo.ts new file mode 100644 index 0000000..c0f770a --- /dev/null +++ b/src/commands/userinfo.ts @@ -0,0 +1,38 @@ + + +import { ChatInputCommandInteraction, EmbedBuilder, SlashCommandBuilder } from 'discord.js'; +import { findUser } from '../db/users'; + +const data = new SlashCommandBuilder() + .setName("userinfo") + .setDescription("Informazioni su un utente") + .addUserOption((o) => o.setName("u") + .setDescription("L'utente") + .setRequired(true) + ) +; + +async function execute (interaction: ChatInputCommandInteraction) { + await interaction.deferReply(); + + const user = interaction.options.getUser("u"); + + const dbUser = await findUser({ + id: user.id, + username: user.username, + globalName: user.globalName + }); + + const uEmbed = new EmbedBuilder() + .setTitle(`${user.globalName} (@${user.username})`) + .setThumbnail(user.avatarURL()) + .addFields([ + {name: 'Bilancio', value: '', inline: true} + ]); + + await interaction.followUp({ + embeds: [uEmbed] + }) +} + +export default { data, execute }; diff --git a/src/cron/calendar.ts b/src/cron/calendar.ts deleted file mode 100644 index 5302aa5..0000000 --- a/src/cron/calendar.ts +++ /dev/null @@ -1,9 +0,0 @@ - - -import * as cron from 'node-cron'; - - -//cron.schedule('0 7 * * *', () => { -// // TODO send good morning to channel -//}); - diff --git a/src/database.ts b/src/database.ts deleted file mode 100644 index 85ed394..0000000 --- a/src/database.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* -Copyright 2025 Sakuragasaki46 - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - */ - - -// TODO - diff --git a/src/db/database.ts b/src/db/database.ts new file mode 100644 index 0000000..f2cf501 --- /dev/null +++ b/src/db/database.ts @@ -0,0 +1,16 @@ + +import { drizzle } from "drizzle-orm/node-postgres"; +import * as schema from "./schema"; +import { Pool } from "pg"; + +const client = new Pool({ + connectionString: process.env.DATABASE_URL! +}); + +export const db = drizzle({ + client, + casing: 'snake_case', + schema +}); + + diff --git a/src/db/schema.ts b/src/db/schema.ts new file mode 100644 index 0000000..039307e --- /dev/null +++ b/src/db/schema.ts @@ -0,0 +1,38 @@ + +import { sql } from "drizzle-orm"; +import * as p from "drizzle-orm/pg-core"; + + +export const users = p.pgTable('users', { + id: p.serial().primaryKey(), + discordId: p.bigint({mode: "bigint"}).unique(), + username: p.varchar({length: 34}), + displayName: p.varchar({length: 64}), + /** reputation values: + * 0 = unscreened + * 1 = exempt + * 2 = suspicious + * 3 = dangerous + */ + reputation: p.smallint().default(0) +}); + +export const guilds = p.pgTable('guilds', { + id: p.serial().primaryKey(), + discordId: p.bigint({mode: "bigint"}).unique(), + displayName: p.varchar(({length: 80})) + // TODO channel IDs +}); + +export const balances = p.pgTable('balances', { + userId: p.integer().references(() => users.id), + guildId: p.integer().references(() => guilds.id), + balance: p.bigint({mode: "bigint"}).default(sql`0::bigint`), + lastMessageHour: p.integer(), +}, (t) => [ + p.primaryKey({ + columns: [t.userId, t.guildId] + }) +]); + + diff --git a/src/db/users.ts b/src/db/users.ts new file mode 100644 index 0000000..584e786 --- /dev/null +++ b/src/db/users.ts @@ -0,0 +1,37 @@ +import { eq } from "drizzle-orm"; +import { db } from "./database"; +import { users } from "./schema"; + + +export type UserUpdate = { + id: string | bigint, + username: string + globalName: string +}; + +export type NewUser = typeof users.$inferInsert; + +export async function findUser (userData: UserUpdate) { + let user = await db.query.users.findFirst({ + where: () => eq(users.discordId, BigInt(userData.id)) + }) as NewUser; + + if (!user) { + // upsert the user + user = await db.insert(users).values({ + discordId: BigInt(userData.id), + username: userData.username, + displayName: userData.globalName, + } as NewUser).returning() as NewUser; + } else if ( + user.username !== userData.username || + user.displayName !== userData.globalName + ) { + await db.update(users).set({ + username: userData.username, + displayName: userData.globalName + }).where(eq(users.discordId, BigInt(userData.id))) + } + + return user; +} \ No newline at end of file diff --git a/src/initConfig.ts b/src/initConfig.ts index 32a521e..7a513ba 100644 --- a/src/initConfig.ts +++ b/src/initConfig.ts @@ -2,8 +2,11 @@ import { config as configDotenv } from 'dotenv'; - export default function init (){ configDotenv(); + + if (!process.env.DATABASE_URL) { + throw new Error('DATABASE_URL not set. Cowardly refusing to start up'); + } } diff --git a/src/main.ts b/src/main.ts index c9d26b1..18b0d1a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,7 +1,20 @@ -import client from "./bot"; + import init from "./initConfig"; init(); +import client from "./bot"; + +// query TEST +import { db } from "./db/database"; +import { count } from "drizzle-orm"; +import { users } from "./db/schema"; +import chalk from "chalk"; +(async function () { + const uCount = await db.select({ count: count() }).from(users); + console.log(`Watching over ${chalk.bold(uCount)} users`); +})().then(() => { }); +// END query TEST + client.login(process.env.TOKEN); From 9919e7483660ac1e9bd0949a3df555c6fb19e51c Mon Sep 17 00:00:00 2001 From: Yusur Princeps Date: Wed, 25 Feb 2026 11:59:17 +0100 Subject: [PATCH 4/7] 0.4.0b2 database fix (and dotenv loading) --- package-lock.json | 20 ++++++++++++++------ package.json | 5 +++-- src/db/database.ts | 19 +++++++++++++++++-- src/initConfig.ts | 3 ++- src/main.ts | 18 ++++++++++-------- src/mediawiki.ts | 4 +--- tsconfig.json | 2 ++ 7 files changed, 49 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index a1a8e06..a3b47f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,23 +1,24 @@ { "name": "sknsybot", - "version": "0.4.0", + "version": "0.4.0.b2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sknsybot", - "version": "0.4.0", + "version": "0.4.0.b2", "license": "Apache-2.0", "dependencies": { "chalk": "^5.4.1", "discord.js": "^14.14.1", - "dotenv": "^16.4.7", + "dotenv": "^17.3.1", "drizzle-orm": "^0.45.1", "node-cron": "^3.0.3", "pg": "^8.18.0", "wikijs": "^6.4.1" }, "devDependencies": { + "@types/chalk": "^0.4.31", "@types/node": "^22.10.7", "@types/node-cron": "^3.0.11", "@types/pg": "^8.16.0", @@ -1144,6 +1145,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/chalk": { + "version": "0.4.31", + "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz", + "integrity": "sha512-nF0fisEPYMIyfrFgabFimsz9Lnuu9MwkNrrlATm2E4E46afKDyeelT+8bXfw1VSc7sLBxMxRgT7PxTC2JcqN4Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "22.10.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz", @@ -1333,9 +1341,9 @@ } }, "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", "license": "BSD-2-Clause", "engines": { "node": ">=12" diff --git a/package.json b/package.json index 6dfef07..d4b3749 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sknsybot", - "version": "0.4.0.b1", + "version": "0.4.0.b2", "private": true, "description": "", "license": "Apache-2.0", @@ -14,13 +14,14 @@ "dependencies": { "chalk": "^5.4.1", "discord.js": "^14.14.1", - "dotenv": "^16.4.7", + "dotenv": "^17.3.1", "drizzle-orm": "^0.45.1", "node-cron": "^3.0.3", "pg": "^8.18.0", "wikijs": "^6.4.1" }, "devDependencies": { + "@types/chalk": "^0.4.31", "@types/node": "^22.10.7", "@types/node-cron": "^3.0.11", "@types/pg": "^8.16.0", diff --git a/src/db/database.ts b/src/db/database.ts index f2cf501..9d91033 100644 --- a/src/db/database.ts +++ b/src/db/database.ts @@ -3,13 +3,28 @@ import { drizzle } from "drizzle-orm/node-postgres"; import * as schema from "./schema"; import { Pool } from "pg"; +function urlToObj(url: string) { + if (!url) throw new Error('DATABASE_URL is not set'); + + const { username, password, hostname, port, pathname } = URL.parse(url); + + return { + user: username, + password, + host: hostname, + port: +(port || 5432), + database: pathname.split('/')[1] + } +} + + const client = new Pool({ - connectionString: process.env.DATABASE_URL! + ...urlToObj(process.env.DATABASE_URL!) }); export const db = drizzle({ client, - casing: 'snake_case', + // casing: 'snake_case', [DOES NOT WORK ON DRIZZLEKIT] schema }); diff --git a/src/initConfig.ts b/src/initConfig.ts index 7a513ba..64d3565 100644 --- a/src/initConfig.ts +++ b/src/initConfig.ts @@ -1,6 +1,7 @@ -import { config as configDotenv } from 'dotenv'; +import { configDotenv } from 'dotenv'; +import process from 'node:process'; export default function init (){ configDotenv(); diff --git a/src/main.ts b/src/main.ts index 18b0d1a..1fb4574 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,17 +1,19 @@ -import init from "./initConfig"; +import { configDotenv } from "dotenv"; -init(); +configDotenv(); // apparently init does not get executed + +const client = (await import("./bot")).default; -import client from "./bot"; // query TEST -import { db } from "./db/database"; -import { count } from "drizzle-orm"; -import { users } from "./db/schema"; -import chalk from "chalk"; (async function () { - const uCount = await db.select({ count: count() }).from(users); + // async imports because yes + const { db } = await import("./db/database"); + const { count } = await import("drizzle-orm"); + const { users } = await import("./db/schema"); + const chalk = (await import("chalk")).default; + const uCount = (await db.select({ count: count() }).from(users))[0].count; console.log(`Watching over ${chalk.bold(uCount)} users`); })().then(() => { }); // END query TEST diff --git a/src/mediawiki.ts b/src/mediawiki.ts index 69cb6c5..c8bddf8 100644 --- a/src/mediawiki.ts +++ b/src/mediawiki.ts @@ -14,8 +14,6 @@ function strToObjArr(s: string | object[]): object[] { export type SectionObject = {title: string, content: string}; -type WithPageId = {pageId: any}; - export class MediaWikiClient { apiUrl: string siteName: string | null @@ -29,7 +27,7 @@ export class MediaWikiClient { const wikiClient = wiki({ apiUrl: this.apiUrl, origin: null - }); + }) as any; const page = await wikiClient.page(title); const pageId = page.raw.pageid; const pageUrl = page.url(); diff --git a/tsconfig.json b/tsconfig.json index 5e79b6e..9efc68e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,7 @@ { "compilerOptions": { + "target": "es2017", + "module": "preserve", "rootDir": "src/", "outDir": "build/", "esModuleInterop": true, From ff6e132ab4daa70cd09775f251d5daf19722ba8a Mon Sep 17 00:00:00 2001 From: Yusur Princeps Date: Wed, 25 Feb 2026 12:06:46 +0100 Subject: [PATCH 5/7] 0.4.0.b3 remove initConfig --- package-lock.json | 4 ++-- package.json | 2 +- src/initConfig.ts | 13 ------------- src/main.ts | 2 +- src/register.ts | 6 ++++-- 5 files changed, 8 insertions(+), 19 deletions(-) delete mode 100644 src/initConfig.ts diff --git a/package-lock.json b/package-lock.json index a3b47f0..02c7c79 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sknsybot", - "version": "0.4.0.b2", + "version": "0.4.0.b3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sknsybot", - "version": "0.4.0.b2", + "version": "0.4.0.b3", "license": "Apache-2.0", "dependencies": { "chalk": "^5.4.1", diff --git a/package.json b/package.json index d4b3749..e910f52 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sknsybot", - "version": "0.4.0.b2", + "version": "0.4.0.b3", "private": true, "description": "", "license": "Apache-2.0", diff --git a/src/initConfig.ts b/src/initConfig.ts deleted file mode 100644 index 64d3565..0000000 --- a/src/initConfig.ts +++ /dev/null @@ -1,13 +0,0 @@ - - -import { configDotenv } from 'dotenv'; -import process from 'node:process'; - -export default function init (){ - configDotenv(); - - if (!process.env.DATABASE_URL) { - throw new Error('DATABASE_URL not set. Cowardly refusing to start up'); - } -} - diff --git a/src/main.ts b/src/main.ts index 1fb4574..bd3abb4 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,7 +1,7 @@ import { configDotenv } from "dotenv"; -configDotenv(); // apparently init does not get executed +configDotenv(); const client = (await import("./bot")).default; diff --git a/src/register.ts b/src/register.ts index b69a5bd..10430c6 100644 --- a/src/register.ts +++ b/src/register.ts @@ -14,12 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. */ -import init from "./initConfig"; + +import { configDotenv } from "dotenv"; + +configDotenv(); import commandList from "./commandList"; import { REST, Routes } from 'discord.js'; -init(); function registerGlobal(rest: REST, clientId: string, commands: any){ rest.put(Routes.applicationCommands(clientId), { body: commands }) From f71c7b0e3464120ee72c2117240f4dfb5a5f4876 Mon Sep 17 00:00:00 2001 From: Yusur Princeps Date: Wed, 25 Feb 2026 12:13:30 +0100 Subject: [PATCH 6/7] 0.4.0b4 register.ts does not need DATABASE_URL --- package-lock.json | 4 ++-- package.json | 2 +- src/db/database.ts | 5 ++++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 02c7c79..0193fd4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sknsybot", - "version": "0.4.0.b3", + "version": "0.4.0.b4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sknsybot", - "version": "0.4.0.b3", + "version": "0.4.0.b4", "license": "Apache-2.0", "dependencies": { "chalk": "^5.4.1", diff --git a/package.json b/package.json index e910f52..b093db1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sknsybot", - "version": "0.4.0.b3", + "version": "0.4.0.b4", "private": true, "description": "", "license": "Apache-2.0", diff --git a/src/db/database.ts b/src/db/database.ts index 9d91033..1b07f5e 100644 --- a/src/db/database.ts +++ b/src/db/database.ts @@ -4,7 +4,10 @@ import * as schema from "./schema"; import { Pool } from "pg"; function urlToObj(url: string) { - if (!url) throw new Error('DATABASE_URL is not set'); + if (!url) { + console.warn("DATABASE_URL is not set, expect the database to not connect"); + return null; + } const { username, password, hostname, port, pathname } = URL.parse(url); From 2334da36d342c1a7b8401e4e21fe911edfe74325 Mon Sep 17 00:00:00 2001 From: Yusur Princeps Date: Wed, 25 Feb 2026 12:19:14 +0100 Subject: [PATCH 7/7] 0.4.0b5 remove initConfig's last traces --- package-lock.json | 4 ++-- package.json | 2 +- src/bot.ts | 2 -- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0193fd4..87a0021 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sknsybot", - "version": "0.4.0.b4", + "version": "0.4.0.b5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sknsybot", - "version": "0.4.0.b4", + "version": "0.4.0.b5", "license": "Apache-2.0", "dependencies": { "chalk": "^5.4.1", diff --git a/package.json b/package.json index b093db1..5081e6f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sknsybot", - "version": "0.4.0.b4", + "version": "0.4.0.b5", "private": true, "description": "", "license": "Apache-2.0", diff --git a/src/bot.ts b/src/bot.ts index 023673c..7df5614 100644 --- a/src/bot.ts +++ b/src/bot.ts @@ -14,8 +14,6 @@ See the License for the specific language governing permissions and limitations under the License. */ -import "./initConfig"; - import { GatewayIntentBits, Events, Interaction, ChatInputCommandInteraction, Guild } from 'discord.js'; import { MyClient } from './client'; import commandList from './commandList';