diff --git a/README.md b/README.md index 1ca130c..b4056ee 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # DENIM 3001 ![Denim](https://cdn.discordapp.com/avatars/535915400375042048/d15e39420dcf328a6d8673ab979a67a7.png?size=32) -[![CodeFactor](https://www.codefactor.io/repository/github/histmy/denim-bot/badge?s=0b4e08a7b118b8120c50359e00c6f6f1d4464b53)](https://www.codefactor.io/repository/github/histmy/denim-bot) +[![CodeFactor](https://www.codefactor.io/repository/github/histmy/denim-mirror/badge?s=5c1c9feeb96c427d13b30ba0653cbbc1bb90bcda)](https://www.codefactor.io/repository/github/histmy/denim-mirror) ## First setup 1. Install all packages with the command `npm i` diff --git a/example.config.json b/example.config.json index 03237b5..5c0ec13 100644 --- a/example.config.json +++ b/example.config.json @@ -10,5 +10,6 @@ "DBUser": "povinné, string - uživatelské jméno pro připojení do databáze", "DBPwd": "povinné, string - heslo pro připojení do databáze", "noGeneralSync": "nepovinné, boolean - nezálohovat generál dobytčárny do databáze", - "ignoreUnknownKeys": "nepovinné, boolean - vypne hlášení neznámých klíčů v config.json" + "ignoreUnknownKeys": "nepovinné, boolean - vypne hlášení neznámých klíčů v config.json", + "sachyDomena": "nepovinné, string - doména pro funkci sachy (základní hodnota je 'šach.ml')" } diff --git a/package-lock.json b/package-lock.json index 6da4522..d1946ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,44 +1,49 @@ { "name": "denim_3001", - "version": "3001.58.3", + "version": "3001.58.8", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "denim_3001", - "version": "3001.58.3", + "version": "3001.58.8", "license": "ISC", "dependencies": { - "@discordjs/voice": "^0.16.1", - "discord.js": "^14.14.1", + "@discordjs/voice": "^0.17.0", + "discord.js": "^14.15.3", "js-levenshtein": "^1.1.6", "mysql": "^2.18.1", "opusscript": "^0.1.1", "play-dl": "^1.9.7", "tiny-typed-emitter": "^2.1.0", "tweetnacl": "^1.0.3", - "valibot": "^0.20.1" + "valibot": "^0.35.0", + "ytdl-core": "^4.11.5" }, "devDependencies": { "@types/js-levenshtein": "^1.1.3", - "@types/mysql": "^2.15.24" + "@types/mysql": "^2.15.26" } }, "node_modules/@discordjs/builders": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.7.0.tgz", - "integrity": "sha512-GDtbKMkg433cOZur8Dv6c25EHxduNIBsxeHrsRoIM8+AwmEZ8r0tEpckx/sHwTLwQPOF3e2JWloZh9ofCaMfAw==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.8.2.tgz", + "integrity": "sha512-6wvG3QaCjtMu0xnle4SoOIeFB4y6fKMN6WZfy3BMKJdQQtPLik8KGzDwBVL/+wTtcE/ZlFjgEk74GublyEVZ7g==", + "license": "Apache-2.0", "dependencies": { - "@discordjs/formatters": "^0.3.3", - "@discordjs/util": "^1.0.2", - "@sapphire/shapeshift": "^3.9.3", - "discord-api-types": "0.37.61", + "@discordjs/formatters": "^0.4.0", + "@discordjs/util": "^1.1.0", + "@sapphire/shapeshift": "^3.9.7", + "discord-api-types": "0.37.83", "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.3", + "ts-mixer": "^6.0.4", "tslib": "^2.6.2" }, "engines": { "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/@discordjs/collection": { @@ -50,64 +55,84 @@ } }, "node_modules/@discordjs/formatters": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.3.tgz", - "integrity": "sha512-wTcI1Q5cps1eSGhl6+6AzzZkBBlVrBdc9IUhJbijRgVjCNIIIZPgqnUj3ntFODsHrdbGU8BEG9XmDQmgEEYn3w==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.4.0.tgz", + "integrity": "sha512-fJ06TLC1NiruF35470q3Nr1bi95BdvKFAF+T5bNfZJ4bNdqZ3VZ+Ttg6SThqTxm6qumSG3choxLBHMC69WXNXQ==", + "license": "Apache-2.0", "dependencies": { - "discord-api-types": "0.37.61" + "discord-api-types": "0.37.83" }, "engines": { "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/@discordjs/rest": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.1.0.tgz", - "integrity": "sha512-5gFWFkZX2JCFSRzs8ltx8bWmyVi0wPMk6pBa9KGIQSDPMmrP+uOrZ9j9HOwvmVWGe+LmZ5Bov0jMnQd6/jVReg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.3.0.tgz", + "integrity": "sha512-C1kAJK8aSYRv3ZwMG8cvrrW4GN0g5eMdP8AuN8ODH5DyOCbHgJspze1my3xHOAgwLJdKUbWNVyAeJ9cEdduqIg==", + "license": "Apache-2.0", "dependencies": { - "@discordjs/collection": "^2.0.0", - "@discordjs/util": "^1.0.2", - "@sapphire/async-queue": "^1.5.0", - "@sapphire/snowflake": "^3.5.1", - "@vladfrangu/async_event_emitter": "^2.2.2", - "discord-api-types": "0.37.61", - "magic-bytes.js": "^1.5.0", + "@discordjs/collection": "^2.1.0", + "@discordjs/util": "^1.1.0", + "@sapphire/async-queue": "^1.5.2", + "@sapphire/snowflake": "^3.5.3", + "@vladfrangu/async_event_emitter": "^2.2.4", + "discord-api-types": "0.37.83", + "magic-bytes.js": "^1.10.0", "tslib": "^2.6.2", - "undici": "5.27.2" + "undici": "6.13.0" }, "engines": { "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/@discordjs/rest/node_modules/@discordjs/collection": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.0.0.tgz", - "integrity": "sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.0.tgz", + "integrity": "sha512-mLcTACtXUuVgutoznkh6hS3UFqYirDYAg5Dc1m8xn6OvPjetnUlf/xjtqnnc47OwWdaoCQnHmHh9KofhD6uRqw==", + "license": "Apache-2.0", "engines": { "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/@discordjs/util": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.0.2.tgz", - "integrity": "sha512-IRNbimrmfb75GMNEjyznqM1tkI7HrZOf14njX7tCAAUetyZM1Pr8hX/EK2lxBCOgWDRmigbp24fD1hdMfQK5lw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.0.tgz", + "integrity": "sha512-IndcI5hzlNZ7GS96RV3Xw1R2kaDuXEp7tRIy/KlhidpN/BQ1qh1NZt3377dMLTa44xDUNKT7hnXkA/oUAzD/lg==", + "license": "Apache-2.0", "engines": { "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/@discordjs/voice": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.16.1.tgz", - "integrity": "sha512-uiWiW0Ta6K473yf8zs13RfKuPqm/xU4m4dAidMkIdwqgy1CztbbZBtPLfDkVSKzpW7s6m072C+uQcs4LwF3FhA==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.17.0.tgz", + "integrity": "sha512-hArn9FF5ZYi1IkxdJEVnJi+OxlwLV0NJYWpKXsmNOojtGtAZHxmsELA+MZlu2KW1F/K1/nt7lFOfcMXNYweq9w==", + "license": "Apache-2.0", "dependencies": { - "@types/ws": "^8.5.9", - "discord-api-types": "0.37.61", + "@types/ws": "^8.5.10", + "discord-api-types": "0.37.83", "prism-media": "^1.3.5", "tslib": "^2.6.2", - "ws": "^8.14.2" + "ws": "^8.16.0" }, "engines": { "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/@discordjs/voice/node_modules/opusscript": { @@ -143,66 +168,68 @@ } }, "node_modules/@discordjs/ws": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.0.2.tgz", - "integrity": "sha512-+XI82Rm2hKnFwAySXEep4A7Kfoowt6weO6381jgW+wVdTpMS/56qCvoXyFRY0slcv7c/U8My2PwIB2/wEaAh7Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.1.tgz", + "integrity": "sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==", + "license": "Apache-2.0", "dependencies": { - "@discordjs/collection": "^2.0.0", - "@discordjs/rest": "^2.1.0", - "@discordjs/util": "^1.0.2", - "@sapphire/async-queue": "^1.5.0", - "@types/ws": "^8.5.9", - "@vladfrangu/async_event_emitter": "^2.2.2", - "discord-api-types": "0.37.61", + "@discordjs/collection": "^2.1.0", + "@discordjs/rest": "^2.3.0", + "@discordjs/util": "^1.1.0", + "@sapphire/async-queue": "^1.5.2", + "@types/ws": "^8.5.10", + "@vladfrangu/async_event_emitter": "^2.2.4", + "discord-api-types": "0.37.83", "tslib": "^2.6.2", - "ws": "^8.14.2" + "ws": "^8.16.0" }, "engines": { "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/@discordjs/ws/node_modules/@discordjs/collection": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.0.0.tgz", - "integrity": "sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.0.tgz", + "integrity": "sha512-mLcTACtXUuVgutoznkh6hS3UFqYirDYAg5Dc1m8xn6OvPjetnUlf/xjtqnnc47OwWdaoCQnHmHh9KofhD6uRqw==", + "license": "Apache-2.0", "engines": { "node": ">=18" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", - "engines": { - "node": ">=14" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/@sapphire/async-queue": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", - "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.2.tgz", + "integrity": "sha512-7X7FFAA4DngXUl95+hYbUF19bp1LGiffjJtu7ygrZrbdCSsdDDBaSjB7Akw0ZbOu6k0xpXyljnJ6/RZUvLfRdg==", + "license": "MIT", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" } }, "node_modules/@sapphire/shapeshift": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.3.tgz", - "integrity": "sha512-WzKJSwDYloSkHoBbE8rkRW8UNKJiSRJ/P8NqJ5iVq7U2Yr/kriIBx2hW+wj2Z5e5EnXL1hgYomgaFsdK6b+zqQ==", + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.7.tgz", + "integrity": "sha512-4It2mxPSr4OGn4HSQWGmhFMsNFGfFVhWeRPCRwbH972Ek2pzfGRZtb0pJ4Ze6oIzcyh2jw7nUDa6qGlWofgd9g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" }, "engines": { - "node": ">=v14.0.0", - "npm": ">=7.0.0" + "node": ">=v16" } }, "node_modules/@sapphire/snowflake": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz", - "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz", + "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==", + "license": "MIT", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" @@ -215,10 +242,11 @@ "dev": true }, "node_modules/@types/mysql": { - "version": "2.15.24", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.24.tgz", - "integrity": "sha512-I0qULi8JBEg0oso69Fe4H4QPR+IdE0yRhZLu3uRhGwQ92m2Epz1cSD5jnXY0nMeZQKd61U8EvnOVMbNE74o3Kw==", + "version": "2.15.26", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.26.tgz", + "integrity": "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -229,17 +257,19 @@ "integrity": "sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==" }, "node_modules/@types/ws": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", - "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@vladfrangu/async_event_emitter": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.2.tgz", - "integrity": "sha512-HIzRG7sy88UZjBJamssEczH5q7t5+axva19UbZLO6u0ySbYPrwzWiXBcC0WuHyhKKoeCyneH+FvYzKQq/zTtkQ==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.4.tgz", + "integrity": "sha512-ButUPz9E9cXMLgvAW8aLAKKJJsPu1dY1/l/E8xzLFuysowXygs6GBcyunK9rnGC4zTsnIc2mQo71rGw9U+Ykug==", + "license": "MIT", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" @@ -259,38 +289,42 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/discord-api-types": { - "version": "0.37.61", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.61.tgz", - "integrity": "sha512-o/dXNFfhBpYHpQFdT6FWzeO7pKc838QeeZ9d91CfVAtpr5XLK4B/zYxQbYgPdoMiTDvJfzcsLW5naXgmHGDNXw==" + "version": "0.37.83", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.83.tgz", + "integrity": "sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==", + "license": "MIT" }, "node_modules/discord.js": { - "version": "14.14.1", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.14.1.tgz", - "integrity": "sha512-/hUVzkIerxKHyRKopJy5xejp4MYKDPTszAnpYxzVVv4qJYf+Tkt+jnT2N29PIPschicaEEpXwF2ARrTYHYwQ5w==", + "version": "14.15.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.15.3.tgz", + "integrity": "sha512-/UJDQO10VuU6wQPglA4kz2bw2ngeeSbogiIPx/TsnctfzV/tNf+q+i1HlgtX1OGpeOBpJH9erZQNO5oRM2uAtQ==", + "license": "Apache-2.0", "dependencies": { - "@discordjs/builders": "^1.7.0", + "@discordjs/builders": "^1.8.2", "@discordjs/collection": "1.5.3", - "@discordjs/formatters": "^0.3.3", - "@discordjs/rest": "^2.1.0", - "@discordjs/util": "^1.0.2", - "@discordjs/ws": "^1.0.2", - "@sapphire/snowflake": "3.5.1", - "@types/ws": "8.5.9", - "discord-api-types": "0.37.61", + "@discordjs/formatters": "^0.4.0", + "@discordjs/rest": "^2.3.0", + "@discordjs/util": "^1.1.0", + "@discordjs/ws": "^1.1.1", + "@sapphire/snowflake": "3.5.3", + "discord-api-types": "0.37.83", "fast-deep-equal": "3.1.3", "lodash.snakecase": "4.1.1", "tslib": "2.6.2", - "undici": "5.27.2", - "ws": "8.14.2" + "undici": "6.13.0" }, "engines": { "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" }, "node_modules/inherits": { "version": "2.0.4", @@ -313,17 +347,41 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" }, "node_modules/lodash.snakecase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" }, + "node_modules/m3u8stream": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.6.tgz", + "integrity": "sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==", + "license": "MIT", + "dependencies": { + "miniget": "^4.2.2", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/magic-bytes.js": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.5.0.tgz", - "integrity": "sha512-wJkXvutRbNWcc37tt5j1HyOK1nosspdh3dj6LUYYAvF6JYNqs53IfRvK9oEpcwiDA1NdoIi64yAMfdivPeVAyw==" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz", + "integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==", + "license": "MIT" + }, + "node_modules/miniget": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.3.tgz", + "integrity": "sha512-SjbDPDICJ1zT+ZvQwK0hUcRY4wxlhhNpHL9nJOB2MEAXRGagTljsO8MEDzQMTFf0Q8g4QNi8P9lEm/g7e+qgzA==", + "license": "MIT", + "engines": { + "node": ">=12" + } }, "node_modules/mysql": { "version": "2.18.1", @@ -384,6 +442,12 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" + }, "node_modules/sqlstring": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", @@ -406,9 +470,10 @@ "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" }, "node_modules/ts-mixer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", - "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==", + "license": "MIT" }, "node_modules/tslib": { "version": "2.6.2", @@ -421,14 +486,12 @@ "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" }, "node_modules/undici": { - "version": "5.27.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz", - "integrity": "sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.13.0.tgz", + "integrity": "sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==", + "license": "MIT", "engines": { - "node": ">=14.0" + "node": ">=18.0" } }, "node_modules/util-deprecate": { @@ -437,14 +500,16 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/valibot": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.20.1.tgz", - "integrity": "sha512-7lToTLG5wtK76u32gq8dUK0bAw7bknTGbeNSKRJunAC2soGVnNrKngg+38Jjt6FOwH+MshUONHoFz+LgmjeYKQ==" + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.35.0.tgz", + "integrity": "sha512-+i2aCRkReTrd5KBN/dW2BrPOvFnU5LXTV2xjZnjnqUIO8YUx6P2+MgRrkwF2FhkexgyKq/NIZdPdknhHf5A/Ww==", + "license": "MIT" }, "node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -460,6 +525,20 @@ "optional": true } } + }, + "node_modules/ytdl-core": { + "version": "4.11.5", + "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-4.11.5.tgz", + "integrity": "sha512-27LwsW4n4nyNviRCO1hmr8Wr5J1wLLMawHCQvH8Fk0hiRqrxuIu028WzbJetiYH28K8XDbeinYW4/wcHQD1EXA==", + "license": "MIT", + "dependencies": { + "m3u8stream": "^0.8.6", + "miniget": "^4.2.2", + "sax": "^1.1.3" + }, + "engines": { + "node": ">=12" + } } } } diff --git a/package.json b/package.json index 87cfcb4..7cc8267 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "denim_3001", - "version": "3001.58.3", + "version": "3001.58.8", "description": "Toto je velmi kvalitní bot.", "repository": { "url": "https://github.com/Histmy/Denim-Bot/" @@ -13,18 +13,19 @@ "author": "Histmy + det-fys", "license": "ISC", "dependencies": { - "@discordjs/voice": "^0.16.1", - "discord.js": "^14.14.1", + "@discordjs/voice": "^0.17.0", + "discord.js": "^14.15.3", "js-levenshtein": "^1.1.6", "mysql": "^2.18.1", "opusscript": "^0.1.1", "play-dl": "^1.9.7", "tiny-typed-emitter": "^2.1.0", "tweetnacl": "^1.0.3", - "valibot": "^0.20.1" + "valibot": "^0.35.0", + "ytdl-core": "^4.11.5" }, "devDependencies": { "@types/js-levenshtein": "^1.1.3", - "@types/mysql": "^2.15.24" + "@types/mysql": "^2.15.26" } } diff --git a/res/sachy/error.html b/res/sachy/error.html index 23746db..f9914df 100644 --- a/res/sachy/error.html +++ b/res/sachy/error.html @@ -5,7 +5,7 @@ - Chyba - šach.ml + Chyba - $domena diff --git a/res/sachy/index.html b/res/sachy/index.html index 0877e65..26d1909 100644 --- a/res/sachy/index.html +++ b/res/sachy/index.html @@ -5,28 +5,15 @@ - Šach.ml + $domena -

Šach.ml

+

$domena

Vytajte na úvodní stránce DENIM3001 šachů!

-

- - +

$pecko

diff --git a/res/sachy/promotion.html b/res/sachy/promotion.html index e06cff6..a15e616 100644 --- a/res/sachy/promotion.html +++ b/res/sachy/promotion.html @@ -5,7 +5,7 @@ - Proměna + Proměna - $domena diff --git a/res/sachy/tah.html b/res/sachy/tah.html index 678da3d..519362d 100644 --- a/res/sachy/tah.html +++ b/res/sachy/tah.html @@ -5,7 +5,7 @@ - Šach.ml - $title + $title - $domena diff --git a/src/app.ts b/src/app.ts index 7a32d07..dab8466 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,4 +1,4 @@ -import { ChannelType, Client, CommandInteraction, GatewayIntentBits, InteractionReplyOptions, Message, Partials } from "discord.js"; +import { ButtonStyle, ChannelType, Client, CommandInteraction, GatewayIntentBits, InteractionReplyOptions, Message, Partials } from "discord.js"; import { readdirSync } from "fs"; import { CUser, KomandNaExport, Komand, ListenerFunkce, Modul, SRecord, SuperListenerFunkce, CClient, HelpServer, KomandRaw } from "./utils/types"; import { adminLog, formatCas, oddiakritikovat, log, rand, prefix, nabidni, send } from "./utils/utils.js"; @@ -24,6 +24,11 @@ client.on("error", err => { adminLog(client, "nejaka chyba na klijentovi", err); }); +client.on("shardError", err => { + log(err); + adminLog(client, "šárd ejrr??", err); +}); + client.komandy = {}; client.aliasy = {}; setClient(client); @@ -286,9 +291,18 @@ client.on("messageCreate", async mes => { return; } - const celArgs = args.join(" "); const komandBez = oddiakritikovat(komandSDiakritikou).toLowerCase(); - const cmdName = client.aliasy[komandBez] ?? komandBez; + // const cmdName = client.aliasy[komandBez] ?? komandBez; + let cmdName = komandBez; + + const aliasCelej = client.aliasy[komandBez]; + if (aliasCelej) { + const [aliasCmdName, ...aliasArgs] = aliasCelej.split(" "); + cmdName = aliasCmdName; + args.unshift(...aliasArgs); + } + + const celArgs = args.join(" "); if (await runEvent("messageCreate", [mes, cmdName])) return; @@ -316,7 +330,7 @@ client.on("messageCreate", async mes => { const komand = nabidka[lookupId]; const cmdName = client.aliasy[komand] ?? komand; const cmd = client.komandy[cmdName]; - radek.components.forEach(btn => btn.setDisabled()); + radek.components.forEach((btn, i) => btn.setDisabled() && (i == lookupId && btn.setStyle(ButtonStyle.Success))); i.update({ content: `ok vole ${emouty.d3k}`, components: [radek] }); if (!cmd) return void send(mes, "bohuzel negdo sy ze mi dela prel"); diff --git a/src/modules/custom.ts b/src/modules/custom.ts index 217c194..0b3c187 100644 --- a/src/modules/custom.ts +++ b/src/modules/custom.ts @@ -109,6 +109,8 @@ const exp: Modul = { jmeno = customKomandy[args[1]] ? args[1] : customAliasy[args[1]].cmd; } else jmeno = zakladniKomandy[args[1]] ? args[1] : zakladniAliasy[args[1]]; + if (args.length > 2) jmeno += " " + args.slice(2).join(" "); + customAliasy[args[0]] = { cmd: jmeno, owner: mes.author.id }; save(); return "jo"; diff --git a/src/modules/muzika.ts b/src/modules/muzika.ts index 3e5d226..a5b7dc7 100644 --- a/src/modules/muzika.ts +++ b/src/modules/muzika.ts @@ -2,7 +2,8 @@ import { AudioPlayerStatus, VoiceConnectionStatus } from "@discordjs/voice"; import { Client } from "discord.js"; -import { search, spotify, stream, validate, video_basic_info } from "play-dl"; +import { search, validate, video_basic_info } from "play-dl"; +import ytdlko from "ytdl-core"; import { emouty } from "../utils/emotes"; import { Modul } from "../utils/types"; import { adminLog, log, send } from "../utils/utils"; @@ -19,7 +20,7 @@ const guildy = new Map(); const searchScema = array(record(string(), string())); -async function playNext(guildId: string, seek?: number) { +async function playNext(guildId: string) { try { const guilda = guildy.get(guildId)!; const kju = guilda.kju; @@ -27,8 +28,8 @@ async function playNext(guildId: string, seek?: number) { let coZahrat: Hratelny; if (!item.special) { - const src = await stream(item.url, { seek }); - coZahrat = { src: src.stream, volume: 1, type: src.type }; + const src = ytdlko(item.url, { filter: "audioonly", highWaterMark: 1 << 25 }); + coZahrat = { src: src, volume: 1 }; } else { coZahrat = item.url; } @@ -80,10 +81,9 @@ const exp: Modul = { ajtem.special = true; send(mes, `zkusim to zahrat`); } - else if (druh == "search" || druh == "sp_track") { + else if (druh == "search") { const msg = send(mes, "hledam"); - const hledacek = druh == "search" ? txt : (await spotify(txt)).name; - const hledani = await search(hledacek, { limit: 1 }); + const hledani = await search(txt, { limit: 1 }); if (!hledani[0]) return "nic sem nenašel"; ajtem.url = hledani[0].url; ajtem.name = hledani[0].title!; @@ -162,20 +162,7 @@ const exp: Modul = { } }, - seek: { - DMUnsafe: true, - arg: "na kolikátou sekundu přetočit", - run: (mes, arg) => { - const numero = Number(arg); - if (isNaN(numero)) return "huh?"; - - const kju = guildy.get(mes.guildId!)?.kju; - if (!kju?.length) return "nehraje nic"; - - playNext(mes.guildId!, numero); - mes.react(emouty.d3k); - } - }, + seek: "nu tuto us nefunkuje pac ytdl-core je kokotina", loop: { DMUnsafe: true, diff --git a/src/modules/sachy.ts b/src/modules/sachy.ts index 2b6eda1..ee3364b 100644 --- a/src/modules/sachy.ts +++ b/src/modules/sachy.ts @@ -1,19 +1,20 @@ // Jo, šachec, :sjetec: import { APIEmbed, Message } from "discord.js"; -import { Modul, SRecord } from "../utils/types"; +import { Modul } from "../utils/types"; import { fokinLookupTable, klikance, pocetKeStrane } from "../utils/sachyEtc"; -import { emiter } from "../utils/sachyServer"; +import { emiter, sachyDomena } from "../utils/sachyServer"; import { send } from "../utils/utils"; -const hry: SRecord = {}; -const hraci: SRecord = {}; +const hry = new Map(); // gameID -> Hra +const hraci = new Map(); // hrac -> gameID +let nextGameID = 0; const smery = [-8, 1, 8, -1, -7, 9, 7, -9]; const mkPis = (barva: Figurka["barva"], typ: Figurka["typ"]) => ({ barva, typ, netahnuta: true, enPassantovatelna: false }); -function createGame(kanel: string, bilej: string, cernej: string, mes: Message) { +function createGame(gameID: number, bilej: string, cernej: string, mes: Message) { const deska: Deska = [...new Array(64)]; @@ -44,6 +45,7 @@ function createGame(kanel: string, bilej: string, cernej: string, mes: Message) deska[59] = mkPis("bila", "queen"); const hra: Hra = { + id: gameID, bila: bilej, cerna: cernej, deska, @@ -52,7 +54,7 @@ function createGame(kanel: string, bilej: string, cernej: string, mes: Message) message: mes }; - hry[kanel] = hra; + hry.set(gameID, hra); return hra; } @@ -331,7 +333,7 @@ function renderHra(hra: Hra, konec?: true) { if (!figurka) { field.value += hra.tahy.includes(i) - ? (cernyPozadi ? `[<:h:1066376051422404628>](http://šach.ml/${klikanec})` : `[<:h:1066376343807336488>](http://šach.ml/${klikanec})`) + ? (cernyPozadi ? `[<:h:1066376051422404628>](http://${sachyDomena}/${klikanec})` : `[<:h:1066376343807336488>](http://${sachyDomena}/${klikanec})`) : (cernyPozadi ? "🟩" : "⬜"); } else { @@ -343,7 +345,7 @@ function renderHra(hra: Hra, konec?: true) { const figurkaStr = `<:h:${emout}>`; if (!konec && figurka.barva == hra.hraje || hra.tahy.includes(i)) { - field.value += `[${figurkaStr}](http://šach.ml/${klikanec})`; + field.value += `[${figurkaStr}](http://${sachyDomena}/${klikanec})`; } else { field.value += figurkaStr; } @@ -361,9 +363,11 @@ function renderHra(hra: Hra, konec?: true) { function konec(mes: Message, hra: Hra, duvod: string) { mes.edit({ content: `hra zkoncila ${duvod}`, embeds: [renderHra(hra, true)] }); - delete hraci[hra.bila]; - delete hraci[hra.cerna]; - delete hry[mes.channelId]; + const gameID = hra.id; + + hraci.delete(hra.bila); + hraci.delete(hra.cerna); + hry.delete(gameID); } function prekreslitHru(hra: Hra) { @@ -399,10 +403,10 @@ function prekreslitHru(hra: Hra) { } emiter.on("tah", (hrac, policko, respond, promo) => { - const channelId = hraci[hrac]; - if (!channelId) return respond("Však vůbec nehraješ ty magore"); + const gameID = hraci.get(hrac); + if (!gameID) return respond("Však vůbec nehraješ ty magore"); - const hra = hry[channelId]; + const hra = hry.get(gameID)!; const barva = hra.bila == hrac ? "bila" : "cerna"; if (hra.hraje != barva) return respond("Teď nehraješ ty ty magore"); @@ -468,20 +472,18 @@ const exp: Modul = { DMUnsafe: true, run: async mes => { - if (hry[mes.channelId]) return "nejze tady se us hraej"; - const druhej = mes.mentions.members?.first()?.id; if (!druhej) return "no sam asi hrat nebudez vet"; for (const player of [mes.author.id, druhej]) { - if (hraci[player]) return "zakaz symultanki"; + if (hraci.has(player)) return "zakaz symultanki"; } const message = await send(mes, "hraj zopiciva"); - const hra = createGame(mes.channelId, mes.author.id, druhej, message); - hraci[mes.author.id] = mes.channelId; - hraci[druhej] = mes.channelId; + const hra = createGame(++nextGameID, mes.author.id, druhej, message); + hraci.set(mes.author.id, nextGameID); + hraci.set(druhej, nextGameID); message.edit({ content: "", embeds: [renderHra(hra)] }); @@ -490,10 +492,10 @@ const exp: Modul = { jasevzdavam: mes => { - if (!hraci[mes.author.id]) return "vsak nehrajes magore"; + const gameID = hraci.get(mes.author.id); + if (!gameID) return "vsak nehrajes magore"; - const hra = hry[mes.channelId]; - if (!hra) return "tadi nehrajes"; + const hra = hry.get(gameID)!; konec(hra.message, hra, `${mes.author} je pusi`); } @@ -504,6 +506,7 @@ const exp: Modul = { module.exports = exp; type Hra = { + id: number; bila: string; cerna: string; deska: Deska; diff --git a/src/modules/spink.ts b/src/modules/spink.ts index 1f2d67f..fc65580 100644 --- a/src/modules/spink.ts +++ b/src/modules/spink.ts @@ -6,8 +6,9 @@ import { Modul, SRecord } from "../utils/types"; import { formatCas, formatter, log, oddiakritikovat, ping, safeQuery, send, sendDM } from "../utils/utils"; const enum Spinky { + spinkacek, vstavacek, - spinkacek + fakeVstavacek } const budouciSpinky: SRecord = {}; @@ -19,7 +20,7 @@ const contactSpinkServer = async (druh: Spinky, user: User) => { const sql = druh == Spinky.spinkacek ? "INSERT INTO spinkacky (discord_id) VALUE (?)" - : "UPDATE spinkacky SET vstavacek = curtime() WHERE discord_id = ? ORDER BY id DESC LIMIT 1"; + : `UPDATE spinkacky SET vstavacek = curtime(), fejk = ${druh == Spinky.fakeVstavacek ? 1 : 0} WHERE discord_id = ? ORDER BY id DESC LIMIT 1`; const odpoved = await safeQuery(sql, [user.id]); @@ -37,7 +38,7 @@ const ifUzRemove = (id: string) => { }; async function getLastEntry(id: string) { - const odpoved = await safeQuery<{ spinkacek: string; vstavacek: string | undefined; }>(`SELECT spinkacek, vstavacek FROM spinkacky WHERE discord_id = ? ORDER BY spinkacek DESC LIMIT 1; `, [id]); + const odpoved = await safeQuery<{ spinkacek: Date; vstavacek: Date | undefined; }>(`SELECT spinkacek, vstavacek FROM spinkacky WHERE discord_id = ? ORDER BY spinkacek DESC LIMIT 1; `, [id]); if (odpoved.err || !odpoved.data.length) return false; return odpoved.data[0]; @@ -49,16 +50,16 @@ async function getLastEntry(id: string) { * 20. 11. 2021 ✝ 19. 11. 2023 Vzpomínáme! */ -const sendGmMessage = async (user: User, rictCas?: boolean) => { - const odpoved = await contactSpinkServer(Spinky.vstavacek, user); +const sendGmMessage = async (user: User, jeFake?: boolean) => { + const odpoved = await contactSpinkServer(jeFake ? Spinky.vstavacek : Spinky.fakeVstavacek, user); if (odpoved) return "uz jsi vzhuru ty hajzle"; const zapis = await getLastEntry(user.id); const zacatek = `dobry rano hajzle ${user}`; - if (!rictCas || zapis === false) return zacatek; + if (!jeFake || zapis === false) return zacatek; - const cas = (Number(new Date(zapis.vstavacek ?? Date.now())) - Number(new Date(zapis.spinkacek))) / 1000; + const cas = (Number(zapis.vstavacek ?? Date.now()) - Number(zapis.spinkacek)) / 1000; const formatedCas = formatCas(cas); let zpr = ""; @@ -109,15 +110,21 @@ function handleSpink(stav: Spinky, uzivatel: User) { } } -function strToDate(str: string) { +/** + * Zpracuje komplexní string pro pgn a vrátí počet milisekund, o kolik v budoucnu autor zamýšlel + * @param str + * @returns array, kde první informace je, zda-li byla informace relativní nebo absolutní a druhá je počet milisekund v budoucnoti + */ +function strToDate(str: string): ["rel" | "abs", number] | never[] { const cas = new Date(); const dnes = new Date(); let neco: RegExpExecArray | null; + if (str == "") return []; + // Relativní čas neco = /^(?:(?\d+)h)?(?:(?\d+)m)?(?:(?\d+)s?)?$/.exec(str.toLowerCase()); if (neco) { - if (str == "") return []; const g = neco.groups!; return ["rel", ((Number(g.h) * 3600 || 0) + (Number(g.m) * 60 || 0) + (Number(g.s) || 0)) * 1000] as const; } @@ -198,8 +205,13 @@ const exp: Modul = { spinkZa = (Math.random() * rozdil + min); log(`random spink pro ${oddiakritikovat(mes.member?.displayName || "neznamejmeno")} byl nastaven na ${formatter(Date.now() + spinkZa)}`); } else { - [druh, spinkZa] = strToDate(kdy); - if (typeof spinkZa != "number") return "cos to napsal kkte"; + if (kdy == "") + [druh, spinkZa] = ["rel", 2 * 60 * 60 * 1000]; + else { + const back = strToDate(kdy); + if (typeof back[1] != "number") return "cos to napsal kkte"; + [druh, spinkZa] = back; + } } ifUzRemove(mes.author.id); @@ -228,7 +240,7 @@ const exp: Modul = { if (entry === false) return `tuten kkt jeste nespal ${emouty.lukiw}`; if (!entry.vstavacek) return "ten kkt jiz ickon spi"; - const cas = Number(new Date()) - Number(new Date(entry.vstavacek)); + const cas = Date.now() - Number(entry.vstavacek); return `uz ${prazdno ? "jsi" : "je"} vzhuru ${formatCas(cas / 1000)}`; } }, @@ -248,6 +260,13 @@ const exp: Modul = { als: ["🚗🚗spink"], run: mes => `autoautospink je ${autoSpinky[mes.author.id] ? (delete autoSpinky[mes.author.id], "vypnut") : (autoSpinky[mes.author.id] = [false, mes.channel], "zapnut")}` + }, + + kdysemselspat: async mes => { + const entry = await getLastEntry(mes.author.id); + if (entry === false) return "este sy nigdy nespal"; + + return `to bilo ${formatter(entry.spinkacek)}`; } }, diff --git a/src/modules/vojs.ts b/src/modules/vojs.ts index 95a3285..ff443b0 100644 --- a/src/modules/vojs.ts +++ b/src/modules/vojs.ts @@ -114,9 +114,6 @@ const exp: Modul = { const min = addSuffix("minut", m); const je = h > 1 && h < 5 ? "jsou" : "je"; - const channel = mes.member?.voice.channel; - if (!channel) return; - const zvuky: Hratelny[] = [{ src: `${pre}${je}.mp3`, volume: 2.5 }]; rozdelAPridej(h); @@ -126,7 +123,7 @@ const exp: Modul = { zvuky.push({ src: `${pre}${min}.mp3`, volume: 2.5 }); } - playAndFukOff(mes, `${je} ${h} ${hod} ${m} ${min}`, zvuky); + return playAndFukOff(mes, `${je} ${h} ${hod} ${m} ${min}`, zvuky); } }, diff --git a/src/modules/vordinace.ts b/src/modules/vordinace.ts index 5b54463..404d1fd 100644 --- a/src/modules/vordinace.ts +++ b/src/modules/vordinace.ts @@ -5,7 +5,7 @@ import { log } from "../utils/utils"; let client: CClient; async function ziskatNazev() { - const stranka = await fetch("https://voyo.nova.cz/api/v1/show/content?showId=1&type=episodes&season=6266&count=1&offset=0&url=%2Fserialy%2F1-ordinace-v-ruzove-zahrade-2") + const stranka = await fetch("https://voyo.nova.cz/api/v1/show/content?showId=1&type=episodes&season=6596&count=1&offset=0&url=%2Fserialy%2F1-ordinace-v-ruzove-zahrade-2") .then(r => r.text()) .catch(e => log("chyba pri accessovani VOYO stránky", e)); diff --git a/src/utils/helpServer.ts b/src/utils/helpServer.ts index a6b99e5..b9bcacd 100644 --- a/src/utils/helpServer.ts +++ b/src/utils/helpServer.ts @@ -9,9 +9,12 @@ createServer((_, res) => { const vsechnyKomandy: KomandNaExport[] = JSON.parse(JSON.stringify([...komandy, ...customKomandy])); for (const key in customAliasy) { - const i = vsechnyKomandy.findIndex(komand => komand.name == customAliasy[key]); + const aliasParts = customAliasy[key].split(" "); + const aliasCmd = aliasParts[0]; + + const i = vsechnyKomandy.findIndex(komand => komand.name == aliasCmd); if (i == -1) continue; - (vsechnyKomandy[i].als ??= []).push(key); + (vsechnyKomandy[i].als ??= []).push(aliasParts.length == 1 ? key : `${key} [${aliasParts.slice(1).join(" ")}]`); } vsechnyKomandy.sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0); diff --git a/src/utils/sachyServer.ts b/src/utils/sachyServer.ts index 765fdaa..32b0c01 100644 --- a/src/utils/sachyServer.ts +++ b/src/utils/sachyServer.ts @@ -15,6 +15,8 @@ const tahStranka = readFileSync(`${basePath}/tah.html`).toString(); const promoStranka = readFileSync(`${basePath}/promotion.html`).toString(); const chybaStranka = readFileSync(`${basePath}/error.html`).toString(); +export const sachyDomena = process.env.sachyDomena ?? "šach.ml"; + interface Eventy { tah: (playerId: string, square: string, verify: (err?: string) => void, promotionType?: string) => void; } @@ -83,7 +85,7 @@ function redirect(res: ServerResponse, path: string) { function login(session: Session, res: ServerResponse) { if (session.logedIn) return "uzjsi prihlasenej"; - redirect(res, "https://discord.com/api/oauth2/authorize?client_id=1064269692165963826&redirect_uri=http%3A%2F%2F%C5%A1ach.ml%2Foauth&response_type=code&scope=identify"); + redirect(res, `https://discord.com/api/oauth2/authorize?client_id=1064269692165963826&redirect_uri=http%3A%2F%2F${encodeURIComponent(sachyDomena)}%2Foauth&response_type=code&scope=identify`); } function logout(session: Session, res: ServerResponse) { @@ -92,13 +94,17 @@ function logout(session: Session, res: ServerResponse) { } function loginErr(res: ServerResponse) { - res.end(chybaStranka.replaceAll("$error", "Prihlaseni se nezdarilo, zkus to znovu a jestli to nefunguje furt, tak si holt stezuj no")); + res.end( + chybaStranka + .replace("$domena", sachyDomena) + .replace("$error", "Prihlaseni se nezdarilo, zkus to znovu a jestli to nefunguje furt, tak si holt stezuj no") + ); } async function overeni(url: string, session: Session, res: ServerResponse) { const code = (new URL(url, "h:/")).searchParams.get("code"); - const data = await fetch("https://discord.com/api/v10/oauth2/token", { method: "post", body: `client_id=1064269692165963826&client_secret=8HHKODmb1HTLWoJGVyoinSU_9323dEla&grant_type=authorization_code&code=${code}&redirect_uri=http%3A%2F%2F%C5%A1ach.ml%2Foauth`, headers: { "Content-type": "application/x-www-form-urlencoded" } }) + const data = await fetch("https://discord.com/api/v10/oauth2/token", { method: "post", body: `client_id=1064269692165963826&client_secret=8HHKODmb1HTLWoJGVyoinSU_9323dEla&grant_type=authorization_code&code=${code}&redirect_uri=http%3A%2F%2F${encodeURIComponent(sachyDomena)}%2Foauth`, headers: { "Content-type": "application/x-www-form-urlencoded" } }) .then(r => r.json()) .catch(err => log("sachy jednotka:", err)); @@ -112,7 +118,7 @@ async function overeni(url: string, session: Session, res: ServerResponse) { session.logedIn = true; session.discordId = uzivatel.id; - session.discordName = `${uzivatel.username}#${uzivatel.discriminator}`; + session.discordName = uzivatel.username; redirect(res, session.redirect || "/"); } @@ -126,9 +132,11 @@ function validateMove(res: ServerResponse, session: Session, url: string) { function overeni(err?: string) { if (err == "--promote--") - return res.end(promoStranka); + return res.end(promoStranka.replace("$domena", sachyDomena)); - const response = tahStranka.replace("$title", err ? "Neplatej tah" : "Úspšný tah") + const response = tahStranka + .replace("$domena", sachyDomena) + .replace("$title", err ? "Neplatej tah" : "Úspšný tah") .replace("$content", err ?? "Kvalitní tah!") .replace("$podminka", err ? "0" : "1"); @@ -141,17 +149,20 @@ function validateMove(res: ServerResponse, session: Session, url: string) { const server = createServer((req, res) => { const session = startSession(req, res); - // TODO: Natipovaný, protože vscode jebe (možná někdy přestane, v tom případě odebrat pls) - const url: URL = new URL(req.url!, "http://šach.ml"); + const url = new URL(req.url!, `http://${sachyDomena}`); + // Zpracování tahu if (url.pathname.length == 2 || url.pathname.length == 4) return validateMove(res, session, req.url!); + // Oauth if (req.url?.startsWith("/oauth")) return overeni(req.url, session, res); + // Jinak switch (url.pathname) { case "/": { - const response = indexStranka.replace("$logged", session.logedIn ? "1" : "0") - .replace("$jmeno", session.discordName ?? ""); + const response = indexStranka + .replaceAll("$domena", sachyDomena) + .replace("$pecko", session.logedIn ? `Jsi přihlášen jako ${session.discordName}. Pro odhlášení pokračuj sem.` : `Pro přihlášení pokračuj sem.`); return res.end(response); } diff --git a/src/utils/utils.ts b/src/utils/utils.ts index 51639c0..d135869 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -1,4 +1,4 @@ -import { APIEmbed, ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, CacheType, ChannelType, Client, Collection, ComponentType, Message, MessageCreateOptions, TextBasedChannel, User } from "discord.js"; +import { APIEmbed, ActionRowBuilder, ButtonBuilder, ButtonInteraction, ButtonStyle, CacheType, ChannelType, Client, ComponentType, Message, MessageCreateOptions, ReadonlyCollection, TextBasedChannel, User } from "discord.js"; import { existsSync } from "fs"; import { MysqlError, createPool } from "mysql"; @@ -6,7 +6,7 @@ if (!existsSync("config.json")) throw new Error("config.json neexistuje"); const konfig = require("../../config.json"); if (!konfig.ignoreUnknownKeys) for (const klic of Object.keys(konfig)) { - if (!["adminChannel", "adminID", "DBPwd", "DBUser", "dieOnError", "ignoreMess", "ignorePresence", "ignoreSpink", "ignoreUnknownKeys", "noGeneralSync", "prefix", "statPass", "token"].includes(klic)) throw new Error(`config.json obsahuje neznámý klíč: ${klic}`); + if (!["adminChannel", "adminID", "DBPwd", "DBUser", "dieOnError", "ignoreMess", "ignorePresence", "ignoreSpink", "ignoreUnknownKeys", "noGeneralSync", "prefix", "sachyDomena", "statPass", "token"].includes(klic)) throw new Error(`config.json obsahuje neznámý klíč: ${klic}`); } process.env = { ...process.env, ...konfig }; @@ -111,7 +111,7 @@ type Nastaveni = { onCollect: (i: ButtonInteraction, id: number, radek: ActionRowBuilder) => void; timeout?: number; } & ({ - onEnd: (c: Collection>) => void; + onEnd: (c: ReadonlyCollection>) => void; } | { konecnaZprava: string; stejne?: boolean; diff --git a/src/utils/voice.ts b/src/utils/voice.ts index ef94f64..390a5fc 100644 --- a/src/utils/voice.ts +++ b/src/utils/voice.ts @@ -94,12 +94,9 @@ export const novejJoin = (guild: Guild, channelId: string) => new Promise createAudioPlayer().on("error", e => log("chyba v nějakým hráčovi", e))) as [AudioPlayer, AudioPlayer, AudioPlayer], queues: [[], [], []] });