diff --git a/.gitignore b/.gitignore index fdda6d8..8db8d77 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /node_modules .env package-lock.json -/src/badges \ No newline at end of file +/src/badges +/prisma \ No newline at end of file diff --git a/index.js b/index.js index 1b5c02c..59ad512 100644 --- a/index.js +++ b/index.js @@ -3,9 +3,9 @@ const fs = require("fs"); const redis = require("./src/functions/redis"); const sql = require("./src/functions/postgres"); const { createClient } = require("redis"); -const { Client } = require("pg"); const colors = require("colors"); -const { connect } = require("http2"); +const { PrismaClient } = require("@prisma/client"); +const { messageCount } = require("./src/functions/postgres"); colors.setTheme({ prompt: "grey", @@ -34,16 +34,13 @@ redisConnection .then(() => console.log("✔️ redis connected".info)) .catch((err) => console.error(err.stack.red)); -//postgresql connect -const client = new Client(); -client - .connect() - .then(() => console.log("✔️ postgres connected".info)) - .catch((err) => console.error(err.stack.red)); +//postgres connection +const client = new PrismaClient(); cl.cfg = require("./cfg.json"); cl.cmds = new discordjs.Collection(); +//cmds handler const cmdsFls = fs .readdirSync(`./src/cmds`) .filter((file) => file.endsWith(`.js`)); @@ -53,15 +50,20 @@ for (const Fl of cmdsFls) { cl.cmds.set(cmd.name, cmd); } +//command execution cl.on("messageCreate", async (msg) => { if (msg.author.bot) return; + + //exp if (!msg.content.startsWith(cl.cfg.prefix)) { + messageCount(client, msg.author.id); if (await redis.expCheck(msg.author.id, redisConnection)) { - sql.addExp(client, msg.author.id); - } else { - sql.messageCount(client, msg.author.id); + sql.addExp(client, msg.author.id, 10, 25); } + } else { + sql.messageCount(client, msg.author.id); } + const args = msg.content.slice(cl.cfg.prefix.length).trim().split(/ +/); const cmdName = args.shift().toLowerCase(); @@ -83,6 +85,7 @@ cl.on("messageCreate", async (msg) => { console.log(`msgCommand: ${cmdName + args} by ${msg.author.tag}`); }); +//client cl.once("ready", () => { console.log(`bot ready; logged in as ${cl.user.tag}\n--`.info); cl.user.setActivity(".pomoc", { type: "LISTENING" }); diff --git a/package-lock.json b/package-lock.json index 52a95db..f258e91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,15 +11,18 @@ "dependencies": { "@discordjs/opus": "^0.5.3", "@discordjs/voice": "^0.7.5", + "@prisma/client": "^3.12.0", + "canvas": "^2.9.1", "colors": "^1.4.0", "daemon": "^1.1.0", - "discord.js": "^13.1.0", + "discord.js": "^13.6.0", "dotenv": "^10.0.0", "ffmpeg": "^0.0.4", "ffmpeg-static": "^4.4.0", "libsodium-wrappers": "^0.7.9", - "nodemon": "^2.0.13", + "nodemon": "^2.0.15", "pg": "^8.7.3", + "prisma": "^3.12.0", "redis": "^4.0.4", "ytdl-core": "^4.9.2", "ytsr": "^3.5.3" @@ -44,43 +47,38 @@ } }, "node_modules/@discordjs/builders": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.8.2.tgz", - "integrity": "sha512-/YRd11SrcluqXkKppq/FAVzLIPRVlIVmc6X8ZklspzMIHDtJ+A4W37D43SHvLdH//+NnK+SHW/WeOF4Ts54PeQ==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.11.0.tgz", + "integrity": "sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg==", "dependencies": { "@sindresorhus/is": "^4.2.0", - "discord-api-types": "^0.24.0", - "ow": "^0.27.0", + "discord-api-types": "^0.26.0", "ts-mixer": "^6.0.0", - "tslib": "^2.3.1" + "tslib": "^2.3.1", + "zod": "^3.11.6" }, "engines": { "node": ">=16.0.0", "npm": ">=7.0.0" } }, + "node_modules/@discordjs/builders/node_modules/discord-api-types": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz", + "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==", + "engines": { + "node": ">=12" + } + }, "node_modules/@discordjs/collection": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.3.2.tgz", - "integrity": "sha512-dMjLl60b2DMqObbH1MQZKePgWhsNe49XkKBZ0W5Acl5uVV43SN414i2QfZwRI7dXAqIn8pEWD2+XXQFn9KWxqg==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.4.0.tgz", + "integrity": "sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw==", "engines": { "node": ">=16.0.0", "npm": ">=7.0.0" } }, - "node_modules/@discordjs/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/@discordjs/node-pre-gyp": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.2.tgz", @@ -158,6 +156,61 @@ "npm": ">=7.0.0" } }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@node-redis/bloom": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@node-redis/bloom/-/bloom-1.0.1.tgz", @@ -212,6 +265,37 @@ "@node-redis/client": "^1.0.0" } }, + "node_modules/@prisma/client": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-3.12.0.tgz", + "integrity": "sha512-4NEQjUcWja/NVBvfuDFscWSk1/rXg3+wj+TSkqXCb1tKlx/bsUE00rxsvOvGg7VZ6lw1JFpGkwjwmsOIc4zvQw==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980" + }, + "engines": { + "node": ">=12.6" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980.tgz", + "integrity": "sha512-zULjkN8yhzS7B3yeEz4aIym4E2w1ChrV12i14pht3ePFufvsAvBSoZ+tuXMvfSoNTgBS5E4bolRzLbMmbwkkMQ==", + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980.tgz", + "integrity": "sha512-o+jo8d7ZEiVpcpNWUDh3fj2uPQpBxl79XE9ih9nkogJbhw6P33274SHnqheedZ7PyvPIK/mvU8MLNYgetgXPYw==" + }, "node_modules/@sapphire/async-queue": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.9.tgz", @@ -222,9 +306,9 @@ } }, "node_modules/@sindresorhus/is": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", - "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "engines": { "node": ">=10" }, @@ -496,14 +580,6 @@ "node": ">=8" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, "node_modules/camelcase": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", @@ -515,6 +591,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/canvas": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.1.tgz", + "integrity": "sha512-vSQti1uG/2gjv3x6QLOZw7TctfufaerTWbVe+NSduHxxLGB+qf3kFgQ6n66DSnuoINtVUjrLLIK2R+lxrBG07A==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.15.0", + "simple-get": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -794,37 +884,44 @@ } }, "node_modules/discord.js": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.3.1.tgz", - "integrity": "sha512-zn4G8tL5+tMV00+0aSsVYNYcIfMSdT2g0nudKny+Ikd+XKv7m6bqI7n3Vji0GIRqXDr5ArPaw+iYFM2I1Iw3vg==", + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.6.0.tgz", + "integrity": "sha512-tXNR8zgsEPxPBvGk3AQjJ9ljIIC6/LOPjzKwpwz8Y1Q2X66Vi3ZqFgRHYwnHKC0jC0F+l4LzxlhmOJsBZDNg9g==", "dependencies": { - "@discordjs/builders": "^0.8.1", - "@discordjs/collection": "^0.3.2", - "@discordjs/form-data": "^3.0.1", - "@sapphire/async-queue": "^1.1.8", + "@discordjs/builders": "^0.11.0", + "@discordjs/collection": "^0.4.0", + "@sapphire/async-queue": "^1.1.9", "@types/node-fetch": "^2.5.12", - "@types/ws": "^8.2.0", - "discord-api-types": "^0.24.0", + "@types/ws": "^8.2.2", + "discord-api-types": "^0.26.0", + "form-data": "^4.0.0", "node-fetch": "^2.6.1", - "ws": "^8.2.3" + "ws": "^8.4.0" }, "engines": { "node": ">=16.6.0", "npm": ">=7.0.0" } }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "node_modules/discord.js/node_modules/discord-api-types": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz", + "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/discord.js/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { - "is-obj": "^2.0.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, "node_modules/dotenv": { @@ -1327,11 +1424,6 @@ "libsodium": "^0.7.0" } }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, "node_modules/lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -1432,9 +1524,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/minipass": { "version": "3.1.6", @@ -1475,6 +1567,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "node_modules/nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + }, "node_modules/node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -1584,25 +1681,6 @@ "wrappy": "1" } }, - "node_modules/ow": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/ow/-/ow-0.27.0.tgz", - "integrity": "sha512-SGnrGUbhn4VaUGdU0EJLMwZWSupPmF46hnTRII7aCLCrqixTAC5eKo8kI4/XXf1eaaI8YEVT+3FeGNJI9himAQ==", - "dependencies": { - "@sindresorhus/is": "^4.0.1", - "callsites": "^3.1.0", - "dot-prop": "^6.0.1", - "lodash.isequal": "^4.5.0", - "type-fest": "^1.2.1", - "vali-date": "^1.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -1804,6 +1882,22 @@ } } }, + "node_modules/prisma": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-3.12.0.tgz", + "integrity": "sha512-ltCMZAx1i0i9xuPM692Srj8McC665h6E5RqJom999sjtVSccHSD8Z+HSdBN2183h9PJKvC5dapkn78dd0NWMBg==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980" + }, + "bin": { + "prisma": "build/index.js", + "prisma2": "build/index.js" + }, + "engines": { + "node": ">=12.6" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -2009,6 +2103,57 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "dependencies": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dependencies": { + "mimic-response": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/simple-get/node_modules/mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/split2": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", @@ -2125,26 +2270,15 @@ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, "node_modules/ts-mixer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.0.tgz", - "integrity": "sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz", + "integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==" }, "node_modules/tslib": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, - "node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -2231,14 +2365,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "node_modules/vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -2310,9 +2436,9 @@ } }, "node_modules/ws": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz", - "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "engines": { "node": ">=10.0.0" }, @@ -2373,6 +2499,14 @@ "engines": { "node": ">=8" } + }, + "node_modules/zod": { + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.14.3.tgz", + "integrity": "sha512-OzwRCSXB1+/8F6w6HkYHdbuWysYWnAF4fkRgKDcSFc54CE+Sv0rHXKfeNUReGCrHukm1LNpi6AYeXotznhYJbQ==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } }, "dependencies": { @@ -2388,31 +2522,28 @@ } }, "@discordjs/builders": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.8.2.tgz", - "integrity": "sha512-/YRd11SrcluqXkKppq/FAVzLIPRVlIVmc6X8ZklspzMIHDtJ+A4W37D43SHvLdH//+NnK+SHW/WeOF4Ts54PeQ==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.11.0.tgz", + "integrity": "sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg==", "requires": { "@sindresorhus/is": "^4.2.0", - "discord-api-types": "^0.24.0", - "ow": "^0.27.0", + "discord-api-types": "^0.26.0", "ts-mixer": "^6.0.0", - "tslib": "^2.3.1" + "tslib": "^2.3.1", + "zod": "^3.11.6" + }, + "dependencies": { + "discord-api-types": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz", + "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==" + } } }, "@discordjs/collection": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.3.2.tgz", - "integrity": "sha512-dMjLl60b2DMqObbH1MQZKePgWhsNe49XkKBZ0W5Acl5uVV43SN414i2QfZwRI7dXAqIn8pEWD2+XXQFn9KWxqg==" - }, - "@discordjs/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.4.0.tgz", + "integrity": "sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw==" }, "@discordjs/node-pre-gyp": { "version": "0.4.2", @@ -2470,6 +2601,45 @@ "ws": "^8.2.3" } }, + "@mapbox/node-pre-gyp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", + "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==", + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "dependencies": { + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "@node-redis/bloom": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@node-redis/bloom/-/bloom-1.0.1.tgz", @@ -2511,15 +2681,33 @@ "integrity": "sha512-HGQ8YooJ8Mx7l28tD7XjtB3ImLEjlUxG1wC1PAjxu6hPJqjPshUZxAICzDqDjtIbhDTf48WXXUcx8TQJB1XTKA==", "requires": {} }, + "@prisma/client": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-3.12.0.tgz", + "integrity": "sha512-4NEQjUcWja/NVBvfuDFscWSk1/rXg3+wj+TSkqXCb1tKlx/bsUE00rxsvOvGg7VZ6lw1JFpGkwjwmsOIc4zvQw==", + "requires": { + "@prisma/engines-version": "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980" + } + }, + "@prisma/engines": { + "version": "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980.tgz", + "integrity": "sha512-zULjkN8yhzS7B3yeEz4aIym4E2w1ChrV12i14pht3ePFufvsAvBSoZ+tuXMvfSoNTgBS5E4bolRzLbMmbwkkMQ==" + }, + "@prisma/engines-version": { + "version": "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980.tgz", + "integrity": "sha512-o+jo8d7ZEiVpcpNWUDh3fj2uPQpBxl79XE9ih9nkogJbhw6P33274SHnqheedZ7PyvPIK/mvU8MLNYgetgXPYw==" + }, "@sapphire/async-queue": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.9.tgz", "integrity": "sha512-CbXaGwwlEMq+l1TRu01FJCvySJ1CEFKFclHT48nIfNeZXaAAmmwwy7scUKmYHPUa3GhoMp6Qr1B3eAJux6XgOQ==" }, "@sindresorhus/is": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", - "integrity": "sha512-VkE3KLBmJwcCaVARtQpfuKcKv8gcBmUubrfHGF84dXuuW6jgsRYxPtzcIhPyK9WAPpRt2/xY6zkD9MnRaJzSyw==" + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" }, "@szmarczak/http-timer": { "version": "1.1.2", @@ -2728,16 +2916,21 @@ } } }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, "camelcase": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" }, + "canvas": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.1.tgz", + "integrity": "sha512-vSQti1uG/2gjv3x6QLOZw7TctfufaerTWbVe+NSduHxxLGB+qf3kFgQ6n66DSnuoINtVUjrLLIK2R+lxrBG07A==", + "requires": { + "@mapbox/node-pre-gyp": "^1.0.0", + "nan": "^2.15.0", + "simple-get": "^3.0.3" + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -2947,27 +3140,36 @@ "integrity": "sha512-X0uA2a92cRjowUEXpLZIHWl4jiX1NsUpDhcEOpa1/hpO1vkaokgZ8kkPtPih9hHth5UVQ3mHBu/PpB4qjyfJ4A==" }, "discord.js": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.3.1.tgz", - "integrity": "sha512-zn4G8tL5+tMV00+0aSsVYNYcIfMSdT2g0nudKny+Ikd+XKv7m6bqI7n3Vji0GIRqXDr5ArPaw+iYFM2I1Iw3vg==", + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.6.0.tgz", + "integrity": "sha512-tXNR8zgsEPxPBvGk3AQjJ9ljIIC6/LOPjzKwpwz8Y1Q2X66Vi3ZqFgRHYwnHKC0jC0F+l4LzxlhmOJsBZDNg9g==", "requires": { - "@discordjs/builders": "^0.8.1", - "@discordjs/collection": "^0.3.2", - "@discordjs/form-data": "^3.0.1", - "@sapphire/async-queue": "^1.1.8", + "@discordjs/builders": "^0.11.0", + "@discordjs/collection": "^0.4.0", + "@sapphire/async-queue": "^1.1.9", "@types/node-fetch": "^2.5.12", - "@types/ws": "^8.2.0", - "discord-api-types": "^0.24.0", + "@types/ws": "^8.2.2", + "discord-api-types": "^0.26.0", + "form-data": "^4.0.0", "node-fetch": "^2.6.1", - "ws": "^8.2.3" - } - }, - "dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "requires": { - "is-obj": "^2.0.0" + "ws": "^8.4.0" + }, + "dependencies": { + "discord-api-types": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz", + "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } } }, "dotenv": { @@ -3352,11 +3554,6 @@ "libsodium": "^0.7.0" } }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, "lowercase-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", @@ -3426,9 +3623,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "minipass": { "version": "3.1.6", @@ -3457,6 +3654,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + }, "node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -3529,19 +3731,6 @@ "wrappy": "1" } }, - "ow": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/ow/-/ow-0.27.0.tgz", - "integrity": "sha512-SGnrGUbhn4VaUGdU0EJLMwZWSupPmF46hnTRII7aCLCrqixTAC5eKo8kI4/XXf1eaaI8YEVT+3FeGNJI9himAQ==", - "requires": { - "@sindresorhus/is": "^4.0.1", - "callsites": "^3.1.0", - "dot-prop": "^6.0.1", - "lodash.isequal": "^4.5.0", - "type-fest": "^1.2.1", - "vali-date": "^1.0.0" - } - }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", @@ -3674,6 +3863,14 @@ "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==", "requires": {} }, + "prisma": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-3.12.0.tgz", + "integrity": "sha512-ltCMZAx1i0i9xuPM692Srj8McC665h6E5RqJom999sjtVSccHSD8Z+HSdBN2183h9PJKvC5dapkn78dd0NWMBg==", + "requires": { + "@prisma/engines": "3.12.0-37.22b822189f46ef0dc5c5b503368d1bee01213980" + } + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -3844,6 +4041,36 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "requires": { + "mimic-response": "^2.0.0" + } + }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" + } + } + }, "split2": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", @@ -3933,20 +4160,15 @@ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" }, "ts-mixer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.0.tgz", - "integrity": "sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ==" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz", + "integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==" }, "tslib": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, - "type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==" - }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -4017,11 +4239,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=" - }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -4084,9 +4301,9 @@ } }, "ws": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.3.0.tgz", - "integrity": "sha512-Gs5EZtpqZzLvmIM59w4igITU57lrtYVFneaa434VROv4thzJyV6UjIL3D42lslWlI+D4KzLYnxSwtfuiO79sNw==", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "requires": {} }, "xdg-basedir": { @@ -4121,6 +4338,11 @@ "requires": { "miniget": "^4.2.1" } + }, + "zod": { + "version": "3.14.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.14.3.tgz", + "integrity": "sha512-OzwRCSXB1+/8F6w6HkYHdbuWysYWnAF4fkRgKDcSFc54CE+Sv0rHXKfeNUReGCrHukm1LNpi6AYeXotznhYJbQ==" } } } diff --git a/package.json b/package.json index 604f655..292b519 100644 --- a/package.json +++ b/package.json @@ -23,15 +23,18 @@ "dependencies": { "@discordjs/opus": "^0.5.3", "@discordjs/voice": "^0.7.5", + "@prisma/client": "^3.12.0", + "canvas": "^2.9.1", "colors": "^1.4.0", "daemon": "^1.1.0", - "discord.js": "^13.1.0", + "discord.js": "^13.6.0", "dotenv": "^10.0.0", "ffmpeg": "^0.0.4", "ffmpeg-static": "^4.4.0", "libsodium-wrappers": "^0.7.9", - "nodemon": "^2.0.13", + "nodemon": "^2.0.15", "pg": "^8.7.3", + "prisma": "^3.12.0", "redis": "^4.0.4", "ytdl-core": "^4.9.2", "ytsr": "^3.5.3" diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..ffc7765 --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,37 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model badges { + badge_id Int @id + badge_name String + badge_description String + badge_type Int @default(0) + given_badges given_badges[] @ignore +} + +/// The underlying table does not contain a valid unique identifier and can therefore currently not be handled by the Prisma Client. +model given_badges { + user_id String + badge_id Int + badges badges @relation(fields: [badge_id], references: [badge_id], onDelete: NoAction, onUpdate: NoAction, map: "badge_id") + users users @relation(fields: [user_id], references: [user_id], onDelete: NoAction, onUpdate: NoAction, map: "user_id") + + @@index([badge_id], map: "fki_badge_id") + @@index([user_id], map: "fki_user_id") + @@ignore +} + +model users { + user_id String @id(map: "user_pkey") + exp Int @default(0) + msg_count Int @default(0) + voice_time Int @default(0) + lvl Int @default(0) + given_badges given_badges[] @ignore +} diff --git a/queries/badge_id.sql b/queries/badge_id.sql deleted file mode 100644 index 09935bb..0000000 --- a/queries/badge_id.sql +++ /dev/null @@ -1,4 +0,0 @@ -SELECT badges.badge_id + 1 AS new_id -FROM badges -ORDER BY badge_id -DESC LIMIT 1 \ No newline at end of file diff --git a/queries/user_badges.sql b/queries/user_badges.sql deleted file mode 100644 index ab2abbe..0000000 --- a/queries/user_badges.sql +++ /dev/null @@ -1,5 +0,0 @@ -SELECT badges.badge_id -FROM users -JOIN given_badges ON given_badges.user_id = users.user_id -JOIN badges ON given_badges.badge_id = badges.badge_id -WHERE users.user_id = 'JEBAĆ' \ No newline at end of file diff --git a/src/cmds/dodajodznake.js b/src/cmds/dodajodznake.js index 2dd161b..5757f00 100644 --- a/src/cmds/dodajodznake.js +++ b/src/cmds/dodajodznake.js @@ -2,20 +2,20 @@ module.exports = { name: "dodajodznake", async execute(cl, msg, args) { const { get } = require("https"); - const { createWriteStream, exists } = require("fs"); + const { createWriteStream, access } = require("fs"); if (msg.member.permissions.has(0x20)) { if (msg.attachments.at(0) != null) { console.log("attachmentadded"); msg.attachments.each((x) => { if (x.contentType.startsWith("application/json")) { - exists(`src/badges/json/${x.name}`, (e) => { + access(`src/badges/json/${x.name}`, (e) => { if (!e) { const file = createWriteStream(`src/badges/json/${x.name}`); get(x.url, (res) => { res.pipe(file); }); } else { - msg.channel.send("nuda"); + msg.channel.send("Taka odznaka już istnieje"); } }); } else if (x.contentType.startsWith("image/")) { @@ -26,7 +26,7 @@ module.exports = { res.pipe(file); }); } else { - msg.channel.send("nuda"); + msg.channel.send("Taka odznaka już istnieje"); } }); } diff --git a/src/cmds/profil.js b/src/cmds/profil.js deleted file mode 100644 index 665757d..0000000 --- a/src/cmds/profil.js +++ /dev/null @@ -1,22 +0,0 @@ -module.exports = { - name: "profil", - execute(cl, msg, args, connect) { - const { profil } = require("../functions/postgres"); - const { MessageEmbed } = require("discord.js"); - async () => { - const user = profil(connect, msg.author.id); - }; - console.debug(user); - /*if (user) { - const embed = new MessageEmbed() - .setColor("#F5F5F5") - .setTitle(msg.author.name) - .addFields( - { name: "Regular field title", value: "Some value here" }, - { name: "Regular field title", value: "Some value here" }, - { name: "Regular field title", value: "Some value here" }, - { name: "Regular field title", value: "Some value here" } - ); - }*/ - }, -}; diff --git a/src/cmds/profile.js b/src/cmds/profile.js new file mode 100644 index 0000000..cc97446 --- /dev/null +++ b/src/cmds/profile.js @@ -0,0 +1,56 @@ +const { ReactionUserManager } = require("discord.js"); + +module.exports = { + name: "profile", + async execute(cl, msg, args, connect) { + const { profile } = require("../functions/postgres"); + const { roundRect, expThreshold } = require("../functions/tools"); + const canvas = require("canvas"); + await profile(connect, msg.author.id).then((user) => { + canvas.registerFont("./src/fonts/Lexend-Bold.ttf", { + family: "LexendBold", + }); + canvas.registerFont("./src/fonts/Lexend-Thin.ttf", { + family: "LexendThin", + }); + const canva = canvas.createCanvas(1024, 256); + let context = canva.getContext("2d"); + context.fillStyle = "#484848"; + roundRect(context, 0, 0, 1024, 256, 25); + context.fill(); + context.font = '48px "LexendBold"'; + context.fillStyle = "#FFFFFF"; + context.fillText(msg.author.tag, 244, 24 + 48); + context.fillText("Lvl " + user.lvl, 850, 24 + 48); + context.font = '25px "LexendThin"'; + context.fillText(user.msg_count + " messages sent", 244, 72 + 25); + context.font = '24px "LexendThin"'; + context.fillText(expThreshold(user.lvl + 1) + " exp", 810, 164 + 24); + context.fillText(user.exp + " exp", 250, 164 + 24); + context.fillStyle = "#242424"; + roundRect(context, 244, 200, 700, 30, 50); + context.fill(); + context.fillStyle = "#61F2EA"; + roundRect( + context, + 244, + 200, + 700 * + ((user.exp - expThreshold(user.lvl)) / expThreshold(user.lvl + 1)), + 30, + 50 + ); + context.fill(); + roundRect(context, 34, 34, 188, 188, 100); + canvas + .loadImage(msg.author.avatarURL({ format: "png" })) + .then((image) => { + context.clip(); + context.drawImage(image, 34, 34, 188, 188); + msg.reply({ + files: [canva.toBuffer()], + }); + }); + }); + }, +}; diff --git a/src/fonts/Lexend-Bold.ttf b/src/fonts/Lexend-Bold.ttf new file mode 100644 index 0000000..c3728e9 Binary files /dev/null and b/src/fonts/Lexend-Bold.ttf differ diff --git a/src/fonts/Lexend-Thin.ttf b/src/fonts/Lexend-Thin.ttf new file mode 100644 index 0000000..cc04497 Binary files /dev/null and b/src/fonts/Lexend-Thin.ttf differ diff --git a/src/functions/postgres.js b/src/functions/postgres.js index a6431b7..de137ea 100644 --- a/src/functions/postgres.js +++ b/src/functions/postgres.js @@ -1,36 +1,59 @@ -const { lvl } = require("./tools"); +const { lvl, randomExp } = require("./tools"); module.exports = { messageCount: async function (connect, userID) { - query = `UPDATE users SET msg_count = msg_count + 1 WHERE users.user_id = '${userID}'`; - await connect.query(query); + const update = await connect.users.update({ + where: { + user_id: userID, + }, + data: { + msg_count: { + increment: 1, + }, + }, + }); + return update; }, - addExp: async function (connect, userID) { - let query = `SELECT users.user_id, users.exp FROM users WHERE users.user_id = '${userID}'`; - const check = await connect.query(query); - if (check.rowCount == 0) { - query = `INSERT INTO users(user_id,msg_count,exp) VALUES ('${userID}',1,${Math.floor( - Math.random() * 25 - )})`; - await connect.query(query); - } else { - let exp = check.rows[0].exp + Math.floor(Math.random() * 25); - console.debug(lvl(exp)); - query = - query = `UPDATE users SET exp = ${exp},msg_count = msg_count + 1,lvl = ${lvl( - exp - )} WHERE users.user_id = '${userID}'`; - await connect.query(query); - } + profile: async function (connect, userID) { + return await connect.users.findUnique({ + where: { + user_id: userID, + }, + }); }, - profil: async function (connect, userID) { - let query = `SELECT * FROM users WHERE users.user_id = '${userID}'`; - const check = await connect.query(query); - if (check.rowCount == 0) { - query = `INSERT INTO users(user_id) VALUES ('${userID}')`; - await connect.query(query); - } - return check.rows; + addExp: async function (connect, userID, min, max) { + const rExp = randomExp(min, max); + return await connect.users.upsert({ + where: { + user_id: userID, + }, + create: { + user_id: userID, + msg_count: 1, + exp: randomExp(min, max), + lvl: 0, + }, + update: { + msg_count: { + increment: 1, + }, + exp: { + increment: rExp, + }, + lvl: lvl( + ( + await connect.users.findUnique({ + where: { + user_id: userID, + }, + select: { + exp: true, + }, + }) + ).exp + rExp + ), + }, + }); }, addBadge: async function (args) {}, giveBadge: async function (args) {}, diff --git a/src/functions/tools.js b/src/functions/tools.js index 0250c27..f72eca6 100644 --- a/src/functions/tools.js +++ b/src/functions/tools.js @@ -2,4 +2,22 @@ module.exports = { lvl: function (exp) { return Math.floor(Math.sqrt(exp) / 5); }, + expThreshold: function (lvl) { + return Math.floor(lvl * lvl * 25); + }, + randomExp: function (min, max) { + return Math.floor(Math.random() * (max - min)) + min; + }, + roundRect: function (ctx, x, y, width, height, radius) { + if (width < 2 * radius) radius = width / 2; + if (height < 2 * radius) radius = height / 2; + ctx.beginPath(); + ctx.moveTo(x + radius, y); + ctx.arcTo(x + width, y, x + width, y + height, radius); + ctx.arcTo(x + width, y + height, x, y + height, radius); + ctx.arcTo(x, y + height, x, y, radius); + ctx.arcTo(x, y, x + width, y, radius); + ctx.closePath(); + return ctx; + }, };