play from youtube
This commit is contained in:
parent
b2cbe50d74
commit
6f16acf5e9
|
@ -14,6 +14,7 @@
|
||||||
"license": "GPL-3.0-only",
|
"license": "GPL-3.0-only",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@discordjs/voice": "^0.17.0",
|
"@discordjs/voice": "^0.17.0",
|
||||||
|
"@distube/ytdl-core": "4.15.6",
|
||||||
"dotenv": "^16.4.7",
|
"dotenv": "^16.4.7",
|
||||||
"libsodium-wrappers": "^0.7.15",
|
"libsodium-wrappers": "^0.7.15",
|
||||||
"oceanic.js": "^1.11.2"
|
"oceanic.js": "^1.11.2"
|
||||||
|
|
154
pnpm-lock.yaml
154
pnpm-lock.yaml
|
@ -11,6 +11,9 @@ importers:
|
||||||
'@discordjs/voice':
|
'@discordjs/voice':
|
||||||
specifier: ^0.17.0
|
specifier: ^0.17.0
|
||||||
version: 0.17.0
|
version: 0.17.0
|
||||||
|
'@distube/ytdl-core':
|
||||||
|
specifier: 4.15.6
|
||||||
|
version: 4.15.6
|
||||||
dotenv:
|
dotenv:
|
||||||
specifier: ^16.4.7
|
specifier: ^16.4.7
|
||||||
version: 16.4.7
|
version: 16.4.7
|
||||||
|
@ -38,6 +41,11 @@ packages:
|
||||||
engines: {node: '>=16.11.0'}
|
engines: {node: '>=16.11.0'}
|
||||||
deprecated: This version uses deprecated encryption modes. Please use a newer version.
|
deprecated: This version uses deprecated encryption modes. Please use a newer version.
|
||||||
|
|
||||||
|
'@distube/ytdl-core@4.15.6':
|
||||||
|
resolution: {integrity: sha512-T5bwnJ14pxHX96rzWzNC5lSHLxPmjXAEExh+VmI8CR2KqplNCMc1a0S+uo0WcIBM/FMw8tFSq5SqErwrZEM+vw==}
|
||||||
|
engines: {node: '>=14.0'}
|
||||||
|
deprecated: This version is deprecated, please upgrade to the latest version.
|
||||||
|
|
||||||
'@esbuild/aix-ppc64@0.24.2':
|
'@esbuild/aix-ppc64@0.24.2':
|
||||||
resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==}
|
resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
|
@ -192,12 +200,29 @@ packages:
|
||||||
resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==}
|
resolution: {integrity: sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==}
|
||||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
|
'@fastify/busboy@2.1.1':
|
||||||
|
resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==}
|
||||||
|
engines: {node: '>=14'}
|
||||||
|
|
||||||
'@types/node@22.10.5':
|
'@types/node@22.10.5':
|
||||||
resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==}
|
resolution: {integrity: sha512-F8Q+SeGimwOo86fiovQh8qiXfFEh2/ocYv7tU5pJ3EXMSSxk1Joj5wefpFK2fHTf/N6HKGSxIDBT9f3gCxXPkQ==}
|
||||||
|
|
||||||
'@types/ws@8.5.13':
|
'@types/ws@8.5.13':
|
||||||
resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==}
|
resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==}
|
||||||
|
|
||||||
|
agent-base@7.1.3:
|
||||||
|
resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==}
|
||||||
|
engines: {node: '>= 14'}
|
||||||
|
|
||||||
|
debug@4.4.0:
|
||||||
|
resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
|
||||||
|
engines: {node: '>=6.0'}
|
||||||
|
peerDependencies:
|
||||||
|
supports-color: '*'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
supports-color:
|
||||||
|
optional: true
|
||||||
|
|
||||||
discord-api-types@0.37.83:
|
discord-api-types@0.37.83:
|
||||||
resolution: {integrity: sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==}
|
resolution: {integrity: sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==}
|
||||||
|
|
||||||
|
@ -210,12 +235,37 @@ packages:
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
http-cookie-agent@6.0.8:
|
||||||
|
resolution: {integrity: sha512-qnYh3yLSr2jBsTYkw11elq+T361uKAJaZ2dR4cfYZChw1dt9uL5t3zSUwehoqqVb4oldk1BpkXKm2oat8zV+oA==}
|
||||||
|
engines: {node: '>=18.0.0'}
|
||||||
|
peerDependencies:
|
||||||
|
tough-cookie: ^4.0.0 || ^5.0.0
|
||||||
|
undici: ^5.11.0 || ^6.0.0
|
||||||
|
peerDependenciesMeta:
|
||||||
|
undici:
|
||||||
|
optional: true
|
||||||
|
|
||||||
|
https-proxy-agent@7.0.6:
|
||||||
|
resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
|
||||||
|
engines: {node: '>= 14'}
|
||||||
|
|
||||||
libsodium-wrappers@0.7.15:
|
libsodium-wrappers@0.7.15:
|
||||||
resolution: {integrity: sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ==}
|
resolution: {integrity: sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ==}
|
||||||
|
|
||||||
libsodium@0.7.15:
|
libsodium@0.7.15:
|
||||||
resolution: {integrity: sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw==}
|
resolution: {integrity: sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw==}
|
||||||
|
|
||||||
|
m3u8stream@0.8.6:
|
||||||
|
resolution: {integrity: sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
|
miniget@4.2.3:
|
||||||
|
resolution: {integrity: sha512-SjbDPDICJ1zT+ZvQwK0hUcRY4wxlhhNpHL9nJOB2MEAXRGagTljsO8MEDzQMTFf0Q8g4QNi8P9lEm/g7e+qgzA==}
|
||||||
|
engines: {node: '>=12'}
|
||||||
|
|
||||||
|
ms@2.1.3:
|
||||||
|
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
|
||||||
|
|
||||||
oceanic.js@1.11.2:
|
oceanic.js@1.11.2:
|
||||||
resolution: {integrity: sha512-kXMoZiIrIFq0QCfsZGJ+eOK+1IFkVsTpvwcQ3nfY6ioDKGVdHQjVIXNJAYvJb5c5la//2OU8WGpqsmp/bAP8aw==}
|
resolution: {integrity: sha512-kXMoZiIrIFq0QCfsZGJ+eOK+1IFkVsTpvwcQ3nfY6ioDKGVdHQjVIXNJAYvJb5c5la//2OU8WGpqsmp/bAP8aw==}
|
||||||
engines: {node: '>=18.13.0'}
|
engines: {node: '>=18.13.0'}
|
||||||
|
@ -237,12 +287,43 @@ packages:
|
||||||
opusscript:
|
opusscript:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
psl@1.15.0:
|
||||||
|
resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==}
|
||||||
|
|
||||||
|
punycode@2.3.1:
|
||||||
|
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
|
||||||
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
|
querystringify@2.2.0:
|
||||||
|
resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
|
||||||
|
|
||||||
|
requires-port@1.0.0:
|
||||||
|
resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
|
||||||
|
|
||||||
|
sax@1.4.1:
|
||||||
|
resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
|
||||||
|
|
||||||
|
tough-cookie@4.1.4:
|
||||||
|
resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
|
||||||
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
tslib@2.8.1:
|
tslib@2.8.1:
|
||||||
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
|
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
|
||||||
|
|
||||||
undici-types@6.20.0:
|
undici-types@6.20.0:
|
||||||
resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
|
resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
|
||||||
|
|
||||||
|
undici@5.28.4:
|
||||||
|
resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==}
|
||||||
|
engines: {node: '>=14.0'}
|
||||||
|
|
||||||
|
universalify@0.2.0:
|
||||||
|
resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
|
||||||
|
engines: {node: '>= 4.0.0'}
|
||||||
|
|
||||||
|
url-parse@1.5.10:
|
||||||
|
resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
|
||||||
|
|
||||||
ws@8.18.0:
|
ws@8.18.0:
|
||||||
resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
|
resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
|
||||||
engines: {node: '>=10.0.0'}
|
engines: {node: '>=10.0.0'}
|
||||||
|
@ -272,6 +353,18 @@ snapshots:
|
||||||
- opusscript
|
- opusscript
|
||||||
- utf-8-validate
|
- utf-8-validate
|
||||||
|
|
||||||
|
'@distube/ytdl-core@4.15.6':
|
||||||
|
dependencies:
|
||||||
|
http-cookie-agent: 6.0.8(tough-cookie@4.1.4)(undici@5.28.4)
|
||||||
|
https-proxy-agent: 7.0.6
|
||||||
|
m3u8stream: 0.8.6
|
||||||
|
miniget: 4.2.3
|
||||||
|
sax: 1.4.1
|
||||||
|
tough-cookie: 4.1.4
|
||||||
|
undici: 5.28.4
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
|
||||||
'@esbuild/aix-ppc64@0.24.2':
|
'@esbuild/aix-ppc64@0.24.2':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
@ -349,6 +442,8 @@ snapshots:
|
||||||
|
|
||||||
'@eslint/js@9.18.0': {}
|
'@eslint/js@9.18.0': {}
|
||||||
|
|
||||||
|
'@fastify/busboy@2.1.1': {}
|
||||||
|
|
||||||
'@types/node@22.10.5':
|
'@types/node@22.10.5':
|
||||||
dependencies:
|
dependencies:
|
||||||
undici-types: 6.20.0
|
undici-types: 6.20.0
|
||||||
|
@ -357,6 +452,12 @@ snapshots:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 22.10.5
|
'@types/node': 22.10.5
|
||||||
|
|
||||||
|
agent-base@7.1.3: {}
|
||||||
|
|
||||||
|
debug@4.4.0:
|
||||||
|
dependencies:
|
||||||
|
ms: 2.1.3
|
||||||
|
|
||||||
discord-api-types@0.37.83: {}
|
discord-api-types@0.37.83: {}
|
||||||
|
|
||||||
dotenv@16.4.7: {}
|
dotenv@16.4.7: {}
|
||||||
|
@ -389,12 +490,35 @@ snapshots:
|
||||||
'@esbuild/win32-ia32': 0.24.2
|
'@esbuild/win32-ia32': 0.24.2
|
||||||
'@esbuild/win32-x64': 0.24.2
|
'@esbuild/win32-x64': 0.24.2
|
||||||
|
|
||||||
|
http-cookie-agent@6.0.8(tough-cookie@4.1.4)(undici@5.28.4):
|
||||||
|
dependencies:
|
||||||
|
agent-base: 7.1.3
|
||||||
|
tough-cookie: 4.1.4
|
||||||
|
optionalDependencies:
|
||||||
|
undici: 5.28.4
|
||||||
|
|
||||||
|
https-proxy-agent@7.0.6:
|
||||||
|
dependencies:
|
||||||
|
agent-base: 7.1.3
|
||||||
|
debug: 4.4.0
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
|
||||||
libsodium-wrappers@0.7.15:
|
libsodium-wrappers@0.7.15:
|
||||||
dependencies:
|
dependencies:
|
||||||
libsodium: 0.7.15
|
libsodium: 0.7.15
|
||||||
|
|
||||||
libsodium@0.7.15: {}
|
libsodium@0.7.15: {}
|
||||||
|
|
||||||
|
m3u8stream@0.8.6:
|
||||||
|
dependencies:
|
||||||
|
miniget: 4.2.3
|
||||||
|
sax: 1.4.1
|
||||||
|
|
||||||
|
miniget@4.2.3: {}
|
||||||
|
|
||||||
|
ms@2.1.3: {}
|
||||||
|
|
||||||
oceanic.js@1.11.2:
|
oceanic.js@1.11.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
tslib: 2.8.1
|
tslib: 2.8.1
|
||||||
|
@ -411,8 +535,38 @@ snapshots:
|
||||||
|
|
||||||
prism-media@1.3.5: {}
|
prism-media@1.3.5: {}
|
||||||
|
|
||||||
|
psl@1.15.0:
|
||||||
|
dependencies:
|
||||||
|
punycode: 2.3.1
|
||||||
|
|
||||||
|
punycode@2.3.1: {}
|
||||||
|
|
||||||
|
querystringify@2.2.0: {}
|
||||||
|
|
||||||
|
requires-port@1.0.0: {}
|
||||||
|
|
||||||
|
sax@1.4.1: {}
|
||||||
|
|
||||||
|
tough-cookie@4.1.4:
|
||||||
|
dependencies:
|
||||||
|
psl: 1.15.0
|
||||||
|
punycode: 2.3.1
|
||||||
|
universalify: 0.2.0
|
||||||
|
url-parse: 1.5.10
|
||||||
|
|
||||||
tslib@2.8.1: {}
|
tslib@2.8.1: {}
|
||||||
|
|
||||||
undici-types@6.20.0: {}
|
undici-types@6.20.0: {}
|
||||||
|
|
||||||
|
undici@5.28.4:
|
||||||
|
dependencies:
|
||||||
|
'@fastify/busboy': 2.1.1
|
||||||
|
|
||||||
|
universalify@0.2.0: {}
|
||||||
|
|
||||||
|
url-parse@1.5.10:
|
||||||
|
dependencies:
|
||||||
|
querystringify: 2.2.0
|
||||||
|
requires-port: 1.0.0
|
||||||
|
|
||||||
ws@8.18.0: {}
|
ws@8.18.0: {}
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
import { Message } from "oceanic.js";
|
||||||
|
import { Command, Extras } from ".";
|
||||||
|
|
||||||
|
const cmdEcho: Command = {
|
||||||
|
names: ["echo", "say"],
|
||||||
|
desc: "repeat text back to you",
|
||||||
|
splitArgs: false,
|
||||||
|
|
||||||
|
checkPerm: async () => true,
|
||||||
|
|
||||||
|
async handler(ex: Extras, content: string) {
|
||||||
|
await ex.say(content);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default cmdEcho;
|
|
@ -1,14 +1,17 @@
|
||||||
import commands, { Command } from ".";
|
import commands, { Command, Extras } from ".";
|
||||||
import { filterAsync } from "../util";
|
import { filterAsync } from "../util";
|
||||||
|
|
||||||
const cmdHelp: Command = {
|
const cmdHelp: Command = {
|
||||||
names: ["help", "cmds"],
|
names: ["help", "cmds"],
|
||||||
desc: "list out commands you have access to",
|
desc: "list out commands you have access to",
|
||||||
|
splitArgs: false,
|
||||||
|
|
||||||
checkPerm: async () => true,
|
checkPerm: async () => true,
|
||||||
async handler(msg, { reply }) {
|
|
||||||
|
async handler(ex: Extras) {
|
||||||
const availCmds = await filterAsync(
|
const availCmds = await filterAsync(
|
||||||
commands,
|
commands,
|
||||||
async (cmd) => await cmd.checkPerm(msg)
|
async (cmd) => await cmd.checkPerm(ex.msg)
|
||||||
);
|
);
|
||||||
|
|
||||||
let text = `// List of commands (${availCmds.length} count)\n`;
|
let text = `// List of commands (${availCmds.length} count)\n`;
|
||||||
|
@ -22,7 +25,7 @@ const cmdHelp: Command = {
|
||||||
}
|
}
|
||||||
|
|
||||||
text = "```\n" + text + "\n```";
|
text = "```\n" + text + "\n```";
|
||||||
await reply(text);
|
await ex.reply(text);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,17 @@
|
||||||
import { Message } from "oceanic.js";
|
import { Message } from "oceanic.js";
|
||||||
import { Command } from ".";
|
import { Command, Extras } from ".";
|
||||||
|
|
||||||
const cmdHi: Command = {
|
const cmdHi: Command = {
|
||||||
names: ["hi", "hello"],
|
names: ["hi", "hello"],
|
||||||
desc: "test command",
|
desc: "test command",
|
||||||
|
splitArgs: false,
|
||||||
|
|
||||||
async checkPerm(msg: Message) {
|
async checkPerm(msg: Message) {
|
||||||
return msg.member?.roles.includes("1327065762031992924");
|
return msg.member?.roles.includes("1327065762031992924");
|
||||||
},
|
},
|
||||||
async handler(msg: Message, { say }) {
|
|
||||||
await say("Test message");
|
async handler(ex: Extras) {
|
||||||
|
await ex.say("Test message");
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -2,20 +2,40 @@ import { Message } from "oceanic.js";
|
||||||
import cmdHelp from "./help";
|
import cmdHelp from "./help";
|
||||||
import cmdHi from "./hi";
|
import cmdHi from "./hi";
|
||||||
import cmdPlay from "./play";
|
import cmdPlay from "./play";
|
||||||
|
import cmdEcho from "./echo";
|
||||||
|
|
||||||
|
export class Extras {
|
||||||
|
constructor(readonly msg: Message) {
|
||||||
|
this.msg = msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
reply = async (text: string) => {
|
||||||
|
await this.msg.channel?.createMessage({
|
||||||
|
content: text,
|
||||||
|
allowedMentions: {
|
||||||
|
repliedUser: false,
|
||||||
|
},
|
||||||
|
messageReference: {
|
||||||
|
messageID: this.msg.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
say = async (text: string) => {
|
||||||
|
await this.msg.channel?.createMessage({
|
||||||
|
content: text,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export type Command = {
|
export type Command = {
|
||||||
names: string[];
|
names: string[];
|
||||||
desc: string;
|
desc: string;
|
||||||
|
splitArgs: boolean;
|
||||||
checkPerm(msg: Message): Promise<boolean | undefined>;
|
checkPerm(msg: Message): Promise<boolean | undefined>;
|
||||||
handler(
|
handler(ex: Extras, ...args: string[]): Promise<void>;
|
||||||
msg: Message,
|
|
||||||
replies: {
|
|
||||||
reply: (text: string) => Promise<void>;
|
|
||||||
say: (text: string) => Promise<void>;
|
|
||||||
}
|
|
||||||
): Promise<void>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const commands: Command[] = [cmdHelp, cmdHi, cmdPlay];
|
const commands: Command[] = [cmdHelp, cmdHi, cmdPlay, cmdEcho];
|
||||||
|
|
||||||
export default commands;
|
export default commands;
|
||||||
|
|
|
@ -4,28 +4,36 @@ import {
|
||||||
createAudioResource,
|
createAudioResource,
|
||||||
VoiceConnectionStatus,
|
VoiceConnectionStatus,
|
||||||
} from "@discordjs/voice";
|
} from "@discordjs/voice";
|
||||||
import { Command } from ".";
|
import { Command, Extras } from ".";
|
||||||
import { existsSync } from "node:fs";
|
import { existsSync } from "node:fs";
|
||||||
|
import { Duplex, Readable } from "node:stream";
|
||||||
|
import ytdl from "@distube/ytdl-core";
|
||||||
|
|
||||||
const cmdPlay: Command = {
|
const cmdPlay: Command = {
|
||||||
names: ["play", "soundtest"],
|
names: ["play"],
|
||||||
desc: "test voice features",
|
desc: "test voice features",
|
||||||
|
splitArgs: true,
|
||||||
|
|
||||||
async checkPerm(msg) {
|
async checkPerm(msg) {
|
||||||
return msg.author.id === "778441081883983893";
|
return msg.author.id === "778441081883983893";
|
||||||
},
|
},
|
||||||
async handler(msg, { reply, say }) {
|
|
||||||
const voiceState = msg.member?.voiceState;
|
|
||||||
if (!voiceState?.channelID)
|
|
||||||
return await reply("You are not in a voice channel");
|
|
||||||
|
|
||||||
if (msg.guildID !== null && msg.client.getVoiceConnection(msg.guildID)) {
|
async handler(ex: Extras, ...args: string[]) {
|
||||||
return await reply("I am already connected");
|
const voiceState = ex.msg.member?.voiceState;
|
||||||
|
if (!voiceState?.channelID)
|
||||||
|
return await ex.reply("You are not in a voice channel");
|
||||||
|
|
||||||
|
if (
|
||||||
|
ex.msg.guildID !== null &&
|
||||||
|
ex.msg.client.getVoiceConnection(ex.msg.guildID)
|
||||||
|
) {
|
||||||
|
return await ex.reply("I am already connected");
|
||||||
}
|
}
|
||||||
|
|
||||||
const conn = voiceState.channel?.join({
|
const conn = voiceState.channel?.join({
|
||||||
selfMute: false,
|
selfMute: false,
|
||||||
});
|
});
|
||||||
if (!conn) return await reply("Failed to join channel");
|
if (!conn) return await ex.reply("Failed to join channel");
|
||||||
|
|
||||||
conn.on(VoiceConnectionStatus.Disconnected, () => {
|
conn.on(VoiceConnectionStatus.Disconnected, () => {
|
||||||
console.log("Rejoining from disconnection!!");
|
console.log("Rejoining from disconnection!!");
|
||||||
|
@ -43,19 +51,24 @@ const cmdPlay: Command = {
|
||||||
});
|
});
|
||||||
|
|
||||||
player.once(AudioPlayerStatus.Playing, async () => {
|
player.once(AudioPlayerStatus.Playing, async () => {
|
||||||
await say("Playing audio");
|
await ex.say("Playing audio");
|
||||||
});
|
});
|
||||||
player.on(AudioPlayerStatus.Idle, async () => {
|
player.on(AudioPlayerStatus.Idle, async () => {
|
||||||
await say("Audio finished playing");
|
await ex.say("Audio finished playing");
|
||||||
});
|
});
|
||||||
|
|
||||||
const name = msg.content.match(/\s(.*)$/)?.[1];
|
const url = args[0];
|
||||||
if (!name || !existsSync(name)) {
|
if (!url) {
|
||||||
return await reply("Audio file not found");
|
return await ex.reply("No url was specified");
|
||||||
}
|
}
|
||||||
console.log(name);
|
|
||||||
|
|
||||||
const audio = createAudioResource(name);
|
const readable = ytdl(url, {
|
||||||
|
filter: "audioonly",
|
||||||
|
quality: "highestaudio",
|
||||||
|
playerClients: ["IOS", "ANDROID"],
|
||||||
|
});
|
||||||
|
|
||||||
|
const audio = createAudioResource(readable);
|
||||||
player.play(audio);
|
player.play(audio);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
export const PREFIX = "!!";
|
export const PREFIX = "!!";
|
||||||
|
export const SPLIT = /\s/;
|
||||||
|
|
38
src/index.ts
38
src/index.ts
|
@ -1,7 +1,7 @@
|
||||||
import { Client } from "oceanic.js";
|
import { Client } from "oceanic.js";
|
||||||
import "dotenv/config";
|
import "dotenv/config";
|
||||||
import commands from "./commands";
|
import commands, { Extras } from "./commands";
|
||||||
import { PREFIX } from "./constants";
|
import { PREFIX, SPLIT } from "./constants";
|
||||||
|
|
||||||
function token() {
|
function token() {
|
||||||
return (
|
return (
|
||||||
|
@ -29,33 +29,27 @@ client.on("ready", async () => {
|
||||||
client.on("messageCreate", async (msg) => {
|
client.on("messageCreate", async (msg) => {
|
||||||
if (msg.author.bot) return;
|
if (msg.author.bot) return;
|
||||||
|
|
||||||
const content = msg.content.toLowerCase().trim();
|
const scanContent = msg.content.toLowerCase();
|
||||||
if (!content.startsWith(PREFIX)) return;
|
if (!scanContent.startsWith(PREFIX)) return;
|
||||||
|
const cmdName = scanContent.split(SPLIT)[0]?.slice(PREFIX.length);
|
||||||
|
|
||||||
|
if (cmdName === undefined) return;
|
||||||
|
|
||||||
const cmdName = content.split(/\s/)[0]?.slice(PREFIX.length) ?? "";
|
|
||||||
const cmd = commands.find((cmd) => cmd.names.includes(cmdName));
|
const cmd = commands.find((cmd) => cmd.names.includes(cmdName));
|
||||||
|
|
||||||
if (cmd === undefined) return;
|
if (cmd === undefined) return;
|
||||||
|
|
||||||
if (await cmd.checkPerm(msg)) {
|
if (await cmd.checkPerm(msg)) {
|
||||||
const reply = async (text: string) => {
|
const ex = new Extras(msg);
|
||||||
await msg.channel?.createMessage({
|
|
||||||
content: text,
|
|
||||||
allowedMentions: {
|
|
||||||
repliedUser: false,
|
|
||||||
},
|
|
||||||
messageReference: {
|
|
||||||
messageID: msg.id,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
};
|
|
||||||
const say = async (text: string) => {
|
|
||||||
await msg.channel?.createMessage({
|
|
||||||
content: text,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
await cmd?.handler(msg, { reply, say });
|
const args = msg.content.split(SPLIT);
|
||||||
|
args.shift();
|
||||||
|
|
||||||
|
if (cmd.splitArgs) await cmd.handler(ex, ...args);
|
||||||
|
else {
|
||||||
|
const content = msg.content.slice(PREFIX.length + cmdName.length);
|
||||||
|
await cmd.handler(ex, content);
|
||||||
|
}
|
||||||
} else await msg.createReaction("❌");
|
} else await msg.createReaction("❌");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue