diff --git a/.dockerignore b/.dockerignore index 7fa30a4..79ba2cd 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,4 +4,4 @@ datastore Dockerfile LICENSE -README.md \ No newline at end of file +README.md diff --git a/.env_example b/.env_example index e41c215..8ff64e7 100644 --- a/.env_example +++ b/.env_example @@ -1,2 +1,2 @@ DISCORD_TOKEN= -RADIOX_STATIONSLISTURL=https://gitea.cwinfo.org/cwchristerw/radio/raw/branch/master/playlist.json \ No newline at end of file +RADIOX_STATIONSLISTURL=https://gitea.cwinfo.org/cwchristerw/radio/raw/branch/master/playlist.json diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6b1750e..091e06d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -16,4 +16,4 @@ updates: interval: "daily" target-branch: "develop" labels: - - "dependencies" \ No newline at end of file + - "dependencies" diff --git a/.github/labeler.yml b/.github/labeler.yml index 5b27493..969a66b 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -3,5 +3,7 @@ dependencies: documentation: - README.md +- SECURITY.md +- CONTRIBUTING.md - LICENSE -- .env_example \ No newline at end of file +- .env_example diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 56eef1b..521a244 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -16,4 +16,4 @@ jobs: with: install: true - name: Build - run: docker build . # will run buildx \ No newline at end of file + run: docker build . # will run buildx diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index ba751b9..de18317 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -14,4 +14,4 @@ jobs: - uses: actions/labeler@v3 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" - sync-labels: true \ No newline at end of file + sync-labels: true diff --git a/.gitignore b/.gitignore index c83c05a..26247f0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ datastore/ node_modules/ npm-debug.log -.vscode/ .env -build/ \ No newline at end of file +build/ diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..247bf3e --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "files.trimFinalNewlines": true, + "editor.renderFinalNewline": false +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..f6a5366 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,27 @@ +# Contributing + +:+1::tada: First off, thanks for taking the time to contribute! :tada::+1: + +If you haven't already, come find us in [Discord](https://waren.io/r/eximiabots-discord). We want you working on things you're excited about. + +Here are some important resources: + + * [Discord](https://waren.io/r/eximiabots-discord) Join our Discord guild. + +## Coding + +### Pull Requests + * Open a new PR from your fork's new branch into develop branch. + * Ensure the PR description clearly describes the problem and solution. Include the relevant issue number if applicable. + * Try to fix all merge conflicts. + +### Coding conventions + * We indent using four spaces (soft tabs) + * We ALWAYS put spaces after list items and method parameters (`[1, 2, 3]`, not `[1,2,3]`), around operators (`x += 1`, not `x+=1`), and around hash arrows. + * This is open source software. Consider the people who will read your code, and make it look nice for them. It's sort of like driving a car: Perhaps you love doing donuts when you're alone, but with passengers the goal is to make the ride as smooth as possible. + +## Testing + +We have currently automated testing in Github Workflows, you can suggest new Github Workflows to us by making PR. + +Every release is manually tested by [cwchristerw](https://github.com/cwchristerw) or [MatteZ02](https://github.com/MatteZ02). diff --git a/Dockerfile b/Dockerfile index bcfb1fa..a052374 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,4 +14,4 @@ RUN npm install RUN npm run build -CMD [ "npm", "start" ] \ No newline at end of file +CMD [ "npm", "start" ] diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..4adaa6f --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,17 @@ +# Security Policy + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 0.3.x | :white_check_mark: | +| 0.2.x | :x: | +| 0.1.x | :x: | + +## Reporting a Vulnerability + +Use this section to tell people how to report a vulnerability. + +Tell them where to go, how often they can expect to get an update on a +reported vulnerability, what to expect if the vulnerability is accepted or +declined, etc. diff --git a/package-lock.json b/package-lock.json index d9ffb9c..b3d384d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,27 +1,27 @@ { "name": "eximiabots-radiox", - "version": "0.3.7", + "version": "0.3.8", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "eximiabots-radiox", - "version": "0.3.7", + "version": "0.3.8", "license": "MIT", "dependencies": { "@discordjs/builders": "^0.6.0", "@discordjs/opus": "^0.6.0", "@discordjs/rest": "^0.1.1-canary.0", "@discordjs/voice": "^0.6.0", - "discord-api-types": "^0.22.0", + "discord-api-types": "^0.23.1", "discord.js": "^13.1.0", "dotenv": "^10.0.0", "libsodium-wrappers": "^0.7.9", - "node-fetch": "^2.6.2", + "node-fetch": "^3.0.0", "path": "^0.12.7" }, "devDependencies": { - "@types/node": "^16.7.13", + "@types/node": "^16.9.0", "@types/ws": "^7.4.7", "@typescript-eslint/eslint-plugin": "^4.31.0", "@typescript-eslint/parser": "^4.31.0", @@ -180,6 +180,14 @@ "npm": ">=7.0.0" } }, + "node_modules/@discordjs/builders/node_modules/discord-api-types": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", + "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==", + "engines": { + "node": ">=12" + } + }, "node_modules/@discordjs/collection": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.2.1.tgz", @@ -220,6 +228,14 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@discordjs/node-pre-gyp/node_modules/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, "node_modules/@discordjs/opus": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.6.0.tgz", @@ -251,6 +267,22 @@ "node": ">=16.0.0" } }, + "node_modules/@discordjs/rest/node_modules/discord-api-types": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", + "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@discordjs/rest/node_modules/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, "node_modules/@discordjs/voice": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.6.0.tgz", @@ -281,6 +313,14 @@ "node": ">=12.0.0" } }, + "node_modules/@discordjs/voice/node_modules/discord-api-types": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", + "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==", + "engines": { + "node": ">=12" + } + }, "node_modules/@discordjs/voice/node_modules/node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -460,9 +500,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.7.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.13.tgz", - "integrity": "sha512-pLUPDn+YG3FYEt/pHI74HmnJOWzeR+tOIQzUx93pi9M7D8OE7PSLr97HboXwk5F+JS+TLtWuzCOW97AHjmOXXA==" + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" }, "node_modules/@types/ws": { "version": "7.4.7", @@ -1190,6 +1230,14 @@ "node": ">=8" } }, + "node_modules/data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==", + "engines": { + "node": ">= 6" + } + }, "node_modules/debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -1285,9 +1333,9 @@ } }, "node_modules/discord-api-types": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", - "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.23.1.tgz", + "integrity": "sha512-igWmn+45mzXRWNEPU25I/pr8MwxHb767wAr51oy3VRLRcTlp5ADBbrBR0lq3SA1Rfw3MtM4TQu1xo3kxscfVdQ==", "engines": { "node": ">=12" } @@ -1327,6 +1375,22 @@ "npm": ">=7.0.0" } }, + "node_modules/discord.js/node_modules/discord-api-types": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", + "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/discord.js/node_modules/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -1743,6 +1807,27 @@ "reusify": "^1.0.4" } }, + "node_modules/fetch-blob": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.2.tgz", + "integrity": "sha512-hunJbvy/6OLjCD0uuhLdp0mMPzP/yd2ssd1t2FCJsaA7wkWhpbp9xfuNVpv7Ll4jFhzp6T4LAupSiV9uOeg0VQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -2535,11 +2620,19 @@ "dev": true }, "node_modules/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.0.0.tgz", + "integrity": "sha512-bKMI+C7/T/SPU1lKnbQbwxptpCrG9ashG+VkytmXCPZyuM9jB6VU+hY0oi4lC8LxTtAeWdckNCTa3nrGsAdA3Q==", + "dependencies": { + "data-uri-to-buffer": "^3.0.1", + "fetch-blob": "^3.1.2" + }, "engines": { - "node": "4.x || >=6.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, "node_modules/nodemon": { @@ -2836,9 +2929,9 @@ } }, "node_modules/prettier": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", - "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.0.tgz", + "integrity": "sha512-DsEPLY1dE5HF3BxCRBmD4uYZ+5DCbvatnolqTqcxEgKVZnL2kUfyu7b8pPQ5+hTBkdhU9SLUmK0/pHb07RE4WQ==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -3783,6 +3876,14 @@ "node": ">=0.10.0" } }, + "node_modules/web-streams-polyfill": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.1.tgz", + "integrity": "sha512-Czi3fG883e96T4DLEPRvufrF2ydhOOW1+1a6c3gNjH2aIh50DNFBdfwh2AKoOf1rXvpvavAoA11Qdq9+BKjE0Q==", + "engines": { + "node": ">= 8" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3874,9 +3975,9 @@ } }, "node_modules/ws": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.4.tgz", - "integrity": "sha512-zP9z6GXm6zC27YtspwH99T3qTG7bBFv2VIkeHstMLrLlDJuzA7tQ5ls3OJ1hOGGCzTQPniNJoHXIAOS0Jljohg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", "engines": { "node": ">=8.3.0" }, @@ -4027,6 +4128,13 @@ "ow": "^0.27.0", "ts-mixer": "^6.0.0", "tslib": "^2.3.1" + }, + "dependencies": { + "discord-api-types": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", + "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==" + } } }, "@discordjs/collection": { @@ -4058,6 +4166,13 @@ "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.8" + }, + "dependencies": { + "node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA==" + } } }, "@discordjs/opus": { @@ -4082,6 +4197,18 @@ "form-data": "^4.0.0", "node-fetch": "^2.6.1", "tslib": "^2.3.0" + }, + "dependencies": { + "discord-api-types": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", + "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==" + }, + "node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA==" + } } }, "@discordjs/voice": { @@ -4107,6 +4234,11 @@ "node-addon-api": "^3.2.1" } }, + "discord-api-types": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", + "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==" + }, "node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -4237,9 +4369,9 @@ "dev": true }, "@types/node": { - "version": "16.7.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.7.13.tgz", - "integrity": "sha512-pLUPDn+YG3FYEt/pHI74HmnJOWzeR+tOIQzUx93pi9M7D8OE7PSLr97HboXwk5F+JS+TLtWuzCOW97AHjmOXXA==" + "version": "16.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", + "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" }, "@types/ws": { "version": "7.4.7", @@ -4764,6 +4896,11 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true }, + "data-uri-to-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz", + "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==" + }, "debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -4830,9 +4967,9 @@ } }, "discord-api-types": { - "version": "0.22.0", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", - "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==" + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.23.1.tgz", + "integrity": "sha512-igWmn+45mzXRWNEPU25I/pr8MwxHb767wAr51oy3VRLRcTlp5ADBbrBR0lq3SA1Rfw3MtM4TQu1xo3kxscfVdQ==" }, "discord.js": { "version": "13.1.0", @@ -4860,6 +4997,16 @@ "ts-mixer": "^6.0.0", "tslib": "^2.3.0" } + }, + "discord-api-types": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.22.0.tgz", + "integrity": "sha512-l8yD/2zRbZItUQpy7ZxBJwaLX/Bs2TGaCthRppk8Sw24LOIWg12t9JEreezPoYD0SQcC2htNNo27kYEpYW/Srg==" + }, + "node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA==" } } }, @@ -5178,6 +5325,14 @@ "reusify": "^1.0.4" } }, + "fetch-blob": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.2.tgz", + "integrity": "sha512-hunJbvy/6OLjCD0uuhLdp0mMPzP/yd2ssd1t2FCJsaA7wkWhpbp9xfuNVpv7Ll4jFhzp6T4LAupSiV9uOeg0VQ==", + "requires": { + "web-streams-polyfill": "^3.0.3" + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -5797,9 +5952,13 @@ "dev": true }, "node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-aLoxToI6RfZ+0NOjmWAgn9+LEd30YCkJKFSyWacNZdEKTit/ZMcKjGkTRo8uWEsnIb/hfKecNPEbln02PdWbcA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.0.0.tgz", + "integrity": "sha512-bKMI+C7/T/SPU1lKnbQbwxptpCrG9ashG+VkytmXCPZyuM9jB6VU+hY0oi4lC8LxTtAeWdckNCTa3nrGsAdA3Q==", + "requires": { + "data-uri-to-buffer": "^3.0.1", + "fetch-blob": "^3.1.2" + } }, "nodemon": { "version": "2.0.12", @@ -6018,9 +6177,9 @@ "dev": true }, "prettier": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.2.tgz", - "integrity": "sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.0.tgz", + "integrity": "sha512-DsEPLY1dE5HF3BxCRBmD4uYZ+5DCbvatnolqTqcxEgKVZnL2kUfyu7b8pPQ5+hTBkdhU9SLUmK0/pHb07RE4WQ==", "dev": true }, "prettier-linter-helpers": { @@ -6705,6 +6864,11 @@ "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=" }, + "web-streams-polyfill": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.1.tgz", + "integrity": "sha512-Czi3fG883e96T4DLEPRvufrF2ydhOOW1+1a6c3gNjH2aIh50DNFBdfwh2AKoOf1rXvpvavAoA11Qdq9+BKjE0Q==" + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -6780,9 +6944,9 @@ } }, "ws": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.4.tgz", - "integrity": "sha512-zP9z6GXm6zC27YtspwH99T3qTG7bBFv2VIkeHstMLrLlDJuzA7tQ5ls3OJ1hOGGCzTQPniNJoHXIAOS0Jljohg==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", "requires": {} }, "xdg-basedir": { diff --git a/package.json b/package.json index 6f80f33..d394755 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "eximiabots-radiox", - "version": "0.3.7", + "version": "0.3.8", "description": "Internet Radio to your Discord guild", "main": "index.js", "scripts": { "build": "rimraf ./build && tsc", - "start": "node build/index.js", - "start:dev": "npm run build && node build/index.js" + "start": "node --no-warnings build/index.js", + "start:dev": "npm run build && node --no-warnings build/index.js" }, "repository": { "type": "git", @@ -22,15 +22,15 @@ "@discordjs/opus": "^0.6.0", "@discordjs/rest": "^0.1.1-canary.0", "@discordjs/voice": "^0.6.0", - "discord-api-types": "^0.22.0", + "discord-api-types": "^0.23.1", "discord.js": "^13.1.0", "dotenv": "^10.0.0", "libsodium-wrappers": "^0.7.9", - "node-fetch": "^2.6.2", + "node-fetch": "^3.0.0", "path": "^0.12.7" }, "devDependencies": { - "@types/node": "^16.7.13", + "@types/node": "^16.9.0", "@types/ws": "^7.4.7", "@typescript-eslint/eslint-plugin": "^4.31.0", "@typescript-eslint/parser": "^4.31.0", @@ -48,4 +48,4 @@ "node": ">=16.8.0", "npm": ">=7.0.0" } -} \ No newline at end of file +} diff --git a/src/Client.ts b/src/Client.ts index 761e7cd..70e0095 100644 --- a/src/Client.ts +++ b/src/Client.ts @@ -52,6 +52,9 @@ class RadioClient extends Client { this.funcs.logger("Bot", "Starting"); + this.funcs.logger("Maintenance Mode", "Enabled"); + this.config.maintenance = true; + const commandFiles = fs.readdirSync(path.join("./src/client/commands")).filter(f => f.endsWith(".js")); for (const file of commandFiles) { const command = require(`./client/commands/${file}`); @@ -73,11 +76,17 @@ class RadioClient extends Client { this.on("interactionCreate", interaction => { require(`${events}interactionCreate`).execute(this, interaction); }); - + this.on("voiceStateUpdate", (oldState, newState) => { require(`${events}voiceStateUpdate`).execute(this, oldState, newState); }); - + + this.on("error", error => { + this.funcs.logger("Discord Client / Error"); + console.error(error); + console.log(''); + }); + process.on('SIGINT', () => { require(`${events}SIGINT`).execute(this); }); @@ -89,13 +98,21 @@ class RadioClient extends Client { process.on('uncaughtException', (error) => { require(`${events}uncaughtException`).execute(this, error); }); - - this.on("error", error => { - console.error(error); + + process.on('exit', () => { + this.funcs.logger("Bot", "Stopping"); }); - this.login(this.config.token).catch(err => console.log("Failed to login: " + err)); + process.on('warning', (warning) => { + require(`${events}warning`).execute(this, warning); + }); + + this.login(this.config.token).catch((err) => { + this.funcs.logger("Discord Client / Error"); + console.log(err); + console.log(''); + }); } } -export default RadioClient \ No newline at end of file +export default RadioClient diff --git a/src/client/commands.js b/src/client/commands.js index 0d737d5..9641933 100644 --- a/src/client/commands.js +++ b/src/client/commands.js @@ -15,7 +15,7 @@ module.exports = { command.data = new SlashCommandBuilder() .setName(command.name) .setDescription(command.description); - + command.data = command.data.toJSON(); if(command.options) { command.options.forEach(function(option) { @@ -67,4 +67,4 @@ module.exports = { } })(); } -} \ No newline at end of file +} diff --git a/src/client/commands/bug.js b/src/client/commands/bug.js index 48091b1..26292d1 100644 --- a/src/client/commands/bug.js +++ b/src/client/commands/bug.js @@ -23,4 +23,4 @@ module.exports = { ephemeral: true }); } -}; \ No newline at end of file +}; diff --git a/src/client/commands/help.js b/src/client/commands/help.js index 212346b..52c4666 100644 --- a/src/client/commands/help.js +++ b/src/client/commands/help.js @@ -26,7 +26,7 @@ module.exports = { .setDescription(message.helpDescription) .setImage('https://waren.io/berriabot-temp-sa7a36a9xm6837br/images/empty-3.png') .setFooter(client.messages.footerText, "https://cdn.discordapp.com/emojis/" + client.messageEmojis["eximiabots"].replace(/[^0-9]+/g, '')); - + interaction.reply({ embeds: [embed], ephemeral: true diff --git a/src/client/commands/invite.js b/src/client/commands/invite.js index 5c66601..c9f69a8 100644 --- a/src/client/commands/invite.js +++ b/src/client/commands/invite.js @@ -19,4 +19,4 @@ module.exports = { ephemeral: true }); } -}; \ No newline at end of file +}; diff --git a/src/client/commands/list.js b/src/client/commands/list.js index 5a18b64..59772f0 100644 --- a/src/client/commands/list.js +++ b/src/client/commands/list.js @@ -6,6 +6,7 @@ module.exports = { category: 'radio', execute(interaction, client) { let message = {}; + if(!client.stations) { message.errorToGetPlaylist = client.messages.errorToGetPlaylist.replace("%client.config.supportGuild%", client.config.supportGuild); return interaction.reply({ @@ -13,10 +14,10 @@ module.exports = { ephemeral: true }); } - + const radio = client.radio.get(interaction.guild.id); - - if(radio){ + + if(radio && !client.config.maintenance){ client.funcs.listStations(client, interaction); } else { let stations = `${client.stations.map(s => `**#** ${s.name}`).join('\n')}` @@ -39,4 +40,4 @@ module.exports = { }); } } -}; \ No newline at end of file +}; diff --git a/src/client/commands/maintenance.js b/src/client/commands/maintenance.js index 86f23e9..8f7745e 100644 --- a/src/client/commands/maintenance.js +++ b/src/client/commands/maintenance.js @@ -1,5 +1,6 @@ import Discord from "discord.js"; -import fetch from "node-fetch"; +const _importDynamic = new Function('modulePath', 'return import(modulePath)'); +const fetch = (...args) => _importDynamic('node-fetch').then(({default: fetch}) => fetch(...args)); module.exports = { name: 'maintenance', @@ -60,7 +61,7 @@ module.exports = { value: "9" } ); - + const menu = new Discord.MessageActionRow() .addComponents( new Discord.MessageSelectMenu() @@ -84,7 +85,7 @@ module.exports = { .setColor(client.config.embedColor) .setDescription(options.find(option => option.value == action).label) .setFooter(client.messages.footerText, "https://cdn.discordapp.com/emojis/" + client.messageEmojis["eximiabots"].replace(/[^0-9]+/g, '')); - + interaction.reply({ embeds: [embed], ephemeral: true @@ -116,7 +117,7 @@ module.exports = { client.stations = await fetch(client.config.stationslistUrl) .then(client.funcs.checkFetchStatus) .then(response => response.json()); - + client.funcs.logger('Stations', 'Successfully fetched list'); } catch (error) { client.funcs.logger('Stations', 'Fetching list failed'); @@ -124,54 +125,17 @@ module.exports = { break; case "8": client.user.setStatus('dnd'); + client.funcs.logger("Maintenance Mode", "Enabled"); + client.config.maintenance = false; break; case "9": client.user.setStatus('online'); + client.funcs.logger("Maintenance Mode", "Disabled"); + client.config.maintenance = false; break; default: } - - /* - if(!client.stations) { - message.errorToGetPlaylist = client.messages.errorToGetPlaylist.replace("%client.config.supportGuild%", client.config.supportGuild); - return interaction.reply(client.messageEmojis["error"] + message.errorToGetPlaylist); - } - - let currentRadios = client.radio.keys(); - let radio = currentRadios.next(); - let stoppedRadios = ""; - - client.user.setStatus('dnd'); - - while (!radio.done) { - let currentRadio = client.radio.get(radio.value); - currentRadio.guild = client.datastore.getEntry(radio.value).guild; - - if(currentRadio){ - client.funcs.statisticsUpdate(client, currentRadio.guild, currentRadio); - currentRadio.connection?.destroy(); - currentRadio.audioPlayer?.stop(); - currentRadio.message?.delete(); - client.radio.delete(radio.value); - stoppedRadios += "-" + radio.value + ": " + currentRadio.guild.name + "\n"; - } - radio = currentRadios.next(); - } - - const embed = new Discord.MessageEmbed() - .setTitle(client.messages.maintenanceTitle) - .setThumbnail("https://cdn.discordapp.com/emojis/" + client.messageEmojis["maintenance"].replace(/[^0-9]+/g, '')) - .setColor(client.config.embedColor) - .setDescription("Stopped all radios" + "\n" + stoppedRadios) - .setImage('https://waren.io/berriabot-temp-sa7a36a9xm6837br/images/empty-3.png') - .setFooter(client.messages.footerText, "https://cdn.discordapp.com/emojis/" + client.messageEmojis["eximiabots"].replace(/[^0-9]+/g, '')); - - interaction.reply({ - embeds: [embed], - ephemeral: true - });*/ - } -}; \ No newline at end of file +}; diff --git a/src/client/commands/next.js b/src/client/commands/next.js index c4ae658..ab3a0f0 100644 --- a/src/client/commands/next.js +++ b/src/client/commands/next.js @@ -5,7 +5,7 @@ module.exports = { async execute(interaction, client, command) { if (client.funcs.check(client, interaction, command)) { const radio = client.radio.get(interaction.guild.id); - + let index = client.stations.findIndex(station => station.name == radio.station.name) + 1; if(index == client.stations.length) index = 0; @@ -20,7 +20,7 @@ module.exports = { client.funcs.statisticsUpdate(client, interaction.guild, radio); radio.audioPlayer.stop(); - + let date = new Date(); radio.station = station; radio.textChannel = interaction.channel; @@ -36,4 +36,4 @@ module.exports = { } } -} \ No newline at end of file +} diff --git a/src/client/commands/nowplaying.js b/src/client/commands/nowplaying.js index bf42da9..b863dc5 100644 --- a/src/client/commands/nowplaying.js +++ b/src/client/commands/nowplaying.js @@ -25,11 +25,11 @@ module.exports = { .setDescription(message.nowplayingDescription) .setImage('https://waren.io/berriabot-temp-sa7a36a9xm6837br/images/empty-3.png') .setFooter(client.messages.footerText, "https://cdn.discordapp.com/emojis/" + client.messageEmojis["eximiabots"].replace(/[^0-9]+/g, '')); - + interaction.reply({ embeds: [embed], ephemeral: true }); } } -}; \ No newline at end of file +}; diff --git a/src/client/commands/play.js b/src/client/commands/play.js index fb29976..cdbd6b4 100644 --- a/src/client/commands/play.js +++ b/src/client/commands/play.js @@ -14,6 +14,15 @@ module.exports = { category: "radio", async execute(interaction, client) { let message = {}; + + if(client.config.maintenance){ + interaction.reply({ + content: client.messageEmojis["error"] + client.messages.maintenance, + ephemeral: true + }); + return false; + } + if(!client.stations) { message.errorToGetPlaylist = client.messages.errorToGetPlaylist.replace("%client.config.supportGuild%", client.config.supportGuild); return interaction.reply({ @@ -90,7 +99,7 @@ module.exports = { if (radio) { client.funcs.statisticsUpdate(client, interaction.guild, radio); radio.audioPlayer.stop(); - + let date = new Date(); radio.station = station; radio.textChannel = interaction.channel; @@ -141,4 +150,4 @@ module.exports = { }); } } -}; \ No newline at end of file +}; diff --git a/src/client/commands/prev.js b/src/client/commands/prev.js index df987b8..78ac583 100644 --- a/src/client/commands/prev.js +++ b/src/client/commands/prev.js @@ -20,12 +20,12 @@ module.exports = { client.funcs.statisticsUpdate(client, interaction.guild, radio); radio.audioPlayer.stop(); - + let date = new Date(); radio.station = station; radio.textChannel = interaction.channel; radio.startTime = date.getTime(); - + if(interaction.isCommand()) { client.funcs.play(interaction, interaction.guild, client, url); } @@ -36,4 +36,4 @@ module.exports = { } } -} \ No newline at end of file +} diff --git a/src/client/commands/statistics.js b/src/client/commands/statistics.js index df31e33..56c533c 100644 --- a/src/client/commands/statistics.js +++ b/src/client/commands/statistics.js @@ -11,7 +11,7 @@ module.exports = { let currentGuild = client.datastore.getEntry(interaction.guild.id); let global = client.datastore.getEntry("global"); let statistics = ""; - + if(!client.stations) { message.errorToGetPlaylist = client.messages.errorToGetPlaylist.replace("%client.config.supportGuild%", client.config.supportGuild); return interaction.reply({ @@ -35,7 +35,7 @@ module.exports = { } }); } - + const embed = new Discord.MessageEmbed() .setTitle(client.messages.statisticsTitle) .setThumbnail("https://cdn.discordapp.com/emojis/" + client.messageEmojis["statistics"].replace(/[^0-9]+/g, '')) @@ -49,4 +49,4 @@ module.exports = { ephemeral: true }); } -}; \ No newline at end of file +}; diff --git a/src/client/commands/status.js b/src/client/commands/status.js index c40fdbd..66eb727 100644 --- a/src/client/commands/status.js +++ b/src/client/commands/status.js @@ -28,4 +28,4 @@ module.exports = { }); } -}; \ No newline at end of file +}; diff --git a/src/client/commands/stop.js b/src/client/commands/stop.js index fbdb3e9..dd6174f 100644 --- a/src/client/commands/stop.js +++ b/src/client/commands/stop.js @@ -5,8 +5,8 @@ module.exports = { description: 'Stop radio', category: 'radio', async execute(interaction, client, command) { - const radio = client.radio.get(interaction.guild.id); if (client.funcs.check(client, interaction, command)) { + const radio = client.radio.get(interaction.guild.id); client.funcs.statisticsUpdate(client, interaction.guild, radio); radio.connection?.destroy(); radio.audioPlayer?.stop(); @@ -38,4 +38,4 @@ module.exports = { }); } } -}; \ No newline at end of file +}; diff --git a/src/client/datastore.js b/src/client/datastore.js index dbacf73..4db0eee 100644 --- a/src/client/datastore.js +++ b/src/client/datastore.js @@ -6,7 +6,7 @@ module.exports = class { this.map = new Map(); this.loadData(); } - + loadData() { const dir = path.join(path.dirname(__dirname), '../datastore'); if (!fs.existsSync(dir)) { @@ -33,7 +33,7 @@ module.exports = class { var statistics = {}; if(!client.stations) return; - + let calculation = guilds.next(); while (!calculation.done) { @@ -47,7 +47,7 @@ module.exports = class { statistics[stations[station].name].time = 0; statistics[stations[station].name].used = 0; } - + statistics[stations[station].name].time = parseInt(statistics[stations[station].name].time)+parseInt(currentGuild.statistics[stations[station].name].time); statistics[stations[station].name].used = parseInt(statistics[stations[station].name].used)+parseInt(currentGuild.statistics[stations[station].name].used); } @@ -84,26 +84,26 @@ module.exports = class { this.map.set(id, newData); this.saveEntry(id, newData); } - + getEntry(id){ return this.map.get(id); } - + updateEntry(guild, newData) { newData.guild.name = guild.name; let date = new Date(); newData.updated = date.toISOString().substring(0, 10) - + this.map.set(guild.id, newData); this.saveEntry(guild.id, newData); //this.showEntry(this.getEntry(guild.id)); } - + showEntry(data){ console.log(data); } - + createTestFile () { let newData = { "guild": { @@ -120,10 +120,10 @@ module.exports = class { } } - + this.updateEntry(newData.guild, newData); } - + saveEntry(file, data) { data = JSON.stringify(data, null, 4); diff --git a/src/client/emojis.js b/src/client/emojis.js index 7e1fbbf..61af51a 100644 --- a/src/client/emojis.js +++ b/src/client/emojis.js @@ -39,4 +39,4 @@ module.exports = { } } } -} \ No newline at end of file +} diff --git a/src/client/events/SIGINT.js b/src/client/events/SIGINT.js index a63248a..6445029 100644 --- a/src/client/events/SIGINT.js +++ b/src/client/events/SIGINT.js @@ -3,16 +3,12 @@ module.exports = { execute(client) { client.user.setStatus('dnd'); - console.log("\n"); - client.funcs.logger("Bot", "Closing"); - console.log("\n"); - client.funcs.saveRadios(client); - + setInterval(() => { if(client.radio.size == 0){ process.exit(); } }, 500); } -} \ No newline at end of file +} diff --git a/src/client/events/SIGTERM.js b/src/client/events/SIGTERM.js index 99e7af3..62c4830 100644 --- a/src/client/events/SIGTERM.js +++ b/src/client/events/SIGTERM.js @@ -3,4 +3,4 @@ module.exports = { execute(client) { process.emit('SIGINT'); } -} \ No newline at end of file +} diff --git a/src/client/events/interactionCreate.js b/src/client/events/interactionCreate.js index 65d7168..4b37466 100644 --- a/src/client/events/interactionCreate.js +++ b/src/client/events/interactionCreate.js @@ -4,7 +4,7 @@ module.exports = { const permissions = interaction.channel.permissionsFor(interaction.client.user); if (!permissions.has('VIEW_CHANNEL')) return; - + if (!permissions.has('EMBED_LINKS')) return interaction.reply({ content: client.messages.noPermsEmbed, ephemeral: true @@ -14,7 +14,7 @@ module.exports = { const commandName = interaction.commandName; const command = client.commands.get(commandName); if (!command) return; - + try { command.execute(interaction, client); } catch (error) { diff --git a/src/client/events/messageCreate.js b/src/client/events/messageCreate.js index 0f8b9d6..939f6b1 100644 --- a/src/client/events/messageCreate.js +++ b/src/client/events/messageCreate.js @@ -16,7 +16,7 @@ module.exports = { } else { return; } - + const args = message.content.slice(prefix.length).split(' '); if (!message.content.startsWith(prefix)) return; if (!args[0]) return; @@ -30,7 +30,7 @@ module.exports = { let newMessage = {}; newMessage.messageCommandsDeprecatedTitle = client.messages.messageCommandsDeprecatedTitle.replace("%client.user.username%", client.user.username); - + const embed = new Discord.MessageEmbed() .setTitle(newMessage.messageCommandsDeprecatedTitle) .setThumbnail("https://cdn.discordapp.com/emojis/" + client.messageEmojis["logo"].replace(/[^0-9]+/g, '')) @@ -55,4 +55,4 @@ module.exports = { console.error(error); } } -} \ No newline at end of file +} diff --git a/src/client/events/messageDelete.js b/src/client/events/messageDelete.js index 9cce584..ee54793 100644 --- a/src/client/events/messageDelete.js +++ b/src/client/events/messageDelete.js @@ -7,4 +7,4 @@ module.exports = { if(msg.id != radio.message.id) return; radio.message = null; } -} \ No newline at end of file +} diff --git a/src/client/events/ready.js b/src/client/events/ready.js index 848885e..ccc6a66 100644 --- a/src/client/events/ready.js +++ b/src/client/events/ready.js @@ -1,5 +1,6 @@ import Datastore from "../datastore.js"; -import fetch from "node-fetch"; +const _importDynamic = new Function('modulePath', 'return import(modulePath)'); +const fetch = (...args) => _importDynamic('node-fetch').then(({default: fetch}) => fetch(...args)); module.exports = { name: 'ready', @@ -21,7 +22,7 @@ module.exports = { /*DEVELOPERS*/ client.funcs.logger('Developers'); - + client.developers = ""; let user = ""; for (let i = 0; i < client.config.devId.length; i++) { @@ -53,7 +54,7 @@ module.exports = { client.funcs.logger('Stations', 'Fetching list failed'); console.error(error + "\n"); } - + setInterval(async () => { try { client.funcs.logger('Stations', 'Started fetching list – ' + client.config.stationslistUrl); @@ -71,7 +72,7 @@ module.exports = { if(!client.stations) { client.user.setStatus('dnd'); } - + /*GUILDS*/ client.funcs.logger('Guilds', 'Started fetching list'); @@ -83,7 +84,7 @@ module.exports = { console.log("\n"); client.funcs.logger('Guilds', 'Successfully fetched list'); - + /*STATISTICS*/ client.datastore.calculateGlobal(client); @@ -98,5 +99,11 @@ module.exports = { client.funcs.restoreRadios(client, guilds); }, 5000); + setTimeout(function () { + /*MAINTENANCE MODE*/ + client.funcs.logger("Maintenance Mode", "Disabled"); + client.config.maintenance = false; + }, 10000); + } -} \ No newline at end of file +} diff --git a/src/client/events/uncaughtException.js b/src/client/events/uncaughtException.js index 5df8a0b..b81609d 100644 --- a/src/client/events/uncaughtException.js +++ b/src/client/events/uncaughtException.js @@ -1,7 +1,10 @@ module.exports = { name: 'uncaughtException', execute(client, error) { + client.funcs.logger("Error"); console.log(error.stack); + console.log(''); + process.emit('SIGINT'); } -} \ No newline at end of file +} diff --git a/src/client/events/warning.js b/src/client/events/warning.js new file mode 100644 index 0000000..537c089 --- /dev/null +++ b/src/client/events/warning.js @@ -0,0 +1,12 @@ +module.exports = { + name: 'warning', + execute(client, warning) { + if(warning.name == "ExperimentalWarning" && warning.message.startsWith("stream/web")) return; + + client.funcs.logger("Warning"); + console.warn(warning.name); + console.warn(warning.message); + console.warn(warning.stack); + console.log(''); + } +} diff --git a/src/client/funcs/check.js b/src/client/funcs/check.js index cfbbbc5..e164cbb 100644 --- a/src/client/funcs/check.js +++ b/src/client/funcs/check.js @@ -2,6 +2,13 @@ module.exports = function (client, interaction, command) { let message = {}; const radio = client.radio.get(interaction.guild.id); const permissions = interaction.channel.permissionsFor(interaction.user); + if(client.config.maintenance){ + interaction.reply({ + content: client.messageEmojis["error"] + client.messages.maintenance, + ephemeral: true + }); + return false; + } if(!client.stations) { message.errorToGetPlaylist = client.messages.errorToGetPlaylist.replace("%client.config.supportGuild%", client.config.supportGuild); interaction.reply({ diff --git a/src/client/funcs/checkFetchStatus.js b/src/client/funcs/checkFetchStatus.js index 3b6c371..4774d77 100644 --- a/src/client/funcs/checkFetchStatus.js +++ b/src/client/funcs/checkFetchStatus.js @@ -4,4 +4,4 @@ module.exports = function (response) { } else { throw new Error(response.status + " " + response.statusText); } -} \ No newline at end of file +} diff --git a/src/client/funcs/isDev.js b/src/client/funcs/isDev.js index 39e98f8..3992c1e 100644 --- a/src/client/funcs/isDev.js +++ b/src/client/funcs/isDev.js @@ -7,4 +7,4 @@ module.exports = function (devList, authorID){ } }); return response; -} \ No newline at end of file +} diff --git a/src/client/funcs/listStations.js b/src/client/funcs/listStations.js index 6befe09..d0cb036 100644 --- a/src/client/funcs/listStations.js +++ b/src/client/funcs/listStations.js @@ -30,4 +30,4 @@ module.exports = function (client, interaction){ components: [menu], ephemeral: true }); -} \ No newline at end of file +} diff --git a/src/client/funcs/loadState.js b/src/client/funcs/loadState.js index f7ff54b..676685e 100644 --- a/src/client/funcs/loadState.js +++ b/src/client/funcs/loadState.js @@ -7,4 +7,4 @@ module.exports = function loadState(client, guild){ data.state = {}; client.datastore.updateEntry(guild, data); return state; -} \ No newline at end of file +} diff --git a/src/client/funcs/logger.js b/src/client/funcs/logger.js index 80ce35c..610fdc5 100644 --- a/src/client/funcs/logger.js +++ b/src/client/funcs/logger.js @@ -2,4 +2,4 @@ module.exports = function (area, text){ let date = new Date(); console.log('[' + area + '] – ' + date.toISOString()); if(text) console.log(text + '\n'); -} \ No newline at end of file +} diff --git a/src/client/funcs/msToTime.js b/src/client/funcs/msToTime.js index 24574ca..07fdb9a 100644 --- a/src/client/funcs/msToTime.js +++ b/src/client/funcs/msToTime.js @@ -9,4 +9,4 @@ module.exports = function msToTime(duration) { : +hours > 0 ? `${+hours < 10 ? `0${hours}` : hours}:${+minutes < 10 ? `0${minutes}` : minutes}:${+seconds < 10 ? `0${seconds}` : seconds}` : `${+minutes < 10 ? `0${minutes}` : minutes}:${+seconds < 10 ? `0${seconds}` : seconds}`; -} \ No newline at end of file +} diff --git a/src/client/funcs/play.js b/src/client/funcs/play.js index fe81608..464e242 100644 --- a/src/client/funcs/play.js +++ b/src/client/funcs/play.js @@ -47,7 +47,7 @@ module.exports = async function play(interaction, guild, client, url) { .addField(client.messages.nowplayingTitle, message.nowplayingDescription, true) .setImage('https://waren.io/berriabot-temp-sa7a36a9xm6837br/images/empty-3.png') .setFooter(client.messages.footerText, "https://cdn.discordapp.com/emojis/" + client.messageEmojis["eximiabots"].replace(/[^0-9]+/g, '')); - + const buttons = new Discord.MessageActionRow() .addComponents( new Discord.MessageButton() @@ -87,10 +87,10 @@ module.exports = async function play(interaction, guild, client, url) { } message.play = client.messages.play.replace("%radio.station.name%", radio.station.name); - + interaction?.reply({ content: client.messageEmojis["play"] + message.play, ephemeral: true }); - -} \ No newline at end of file + +} diff --git a/src/client/funcs/restoreRadios.js b/src/client/funcs/restoreRadios.js index c1a4a39..10aff24 100644 --- a/src/client/funcs/restoreRadios.js +++ b/src/client/funcs/restoreRadios.js @@ -43,7 +43,7 @@ module.exports = async function restoreRadios(client, guilds) { construct.connection = connection; let date = new Date(); construct.startTime = date.getTime(); - + client.funcs.play(null, guild, client, url, Discord); client.datastore.checkEntry(guild.id); @@ -59,4 +59,4 @@ module.exports = async function restoreRadios(client, guilds) { console.log(error); } }); -} \ No newline at end of file +} diff --git a/src/client/funcs/saveRadios.js b/src/client/funcs/saveRadios.js index 30280e1..9e7b187 100644 --- a/src/client/funcs/saveRadios.js +++ b/src/client/funcs/saveRadios.js @@ -1,11 +1,11 @@ module.exports = function saveRadios(client) { let currentRadios = client.radio.keys(); let radio = currentRadios.next(); - + while (!radio.done) { let currentRadio = client.radio.get(radio.value); currentRadio.guild = client.datastore.getEntry(radio.value).guild; - + if (currentRadio) { client.funcs.statisticsUpdate(client, currentRadio.guild, currentRadio); client.funcs.saveState(client, currentRadio.guild, currentRadio); @@ -14,7 +14,7 @@ module.exports = function saveRadios(client) { currentRadio.message?.delete(); client.radio.delete(radio.value); } - + radio = currentRadios.next(); } -} \ No newline at end of file +} diff --git a/src/client/funcs/saveState.js b/src/client/funcs/saveState.js index eb59553..6ef476a 100644 --- a/src/client/funcs/saveState.js +++ b/src/client/funcs/saveState.js @@ -1,6 +1,6 @@ module.exports = function saveState(client, guild, radio){ client.datastore.checkEntry(guild.id); - + let date = new Date(); let data = client.datastore.getEntry(guild.id); @@ -15,4 +15,4 @@ module.exports = function saveState(client, guild, radio){ data.state.station.owner = radio.station.owner; client.datastore.updateEntry(guild, data); -} \ No newline at end of file +} diff --git a/src/client/funcs/searchStation.js b/src/client/funcs/searchStation.js index f443fd0..9206722 100644 --- a/src/client/funcs/searchStation.js +++ b/src/client/funcs/searchStation.js @@ -59,4 +59,4 @@ module.exports = function searchStation(key, client) { } } return highestProbabilityStation; -} \ No newline at end of file +} diff --git a/src/client/funcs/statisticsUpdate.js b/src/client/funcs/statisticsUpdate.js index 4fcf09c..fcd3ad1 100644 --- a/src/client/funcs/statisticsUpdate.js +++ b/src/client/funcs/statisticsUpdate.js @@ -1,22 +1,22 @@ module.exports = function statisticsUpdate(client, guild, radio) { - + client.datastore.checkEntry(guild.id); - + radio.datastore = client.datastore.getEntry(guild.id); - + if(!radio.datastore.statistics[radio.station.name]){ radio.datastore.statistics[radio.station.name] = {}; radio.datastore.statistics[radio.station.name].time = 0; radio.datastore.statistics[radio.station.name].used = 0; client.datastore.updateEntry(guild, radio.datastore); } - + let date = new Date(); radio.currentTime = date.getTime(); radio.playTime = parseInt(radio.currentTime)-parseInt(radio.startTime); radio.datastore.statistics[radio.station.name].time = parseInt(radio.datastore.statistics[radio.station.name].time)+parseInt(radio.playTime); - + radio.datastore.statistics[radio.station.name].used = parseInt(radio.datastore.statistics[radio.station.name].used)+1; client.datastore.updateEntry(guild, radio.datastore); client.datastore.calculateGlobal(client); -} \ No newline at end of file +} diff --git a/src/client/messages.js b/src/client/messages.js index c0b01af..f893ff8 100644 --- a/src/client/messages.js +++ b/src/client/messages.js @@ -36,5 +36,6 @@ module.exports = { statusField5: "Hosted by", errorStationURL: "Station can't be URL", messageCommandsDeprecatedTitle: "%client.user.username%", - messageCommandsDeprecatedDescription: "We recommend you to reauthorize our bot by clicking the invite link down below, because Discord is planning to remove message content from verified bots [Read More](https://support-dev.discord.com/hc/en-us/articles/4404772028055)" + "\n\n" + "**Invite Bot**" + "\n" + "https://wgi.fi/radiox_invite" + "\n\n" + "This bot now supports slash commands, you should start using them instead. Type / into the message box and select the bot you wish to use. Remember to be careful as there are a few bugs here and there on Discord." + "\n\n" + "We will remove this deprecation message in March of 2022 when RadioX 1.0.0 is released." -}; \ No newline at end of file + messageCommandsDeprecatedDescription: "We recommend you to reauthorize our bot by clicking the invite link down below, because Discord is planning to remove message content from verified bots [Read More](https://support-dev.discord.com/hc/en-us/articles/4404772028055)" + "\n\n" + "**Invite Bot**" + "\n" + "https://wgi.fi/radiox_invite" + "\n\n" + "This bot now supports slash commands, you should start using them instead. Type / into the message box and select the bot you wish to use. Remember to be careful as there are a few bugs here and there on Discord." + "\n\n" + "We will remove this deprecation message in March of 2022 when RadioX 1.0.0 is released.", + maintenance: "Shhhh... We are now sleeping and dreaming about new features to implement. Will be back soon." +}; diff --git a/src/client/utils/typings.ts b/src/client/utils/typings.ts index 79cc341..1e5d860 100644 --- a/src/client/utils/typings.ts +++ b/src/client/utils/typings.ts @@ -1,3 +1,3 @@ export interface command { } -export interface radio {} \ No newline at end of file +export interface radio {} diff --git a/src/config.js b/src/config.js index 2aa884d..b161603 100644 --- a/src/config.js +++ b/src/config.js @@ -21,6 +21,6 @@ module.exports = { //Settings version: process.env.RADIOX_VERSION || process.env.npm_package_version, - debug: process.env.DEBUG_MODE || false - -} \ No newline at end of file + debug: process.env.DEBUG_MODE || false, + maintenance: false +}