feat: mongodb migrations

This commit is contained in:
2025-06-28 18:38:33 +02:00
parent ea1f8d96e0
commit e430d43f1d
19 changed files with 383 additions and 2 deletions

View File

@@ -9,7 +9,6 @@
- [x] /megamind - Megamind meme generator with canvas
- [x] /makesweet - Heart locket image generator
- [x] /a - Custom command with user autocomplete
- [ ] /cursivify - Context menu command to italicize text
## Miscellaneous Commands
- [ ] /rolemenu - Role selection menu (owner only)
@@ -68,3 +67,6 @@
- [ ] API integrations (TheCatAPI, TheDogAPI, Genius, etc.)
- [ ] Canvas-based image generation
- [ ] Modal forms and user input handling
# Other
- [ ] Figure out fonts

View File

@@ -10,10 +10,12 @@
"@sern/publisher": "^1.1.1",
"discord.js": "latest",
"dotenv": "^16.3.1",
"mongodb": "^6.17.0",
"sharp": "^0.34.2",
},
"devDependencies": {
"@sern/cli": "^1.4.0",
"@types/mongodb": "^4.0.7",
"@types/node": "^17.0.25",
"prisma": "^6.10.1",
"typescript": "^5.0",
@@ -131,6 +133,8 @@
"@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
"@mongodb-js/saslprep": ["@mongodb-js/saslprep@1.3.0", "", { "dependencies": { "sparse-bitfield": "^3.0.3" } }, "sha512-zlayKCsIjYb7/IdfqxorK5+xUMyi4vOKcFy10wKJYc63NSdKI8mNME+uJqfatkPmOSMMUiojrL58IePKBm3gvQ=="],
"@napi-rs/canvas": ["@napi-rs/canvas@0.1.72", "", { "optionalDependencies": { "@napi-rs/canvas-android-arm64": "0.1.72", "@napi-rs/canvas-darwin-arm64": "0.1.72", "@napi-rs/canvas-darwin-x64": "0.1.72", "@napi-rs/canvas-linux-arm-gnueabihf": "0.1.72", "@napi-rs/canvas-linux-arm64-gnu": "0.1.72", "@napi-rs/canvas-linux-arm64-musl": "0.1.72", "@napi-rs/canvas-linux-riscv64-gnu": "0.1.72", "@napi-rs/canvas-linux-x64-gnu": "0.1.72", "@napi-rs/canvas-linux-x64-musl": "0.1.72", "@napi-rs/canvas-win32-x64-msvc": "0.1.72" } }, "sha512-ypTJ/DXzsJbTU3o7qXFlWmZGgEbh42JWQl7v5/i+DJz/HURELcSnq9ler9e1ukqma70JzmCQcIseiE/Xs6sczw=="],
"@napi-rs/canvas-android-arm64": ["@napi-rs/canvas-android-arm64@0.1.72", "", { "os": "android", "cpu": "arm64" }, "sha512-OW99TDJEdfOhpJWQ7SXFsQi1BXd6UFuWM8AoQvJ0SQMHWY/iwuopmb1UqGV6Df9aM/SWxvCWBN/onjeCM8KVKQ=="],
@@ -185,8 +189,14 @@
"@types/luxon": ["@types/luxon@3.4.2", "", {}, "sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA=="],
"@types/mongodb": ["@types/mongodb@4.0.7", "", { "dependencies": { "mongodb": "*" } }, "sha512-lPUYPpzA43baXqnd36cZ9xxorprybxXDzteVKCPAdp14ppHtFJHnXYvNpmBvtMUTb5fKXVv6sVbzo1LHkWhJlw=="],
"@types/node": ["@types/node@17.0.45", "", {}, "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw=="],
"@types/webidl-conversions": ["@types/webidl-conversions@7.0.3", "", {}, "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA=="],
"@types/whatwg-url": ["@types/whatwg-url@11.0.5", "", { "dependencies": { "@types/webidl-conversions": "*" } }, "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ=="],
"@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="],
"@vladfrangu/async_event_emitter": ["@vladfrangu/async_event_emitter@2.4.6", "", {}, "sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA=="],
@@ -203,6 +213,8 @@
"brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
"bson": ["bson@6.10.4", "", {}, "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng=="],
"buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
"buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
@@ -305,6 +317,8 @@
"magic-bytes.js": ["magic-bytes.js@1.12.1", "", {}, "sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA=="],
"memory-pager": ["memory-pager@1.5.0", "", {}, "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="],
"merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
"mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="],
@@ -313,6 +327,10 @@
"minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
"mongodb": ["mongodb@6.17.0", "", { "dependencies": { "@mongodb-js/saslprep": "^1.1.9", "bson": "^6.10.4", "mongodb-connection-string-url": "^3.0.0" }, "peerDependencies": { "@aws-sdk/credential-providers": "^3.188.0", "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", "gcp-metadata": "^5.2.0", "kerberos": "^2.0.1", "mongodb-client-encryption": ">=6.0.0 <7", "snappy": "^7.2.2", "socks": "^2.7.1" }, "optionalPeers": ["@aws-sdk/credential-providers", "@mongodb-js/zstd", "gcp-metadata", "kerberos", "mongodb-client-encryption", "snappy", "socks"] }, "sha512-neerUzg/8U26cgruLysKEjJvoNSXhyID3RvzvdcpsIi2COYM3FS3o9nlH7fxFtefTb942dX3W9i37oPfCVj4wA=="],
"mongodb-connection-string-url": ["mongodb-connection-string-url@3.0.2", "", { "dependencies": { "@types/whatwg-url": "^11.0.2", "whatwg-url": "^14.1.0 || ^13.0.0" } }, "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA=="],
"npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="],
"onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="],
@@ -335,6 +353,8 @@
"prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
"punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
"readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="],
"resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
@@ -361,6 +381,8 @@
"source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="],
"sparse-bitfield": ["sparse-bitfield@3.0.3", "", { "dependencies": { "memory-pager": "^1.0.2" } }, "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ=="],
"stdin-discarder": ["stdin-discarder@0.1.0", "", { "dependencies": { "bl": "^5.0.0" } }, "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ=="],
"streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="],
@@ -377,6 +399,8 @@
"strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="],
"tr46": ["tr46@5.1.1", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw=="],
"ts-mixer": ["ts-mixer@6.0.4", "", {}, "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA=="],
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
@@ -389,6 +413,10 @@
"wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="],
"webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="],
"whatwg-url": ["whatwg-url@14.2.0", "", { "dependencies": { "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" } }, "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw=="],
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
"wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],

View File

@@ -23,10 +23,12 @@
"@sern/publisher": "^1.1.1",
"discord.js": "latest",
"dotenv": "^16.3.1",
"mongodb": "^6.17.0",
"sharp": "^0.34.2"
},
"devDependencies": {
"@sern/cli": "^1.4.0",
"@types/mongodb": "^4.0.7",
"@types/node": "^17.0.25",
"prisma": "^6.10.1",
"typescript": "^5.0"

View File

@@ -0,0 +1,15 @@
-- CreateTable
CREATE TABLE "ai_chats" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"messageid" TEXT NOT NULL,
"threadid" TEXT NOT NULL
);
-- CreateTable
CREATE TABLE "AIMessage" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"role" TEXT NOT NULL,
"content" TEXT NOT NULL,
"aiChatId" INTEGER NOT NULL,
CONSTRAINT "AIMessage_aiChatId_fkey" FOREIGN KEY ("aiChatId") REFERENCES "ai_chats" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
);

View File

@@ -0,0 +1,19 @@
/*
Warnings:
- You are about to drop the `AIMessage` table. If the table is not empty, all the data it contains will be lost.
*/
-- DropTable
PRAGMA foreign_keys=off;
DROP TABLE "AIMessage";
PRAGMA foreign_keys=on;
-- CreateTable
CREATE TABLE "AiMessage" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"role" TEXT NOT NULL,
"content" TEXT NOT NULL,
"aiChatId" INTEGER NOT NULL,
CONSTRAINT "AiMessage_aiChatId_fkey" FOREIGN KEY ("aiChatId") REFERENCES "ai_chats" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
);

View File

@@ -0,0 +1,33 @@
/*
Warnings:
- You are about to drop the `ai_chats` table. If the table is not empty, all the data it contains will be lost.
*/
-- DropTable
PRAGMA foreign_keys=off;
DROP TABLE "ai_chats";
PRAGMA foreign_keys=on;
-- CreateTable
CREATE TABLE "AiChat" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"messageid" TEXT NOT NULL,
"threadid" TEXT NOT NULL
);
-- RedefineTables
PRAGMA defer_foreign_keys=ON;
PRAGMA foreign_keys=OFF;
CREATE TABLE "new_AiMessage" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"role" TEXT NOT NULL,
"content" TEXT NOT NULL,
"aiChatId" INTEGER NOT NULL,
CONSTRAINT "AiMessage_aiChatId_fkey" FOREIGN KEY ("aiChatId") REFERENCES "AiChat" ("id") ON DELETE RESTRICT ON UPDATE CASCADE
);
INSERT INTO "new_AiMessage" ("aiChatId", "content", "id", "role") SELECT "aiChatId", "content", "id", "role" FROM "AiMessage";
DROP TABLE "AiMessage";
ALTER TABLE "new_AiMessage" RENAME TO "AiMessage";
PRAGMA foreign_keys=ON;
PRAGMA defer_foreign_keys=OFF;

View File

@@ -0,0 +1,10 @@
-- CreateTable
CREATE TABLE "Afk" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"userId" TEXT NOT NULL,
"reason" TEXT NOT NULL,
"expiresAt" DATETIME NOT NULL
);
-- CreateIndex
CREATE UNIQUE INDEX "Afk_userId_key" ON "Afk"("userId");

View File

@@ -0,0 +1,12 @@
/*
Warnings:
- A unique constraint covering the columns `[messageid]` on the table `AiChat` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[threadid]` on the table `AiChat` will be added. If there are existing duplicate values, this will fail.
*/
-- CreateIndex
CREATE UNIQUE INDEX "AiChat_messageid_key" ON "AiChat"("messageid");
-- CreateIndex
CREATE UNIQUE INDEX "AiChat_threadid_key" ON "AiChat"("threadid");

View File

@@ -0,0 +1,20 @@
/*
Warnings:
- You are about to drop the column `expiresAt` on the `Afk` table. All the data in the column will be lost.
*/
-- RedefineTables
PRAGMA defer_foreign_keys=ON;
PRAGMA foreign_keys=OFF;
CREATE TABLE "new_Afk" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"userId" TEXT NOT NULL,
"reason" TEXT NOT NULL
);
INSERT INTO "new_Afk" ("id", "reason", "userId") SELECT "id", "reason", "userId" FROM "Afk";
DROP TABLE "Afk";
ALTER TABLE "new_Afk" RENAME TO "Afk";
CREATE UNIQUE INDEX "Afk_userId_key" ON "Afk"("userId");
PRAGMA foreign_keys=ON;
PRAGMA defer_foreign_keys=OFF;

View File

@@ -0,0 +1,10 @@
-- CreateTable
CREATE TABLE "Birthday" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"userId" TEXT NOT NULL,
"date" TEXT NOT NULL,
"sent" BOOLEAN NOT NULL DEFAULT false
);
-- CreateIndex
CREATE UNIQUE INDEX "Birthday_userId_key" ON "Birthday"("userId");

View File

@@ -0,0 +1,12 @@
-- CreateTable
CREATE TABLE "Suggestion" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"userId" TEXT NOT NULL,
"msgId" TEXT NOT NULL
);
-- CreateIndex
CREATE UNIQUE INDEX "Suggestion_userId_key" ON "Suggestion"("userId");
-- CreateIndex
CREATE UNIQUE INDEX "Suggestion_msgId_key" ON "Suggestion"("msgId");

View File

@@ -0,0 +1,22 @@
/*
Warnings:
- Added the required column `upDown` to the `Suggestion` table without a default value. This is not possible if the table is not empty.
*/
-- RedefineTables
PRAGMA defer_foreign_keys=ON;
PRAGMA foreign_keys=OFF;
CREATE TABLE "new_Suggestion" (
"id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
"userId" TEXT NOT NULL,
"msgId" TEXT NOT NULL,
"upDown" INTEGER NOT NULL
);
INSERT INTO "new_Suggestion" ("id", "msgId", "userId") SELECT "id", "msgId", "userId" FROM "Suggestion";
DROP TABLE "Suggestion";
ALTER TABLE "new_Suggestion" RENAME TO "Suggestion";
CREATE UNIQUE INDEX "Suggestion_userId_key" ON "Suggestion"("userId");
CREATE UNIQUE INDEX "Suggestion_msgId_key" ON "Suggestion"("msgId");
PRAGMA foreign_keys=ON;
PRAGMA defer_foreign_keys=OFF;

View File

@@ -0,0 +1,2 @@
-- DropIndex
DROP INDEX "Suggestion_userId_key";

View File

@@ -0,0 +1,2 @@
-- DropIndex
DROP INDEX "Suggestion_msgId_key";

View File

@@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (e.g., Git)
provider = "sqlite"

View File

@@ -13,3 +13,40 @@ datasource db {
provider = "sqlite"
url = "file:./vinci.db"
}
model AiChat {
id Int @id @default(autoincrement())
messageid String @unique
threadid String @unique
messages AiMessage[]
}
model AiMessage {
id Int @id @default(autoincrement())
role String
content String
aiChatId Int
aiChat AiChat @relation(fields: [aiChatId], references: [id])
}
model Afk {
id Int @id @default(autoincrement())
userId String @unique
reason String
}
model Birthday {
id Int @id @default(autoincrement())
userId String @unique
date String
sent Boolean @default(false)
}
model Suggestion {
id Int @id @default(autoincrement())
userId String
msgId String
upDown Int
}

View File

@@ -25,6 +25,7 @@ export default commandModule({
'A lo mejor',
'No cuentes con ello',
'Buena suerte',
'No lo creo',
];
await ctx.reply({
content: `La bola tiene respuesta: ${

View File

@@ -1,7 +1,7 @@
// command of the year
import { commandModule, CommandType } from '@sern/handler';
import { ApplicationCommandOptionType } from 'discord.js';
import { ActionRowBuilder, ApplicationCommandOptionType, ButtonBuilder, ButtonStyle } from 'discord.js';
export default commandModule({
type: CommandType.Slash,
@@ -16,8 +16,16 @@ export default commandModule({
execute: async (ctx) => {
const query = ctx.options.getString('query', true);
const url = `https://google.com/search?q=${encodeURIComponent(query)}`;
const button = new ActionRowBuilder<ButtonBuilder>().addComponents(
new ButtonBuilder()
.setLabel('abrir enlace')
.setStyle(ButtonStyle.Link)
.setURL(url),
)
await ctx.reply({
content: `<${url}>`,
components: [button],
});
},
});

View File

@@ -0,0 +1,143 @@
import { Db, MongoClient } from 'mongodb';
import 'dotenv/config';
import prisma from './index';
export async function migrateMongo(
uri: string,
dbName: string,
migrationScript: (db: Db) => Promise<void>
): Promise<void> {
const client = new MongoClient(uri);
try {
await client.connect();
const db = client.db(dbName);
await migrationScript(db);
} catch (error) {
console.error('Migration failed:', error);
} finally {
await client.close();
}
}
if ((await prisma.aiChat.count()) === 0) {
console.log('aichat');
migrateMongo(process.env.MONGODB!, 'vinci', async (db) => {
// chatgpt logic
const aiChat = (await db.collection('chatgpt').find().toArray()) as unknown as ChatGPT[];
for (const chat of aiChat) {
await prisma.aiChat.create({
data: {
messageid: chat.messageid,
threadid: chat.threadid,
messages: {
create: chat.messages.map((message) => ({
role: message.role,
content: message.content,
})),
},
},
});
}
});
}
if ((await prisma.afk.count()) === 0) {
console.log('afk');
migrateMongo(process.env.MONGODB!, 'vinci', async (db) => {
// afk logic
const afk = (await db.collection('afk').find().toArray()) as unknown as AFK[];
await prisma.afk.createMany({
data: afk.map((afk) => ({
userId: afk.id,
reason: afk.reason,
})),
});
});
}
if ((await prisma.birthday.count()) === 0) {
console.log('birthday');
migrateMongo(process.env.MONGODB!, 'vinci', async (db) => {
// birthday logic
const birthdays = (await db.collection('birthdays').find().toArray()) as unknown as Birthday[];
const today = new Date();
const todayFormatted = `${today.getDate()}-${today.getMonth() + 1}`;
await prisma.birthday.createMany({
data: birthdays
.map((birthday) => {
if (todayFormatted !== birthday.date) {
birthday.alreadysent = false;
}
if (birthday.id === undefined) {
return null;
}
return {
userId: birthday.id,
date: birthday.date,
sent: birthday.alreadysent,
};
})
.filter((data) => data !== null),
});
});
}
if ((await prisma.suggestion.count()) === 0) {
console.log('suggestion');
migrateMongo(process.env.MONGODB!, 'vinci', async (db) => {
// suggestion logic
const suggestions = (await db
.collection('suggestions')
.find()
.toArray()) as unknown as Suggestion[];
await prisma.suggestion.createMany({
data: suggestions.map((suggestion) => {
if (suggestion.upordown === undefined) {
return null;
}
return {
userId: suggestion.userid,
msgId: suggestion.msgid,
upDown: suggestion.upordown,
};
}).filter((data) => data !== null),
});
});
}
type ChatGPT = {
_id: string;
messageid: string;
threadid: string;
messages: AIMessage[];
};
type AIMessage = {
_id: string;
role: string;
content: string;
};
type AFK = {
_id: string;
id: string;
reason: string;
};
type Birthday = {
_id: string;
id: string;
date: string;
alreadysent: boolean;
};
type Suggestion = {
_id: string;
userid: string;
msgid: string;
upordown: number;
};