lepší timeout #3

Closed
Histmy wants to merge 4 commits from lepsi-timeout into main
19 changed files with 331 additions and 230 deletions
Showing only changes of commit 9c6504e309 - Show all commits

View File

@ -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`

View File

@ -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')"
}

319
package-lock.json generated
View File

@ -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"
}
}
}
}

View File

@ -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"
}
}

View File

@ -5,7 +5,7 @@
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Chyba - šach.ml</title>
<title>Chyba - $domena</title>
</head>
<body>

View File

@ -5,28 +5,15 @@
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Šach.ml</title>
<title>$domena</title>
</head>
<body>
<h1>Šach.ml</h1>
<h1>$domena</h1>
<p>Vytajte na úvodní stránce DENIM3001 šachů!</p>
<p id="sem"></p>
<script>
// Jo, použivám JS na render :fujjjj:
// Prasárna, jsem si vědom, ale je to nejjednoduší :ksd:
const pecko = document.querySelector("#sem");
if ($logged) {
pecko.innerHTML = "Jsi přihlášen jako $jmeno. Pro odhlášení pokračuj <a href='logout'>sem</a>.";
} else {
pecko.innerHTML = "Pro přihlášení pokračujte <a href='login'>sem</a>.";
}
</script>
<p>$pecko</p>
</body>
</html>

View File

@ -5,7 +5,7 @@
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Proměna</title>
<title>Proměna - $domena</title>
</head>
<body>

View File

@ -5,7 +5,7 @@
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Šach.ml - $title</title>
<title>$title - $domena</title>
</head>
<body>

View File

@ -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");

View File

@ -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";

View File

@ -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<string, { kju: QueueItem[]; loop: boolean; }>();
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,

View File

@ -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<Hra> = {};
const hraci: SRecord<string> = {};
const hry = new Map<number, Hra>(); // gameID -> Hra
const hraci = new Map<string, number>(); // 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;

View File

@ -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<NodeJS.Timeout> = {};
@ -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 = /^(?:(?<h>\d+)h)?(?:(?<m>\d+)m)?(?:(?<s>\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)}`;
}
},

View File

@ -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);
}
},

View File

@ -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));

View File

@ -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);

View File

@ -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 <a href="logout">sem</a>.` : `Pro přihlášení pokračuj <a href="login">sem</a>.`);
return res.end(response);
}

View File

@ -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<ButtonBuilder>) => void;
timeout?: number;
} & ({
onEnd: (c: Collection<string, ButtonInteraction<CacheType>>) => void;
onEnd: (c: ReadonlyCollection<string, ButtonInteraction<CacheType>>) => void;
} | {
konecnaZprava: string;
stejne?: boolean;

View File

@ -94,12 +94,9 @@ export const novejJoin = (guild: Guild, channelId: string) => new Promise<boolea
});
});
const player = createAudioPlayer();
conn.subscribe(player);
vojsy.set(guildId, {
conn,
players: [createAudioPlayer(), createAudioPlayer(), createAudioPlayer()],
players: Array(3).fill(0).map(() => createAudioPlayer().on("error", e => log("chyba v nějakým hráčovi", e))) as [AudioPlayer, AudioPlayer, AudioPlayer],
queues: [[], [], []]
});