├── .dockerignore ├── .env.example ├── .gitattributes ├── .github └── workflows │ └── build.yaml ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── docker-compose.yml ├── package.json ├── pnpm-lock.yaml ├── src ├── bot │ ├── client │ │ └── ListenClient.ts │ ├── commands │ │ ├── listen │ │ │ ├── np.ts │ │ │ └── npk.ts │ │ └── util │ │ │ ├── help.ts │ │ │ ├── ping.ts │ │ │ └── stats.ts │ ├── inhibitors │ │ └── blacklist.ts │ ├── listeners │ │ ├── client │ │ │ ├── debug.ts │ │ │ ├── ready.ts │ │ │ ├── shardDisconnected.ts │ │ │ ├── shardReady.ts │ │ │ ├── shardReconnecting.ts │ │ │ └── shardResumed.ts │ │ └── commandHandler │ │ │ └── error.ts │ ├── models │ │ └── Settings.ts │ └── structures │ │ ├── Database.ts │ │ ├── SettingsProvider.ts │ │ └── WebSocketManager.ts ├── listen.ts └── util │ ├── logger.ts │ ├── paginate.ts │ └── timeStrings.ts └── tsconfig.json /.dockerignore: -------------------------------------------------------------------------------- 1 | # Packages 2 | node_modules/ 3 | 4 | # Log files 5 | logs/ 6 | *.log 7 | npm-debug.log* 8 | 9 | # Runtime data 10 | pids 11 | *.pid 12 | *.seed 13 | 14 | # IDE 15 | .vscode/ 16 | 17 | # Docker (experimental) 18 | docker/ 19 | deploy/ 20 | Dockerfile 21 | .dockerignore 22 | 23 | # Authentication 24 | .env 25 | .env_lavalink 26 | .env.example 27 | 28 | # Test files 29 | 30 | # Command files (unfinished) 31 | *.bak 32 | 33 | # Miscellaneous 34 | .tmp/ 35 | .github/ 36 | .travis.yml 37 | LICENSE 38 | 39 | # Git 40 | .github 41 | .git 42 | .gitattributes 43 | .gitignore 44 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # General settings 2 | NODE_ENV=development 3 | COMMAND_PREFIX=~~ 4 | ID= 5 | OWNERS= 6 | DISCORD_SERVER_INVITE= 7 | DISCORD_BOT_INVITE= 8 | TOKEN= 9 | WEBSOCKET=wss://listen.moe/gateway_v2 10 | WEBSOCKET_KPOP=wss://listen.moe/kpop/gateway_v2 11 | 12 | # Music 13 | LAVALINK_PASSWORD= 14 | LAVALINK_REST= 15 | LAVALINK_WS= 16 | 17 | # Databases 18 | DB= 19 | 20 | # Discord channels 21 | RADIO_CHANNELS= 22 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | -------------------------------------------------------------------------------- /.github/workflows/build.yaml: -------------------------------------------------------------------------------- 1 | name: Container 2 | on: 3 | push: 4 | branches: 5 | - master 6 | jobs: 7 | publish: 8 | name: Build, tag, and publish container 9 | runs-on: ubuntu-latest 10 | steps: 11 | - name: Checkout repository 12 | uses: actions/checkout@v2 13 | 14 | - name: Login to GitHub docker registry 15 | uses: azure/container-actions/docker-login@master 16 | with: 17 | username: ${{ github.actor }} 18 | password: ${{ secrets.DOCKER_PAT }} 19 | login-server: 'docker.pkg.github.com' 20 | 21 | - name: Build, tag, and push container 22 | run: | 23 | docker build --build-arg VERSION=${{ github.sha }} -f Dockerfile -t docker.pkg.github.com/listen-moe/discord-bot/discord_bot:latest . 24 | docker push docker.pkg.github.com/listen-moe/discord-bot/discord_bot:latest 25 | 26 | - name: Logout of GitHub docker registry 27 | uses: azure/container-actions/docker-logout@master 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Packages 2 | node_modules/ 3 | 4 | # Log files 5 | logs/ 6 | *.log 7 | npm-debug.log* 8 | 9 | # Runtime data 10 | pids 11 | *.pid 12 | *.seed 13 | 14 | # Env 15 | .env 16 | .env_lavalink 17 | 18 | # Dist 19 | dist/ 20 | typings/ 21 | 22 | # Miscellaneous 23 | .tmp/ 24 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:12-alpine 2 | LABEL name "Listen" 3 | LABEL version "0.1.0" 4 | LABEL maintainer "iCrawl " 5 | WORKDIR /usr/src/Listen 6 | COPY package.json pnpm-lock.yaml ./ 7 | RUN apk add --update \ 8 | && apk add --no-cache ca-certificates \ 9 | && apk add --no-cache --virtual .build-deps git curl build-base python g++ make \ 10 | && curl -L https://unpkg.com/@pnpm/self-installer | node \ 11 | && pnpm i \ 12 | && apk del .build-deps 13 | COPY . . 14 | RUN pnpm run build 15 | ENV NODE_ENV= \ 16 | COMMAND_PREFIX= \ 17 | ID= \ 18 | OWNERS= \ 19 | DISCORD_SERVER_INVITE= \ 20 | DISCORD_BOT_INVITE= \ 21 | TOKEN= \ 22 | WEBSOCKET= \ 23 | WEBSOCKET_KPOP= \ 24 | DB= \ 25 | RADIO_CHANNELS= 26 | CMD ["node", "dist/listen.js"] 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018-2020 iCrawl 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Listen.moe Discord Bot 2 | > . 3 | 4 | I'll get into filling this out later, gotta stay tuned for now. 5 | 6 | ## Contributing 7 | 8 | 1. Fork it! 9 | 2. Create your feature branch: `git checkout -b my-new-feature` 10 | 3. Commit your changes: `git commit -am 'Add some feature'` 11 | 4. Push to the branch: `git push origin my-new-feature` 12 | 5. Submit a pull request :D 13 | 14 | ## Author 15 | 16 | **Listen.moe** © [iCrawl](https://github.com/iCrawl). 17 | Authored and maintained by iCrawl. 18 | 19 | > GitHub [@iCrawl](https://github.com/iCrawl) 20 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2.4' 2 | 3 | services: 4 | bot: 5 | build: 6 | context: . 7 | restart: unless-stopped 8 | env_file: 9 | - ./.env 10 | network_mode: 'host' 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "discord-bot", 3 | "version": "0.1.0", 4 | "description": "The official Listen.moe discord bot", 5 | "main": "dist/listen.js", 6 | "author": "iCrawl ", 7 | "license": "MIT", 8 | "private": true, 9 | "scripts": { 10 | "prebuild": "pnpm run lint", 11 | "build": "rimraf dist && tsc", 12 | "lint": "eslint src --ext .ts", 13 | "lint:fix": "eslint src --ext .ts --fix" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "git+https://github.com/LISTEN-moe/discord-bot.git" 18 | }, 19 | "bugs": { 20 | "url": "https://github.com/LISTEN-moe/discord-bot/issues" 21 | }, 22 | "keywords": [ 23 | "discord", 24 | "bot", 25 | "listen-moe" 26 | ], 27 | "homepage": "https://github.com/LISTEN-moe/discord-bot#readme", 28 | "dependencies": { 29 | "common-tags": "^1.8.0", 30 | "discord-akairo": "1Computer1/discord-akairo", 31 | "discord.js": "discordjs/discord.js", 32 | "dotenv": "^8.2.0", 33 | "lavalink": "^2.10.0", 34 | "moment": "^2.24.0", 35 | "moment-duration-format": "^2.3.2", 36 | "pg": "^8.0.2", 37 | "reflect-metadata": "^0.1.13", 38 | "tslib": "^1.11.1", 39 | "typeorm": "^0.2.24", 40 | "winston": "^3.2.1", 41 | "winston-daily-rotate-file": "^4.4.2", 42 | "ws": "^7.2.3" 43 | }, 44 | "devDependencies": { 45 | "@types/common-tags": "^1.8.0", 46 | "@types/moment-duration-format": "^2.2.2", 47 | "@types/node": "^13.11.1", 48 | "@types/ws": "^7.2.4", 49 | "@typescript-eslint/eslint-plugin": "^2.28.0", 50 | "@typescript-eslint/parser": "^2.28.0", 51 | "eslint": "^6.8.0", 52 | "eslint-config-marine": "^6.0.0", 53 | "eslint-config-prettier": "^6.10.1", 54 | "eslint-plugin-prettier": "^3.1.3", 55 | "prettier": "^2.0.4", 56 | "rimraf": "^3.0.2", 57 | "typescript": "^3.8.3" 58 | }, 59 | "optionalDependencies": { 60 | "bufferutil": "^4.0.1", 61 | "utf-8-validate": "^5.0.2", 62 | "zlib-sync": "^0.1.6" 63 | }, 64 | "eslintConfig": { 65 | "extends": "marine/prettier/node" 66 | }, 67 | "renovate": { 68 | "extends": [ 69 | "teal" 70 | ] 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | dependencies: 2 | common-tags: 1.8.0 3 | discord-akairo: github.com/1Computer1/discord-akairo/10cef7efc7a329cb1e0d96d73ccb4b83bc0afa72_discord.js@12.1.1 4 | discord.js: github.com/discordjs/discord.js/1330e2d246cf4e1b9e7f13a5f941ff086117a3fc_cf2ed6007ca0a0cd3da37c757a7bf7b9 5 | dotenv: 8.2.0 6 | lavalink: 2.10.0 7 | moment: 2.24.0 8 | moment-duration-format: 2.3.2 9 | pg: 8.0.2_pg@8.0.2 10 | reflect-metadata: 0.1.13 11 | tslib: 1.11.1 12 | typeorm: 0.2.24 13 | winston: 3.2.1 14 | winston-daily-rotate-file: 4.4.2_winston@3.2.1 15 | ws: 7.2.3_5290a7aab7631971258e1bd11475725e 16 | devDependencies: 17 | '@types/common-tags': 1.8.0 18 | '@types/moment-duration-format': 2.2.2 19 | '@types/node': 13.11.1 20 | '@types/ws': 7.2.4 21 | '@typescript-eslint/eslint-plugin': 2.28.0_7d9b020b8616a35b73d4b597f43d4d93 22 | '@typescript-eslint/parser': 2.28.0_eslint@6.8.0+typescript@3.8.3 23 | eslint: 6.8.0 24 | eslint-config-marine: 6.0.0_322d4e82094cc1fdbc64d24bb60ed13d 25 | eslint-config-prettier: 6.10.1_eslint@6.8.0 26 | eslint-plugin-prettier: 3.1.3_eslint@6.8.0+prettier@2.0.4 27 | prettier: 2.0.4 28 | rimraf: 3.0.2 29 | typescript: 3.8.3 30 | lockfileVersion: 5.1 31 | optionalDependencies: 32 | bufferutil: 4.0.1 33 | utf-8-validate: 5.0.2 34 | zlib-sync: 0.1.6 35 | packages: 36 | /@babel/code-frame/7.8.3: 37 | dependencies: 38 | '@babel/highlight': 7.9.0 39 | dev: true 40 | resolution: 41 | integrity: sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== 42 | /@babel/helper-validator-identifier/7.9.5: 43 | dev: true 44 | resolution: 45 | integrity: sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== 46 | /@babel/highlight/7.9.0: 47 | dependencies: 48 | '@babel/helper-validator-identifier': 7.9.5 49 | chalk: 2.4.2 50 | js-tokens: 4.0.0 51 | dev: true 52 | resolution: 53 | integrity: sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== 54 | /@discordjs/collection/0.1.5: 55 | dev: false 56 | resolution: 57 | integrity: sha512-CU1q0UXQUpFNzNB7gufgoisDHP7n+T3tkqTsp3MNUkVJ5+hS3BCvME8uCXAUFlz+6T2FbTCu75A+yQ7HMKqRKw== 58 | /@types/color-name/1.1.1: 59 | resolution: 60 | integrity: sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 61 | /@types/common-tags/1.8.0: 62 | dev: true 63 | resolution: 64 | integrity: sha512-htRqZr5qn8EzMelhX/Xmx142z218lLyGaeZ3YR8jlze4TATRU9huKKvuBmAJEW4LCC4pnY1N6JAm6p85fMHjhg== 65 | /@types/eslint-visitor-keys/1.0.0: 66 | dev: true 67 | resolution: 68 | integrity: sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== 69 | /@types/json-schema/7.0.4: 70 | dev: true 71 | resolution: 72 | integrity: sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== 73 | /@types/moment-duration-format/2.2.2: 74 | dependencies: 75 | moment: 2.24.0 76 | dev: true 77 | resolution: 78 | integrity: sha512-CuYswsMI3y5uR5sD9i/VUqIbZrsYN2eaCs7nH3qpDl2CZlNI48mjMf4ve2RpQ/65irprtnQVetfnea9my+jqcg== 79 | /@types/node/13.11.1: 80 | dev: true 81 | resolution: 82 | integrity: sha512-eWQGP3qtxwL8FGneRrC5DwrJLGN4/dH1clNTuLfN81HCrxVtxRjygDTUoZJ5ASlDEeo0ppYFQjQIlXhtXpOn6g== 83 | /@types/ws/7.2.4: 84 | dependencies: 85 | '@types/node': 13.11.1 86 | dev: true 87 | resolution: 88 | integrity: sha512-9S6Ask71vujkVyeEXKxjBSUV8ZUB0mjL5la4IncBoheu04bDaYyUKErh1BQcY9+WzOUOiKqz/OnpJHYckbMfNg== 89 | /@typescript-eslint/eslint-plugin/2.28.0_7d9b020b8616a35b73d4b597f43d4d93: 90 | dependencies: 91 | '@typescript-eslint/experimental-utils': 2.28.0_eslint@6.8.0+typescript@3.8.3 92 | '@typescript-eslint/parser': 2.28.0_eslint@6.8.0+typescript@3.8.3 93 | eslint: 6.8.0 94 | functional-red-black-tree: 1.0.1 95 | regexpp: 3.1.0 96 | tsutils: 3.17.1_typescript@3.8.3 97 | typescript: 3.8.3 98 | dev: true 99 | engines: 100 | node: ^8.10.0 || ^10.13.0 || >=11.10.1 101 | peerDependencies: 102 | '@typescript-eslint/parser': ^2.0.0 103 | eslint: ^5.0.0 || ^6.0.0 104 | typescript: '*' 105 | peerDependenciesMeta: 106 | typescript: 107 | optional: true 108 | resolution: 109 | integrity: sha512-w0Ugcq2iatloEabQP56BRWJowliXUP5Wv6f9fKzjJmDW81hOTBxRoJ4LoEOxRpz9gcY51Libytd2ba3yLmSOfg== 110 | /@typescript-eslint/experimental-utils/2.28.0_eslint@6.8.0+typescript@3.8.3: 111 | dependencies: 112 | '@types/json-schema': 7.0.4 113 | '@typescript-eslint/typescript-estree': 2.28.0_typescript@3.8.3 114 | eslint: 6.8.0 115 | eslint-scope: 5.0.0 116 | eslint-utils: 2.0.0 117 | dev: true 118 | engines: 119 | node: ^8.10.0 || ^10.13.0 || >=11.10.1 120 | peerDependencies: 121 | eslint: '*' 122 | typescript: '*' 123 | resolution: 124 | integrity: sha512-4SL9OWjvFbHumM/Zh/ZeEjUFxrYKtdCi7At4GyKTbQlrj1HcphIDXlje4Uu4cY+qzszR5NdVin4CCm6AXCjd6w== 125 | /@typescript-eslint/parser/2.28.0_eslint@6.8.0+typescript@3.8.3: 126 | dependencies: 127 | '@types/eslint-visitor-keys': 1.0.0 128 | '@typescript-eslint/experimental-utils': 2.28.0_eslint@6.8.0+typescript@3.8.3 129 | '@typescript-eslint/typescript-estree': 2.28.0_typescript@3.8.3 130 | eslint: 6.8.0 131 | eslint-visitor-keys: 1.1.0 132 | typescript: 3.8.3 133 | dev: true 134 | engines: 135 | node: ^8.10.0 || ^10.13.0 || >=11.10.1 136 | peerDependencies: 137 | eslint: ^5.0.0 || ^6.0.0 138 | typescript: '*' 139 | peerDependenciesMeta: 140 | typescript: 141 | optional: true 142 | resolution: 143 | integrity: sha512-RqPybRDquui9d+K86lL7iPqH6Dfp9461oyqvlXMNtap+PyqYbkY5dB7LawQjDzot99fqzvS0ZLZdfe+1Bt3Jgw== 144 | /@typescript-eslint/typescript-estree/2.28.0_typescript@3.8.3: 145 | dependencies: 146 | debug: 4.1.1 147 | eslint-visitor-keys: 1.1.0 148 | glob: 7.1.6 149 | is-glob: 4.0.1 150 | lodash: 4.17.15 151 | semver: 6.3.0 152 | tsutils: 3.17.1_typescript@3.8.3 153 | typescript: 3.8.3 154 | dev: true 155 | engines: 156 | node: ^8.10.0 || ^10.13.0 || >=11.10.1 157 | peerDependencies: 158 | typescript: '*' 159 | peerDependenciesMeta: 160 | typescript: 161 | optional: true 162 | resolution: 163 | integrity: sha512-HDr8MP9wfwkiuqzRVkuM3BeDrOC4cKbO5a6BymZBHUt5y/2pL0BXD6I/C/ceq2IZoHWhcASk+5/zo+dwgu9V8Q== 164 | /abort-controller/3.0.0: 165 | dependencies: 166 | event-target-shim: 5.0.1 167 | dev: false 168 | engines: 169 | node: '>=6.5' 170 | resolution: 171 | integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== 172 | /acorn-jsx/5.2.0_acorn@7.1.1: 173 | dependencies: 174 | acorn: 7.1.1 175 | dev: true 176 | peerDependencies: 177 | acorn: ^6.0.0 || ^7.0.0 178 | resolution: 179 | integrity: sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== 180 | /acorn/7.1.1: 181 | dev: true 182 | engines: 183 | node: '>=0.4.0' 184 | hasBin: true 185 | resolution: 186 | integrity: sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== 187 | /ajv/6.12.0: 188 | dependencies: 189 | fast-deep-equal: 3.1.1 190 | fast-json-stable-stringify: 2.1.0 191 | json-schema-traverse: 0.4.1 192 | uri-js: 4.2.2 193 | dev: true 194 | resolution: 195 | integrity: sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== 196 | /ansi-escapes/4.3.1: 197 | dependencies: 198 | type-fest: 0.11.0 199 | dev: true 200 | engines: 201 | node: '>=8' 202 | resolution: 203 | integrity: sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== 204 | /ansi-regex/2.1.1: 205 | dev: false 206 | engines: 207 | node: '>=0.10.0' 208 | resolution: 209 | integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 210 | /ansi-regex/4.1.0: 211 | engines: 212 | node: '>=6' 213 | resolution: 214 | integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 215 | /ansi-regex/5.0.0: 216 | engines: 217 | node: '>=8' 218 | resolution: 219 | integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 220 | /ansi-styles/2.2.1: 221 | dev: false 222 | engines: 223 | node: '>=0.10.0' 224 | resolution: 225 | integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 226 | /ansi-styles/3.2.1: 227 | dependencies: 228 | color-convert: 1.9.3 229 | engines: 230 | node: '>=4' 231 | resolution: 232 | integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 233 | /ansi-styles/4.2.1: 234 | dependencies: 235 | '@types/color-name': 1.1.1 236 | color-convert: 2.0.1 237 | engines: 238 | node: '>=8' 239 | resolution: 240 | integrity: sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 241 | /any-promise/1.3.0: 242 | dev: false 243 | resolution: 244 | integrity: sha1-q8av7tzqUugJzcA3au0845Y10X8= 245 | /app-root-path/3.0.0: 246 | dev: false 247 | engines: 248 | node: '>= 6.0.0' 249 | resolution: 250 | integrity: sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw== 251 | /argparse/1.0.10: 252 | dependencies: 253 | sprintf-js: 1.0.3 254 | resolution: 255 | integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 256 | /astral-regex/1.0.0: 257 | dev: true 258 | engines: 259 | node: '>=4' 260 | resolution: 261 | integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== 262 | /async-limiter/1.0.1: 263 | dev: false 264 | resolution: 265 | integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== 266 | /async/2.6.3: 267 | dependencies: 268 | lodash: 4.17.15 269 | dev: false 270 | resolution: 271 | integrity: sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== 272 | /asynckit/0.4.0: 273 | dev: false 274 | resolution: 275 | integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k= 276 | /backoff/2.5.0: 277 | dependencies: 278 | precond: 0.2.3 279 | dev: false 280 | engines: 281 | node: '>= 0.6' 282 | resolution: 283 | integrity: sha1-9hbtqdPktmuMp/ynn2lXIsX44m8= 284 | /balanced-match/1.0.0: 285 | resolution: 286 | integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 287 | /base64-js/1.3.1: 288 | dev: false 289 | resolution: 290 | integrity: sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== 291 | /brace-expansion/1.1.11: 292 | dependencies: 293 | balanced-match: 1.0.0 294 | concat-map: 0.0.1 295 | resolution: 296 | integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 297 | /buffer-writer/2.0.0: 298 | dev: false 299 | engines: 300 | node: '>=4' 301 | resolution: 302 | integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== 303 | /buffer/5.6.0: 304 | dependencies: 305 | base64-js: 1.3.1 306 | ieee754: 1.1.13 307 | dev: false 308 | resolution: 309 | integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== 310 | /bufferutil/4.0.1: 311 | dependencies: 312 | node-gyp-build: 3.7.0 313 | dev: false 314 | requiresBuild: true 315 | resolution: 316 | integrity: sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA== 317 | /callsites/3.1.0: 318 | dev: true 319 | engines: 320 | node: '>=6' 321 | resolution: 322 | integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 323 | /camelcase/5.3.1: 324 | dev: false 325 | engines: 326 | node: '>=6' 327 | resolution: 328 | integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 329 | /chalk/1.1.3: 330 | dependencies: 331 | ansi-styles: 2.2.1 332 | escape-string-regexp: 1.0.5 333 | has-ansi: 2.0.0 334 | strip-ansi: 3.0.1 335 | supports-color: 2.0.0 336 | dev: false 337 | engines: 338 | node: '>=0.10.0' 339 | resolution: 340 | integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= 341 | /chalk/2.4.2: 342 | dependencies: 343 | ansi-styles: 3.2.1 344 | escape-string-regexp: 1.0.5 345 | supports-color: 5.5.0 346 | engines: 347 | node: '>=4' 348 | resolution: 349 | integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 350 | /chalk/3.0.0: 351 | dependencies: 352 | ansi-styles: 4.2.1 353 | supports-color: 7.1.0 354 | engines: 355 | node: '>=8' 356 | resolution: 357 | integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 358 | /chardet/0.7.0: 359 | dev: true 360 | resolution: 361 | integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 362 | /cli-cursor/3.1.0: 363 | dependencies: 364 | restore-cursor: 3.1.0 365 | dev: true 366 | engines: 367 | node: '>=8' 368 | resolution: 369 | integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== 370 | /cli-highlight/2.1.4: 371 | dependencies: 372 | chalk: 3.0.0 373 | highlight.js: 9.18.1 374 | mz: 2.7.0 375 | parse5: 5.1.1 376 | parse5-htmlparser2-tree-adapter: 5.1.1 377 | yargs: 15.3.1 378 | dev: false 379 | engines: 380 | node: '>=8.0.0' 381 | npm: '>=5.0.0' 382 | hasBin: true 383 | resolution: 384 | integrity: sha512-s7Zofobm20qriqDoU9sXptQx0t2R9PEgac92mENNm7xaEe1hn71IIMsXMK+6encA6WRCWWxIGQbipr3q998tlQ== 385 | /cli-width/2.2.1: 386 | dev: true 387 | resolution: 388 | integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== 389 | /cliui/5.0.0: 390 | dependencies: 391 | string-width: 3.1.0 392 | strip-ansi: 5.2.0 393 | wrap-ansi: 5.1.0 394 | dev: false 395 | resolution: 396 | integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== 397 | /cliui/6.0.0: 398 | dependencies: 399 | string-width: 4.2.0 400 | strip-ansi: 6.0.0 401 | wrap-ansi: 6.2.0 402 | dev: false 403 | resolution: 404 | integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== 405 | /color-convert/1.9.3: 406 | dependencies: 407 | color-name: 1.1.3 408 | resolution: 409 | integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 410 | /color-convert/2.0.1: 411 | dependencies: 412 | color-name: 1.1.4 413 | engines: 414 | node: '>=7.0.0' 415 | resolution: 416 | integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 417 | /color-name/1.1.3: 418 | resolution: 419 | integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 420 | /color-name/1.1.4: 421 | resolution: 422 | integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 423 | /color-string/1.5.3: 424 | dependencies: 425 | color-name: 1.1.4 426 | simple-swizzle: 0.2.2 427 | dev: false 428 | resolution: 429 | integrity: sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw== 430 | /color/3.0.0: 431 | dependencies: 432 | color-convert: 1.9.3 433 | color-string: 1.5.3 434 | dev: false 435 | resolution: 436 | integrity: sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w== 437 | /colornames/1.1.1: 438 | dev: false 439 | resolution: 440 | integrity: sha1-+IiQMGhcfE/54qVZ9Qd+t2qBb5Y= 441 | /colors/1.4.0: 442 | dev: false 443 | engines: 444 | node: '>=0.1.90' 445 | resolution: 446 | integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== 447 | /colorspace/1.1.2: 448 | dependencies: 449 | color: 3.0.0 450 | text-hex: 1.0.0 451 | dev: false 452 | resolution: 453 | integrity: sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ== 454 | /combined-stream/1.0.8: 455 | dependencies: 456 | delayed-stream: 1.0.0 457 | dev: false 458 | engines: 459 | node: '>= 0.8' 460 | resolution: 461 | integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 462 | /common-tags/1.8.0: 463 | dev: false 464 | engines: 465 | node: '>=4.0.0' 466 | resolution: 467 | integrity: sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== 468 | /concat-map/0.0.1: 469 | resolution: 470 | integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 471 | /core-util-is/1.0.2: 472 | dev: false 473 | resolution: 474 | integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 475 | /cross-spawn/6.0.5: 476 | dependencies: 477 | nice-try: 1.0.5 478 | path-key: 2.0.1 479 | semver: 5.7.1 480 | shebang-command: 1.2.0 481 | which: 1.3.1 482 | dev: true 483 | engines: 484 | node: '>=4.8' 485 | resolution: 486 | integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 487 | /debug/4.1.1: 488 | dependencies: 489 | ms: 2.1.2 490 | resolution: 491 | integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 492 | /decamelize/1.2.0: 493 | dev: false 494 | engines: 495 | node: '>=0.10.0' 496 | resolution: 497 | integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 498 | /deep-is/0.1.3: 499 | dev: true 500 | resolution: 501 | integrity: sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 502 | /delayed-stream/1.0.0: 503 | dev: false 504 | engines: 505 | node: '>=0.4.0' 506 | resolution: 507 | integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 508 | /diagnostics/1.1.1: 509 | dependencies: 510 | colorspace: 1.1.2 511 | enabled: 1.0.2 512 | kuler: 1.0.1 513 | dev: false 514 | resolution: 515 | integrity: sha512-8wn1PmdunLJ9Tqbx+Fx/ZEuHfJf4NKSN2ZBj7SJC/OWRWha843+WsTjqMe1B5E3p28jqBlp+mJ2fPVxPyNgYKQ== 516 | /doctrine/3.0.0: 517 | dependencies: 518 | esutils: 2.0.3 519 | dev: true 520 | engines: 521 | node: '>=6.0.0' 522 | resolution: 523 | integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 524 | /dotenv/6.2.0: 525 | dev: false 526 | engines: 527 | node: '>=6' 528 | resolution: 529 | integrity: sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w== 530 | /dotenv/8.2.0: 531 | dev: false 532 | engines: 533 | node: '>=8' 534 | resolution: 535 | integrity: sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== 536 | /emoji-regex/7.0.3: 537 | resolution: 538 | integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 539 | /emoji-regex/8.0.0: 540 | resolution: 541 | integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 542 | /enabled/1.0.2: 543 | dependencies: 544 | env-variable: 0.0.6 545 | dev: false 546 | resolution: 547 | integrity: sha1-ll9lE9LC0cX0ZStkouM5ZGf8L5M= 548 | /env-variable/0.0.6: 549 | dev: false 550 | resolution: 551 | integrity: sha512-bHz59NlBbtS0NhftmR8+ExBEekE7br0e01jw+kk0NDro7TtZzBYZ5ScGPs3OmwnpyfHTHOtr1Y6uedCdrIldtg== 552 | /escape-string-regexp/1.0.5: 553 | engines: 554 | node: '>=0.8.0' 555 | resolution: 556 | integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 557 | /eslint-config-aqua/7.2.3_322d4e82094cc1fdbc64d24bb60ed13d: 558 | dependencies: 559 | eslint: 6.8.0 560 | eslint-config-prettier: 6.10.1_eslint@6.8.0 561 | eslint-plugin-prettier: 3.1.3_eslint@6.8.0+prettier@2.0.4 562 | prettier: 2.0.4 563 | dev: true 564 | engines: 565 | node: '>=10' 566 | peerDependencies: 567 | babel-eslint: ^10.0.3 568 | eslint: ^6.8.0 569 | eslint-config-prettier: ^6.9.0 570 | eslint-plugin-prettier: ^3.1.2 571 | eslint-plugin-react: ^7.18.0 572 | eslint-plugin-react-hooks: ^3.0.0 573 | eslint-plugin-svelte3: ^2.7.3 574 | eslint-plugin-vue: ^6.1.2 575 | prettier: ^2.0.0 576 | peerDependenciesMeta: 577 | babel-eslint: 578 | optional: true 579 | eslint-config-prettier: 580 | optional: true 581 | eslint-plugin-prettier: 582 | optional: true 583 | eslint-plugin-react: 584 | optional: true 585 | eslint-plugin-react-hooks: 586 | optional: true 587 | eslint-plugin-svelte3: 588 | optional: true 589 | eslint-plugin-vue: 590 | optional: true 591 | prettier: 592 | optional: true 593 | resolution: 594 | integrity: sha512-JaUcVFImU6kgF6xmUENyYIiR2c+7BuJd/AH1e9tSPQRLb/owj9KpnDUI6T/xfv3K+dV0sQ0J4mmOqIQC96M43w== 595 | /eslint-config-marine/6.0.0_322d4e82094cc1fdbc64d24bb60ed13d: 596 | dependencies: 597 | eslint-config-aqua: 7.2.3_322d4e82094cc1fdbc64d24bb60ed13d 598 | dev: true 599 | peerDependencies: 600 | eslint: '*' 601 | eslint-config-prettier: '*' 602 | eslint-plugin-prettier: '*' 603 | prettier: '*' 604 | resolution: 605 | integrity: sha512-4735oFwmfMsXQY/MUKJ/N8EjCqHiLkAu9kbxOjdQCwJpWUeDpGwLUN5LL/c5DZQ/NaQVGfLvUM0gq4waj8UwAA== 606 | /eslint-config-prettier/6.10.1_eslint@6.8.0: 607 | dependencies: 608 | eslint: 6.8.0 609 | get-stdin: 6.0.0 610 | dev: true 611 | hasBin: true 612 | peerDependencies: 613 | eslint: '>=3.14.1' 614 | resolution: 615 | integrity: sha512-svTy6zh1ecQojvpbJSgH3aei/Rt7C6i090l5f2WQ4aB05lYHeZIR1qL4wZyyILTbtmnbHP5Yn8MrsOJMGa8RkQ== 616 | /eslint-plugin-prettier/3.1.3_eslint@6.8.0+prettier@2.0.4: 617 | dependencies: 618 | eslint: 6.8.0 619 | prettier: 2.0.4 620 | prettier-linter-helpers: 1.0.0 621 | dev: true 622 | engines: 623 | node: '>=6.0.0' 624 | peerDependencies: 625 | eslint: '>= 5.0.0' 626 | prettier: '>= 1.13.0' 627 | resolution: 628 | integrity: sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ== 629 | /eslint-scope/5.0.0: 630 | dependencies: 631 | esrecurse: 4.2.1 632 | estraverse: 4.3.0 633 | dev: true 634 | engines: 635 | node: '>=8.0.0' 636 | resolution: 637 | integrity: sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== 638 | /eslint-utils/1.4.3: 639 | dependencies: 640 | eslint-visitor-keys: 1.1.0 641 | dev: true 642 | engines: 643 | node: '>=6' 644 | resolution: 645 | integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== 646 | /eslint-utils/2.0.0: 647 | dependencies: 648 | eslint-visitor-keys: 1.1.0 649 | dev: true 650 | engines: 651 | node: '>=6' 652 | resolution: 653 | integrity: sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA== 654 | /eslint-visitor-keys/1.1.0: 655 | dev: true 656 | engines: 657 | node: '>=4' 658 | resolution: 659 | integrity: sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== 660 | /eslint/6.8.0: 661 | dependencies: 662 | '@babel/code-frame': 7.8.3 663 | ajv: 6.12.0 664 | chalk: 2.4.2 665 | cross-spawn: 6.0.5 666 | debug: 4.1.1 667 | doctrine: 3.0.0 668 | eslint-scope: 5.0.0 669 | eslint-utils: 1.4.3 670 | eslint-visitor-keys: 1.1.0 671 | espree: 6.2.1 672 | esquery: 1.3.0 673 | esutils: 2.0.3 674 | file-entry-cache: 5.0.1 675 | functional-red-black-tree: 1.0.1 676 | glob-parent: 5.1.1 677 | globals: 12.4.0 678 | ignore: 4.0.6 679 | import-fresh: 3.2.1 680 | imurmurhash: 0.1.4 681 | inquirer: 7.1.0 682 | is-glob: 4.0.1 683 | js-yaml: 3.13.1 684 | json-stable-stringify-without-jsonify: 1.0.1 685 | levn: 0.3.0 686 | lodash: 4.17.15 687 | minimatch: 3.0.4 688 | mkdirp: 0.5.5 689 | natural-compare: 1.4.0 690 | optionator: 0.8.3 691 | progress: 2.0.3 692 | regexpp: 2.0.1 693 | semver: 6.3.0 694 | strip-ansi: 5.2.0 695 | strip-json-comments: 3.1.0 696 | table: 5.4.6 697 | text-table: 0.2.0 698 | v8-compile-cache: 2.1.0 699 | dev: true 700 | engines: 701 | node: ^8.10.0 || ^10.13.0 || >=11.10.1 702 | hasBin: true 703 | resolution: 704 | integrity: sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== 705 | /espree/6.2.1: 706 | dependencies: 707 | acorn: 7.1.1 708 | acorn-jsx: 5.2.0_acorn@7.1.1 709 | eslint-visitor-keys: 1.1.0 710 | dev: true 711 | engines: 712 | node: '>=6.0.0' 713 | resolution: 714 | integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== 715 | /esprima/4.0.1: 716 | engines: 717 | node: '>=4' 718 | hasBin: true 719 | resolution: 720 | integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 721 | /esquery/1.3.0: 722 | dependencies: 723 | estraverse: 5.0.0 724 | dev: true 725 | engines: 726 | node: '>=0.10' 727 | resolution: 728 | integrity: sha512-/5qB+Mb0m2bh86tjGbA8pB0qBfdmCIK6ZNPjcw4/TtEH0+tTf0wLA5HK4KMTweSMwLGHwBDWCBV+6+2+EuHmgg== 729 | /esrecurse/4.2.1: 730 | dependencies: 731 | estraverse: 4.3.0 732 | dev: true 733 | engines: 734 | node: '>=4.0' 735 | resolution: 736 | integrity: sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== 737 | /estraverse/4.3.0: 738 | dev: true 739 | engines: 740 | node: '>=4.0' 741 | resolution: 742 | integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 743 | /estraverse/5.0.0: 744 | dev: true 745 | engines: 746 | node: '>=4.0' 747 | resolution: 748 | integrity: sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A== 749 | /esutils/2.0.3: 750 | dev: true 751 | engines: 752 | node: '>=0.10.0' 753 | resolution: 754 | integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 755 | /event-target-shim/5.0.1: 756 | dev: false 757 | engines: 758 | node: '>=6' 759 | resolution: 760 | integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== 761 | /external-editor/3.1.0: 762 | dependencies: 763 | chardet: 0.7.0 764 | iconv-lite: 0.4.24 765 | tmp: 0.0.33 766 | dev: true 767 | engines: 768 | node: '>=4' 769 | resolution: 770 | integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== 771 | /fast-deep-equal/3.1.1: 772 | dev: true 773 | resolution: 774 | integrity: sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== 775 | /fast-diff/1.2.0: 776 | dev: true 777 | resolution: 778 | integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== 779 | /fast-json-stable-stringify/2.1.0: 780 | dev: true 781 | resolution: 782 | integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 783 | /fast-levenshtein/2.0.6: 784 | dev: true 785 | resolution: 786 | integrity: sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 787 | /fast-safe-stringify/2.0.7: 788 | dev: false 789 | resolution: 790 | integrity: sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== 791 | /fecha/2.3.3: 792 | dev: false 793 | resolution: 794 | integrity: sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg== 795 | /figlet/1.3.0: 796 | dev: false 797 | engines: 798 | node: '>= 0.4.0' 799 | resolution: 800 | integrity: sha512-f7A8aOJAfyehLJ7lQ6rEA8WJw7kOk3lfWRi5piSjkzbK5YkI5sqO8eiLHz1ehO+DM0QYB85i8VfA6XIGUbU1dg== 801 | /figures/3.2.0: 802 | dependencies: 803 | escape-string-regexp: 1.0.5 804 | dev: true 805 | engines: 806 | node: '>=8' 807 | resolution: 808 | integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== 809 | /file-entry-cache/5.0.1: 810 | dependencies: 811 | flat-cache: 2.0.1 812 | dev: true 813 | engines: 814 | node: '>=4' 815 | resolution: 816 | integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== 817 | /file-stream-rotator/0.5.7: 818 | dependencies: 819 | moment: 2.24.0 820 | dev: false 821 | resolution: 822 | integrity: sha512-VYb3HZ/GiAGUCrfeakO8Mp54YGswNUHvL7P09WQcXAJNSj3iQ5QraYSp3cIn1MUyw6uzfgN/EFOarCNa4JvUHQ== 823 | /find-up/3.0.0: 824 | dependencies: 825 | locate-path: 3.0.0 826 | dev: false 827 | engines: 828 | node: '>=6' 829 | resolution: 830 | integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 831 | /find-up/4.1.0: 832 | dependencies: 833 | locate-path: 5.0.0 834 | path-exists: 4.0.0 835 | dev: false 836 | engines: 837 | node: '>=8' 838 | resolution: 839 | integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 840 | /flat-cache/2.0.1: 841 | dependencies: 842 | flatted: 2.0.2 843 | rimraf: 2.6.3 844 | write: 1.0.3 845 | dev: true 846 | engines: 847 | node: '>=4' 848 | resolution: 849 | integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== 850 | /flatted/2.0.2: 851 | dev: true 852 | resolution: 853 | integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== 854 | /form-data/3.0.0: 855 | dependencies: 856 | asynckit: 0.4.0 857 | combined-stream: 1.0.8 858 | mime-types: 2.1.26 859 | dev: false 860 | engines: 861 | node: '>= 6' 862 | resolution: 863 | integrity: sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== 864 | /fs.realpath/1.0.0: 865 | resolution: 866 | integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 867 | /functional-red-black-tree/1.0.1: 868 | dev: true 869 | resolution: 870 | integrity: sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 871 | /get-caller-file/2.0.5: 872 | dev: false 873 | engines: 874 | node: 6.* || 8.* || >= 10.* 875 | resolution: 876 | integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 877 | /get-stdin/6.0.0: 878 | dev: true 879 | engines: 880 | node: '>=4' 881 | resolution: 882 | integrity: sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== 883 | /glob-parent/5.1.1: 884 | dependencies: 885 | is-glob: 4.0.1 886 | dev: true 887 | engines: 888 | node: '>= 6' 889 | resolution: 890 | integrity: sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 891 | /glob/7.1.6: 892 | dependencies: 893 | fs.realpath: 1.0.0 894 | inflight: 1.0.6 895 | inherits: 2.0.4 896 | minimatch: 3.0.4 897 | once: 1.4.0 898 | path-is-absolute: 1.0.1 899 | resolution: 900 | integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 901 | /globals/12.4.0: 902 | dependencies: 903 | type-fest: 0.8.1 904 | dev: true 905 | engines: 906 | node: '>=8' 907 | resolution: 908 | integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== 909 | /has-ansi/2.0.0: 910 | dependencies: 911 | ansi-regex: 2.1.1 912 | dev: false 913 | engines: 914 | node: '>=0.10.0' 915 | resolution: 916 | integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= 917 | /has-flag/3.0.0: 918 | engines: 919 | node: '>=4' 920 | resolution: 921 | integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 922 | /has-flag/4.0.0: 923 | engines: 924 | node: '>=8' 925 | resolution: 926 | integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 927 | /highlight.js/9.18.1: 928 | dev: false 929 | resolution: 930 | integrity: sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg== 931 | /iconv-lite/0.4.24: 932 | dependencies: 933 | safer-buffer: 2.1.2 934 | dev: true 935 | engines: 936 | node: '>=0.10.0' 937 | resolution: 938 | integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 939 | /ieee754/1.1.13: 940 | dev: false 941 | resolution: 942 | integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== 943 | /ignore/4.0.6: 944 | dev: true 945 | engines: 946 | node: '>= 4' 947 | resolution: 948 | integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 949 | /import-fresh/3.2.1: 950 | dependencies: 951 | parent-module: 1.0.1 952 | resolve-from: 4.0.0 953 | dev: true 954 | engines: 955 | node: '>=6' 956 | resolution: 957 | integrity: sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== 958 | /imurmurhash/0.1.4: 959 | dev: true 960 | engines: 961 | node: '>=0.8.19' 962 | resolution: 963 | integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o= 964 | /inflight/1.0.6: 965 | dependencies: 966 | once: 1.4.0 967 | wrappy: 1.0.2 968 | resolution: 969 | integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 970 | /inherits/2.0.4: 971 | resolution: 972 | integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 973 | /inquirer/7.1.0: 974 | dependencies: 975 | ansi-escapes: 4.3.1 976 | chalk: 3.0.0 977 | cli-cursor: 3.1.0 978 | cli-width: 2.2.1 979 | external-editor: 3.1.0 980 | figures: 3.2.0 981 | lodash: 4.17.15 982 | mute-stream: 0.0.8 983 | run-async: 2.4.0 984 | rxjs: 6.5.5 985 | string-width: 4.2.0 986 | strip-ansi: 6.0.0 987 | through: 2.3.8 988 | dev: true 989 | engines: 990 | node: '>=6.0.0' 991 | resolution: 992 | integrity: sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== 993 | /is-arrayish/0.3.2: 994 | dev: false 995 | resolution: 996 | integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== 997 | /is-extglob/2.1.1: 998 | dev: true 999 | engines: 1000 | node: '>=0.10.0' 1001 | resolution: 1002 | integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 1003 | /is-fullwidth-code-point/2.0.0: 1004 | engines: 1005 | node: '>=4' 1006 | resolution: 1007 | integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 1008 | /is-fullwidth-code-point/3.0.0: 1009 | engines: 1010 | node: '>=8' 1011 | resolution: 1012 | integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1013 | /is-glob/4.0.1: 1014 | dependencies: 1015 | is-extglob: 2.1.1 1016 | dev: true 1017 | engines: 1018 | node: '>=0.10.0' 1019 | resolution: 1020 | integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 1021 | /is-promise/2.1.0: 1022 | dev: true 1023 | resolution: 1024 | integrity: sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= 1025 | /is-stream/1.1.0: 1026 | dev: false 1027 | engines: 1028 | node: '>=0.10.0' 1029 | resolution: 1030 | integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 1031 | /isarray/1.0.0: 1032 | dev: false 1033 | resolution: 1034 | integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 1035 | /isexe/2.0.0: 1036 | dev: true 1037 | resolution: 1038 | integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 1039 | /js-tokens/4.0.0: 1040 | dev: true 1041 | resolution: 1042 | integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 1043 | /js-yaml/3.13.1: 1044 | dependencies: 1045 | argparse: 1.0.10 1046 | esprima: 4.0.1 1047 | hasBin: true 1048 | resolution: 1049 | integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== 1050 | /json-schema-traverse/0.4.1: 1051 | dev: true 1052 | resolution: 1053 | integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1054 | /json-stable-stringify-without-jsonify/1.0.1: 1055 | dev: true 1056 | resolution: 1057 | integrity: sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 1058 | /kuler/1.0.1: 1059 | dependencies: 1060 | colornames: 1.1.1 1061 | dev: false 1062 | resolution: 1063 | integrity: sha512-J9nVUucG1p/skKul6DU3PUZrhs0LPulNaeUOox0IyXDi8S4CztTHs1gQphhuZmzXG7VOQSf6NJfKuzteQLv9gQ== 1064 | /lavalink/2.10.0: 1065 | dependencies: 1066 | backoff: 2.5.0 1067 | ws: 6.2.1 1068 | dev: false 1069 | resolution: 1070 | integrity: sha512-3fgyzeHm98rL+S8lMsJKL3pIOkYNVGWLBdkm6U5Sk2KWHGKgKZnmLXWIyvVD3Yqrz4PzER0MWtEk3LknQ4VjCw== 1071 | /levn/0.3.0: 1072 | dependencies: 1073 | prelude-ls: 1.1.2 1074 | type-check: 0.3.2 1075 | dev: true 1076 | engines: 1077 | node: '>= 0.8.0' 1078 | resolution: 1079 | integrity: sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= 1080 | /locate-path/3.0.0: 1081 | dependencies: 1082 | p-locate: 3.0.0 1083 | path-exists: 3.0.0 1084 | dev: false 1085 | engines: 1086 | node: '>=6' 1087 | resolution: 1088 | integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 1089 | /locate-path/5.0.0: 1090 | dependencies: 1091 | p-locate: 4.1.0 1092 | dev: false 1093 | engines: 1094 | node: '>=8' 1095 | resolution: 1096 | integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 1097 | /lodash/4.17.15: 1098 | resolution: 1099 | integrity: sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 1100 | /logform/2.1.2: 1101 | dependencies: 1102 | colors: 1.4.0 1103 | fast-safe-stringify: 2.0.7 1104 | fecha: 2.3.3 1105 | ms: 2.1.2 1106 | triple-beam: 1.3.0 1107 | dev: false 1108 | resolution: 1109 | integrity: sha512-+lZh4OpERDBLqjiwDLpAWNQu6KMjnlXH2ByZwCuSqVPJletw0kTWJf5CgSNAUKn1KUkv3m2cUz/LK8zyEy7wzQ== 1110 | /mime-db/1.43.0: 1111 | dev: false 1112 | engines: 1113 | node: '>= 0.6' 1114 | resolution: 1115 | integrity: sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== 1116 | /mime-types/2.1.26: 1117 | dependencies: 1118 | mime-db: 1.43.0 1119 | dev: false 1120 | engines: 1121 | node: '>= 0.6' 1122 | resolution: 1123 | integrity: sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== 1124 | /mimic-fn/2.1.0: 1125 | dev: true 1126 | engines: 1127 | node: '>=6' 1128 | resolution: 1129 | integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 1130 | /minimatch/3.0.4: 1131 | dependencies: 1132 | brace-expansion: 1.1.11 1133 | resolution: 1134 | integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1135 | /minimist/1.2.5: 1136 | resolution: 1137 | integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1138 | /mkdirp/0.5.5: 1139 | dependencies: 1140 | minimist: 1.2.5 1141 | hasBin: true 1142 | resolution: 1143 | integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 1144 | /moment-duration-format/2.3.2: 1145 | dev: false 1146 | resolution: 1147 | integrity: sha512-cBMXjSW+fjOb4tyaVHuaVE/A5TqkukDWiOfxxAjY+PEqmmBQlLwn+8OzwPiG3brouXKY5Un4pBjAeB6UToXHaQ== 1148 | /moment/2.24.0: 1149 | resolution: 1150 | integrity: sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== 1151 | /ms/2.1.2: 1152 | resolution: 1153 | integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1154 | /mute-stream/0.0.8: 1155 | dev: true 1156 | resolution: 1157 | integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== 1158 | /mz/2.7.0: 1159 | dependencies: 1160 | any-promise: 1.3.0 1161 | object-assign: 4.1.1 1162 | thenify-all: 1.6.0 1163 | dev: false 1164 | resolution: 1165 | integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== 1166 | /nan/2.14.0: 1167 | dev: false 1168 | resolution: 1169 | integrity: sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== 1170 | /natural-compare/1.4.0: 1171 | dev: true 1172 | resolution: 1173 | integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 1174 | /nice-try/1.0.5: 1175 | dev: true 1176 | resolution: 1177 | integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 1178 | /node-fetch/2.6.0: 1179 | dev: false 1180 | engines: 1181 | node: 4.x || >=6.0.0 1182 | resolution: 1183 | integrity: sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== 1184 | /node-gyp-build/3.7.0: 1185 | dev: false 1186 | hasBin: true 1187 | resolution: 1188 | integrity: sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w== 1189 | /object-assign/4.1.1: 1190 | dev: false 1191 | engines: 1192 | node: '>=0.10.0' 1193 | resolution: 1194 | integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1195 | /object-hash/2.0.3: 1196 | dev: false 1197 | engines: 1198 | node: '>= 6' 1199 | resolution: 1200 | integrity: sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg== 1201 | /once/1.4.0: 1202 | dependencies: 1203 | wrappy: 1.0.2 1204 | resolution: 1205 | integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1206 | /one-time/0.0.4: 1207 | dev: false 1208 | resolution: 1209 | integrity: sha1-+M33eISCb+Tf+T46nMN7HkSAdC4= 1210 | /onetime/5.1.0: 1211 | dependencies: 1212 | mimic-fn: 2.1.0 1213 | dev: true 1214 | engines: 1215 | node: '>=6' 1216 | resolution: 1217 | integrity: sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== 1218 | /optionator/0.8.3: 1219 | dependencies: 1220 | deep-is: 0.1.3 1221 | fast-levenshtein: 2.0.6 1222 | levn: 0.3.0 1223 | prelude-ls: 1.1.2 1224 | type-check: 0.3.2 1225 | word-wrap: 1.2.3 1226 | dev: true 1227 | engines: 1228 | node: '>= 0.8.0' 1229 | resolution: 1230 | integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== 1231 | /os-tmpdir/1.0.2: 1232 | dev: true 1233 | engines: 1234 | node: '>=0.10.0' 1235 | resolution: 1236 | integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 1237 | /p-limit/2.3.0: 1238 | dependencies: 1239 | p-try: 2.2.0 1240 | dev: false 1241 | engines: 1242 | node: '>=6' 1243 | resolution: 1244 | integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1245 | /p-locate/3.0.0: 1246 | dependencies: 1247 | p-limit: 2.3.0 1248 | dev: false 1249 | engines: 1250 | node: '>=6' 1251 | resolution: 1252 | integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1253 | /p-locate/4.1.0: 1254 | dependencies: 1255 | p-limit: 2.3.0 1256 | dev: false 1257 | engines: 1258 | node: '>=8' 1259 | resolution: 1260 | integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 1261 | /p-try/2.2.0: 1262 | dev: false 1263 | engines: 1264 | node: '>=6' 1265 | resolution: 1266 | integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1267 | /packet-reader/1.0.0: 1268 | dev: false 1269 | resolution: 1270 | integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== 1271 | /parent-module/1.0.1: 1272 | dependencies: 1273 | callsites: 3.1.0 1274 | dev: true 1275 | engines: 1276 | node: '>=6' 1277 | resolution: 1278 | integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1279 | /parent-require/1.0.0: 1280 | dev: false 1281 | engines: 1282 | node: '>= 0.4.0' 1283 | resolution: 1284 | integrity: sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc= 1285 | /parse5-htmlparser2-tree-adapter/5.1.1: 1286 | dependencies: 1287 | parse5: 5.1.1 1288 | dev: false 1289 | resolution: 1290 | integrity: sha512-CF+TKjXqoqyDwHqBhFQ+3l5t83xYi6fVT1tQNg+Ye0JRLnTxWvIroCjEp1A0k4lneHNBGnICUf0cfYVYGEazqw== 1291 | /parse5/5.1.1: 1292 | dev: false 1293 | resolution: 1294 | integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== 1295 | /path-exists/3.0.0: 1296 | dev: false 1297 | engines: 1298 | node: '>=4' 1299 | resolution: 1300 | integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1301 | /path-exists/4.0.0: 1302 | dev: false 1303 | engines: 1304 | node: '>=8' 1305 | resolution: 1306 | integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1307 | /path-is-absolute/1.0.1: 1308 | engines: 1309 | node: '>=0.10.0' 1310 | resolution: 1311 | integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1312 | /path-key/2.0.1: 1313 | dev: true 1314 | engines: 1315 | node: '>=4' 1316 | resolution: 1317 | integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1318 | /pg-connection-string/0.1.3: 1319 | dev: false 1320 | resolution: 1321 | integrity: sha1-2hhHsglA5C7hSSvq9l1J2RskXfc= 1322 | /pg-int8/1.0.1: 1323 | dev: false 1324 | engines: 1325 | node: '>=4.0.0' 1326 | resolution: 1327 | integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== 1328 | /pg-pool/3.1.0_pg@8.0.2: 1329 | dependencies: 1330 | pg: 8.0.2_pg@8.0.2 1331 | dev: false 1332 | peerDependencies: 1333 | pg: '>=8.0' 1334 | resolution: 1335 | integrity: sha512-CvxGctDwjZZad6Q7vvhFA4BsYdk26UFIZaFH0XXqHId5uBOc26vco/GFh/laUVIQUpD9IKe/f9/mr/OQHyQ2ZA== 1336 | /pg-protocol/1.2.1: 1337 | dev: false 1338 | resolution: 1339 | integrity: sha512-IqZ+VUOqg3yydxSt5NgNKLVK9JgPBuzq4ZbA9GmrmIkQjQAszPT9DLqTtID0mKsLEZB68PU0gjLla561WZ2QkQ== 1340 | /pg-types/2.2.0: 1341 | dependencies: 1342 | pg-int8: 1.0.1 1343 | postgres-array: 2.0.0 1344 | postgres-bytea: 1.0.0 1345 | postgres-date: 1.0.5 1346 | postgres-interval: 1.2.0 1347 | dev: false 1348 | engines: 1349 | node: '>=4' 1350 | resolution: 1351 | integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== 1352 | /pg/8.0.2_pg@8.0.2: 1353 | dependencies: 1354 | buffer-writer: 2.0.0 1355 | packet-reader: 1.0.0 1356 | pg-connection-string: 0.1.3 1357 | pg-pool: 3.1.0_pg@8.0.2 1358 | pg-protocol: 1.2.1 1359 | pg-types: 2.2.0 1360 | pgpass: 1.0.2 1361 | semver: 4.3.2 1362 | dev: false 1363 | engines: 1364 | node: '>= 8.0.0' 1365 | peerDependencies: 1366 | pg: '*' 1367 | resolution: 1368 | integrity: sha512-ngOUEDk69kLdH/k/YLT2NRIBcUiPFRcY4l51dviqn79P5qIa5jBIGIFTIGXh4OlT/6gpiCAza5a9uy08izpFQQ== 1369 | /pgpass/1.0.2: 1370 | dependencies: 1371 | split: 1.0.1 1372 | dev: false 1373 | resolution: 1374 | integrity: sha1-Knu0G2BltnkH6R2hsHwYR8h3swY= 1375 | /postgres-array/2.0.0: 1376 | dev: false 1377 | engines: 1378 | node: '>=4' 1379 | resolution: 1380 | integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== 1381 | /postgres-bytea/1.0.0: 1382 | dev: false 1383 | engines: 1384 | node: '>=0.10.0' 1385 | resolution: 1386 | integrity: sha1-AntTPAqokOJtFy1Hz5zOzFIazTU= 1387 | /postgres-date/1.0.5: 1388 | dev: false 1389 | engines: 1390 | node: '>=0.10.0' 1391 | resolution: 1392 | integrity: sha512-pdau6GRPERdAYUQwkBnGKxEfPyhVZXG/JiS44iZWiNdSOWE09N2lUgN6yshuq6fVSon4Pm0VMXd1srUUkLe9iA== 1393 | /postgres-interval/1.2.0: 1394 | dependencies: 1395 | xtend: 4.0.2 1396 | dev: false 1397 | engines: 1398 | node: '>=0.10.0' 1399 | resolution: 1400 | integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== 1401 | /precond/0.2.3: 1402 | dev: false 1403 | engines: 1404 | node: '>= 0.6' 1405 | resolution: 1406 | integrity: sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw= 1407 | /prelude-ls/1.1.2: 1408 | dev: true 1409 | engines: 1410 | node: '>= 0.8.0' 1411 | resolution: 1412 | integrity: sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= 1413 | /prettier-linter-helpers/1.0.0: 1414 | dependencies: 1415 | fast-diff: 1.2.0 1416 | dev: true 1417 | engines: 1418 | node: '>=6.0.0' 1419 | resolution: 1420 | integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== 1421 | /prettier/2.0.4: 1422 | dev: true 1423 | engines: 1424 | node: '>=10.13.0' 1425 | hasBin: true 1426 | resolution: 1427 | integrity: sha512-SVJIQ51spzFDvh4fIbCLvciiDMCrRhlN3mbZvv/+ycjvmF5E73bKdGfU8QDLNmjYJf+lsGnDBC4UUnvTe5OO0w== 1428 | /prism-media/1.2.1: 1429 | dev: false 1430 | peerDependencies: 1431 | '@discordjs/opus': ^0.1.0 1432 | ffmpeg-static: ^2.4.0 || ^3.0.0 1433 | node-opus: ^0.3.1 1434 | opusscript: ^0.0.6 1435 | peerDependenciesMeta: 1436 | '@discordjs/opus': 1437 | optional: true 1438 | ffmpeg-static: 1439 | optional: true 1440 | node-opus: 1441 | optional: true 1442 | opusscript: 1443 | optional: true 1444 | resolution: 1445 | integrity: sha512-R3EbKwJiYlTvGwcG1DpUt+06DsxOGS5W4AMEHT7oVOjG93MjpdhGX1whHyjnqknylLMupKAsKMEXcTNRbPe6Vw== 1446 | /process-nextick-args/2.0.1: 1447 | dev: false 1448 | resolution: 1449 | integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1450 | /progress/2.0.3: 1451 | dev: true 1452 | engines: 1453 | node: '>=0.4.0' 1454 | resolution: 1455 | integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 1456 | /punycode/2.1.1: 1457 | dev: true 1458 | engines: 1459 | node: '>=6' 1460 | resolution: 1461 | integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1462 | /readable-stream/2.3.7: 1463 | dependencies: 1464 | core-util-is: 1.0.2 1465 | inherits: 2.0.4 1466 | isarray: 1.0.0 1467 | process-nextick-args: 2.0.1 1468 | safe-buffer: 5.1.2 1469 | string_decoder: 1.1.1 1470 | util-deprecate: 1.0.2 1471 | dev: false 1472 | resolution: 1473 | integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 1474 | /readable-stream/3.6.0: 1475 | dependencies: 1476 | inherits: 2.0.4 1477 | string_decoder: 1.3.0 1478 | util-deprecate: 1.0.2 1479 | dev: false 1480 | engines: 1481 | node: '>= 6' 1482 | resolution: 1483 | integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 1484 | /reflect-metadata/0.1.13: 1485 | dev: false 1486 | resolution: 1487 | integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== 1488 | /regexpp/2.0.1: 1489 | dev: true 1490 | engines: 1491 | node: '>=6.5.0' 1492 | resolution: 1493 | integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== 1494 | /regexpp/3.1.0: 1495 | dev: true 1496 | engines: 1497 | node: '>=8' 1498 | resolution: 1499 | integrity: sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== 1500 | /require-directory/2.1.1: 1501 | dev: false 1502 | engines: 1503 | node: '>=0.10.0' 1504 | resolution: 1505 | integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1506 | /require-main-filename/2.0.0: 1507 | dev: false 1508 | resolution: 1509 | integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 1510 | /resolve-from/4.0.0: 1511 | dev: true 1512 | engines: 1513 | node: '>=4' 1514 | resolution: 1515 | integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1516 | /restore-cursor/3.1.0: 1517 | dependencies: 1518 | onetime: 5.1.0 1519 | signal-exit: 3.0.3 1520 | dev: true 1521 | engines: 1522 | node: '>=8' 1523 | resolution: 1524 | integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== 1525 | /rimraf/2.6.3: 1526 | dependencies: 1527 | glob: 7.1.6 1528 | dev: true 1529 | hasBin: true 1530 | resolution: 1531 | integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== 1532 | /rimraf/3.0.2: 1533 | dependencies: 1534 | glob: 7.1.6 1535 | dev: true 1536 | hasBin: true 1537 | resolution: 1538 | integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1539 | /run-async/2.4.0: 1540 | dependencies: 1541 | is-promise: 2.1.0 1542 | dev: true 1543 | engines: 1544 | node: '>=0.12.0' 1545 | resolution: 1546 | integrity: sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== 1547 | /rxjs/6.5.5: 1548 | dependencies: 1549 | tslib: 1.11.1 1550 | dev: true 1551 | engines: 1552 | npm: '>=2.0.0' 1553 | resolution: 1554 | integrity: sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== 1555 | /safe-buffer/5.1.2: 1556 | dev: false 1557 | resolution: 1558 | integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1559 | /safe-buffer/5.2.0: 1560 | dev: false 1561 | resolution: 1562 | integrity: sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 1563 | /safer-buffer/2.1.2: 1564 | dev: true 1565 | resolution: 1566 | integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1567 | /sax/1.2.4: 1568 | dev: false 1569 | resolution: 1570 | integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== 1571 | /semver/4.3.2: 1572 | dev: false 1573 | hasBin: true 1574 | resolution: 1575 | integrity: sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c= 1576 | /semver/5.7.1: 1577 | dev: true 1578 | hasBin: true 1579 | resolution: 1580 | integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1581 | /semver/6.3.0: 1582 | dev: true 1583 | hasBin: true 1584 | resolution: 1585 | integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1586 | /set-blocking/2.0.0: 1587 | dev: false 1588 | resolution: 1589 | integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1590 | /setimmediate/1.0.5: 1591 | dev: false 1592 | resolution: 1593 | integrity: sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= 1594 | /sha.js/2.4.11: 1595 | dependencies: 1596 | inherits: 2.0.4 1597 | safe-buffer: 5.2.0 1598 | dev: false 1599 | hasBin: true 1600 | resolution: 1601 | integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== 1602 | /shebang-command/1.2.0: 1603 | dependencies: 1604 | shebang-regex: 1.0.0 1605 | dev: true 1606 | engines: 1607 | node: '>=0.10.0' 1608 | resolution: 1609 | integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1610 | /shebang-regex/1.0.0: 1611 | dev: true 1612 | engines: 1613 | node: '>=0.10.0' 1614 | resolution: 1615 | integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1616 | /signal-exit/3.0.3: 1617 | dev: true 1618 | resolution: 1619 | integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1620 | /simple-swizzle/0.2.2: 1621 | dependencies: 1622 | is-arrayish: 0.3.2 1623 | dev: false 1624 | resolution: 1625 | integrity: sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= 1626 | /slice-ansi/2.1.0: 1627 | dependencies: 1628 | ansi-styles: 3.2.1 1629 | astral-regex: 1.0.0 1630 | is-fullwidth-code-point: 2.0.0 1631 | dev: true 1632 | engines: 1633 | node: '>=6' 1634 | resolution: 1635 | integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== 1636 | /split/1.0.1: 1637 | dependencies: 1638 | through: 2.3.8 1639 | dev: false 1640 | resolution: 1641 | integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== 1642 | /sprintf-js/1.0.3: 1643 | resolution: 1644 | integrity: sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 1645 | /stack-trace/0.0.10: 1646 | dev: false 1647 | resolution: 1648 | integrity: sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= 1649 | /string-width/3.1.0: 1650 | dependencies: 1651 | emoji-regex: 7.0.3 1652 | is-fullwidth-code-point: 2.0.0 1653 | strip-ansi: 5.2.0 1654 | engines: 1655 | node: '>=6' 1656 | resolution: 1657 | integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1658 | /string-width/4.2.0: 1659 | dependencies: 1660 | emoji-regex: 8.0.0 1661 | is-fullwidth-code-point: 3.0.0 1662 | strip-ansi: 6.0.0 1663 | engines: 1664 | node: '>=8' 1665 | resolution: 1666 | integrity: sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 1667 | /string_decoder/1.1.1: 1668 | dependencies: 1669 | safe-buffer: 5.1.2 1670 | dev: false 1671 | resolution: 1672 | integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1673 | /string_decoder/1.3.0: 1674 | dependencies: 1675 | safe-buffer: 5.2.0 1676 | dev: false 1677 | resolution: 1678 | integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1679 | /strip-ansi/3.0.1: 1680 | dependencies: 1681 | ansi-regex: 2.1.1 1682 | dev: false 1683 | engines: 1684 | node: '>=0.10.0' 1685 | resolution: 1686 | integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 1687 | /strip-ansi/5.2.0: 1688 | dependencies: 1689 | ansi-regex: 4.1.0 1690 | engines: 1691 | node: '>=6' 1692 | resolution: 1693 | integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1694 | /strip-ansi/6.0.0: 1695 | dependencies: 1696 | ansi-regex: 5.0.0 1697 | engines: 1698 | node: '>=8' 1699 | resolution: 1700 | integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1701 | /strip-json-comments/3.1.0: 1702 | dev: true 1703 | engines: 1704 | node: '>=8' 1705 | resolution: 1706 | integrity: sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== 1707 | /supports-color/2.0.0: 1708 | dev: false 1709 | engines: 1710 | node: '>=0.8.0' 1711 | resolution: 1712 | integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 1713 | /supports-color/5.5.0: 1714 | dependencies: 1715 | has-flag: 3.0.0 1716 | engines: 1717 | node: '>=4' 1718 | resolution: 1719 | integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1720 | /supports-color/7.1.0: 1721 | dependencies: 1722 | has-flag: 4.0.0 1723 | engines: 1724 | node: '>=8' 1725 | resolution: 1726 | integrity: sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 1727 | /table/5.4.6: 1728 | dependencies: 1729 | ajv: 6.12.0 1730 | lodash: 4.17.15 1731 | slice-ansi: 2.1.0 1732 | string-width: 3.1.0 1733 | dev: true 1734 | engines: 1735 | node: '>=6.0.0' 1736 | resolution: 1737 | integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== 1738 | /text-hex/1.0.0: 1739 | dev: false 1740 | resolution: 1741 | integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== 1742 | /text-table/0.2.0: 1743 | dev: true 1744 | resolution: 1745 | integrity: sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1746 | /thenify-all/1.6.0: 1747 | dependencies: 1748 | thenify: 3.3.0 1749 | dev: false 1750 | engines: 1751 | node: '>=0.8' 1752 | resolution: 1753 | integrity: sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= 1754 | /thenify/3.3.0: 1755 | dependencies: 1756 | any-promise: 1.3.0 1757 | dev: false 1758 | resolution: 1759 | integrity: sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= 1760 | /through/2.3.8: 1761 | resolution: 1762 | integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 1763 | /tmp/0.0.33: 1764 | dependencies: 1765 | os-tmpdir: 1.0.2 1766 | dev: true 1767 | engines: 1768 | node: '>=0.6.0' 1769 | resolution: 1770 | integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 1771 | /triple-beam/1.3.0: 1772 | dev: false 1773 | resolution: 1774 | integrity: sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== 1775 | /tslib/1.11.1: 1776 | resolution: 1777 | integrity: sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== 1778 | /tsutils/3.17.1_typescript@3.8.3: 1779 | dependencies: 1780 | tslib: 1.11.1 1781 | typescript: 3.8.3 1782 | dev: true 1783 | engines: 1784 | node: '>= 6' 1785 | peerDependencies: 1786 | typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' 1787 | resolution: 1788 | integrity: sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g== 1789 | /tweetnacl/1.0.3: 1790 | dev: false 1791 | resolution: 1792 | integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== 1793 | /type-check/0.3.2: 1794 | dependencies: 1795 | prelude-ls: 1.1.2 1796 | dev: true 1797 | engines: 1798 | node: '>= 0.8.0' 1799 | resolution: 1800 | integrity: sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= 1801 | /type-fest/0.11.0: 1802 | dev: true 1803 | engines: 1804 | node: '>=8' 1805 | resolution: 1806 | integrity: sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== 1807 | /type-fest/0.8.1: 1808 | dev: true 1809 | engines: 1810 | node: '>=8' 1811 | resolution: 1812 | integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 1813 | /typeorm/0.2.24: 1814 | dependencies: 1815 | app-root-path: 3.0.0 1816 | buffer: 5.6.0 1817 | chalk: 2.4.2 1818 | cli-highlight: 2.1.4 1819 | debug: 4.1.1 1820 | dotenv: 6.2.0 1821 | glob: 7.1.6 1822 | js-yaml: 3.13.1 1823 | mkdirp: 0.5.5 1824 | reflect-metadata: 0.1.13 1825 | sha.js: 2.4.11 1826 | tslib: 1.11.1 1827 | xml2js: 0.4.23 1828 | yargonaut: 1.1.4 1829 | yargs: 13.3.2 1830 | dev: false 1831 | hasBin: true 1832 | resolution: 1833 | integrity: sha512-L9tQv6nNLRyh+gex/qc8/CyLs8u0kXKqk1OjYGF13k/KOg6N2oibwkuGgv0FuoTGYx2ta2NmqvuMUAMrHIY5ew== 1834 | /typescript/3.8.3: 1835 | dev: true 1836 | engines: 1837 | node: '>=4.2.0' 1838 | hasBin: true 1839 | resolution: 1840 | integrity: sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== 1841 | /uri-js/4.2.2: 1842 | dependencies: 1843 | punycode: 2.1.1 1844 | dev: true 1845 | resolution: 1846 | integrity: sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 1847 | /utf-8-validate/5.0.2: 1848 | dependencies: 1849 | node-gyp-build: 3.7.0 1850 | dev: false 1851 | requiresBuild: true 1852 | resolution: 1853 | integrity: sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw== 1854 | /util-deprecate/1.0.2: 1855 | dev: false 1856 | resolution: 1857 | integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1858 | /v8-compile-cache/2.1.0: 1859 | dev: true 1860 | resolution: 1861 | integrity: sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== 1862 | /which-module/2.0.0: 1863 | dev: false 1864 | resolution: 1865 | integrity: sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 1866 | /which/1.3.1: 1867 | dependencies: 1868 | isexe: 2.0.0 1869 | dev: true 1870 | hasBin: true 1871 | resolution: 1872 | integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1873 | /winston-daily-rotate-file/4.4.2_winston@3.2.1: 1874 | dependencies: 1875 | file-stream-rotator: 0.5.7 1876 | object-hash: 2.0.3 1877 | triple-beam: 1.3.0 1878 | winston: 3.2.1 1879 | winston-transport: 4.3.0 1880 | dev: false 1881 | engines: 1882 | node: '>=8' 1883 | peerDependencies: 1884 | winston: ^3 1885 | resolution: 1886 | integrity: sha512-pVOUJKxN+Kn6LnOJZ4tTwdV5+N+fCkiRAb3bVnzcPtOj1ScxGNC3DyUhHuAHssBtMl5s45/aUcSUtApH+69V5A== 1887 | /winston-transport/4.3.0: 1888 | dependencies: 1889 | readable-stream: 2.3.7 1890 | triple-beam: 1.3.0 1891 | dev: false 1892 | engines: 1893 | node: '>= 6.4.0' 1894 | resolution: 1895 | integrity: sha512-B2wPuwUi3vhzn/51Uukcao4dIduEiPOcOt9HJ3QeaXgkJ5Z7UwpBzxS4ZGNHtrxrUvTwemsQiSys0ihOf8Mp1A== 1896 | /winston/3.2.1: 1897 | dependencies: 1898 | async: 2.6.3 1899 | diagnostics: 1.1.1 1900 | is-stream: 1.1.0 1901 | logform: 2.1.2 1902 | one-time: 0.0.4 1903 | readable-stream: 3.6.0 1904 | stack-trace: 0.0.10 1905 | triple-beam: 1.3.0 1906 | winston-transport: 4.3.0 1907 | dev: false 1908 | engines: 1909 | node: '>= 6.4.0' 1910 | resolution: 1911 | integrity: sha512-zU6vgnS9dAWCEKg/QYigd6cgMVVNwyTzKs81XZtTFuRwJOcDdBg7AU0mXVyNbs7O5RH2zdv+BdNZUlx7mXPuOw== 1912 | /word-wrap/1.2.3: 1913 | dev: true 1914 | engines: 1915 | node: '>=0.10.0' 1916 | resolution: 1917 | integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 1918 | /wrap-ansi/5.1.0: 1919 | dependencies: 1920 | ansi-styles: 3.2.1 1921 | string-width: 3.1.0 1922 | strip-ansi: 5.2.0 1923 | dev: false 1924 | engines: 1925 | node: '>=6' 1926 | resolution: 1927 | integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== 1928 | /wrap-ansi/6.2.0: 1929 | dependencies: 1930 | ansi-styles: 4.2.1 1931 | string-width: 4.2.0 1932 | strip-ansi: 6.0.0 1933 | dev: false 1934 | engines: 1935 | node: '>=8' 1936 | resolution: 1937 | integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== 1938 | /wrappy/1.0.2: 1939 | resolution: 1940 | integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1941 | /write/1.0.3: 1942 | dependencies: 1943 | mkdirp: 0.5.5 1944 | dev: true 1945 | engines: 1946 | node: '>=4' 1947 | resolution: 1948 | integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== 1949 | /ws/6.2.1: 1950 | dependencies: 1951 | async-limiter: 1.0.1 1952 | dev: false 1953 | resolution: 1954 | integrity: sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== 1955 | /ws/7.2.3_5290a7aab7631971258e1bd11475725e: 1956 | dependencies: 1957 | bufferutil: 4.0.1 1958 | utf-8-validate: 5.0.2 1959 | dev: false 1960 | engines: 1961 | node: '>=8.3.0' 1962 | peerDependencies: 1963 | bufferutil: ^4.0.1 1964 | utf-8-validate: ^5.0.2 1965 | peerDependenciesMeta: 1966 | bufferutil: 1967 | optional: true 1968 | utf-8-validate: 1969 | optional: true 1970 | resolution: 1971 | integrity: sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== 1972 | /xml2js/0.4.23: 1973 | dependencies: 1974 | sax: 1.2.4 1975 | xmlbuilder: 11.0.1 1976 | dev: false 1977 | engines: 1978 | node: '>=4.0.0' 1979 | resolution: 1980 | integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== 1981 | /xmlbuilder/11.0.1: 1982 | dev: false 1983 | engines: 1984 | node: '>=4.0' 1985 | resolution: 1986 | integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== 1987 | /xtend/4.0.2: 1988 | dev: false 1989 | engines: 1990 | node: '>=0.4' 1991 | resolution: 1992 | integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 1993 | /y18n/4.0.0: 1994 | dev: false 1995 | resolution: 1996 | integrity: sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== 1997 | /yargonaut/1.1.4: 1998 | dependencies: 1999 | chalk: 1.1.3 2000 | figlet: 1.3.0 2001 | parent-require: 1.0.0 2002 | dev: false 2003 | resolution: 2004 | integrity: sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA== 2005 | /yargs-parser/13.1.2: 2006 | dependencies: 2007 | camelcase: 5.3.1 2008 | decamelize: 1.2.0 2009 | dev: false 2010 | resolution: 2011 | integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== 2012 | /yargs-parser/18.1.2: 2013 | dependencies: 2014 | camelcase: 5.3.1 2015 | decamelize: 1.2.0 2016 | dev: false 2017 | engines: 2018 | node: '>=6' 2019 | resolution: 2020 | integrity: sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ== 2021 | /yargs/13.3.2: 2022 | dependencies: 2023 | cliui: 5.0.0 2024 | find-up: 3.0.0 2025 | get-caller-file: 2.0.5 2026 | require-directory: 2.1.1 2027 | require-main-filename: 2.0.0 2028 | set-blocking: 2.0.0 2029 | string-width: 3.1.0 2030 | which-module: 2.0.0 2031 | y18n: 4.0.0 2032 | yargs-parser: 13.1.2 2033 | dev: false 2034 | resolution: 2035 | integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== 2036 | /yargs/15.3.1: 2037 | dependencies: 2038 | cliui: 6.0.0 2039 | decamelize: 1.2.0 2040 | find-up: 4.1.0 2041 | get-caller-file: 2.0.5 2042 | require-directory: 2.1.1 2043 | require-main-filename: 2.0.0 2044 | set-blocking: 2.0.0 2045 | string-width: 4.2.0 2046 | which-module: 2.0.0 2047 | y18n: 4.0.0 2048 | yargs-parser: 18.1.2 2049 | dev: false 2050 | engines: 2051 | node: '>=8' 2052 | resolution: 2053 | integrity: sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA== 2054 | /zlib-sync/0.1.6: 2055 | dependencies: 2056 | nan: 2.14.0 2057 | dev: false 2058 | requiresBuild: true 2059 | resolution: 2060 | integrity: sha512-B2XGrhlXs/izEks+705vn/aL+nWyPgnS1glyCeH8wgZdOvztRn3ZEdqclj6GoJSeA/iRSqaTlznG2KO1M/GuWg== 2061 | github.com/1Computer1/discord-akairo/10cef7efc7a329cb1e0d96d73ccb4b83bc0afa72_discord.js@12.1.1: 2062 | dependencies: 2063 | discord.js: github.com/discordjs/discord.js/1330e2d246cf4e1b9e7f13a5f941ff086117a3fc_cf2ed6007ca0a0cd3da37c757a7bf7b9 2064 | dev: false 2065 | id: github.com/1Computer1/discord-akairo/10cef7efc7a329cb1e0d96d73ccb4b83bc0afa72 2066 | name: discord-akairo 2067 | peerDependencies: 2068 | discord.js: ^12.0.0 2069 | sequelize: ^5.2.12 2070 | sqlite: ^3.0.3 2071 | resolution: 2072 | registry: 'https://registry.npmjs.org/' 2073 | tarball: 'https://codeload.github.com/1Computer1/discord-akairo/tar.gz/10cef7efc7a329cb1e0d96d73ccb4b83bc0afa72' 2074 | version: 8.0.0 2075 | github.com/discordjs/discord.js/1330e2d246cf4e1b9e7f13a5f941ff086117a3fc_cf2ed6007ca0a0cd3da37c757a7bf7b9: 2076 | dependencies: 2077 | '@discordjs/collection': 0.1.5 2078 | abort-controller: 3.0.0 2079 | bufferutil: 4.0.1 2080 | form-data: 3.0.0 2081 | node-fetch: 2.6.0 2082 | prism-media: 1.2.1 2083 | setimmediate: 1.0.5 2084 | tweetnacl: 1.0.3 2085 | utf-8-validate: 5.0.2 2086 | ws: 7.2.3_5290a7aab7631971258e1bd11475725e 2087 | zlib-sync: 0.1.6 2088 | dev: false 2089 | engines: 2090 | node: '>=12.0.0' 2091 | id: github.com/discordjs/discord.js/1330e2d246cf4e1b9e7f13a5f941ff086117a3fc 2092 | name: discord.js 2093 | peerDependencies: 2094 | bufferutil: ^4.0.1 2095 | erlpack: discordapp/erlpack 2096 | libsodium-wrappers: ^0.7.6 2097 | sodium: ^3.0.2 2098 | utf-8-validate: ^5.0.2 2099 | zlib-sync: ^0.1.6 2100 | peerDependenciesMeta: 2101 | bufferutil: 2102 | optional: true 2103 | erlpack: 2104 | optional: true 2105 | libsodium-wrappers: 2106 | optional: true 2107 | sodium: 2108 | optional: true 2109 | utf-8-validate: 2110 | optional: true 2111 | zlib-sync: 2112 | optional: true 2113 | resolution: 2114 | registry: 'https://registry.npmjs.org/' 2115 | tarball: 'https://codeload.github.com/discordjs/discord.js/tar.gz/1330e2d246cf4e1b9e7f13a5f941ff086117a3fc' 2116 | version: 12.1.1 2117 | specifiers: 2118 | '@types/common-tags': ^1.8.0 2119 | '@types/moment-duration-format': ^2.2.2 2120 | '@types/node': ^13.11.1 2121 | '@types/ws': ^7.2.4 2122 | '@typescript-eslint/eslint-plugin': ^2.28.0 2123 | '@typescript-eslint/parser': ^2.28.0 2124 | bufferutil: ^4.0.1 2125 | common-tags: ^1.8.0 2126 | discord-akairo: 1Computer1/discord-akairo 2127 | discord.js: discordjs/discord.js 2128 | dotenv: ^8.2.0 2129 | eslint: ^6.8.0 2130 | eslint-config-marine: ^6.0.0 2131 | eslint-config-prettier: ^6.10.1 2132 | eslint-plugin-prettier: ^3.1.3 2133 | lavalink: ^2.10.0 2134 | moment: ^2.24.0 2135 | moment-duration-format: ^2.3.2 2136 | pg: ^8.0.2 2137 | prettier: ^2.0.4 2138 | reflect-metadata: ^0.1.13 2139 | rimraf: ^3.0.2 2140 | tslib: ^1.11.1 2141 | typeorm: ^0.2.24 2142 | typescript: ^3.8.3 2143 | utf-8-validate: ^5.0.2 2144 | winston: ^3.2.1 2145 | winston-daily-rotate-file: ^4.4.2 2146 | ws: ^7.2.3 2147 | zlib-sync: ^0.1.6 2148 | -------------------------------------------------------------------------------- /src/bot/client/ListenClient.ts: -------------------------------------------------------------------------------- 1 | import { join } from 'path'; 2 | import { AkairoClient, CommandHandler, InhibitorHandler, ListenerHandler } from 'discord-akairo'; 3 | import { logger } from '../../util/logger'; 4 | import { Logger } from 'winston'; 5 | import { Connection } from 'typeorm'; 6 | import database from '../structures/Database'; 7 | import { Setting } from '../models/Settings'; 8 | import TypeORMProvider from '../structures/SettingsProvider'; 9 | import WebSocketManager from '../structures/WebSocketManager'; 10 | 11 | declare module 'discord-akairo' { 12 | interface AkairoClient { 13 | logger: Logger; 14 | db: Connection; 15 | settings: TypeORMProvider; 16 | config: ListenOptions; 17 | radioInfo: RadioInfo; 18 | radioInfoKpop: RadioInfoKpop; 19 | webSocketManager: WebSocketManager; 20 | webSocketManagerKpop: WebSocketManager; 21 | } 22 | } 23 | 24 | interface ListenOptions { 25 | owner?: string; 26 | token?: string; 27 | } 28 | 29 | interface RadioInfo { 30 | songName: string; 31 | artistName?: string; 32 | artistList?: string; 33 | artistCount: number; 34 | sourceName: string; 35 | albumName: string; 36 | albumCover: string; 37 | listeners: number; 38 | requestedBy: string; 39 | event: boolean; 40 | eventName?: string; 41 | eventCover?: string; 42 | } 43 | 44 | interface RadioInfoKpop { 45 | songName: string; 46 | artistName?: string; 47 | artistList?: string; 48 | artistCount: number; 49 | sourceName: string; 50 | albumName: string; 51 | albumCover: string; 52 | listeners: number; 53 | requestedBy: string; 54 | event: boolean; 55 | eventName?: string; 56 | eventCover?: string; 57 | } 58 | 59 | export default class ListenClient extends AkairoClient { 60 | public logger = logger; 61 | 62 | public db!: Connection; 63 | 64 | public settings!: TypeORMProvider; 65 | 66 | public webSocketManager = new WebSocketManager(this, process.env.WEBSOCKET!, 'jpop'); 67 | 68 | public webSocketManagerKpop = new WebSocketManager(this, process.env.WEBSOCKET_KPOP!, 'kpop'); 69 | 70 | public radioInfo!: RadioInfo; 71 | 72 | public radioInfoKpop!: RadioInfoKpop; 73 | 74 | public commandHandler = new CommandHandler(this, { 75 | directory: join(__dirname, '..', 'commands'), 76 | prefix: '~~', 77 | aliasReplacement: /-/g, 78 | allowMention: true, 79 | handleEdits: true, 80 | commandUtil: true, 81 | commandUtilLifetime: 3e5, 82 | defaultCooldown: 3000, 83 | argumentDefaults: { 84 | prompt: { 85 | modifyStart: (_, str) => `${str}\n\nType \`cancel\` to cancel the command.`, 86 | modifyRetry: (_, str) => `${str}\n\nType \`cancel\` to cancel the command.`, 87 | timeout: 'Guess you took too long, the command has been cancelled.', 88 | ended: "More than 3 tries and you still didn't quite get it. The command has been cancelled", 89 | cancel: 'The command has been cancelled.', 90 | retries: 3, 91 | time: 30000, 92 | }, 93 | otherwise: '', 94 | }, 95 | }); 96 | 97 | public inhibitorHandler = new InhibitorHandler(this, { directory: join(__dirname, '..', 'inhibitors') }); 98 | 99 | public listenerHandler = new ListenerHandler(this, { directory: join(__dirname, '..', 'listeners') }); 100 | 101 | public config: ListenOptions; 102 | 103 | public constructor(config: ListenOptions) { 104 | // @ts-ignore 105 | super( 106 | { ownerID: config.owner }, 107 | { 108 | disableMentions: 'all', 109 | shards: 'auto', 110 | }, 111 | ); 112 | 113 | this.config = config; 114 | 115 | process.on('unhandledRejection', (err: any) => 116 | this.logger.error(`[UNHANDLED REJECTION] ${err.message}`, err.stack), 117 | ); 118 | } 119 | 120 | private async _init() { 121 | this.commandHandler.useInhibitorHandler(this.inhibitorHandler); 122 | this.commandHandler.useListenerHandler(this.listenerHandler); 123 | this.listenerHandler.setEmitters({ 124 | commandHandler: this.commandHandler, 125 | inhibitorHandler: this.inhibitorHandler, 126 | listenerHandler: this.listenerHandler, 127 | }); 128 | 129 | this.commandHandler.loadAll(); 130 | this.inhibitorHandler.loadAll(); 131 | this.listenerHandler.loadAll(); 132 | 133 | this.db = database.get('listen'); 134 | await this.db.connect(); 135 | this.settings = new TypeORMProvider(this.db.getRepository(Setting)); 136 | await this.settings.init(); 137 | } 138 | 139 | public async start() { 140 | await this._init(); 141 | return this.login(this.config.token); 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /src/bot/commands/listen/np.ts: -------------------------------------------------------------------------------- 1 | import { Command } from 'discord-akairo'; 2 | import { Message, MessageEmbed, Util } from 'discord.js'; 3 | 4 | export default class NowPlayingCommand extends Command { 5 | public constructor() { 6 | super('np', { 7 | aliases: ['np', 'now-playing'], 8 | description: { 9 | content: 'Display the currently playing song.', 10 | }, 11 | category: 'listen', 12 | clientPermissions: ['EMBED_LINKS'], 13 | ratelimit: 2, 14 | }); 15 | } 16 | 17 | public async exec(message: Message) { 18 | const { radioInfo } = this.client; 19 | const name = `**Name**: ${Util.escapeMarkdown(radioInfo.songName)}`; 20 | const artists = `${radioInfo.artistCount > 1 ? '**Artists**' : '**Artist**'}: ${Util.escapeMarkdown( 21 | radioInfo.artistList ?? '', 22 | )}`; 23 | const anime = radioInfo.sourceName ? `**Source**: ${Util.escapeMarkdown(radioInfo.sourceName)}` : ''; 24 | const album = radioInfo.albumName ? `**Album**: ${Util.escapeMarkdown(radioInfo.albumName)}` : ''; 25 | const requestedBy = radioInfo.event 26 | ? `🎉 **${Util.escapeMarkdown(radioInfo.eventName ?? '')}** 🎉` 27 | : radioInfo.requestedBy 28 | ? `Requested by: ${Util.escapeMarkdown(radioInfo.requestedBy)}` 29 | : ''; 30 | const ifAlbum = radioInfo.albumName ? '\n' : ''; 31 | const ifAnime = radioInfo.sourceName ? '\n' : ''; 32 | const ifRequest = requestedBy ? '\n\n' : ''; 33 | const song = `${name}\n${artists}${ifAlbum}${album}${ifAnime}${anime}${ifRequest}${requestedBy}`; 34 | const cover = radioInfo.event ? radioInfo.eventCover : radioInfo.albumCover; 35 | 36 | const embed = new MessageEmbed() 37 | .setColor(15473237) 38 | .addField('❯ Now playing', song) 39 | .setThumbnail(cover ?? ''); 40 | 41 | return message.util!.send(embed); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/bot/commands/listen/npk.ts: -------------------------------------------------------------------------------- 1 | import { Command } from 'discord-akairo'; 2 | import { Message, MessageEmbed, Util } from 'discord.js'; 3 | 4 | export default class NowPlayingKPOPCommand extends Command { 5 | public constructor() { 6 | super('npk', { 7 | aliases: ['npk', 'now-playing-kpop'], 8 | description: { 9 | content: 'Display the currently playing KPOP song.', 10 | }, 11 | category: 'listen', 12 | clientPermissions: ['EMBED_LINKS'], 13 | ratelimit: 2, 14 | }); 15 | } 16 | 17 | public async exec(message: Message) { 18 | const { radioInfoKpop } = this.client; 19 | const name = `**Name**: ${Util.escapeMarkdown(radioInfoKpop.songName)}`; 20 | const artists = `${radioInfoKpop.artistCount > 1 ? '**Artists**' : '**Artist**'}: ${Util.escapeMarkdown( 21 | radioInfoKpop.artistList ?? '', 22 | )}`; 23 | const anime = radioInfoKpop.sourceName ? `**Source**: ${Util.escapeMarkdown(radioInfoKpop.sourceName)}` : ''; 24 | const album = radioInfoKpop.albumName ? `**Album**: ${Util.escapeMarkdown(radioInfoKpop.albumName)}` : ''; 25 | const requestedBy = radioInfoKpop.event 26 | ? `🎉 **${Util.escapeMarkdown(radioInfoKpop.eventName ?? '')}** 🎉` 27 | : radioInfoKpop.requestedBy 28 | ? `Requested by: ${Util.escapeMarkdown(radioInfoKpop.requestedBy)}` 29 | : ''; 30 | const ifAlbum = radioInfoKpop.albumName ? '\n' : ''; 31 | const ifAnime = radioInfoKpop.sourceName ? '\n' : ''; 32 | const ifRequest = requestedBy ? '\n\n' : ''; 33 | const song = `${name}\n${artists}${ifAlbum}${album}${ifAnime}${anime}${ifRequest}${requestedBy}`; 34 | const cover = radioInfoKpop.event ? radioInfoKpop.eventCover : radioInfoKpop.albumCover; 35 | 36 | const embed = new MessageEmbed() 37 | .setColor(3189229) 38 | .addField('❯ Now playing', song) 39 | .setThumbnail(cover ?? ''); 40 | 41 | return message.util!.send(embed); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/bot/commands/util/help.ts: -------------------------------------------------------------------------------- 1 | import { Command } from 'discord-akairo'; 2 | import { Message, MessageEmbed } from 'discord.js'; 3 | import { stripIndents } from 'common-tags'; 4 | 5 | export default class HelpCommand extends Command { 6 | public constructor() { 7 | super('help', { 8 | aliases: ['help'], 9 | description: { 10 | content: 'Displays a list of available commands, or detailed information for a specified command.', 11 | usage: '[command]', 12 | }, 13 | category: 'util', 14 | clientPermissions: ['EMBED_LINKS'], 15 | ratelimit: 2, 16 | args: [ 17 | { 18 | id: 'command', 19 | type: 'commandAlias', 20 | }, 21 | ], 22 | }); 23 | } 24 | 25 | public async exec(message: Message, { command }: { command: Command }) { 26 | const prefix = (this.handler.prefix as string[])[0]; 27 | if (!command) { 28 | const embed = new MessageEmbed().setColor(3447003).addField( 29 | '❯ Commands', 30 | stripIndents`A list of available commands. 31 | For additional info on a command, type \`${prefix}help \` 32 | `, 33 | ); 34 | 35 | for (const category of this.handler.categories.values()) { 36 | embed.addField( 37 | `❯ ${category.id.replace(/(\b\w)/gi, (lc) => lc.toUpperCase())}`, 38 | `${category 39 | .filter((cmd) => cmd.aliases.length > 0) 40 | .map((cmd: Command) => `\`${cmd.aliases[0]}\``) 41 | .join(' ')}`, 42 | ); 43 | } 44 | 45 | return message.util!.send(embed); 46 | } 47 | 48 | const embed = new MessageEmbed() 49 | .setColor(3447003) 50 | .setTitle(`\`${command.aliases[0]} ${command.description.usage ? command.description.usage : ''}\``) 51 | .addField('❯ Description', command.description.content || '\u200b'); 52 | 53 | if (command.aliases.length > 1) embed.addField('❯ Aliases', `\`${command.aliases.join('` `')}\``, true); 54 | if (command.description.examples && command.description.examples.length) 55 | embed.addField( 56 | '❯ Examples', 57 | `\`${command.aliases[0]} ${command.description.examples.join(`\`\n\`${command.aliases[0]} `)}\``, 58 | true, 59 | ); 60 | 61 | return message.util!.send(embed); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/bot/commands/util/ping.ts: -------------------------------------------------------------------------------- 1 | import { Command } from 'discord-akairo'; 2 | import { Message } from 'discord.js'; 3 | import { stripIndents } from 'common-tags'; 4 | 5 | const RESPONSES: string[] = [ 6 | 'No.', 7 | 'Not happening.', 8 | 'Maybe later.', 9 | stripIndents`:ping_pong: Pong! \`$(ping)ms\` 10 | Heartbeat: \`$(heartbeat)ms\``, 11 | stripIndents`Firepower--full force!! \`$(ping)ms\` 12 | Doki doki: \`$(heartbeat)ms\``, 13 | stripIndents`A fierce battle makes me want to eat a bucket full of rice afterwards. \`$(ping)ms\` 14 | Heartbeat: \`$(heartbeat)ms\``, 15 | stripIndents`This, this is a little embarrassing... \`$(ping)ms\` 16 | Heartbeat: \`$(heartbeat)ms\``, 17 | ]; 18 | 19 | export default class PingCommand extends Command { 20 | public constructor() { 21 | super('ping', { 22 | aliases: ['ping'], 23 | description: { 24 | content: "Checks the bot's ping to the Discord servers.", 25 | }, 26 | category: 'util', 27 | ratelimit: 2, 28 | }); 29 | } 30 | 31 | public async exec(message: Message) { 32 | const msg = await message.util!.send('Pinging...'); 33 | 34 | return message.util!.send( 35 | RESPONSES[Math.floor(Math.random() * RESPONSES.length)] 36 | .replace( 37 | '$(ping)', 38 | ( 39 | (msg.editedTimestamp || msg.createdTimestamp) - (message.editedTimestamp || message.createdTimestamp) 40 | ).toString(), 41 | ) 42 | .replace('$(heartbeat)', Math.round(this.client.ws.ping).toString()), 43 | ); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/bot/commands/util/stats.ts: -------------------------------------------------------------------------------- 1 | import { Command } from 'discord-akairo'; 2 | import { Message, MessageEmbed } from 'discord.js'; 3 | import { stripIndents } from 'common-tags'; 4 | import * as moment from 'moment'; 5 | import 'moment-duration-format'; 6 | 7 | // eslint-disable-next-line 8 | const { version } = require('../../../../package.json'); 9 | 10 | export default class StatsCommand extends Command { 11 | public constructor() { 12 | super('stats', { 13 | aliases: ['stats'], 14 | description: { 15 | content: 'Displays statistics about the bot.', 16 | }, 17 | category: 'util', 18 | clientPermissions: ['EMBED_LINKS'], 19 | ratelimit: 2, 20 | }); 21 | } 22 | 23 | public async exec(message: Message) { 24 | const embed = new MessageEmbed() 25 | .setColor(3447003) 26 | .setDescription(`**${this.client.user!.username} Statistics**`) 27 | .addField('❯ Uptime', moment.duration(this.client.uptime!).format('d[d ]h[h ]m[m ]s[s]'), true) 28 | .addField('❯ Memory Usage', `${Math.round(process.memoryUsage().heapUsed / 1024 / 1024)}MB`, true) 29 | .addField( 30 | '❯ General Stats', 31 | stripIndents` 32 | • Guilds: ${this.client.guilds.cache.size} 33 | • Channels: ${this.client.channels.cache.size} 34 | `, 35 | true, 36 | ) 37 | .addField('❯ Version', `v${version}`, true) 38 | .addField('❯ Source Code', '[View Here](https://github.com/LISTEN-moe/discord-bot)', true) 39 | .addField( 40 | '❯ Library', 41 | '[discord.js](https://discord.js.org)[-akairo](https://github.com/1Computer1/discord-akairo)', 42 | true, 43 | ) 44 | .setThumbnail(this.client.user!.displayAvatarURL()) 45 | .setFooter(`© 2018-2020 ${this.client.users.cache.get(this.client.config.owner!)!.tag}`); 46 | 47 | return message.util!.send(embed); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/bot/inhibitors/blacklist.ts: -------------------------------------------------------------------------------- 1 | import { Inhibitor } from 'discord-akairo'; 2 | import { Message } from 'discord.js'; 3 | 4 | export default class BlacklistInhibitor extends Inhibitor { 5 | public constructor() { 6 | super('blacklist', { 7 | reason: 'blacklist', 8 | }); 9 | } 10 | 11 | public exec(message: Message) { 12 | const blacklist = this.client.settings.get('global', 'blacklist', []); 13 | return blacklist.includes(message.author.id); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/bot/listeners/client/debug.ts: -------------------------------------------------------------------------------- 1 | import { Listener } from 'discord-akairo'; 2 | 3 | export default class DebugListener extends Listener { 4 | public constructor() { 5 | super('debug', { 6 | emitter: 'client', 7 | event: 'debug', 8 | category: 'client', 9 | }); 10 | } 11 | 12 | public exec(event: any) { 13 | this.client.logger.debug(`[DEBUG] ${event}`); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/bot/listeners/client/ready.ts: -------------------------------------------------------------------------------- 1 | import { Listener } from 'discord-akairo'; 2 | 3 | export default class ReadyListener extends Listener { 4 | public constructor() { 5 | super('ready', { 6 | emitter: 'client', 7 | event: 'ready', 8 | category: 'client', 9 | }); 10 | } 11 | 12 | public exec() { 13 | this.client.logger.info(`[READY] ${this.client.user!.tag} (${this.client.user!.id})`); 14 | this.client.webSocketManager.connect(); 15 | this.client.webSocketManagerKpop.connect(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/bot/listeners/client/shardDisconnected.ts: -------------------------------------------------------------------------------- 1 | import { Listener } from 'discord-akairo'; 2 | 3 | export default class ShardDisconnectedListener extends Listener { 4 | public constructor() { 5 | super('shardDisconnected', { 6 | emitter: 'client', 7 | event: 'shardDisconnected', 8 | category: 'client', 9 | }); 10 | } 11 | 12 | public exec(event: any, id: number) { 13 | this.client.logger.warn(`[SHARD ${id} DISCONNECTED] (${event.code})`, event); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/bot/listeners/client/shardReady.ts: -------------------------------------------------------------------------------- 1 | import { Listener } from 'discord-akairo'; 2 | 3 | export default class ShardReadyListener extends Listener { 4 | public constructor() { 5 | super('shardReady', { 6 | emitter: 'client', 7 | event: 'shardReady', 8 | category: 'client', 9 | }); 10 | } 11 | 12 | public exec(id: number) { 13 | this.client.logger.info(`[SHARD ${id} READY]`); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/bot/listeners/client/shardReconnecting.ts: -------------------------------------------------------------------------------- 1 | import { Listener } from 'discord-akairo'; 2 | 3 | export default class ShardReconnectListener extends Listener { 4 | public constructor() { 5 | super('shardReconnecting', { 6 | emitter: 'client', 7 | event: 'shardReconnecting', 8 | category: 'client', 9 | }); 10 | } 11 | 12 | public exec(id: number) { 13 | this.client.logger.info(`[SHARD ${id} RECONNECTING]`); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/bot/listeners/client/shardResumed.ts: -------------------------------------------------------------------------------- 1 | import { Listener } from 'discord-akairo'; 2 | 3 | export default class ShardResumeListener extends Listener { 4 | public constructor() { 5 | super('shardResumed', { 6 | emitter: 'client', 7 | event: 'shardResumed', 8 | category: 'client', 9 | }); 10 | } 11 | 12 | public exec(id: number) { 13 | this.client.logger.info(`[SHARD ${id} RESUMED]`); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/bot/listeners/commandHandler/error.ts: -------------------------------------------------------------------------------- 1 | import { Listener } from 'discord-akairo'; 2 | 3 | export default class CommandErrorListener extends Listener { 4 | public constructor() { 5 | super('error', { 6 | emitter: 'commandHandler', 7 | event: 'error', 8 | category: 'commandHandler', 9 | }); 10 | } 11 | 12 | public exec(error: Error) { 13 | this.client.logger.error(`[COMMAND ERROR] ${error.message}`, error.stack); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/bot/models/Settings.ts: -------------------------------------------------------------------------------- 1 | import { Entity, Column, PrimaryColumn } from 'typeorm'; 2 | 3 | @Entity('settings') 4 | export class Setting { 5 | @PrimaryColumn({ type: 'bigint' }) 6 | public guild!: string; 7 | 8 | @Column({ type: 'jsonb', default: () => "'{}'" }) 9 | public settings: any; 10 | } 11 | -------------------------------------------------------------------------------- /src/bot/structures/Database.ts: -------------------------------------------------------------------------------- 1 | import { ConnectionManager } from 'typeorm'; 2 | import { Setting } from '../models/Settings'; 3 | 4 | const connectionManager = new ConnectionManager(); 5 | connectionManager.create({ 6 | name: 'listen', 7 | type: 'postgres', 8 | url: process.env.DB, 9 | entities: [Setting], 10 | }); 11 | 12 | export default connectionManager; 13 | -------------------------------------------------------------------------------- /src/bot/structures/SettingsProvider.ts: -------------------------------------------------------------------------------- 1 | import { Provider } from 'discord-akairo'; 2 | import { Guild } from 'discord.js'; 3 | import { Repository } from 'typeorm'; 4 | import { Setting } from '../models/Settings'; 5 | 6 | export default class TypeORMProvider extends Provider { 7 | public repo: Repository; 8 | 9 | public constructor(repository: Repository) { 10 | super(); 11 | 12 | this.repo = repository; 13 | } 14 | 15 | public async init() { 16 | const settings = await this.repo.find(); 17 | for (const setting of settings) { 18 | this.items.set(setting.guild, setting.settings); 19 | } 20 | } 21 | 22 | public get(guild: string | Guild, key: string, defaultValue: any) { 23 | const id = (this.constructor as typeof TypeORMProvider).getGuildId(guild); 24 | if (this.items.has(id)) { 25 | const value = this.items.get(id)[key]; 26 | // eslint-disable-next-line 27 | return value == null ? defaultValue : value; 28 | } 29 | 30 | return defaultValue; 31 | } 32 | 33 | public async set(guild: string | Guild, key: string, value: any) { 34 | const id = (this.constructor as typeof TypeORMProvider).getGuildId(guild); 35 | const data = this.items.get(id) || {}; 36 | data[key] = value; 37 | this.items.set(id, data); 38 | 39 | return this.repo 40 | .createQueryBuilder() 41 | .insert() 42 | .into(Setting) 43 | .values({ guild: id, settings: data }) 44 | .onConflict('("guild") DO UPDATE SET "settings" = :settings') 45 | .setParameter('settings', data) 46 | .execute(); 47 | } 48 | 49 | public async delete(guild: string | Guild, key: string) { 50 | const id = (this.constructor as typeof TypeORMProvider).getGuildId(guild); 51 | const data = this.items.get(id) || {}; 52 | delete data[key]; // tslint:disable-line 53 | 54 | return this.repo 55 | .createQueryBuilder() 56 | .insert() 57 | .into(Setting) 58 | .values({ guild: id, settings: data }) 59 | .onConflict('("guild") DO UPDATE SET "settings" =:settings') 60 | .setParameter('settings', null) 61 | .execute(); 62 | } 63 | 64 | public async clear(guild: string | Guild) { 65 | const id = (this.constructor as typeof TypeORMProvider).getGuildId(guild); 66 | this.items.delete(id); 67 | 68 | return this.repo.delete(id); 69 | } 70 | 71 | private static getGuildId(guild: string | Guild) { 72 | if (guild instanceof Guild) return guild.id; 73 | if (guild === 'global' || guild === null) return '0'; 74 | if (typeof guild === 'string' && /^\d+$/.test(guild)) return guild; 75 | throw new TypeError('Invalid guild specified. Must be a Guild instance, guild ID, "global", or null.'); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/bot/structures/WebSocketManager.ts: -------------------------------------------------------------------------------- 1 | import * as WebSocket from 'ws'; 2 | import ListenClient from '../client/ListenClient'; 3 | 4 | export default class WebSocketManager { 5 | private ws: WebSocket | null = null; 6 | 7 | private sendHeartbeat: NodeJS.Timer | null = null; 8 | 9 | // eslint-disable-next-line 10 | public constructor(public readonly client: ListenClient, public readonly url: string, public readonly type: string) {} 11 | 12 | public connect() { 13 | if (this.ws) this.ws.removeAllListeners(); 14 | try { 15 | this.ws = new WebSocket(this.url); 16 | } catch (error) { 17 | this.client.setTimeout(this.connect.bind(this), 5000); 18 | } 19 | 20 | this.ws!.on('open', this.onOpen.bind(this)); 21 | this.ws!.on('message', this.onMessage.bind(this)); 22 | this.ws!.on('close', this.onClose.bind(this)); 23 | this.ws!.on('error', (err: any) => this.client.logger.error(err)); 24 | } 25 | 26 | public disconnect() { 27 | if (!this.ws) return; 28 | return this.ws.close(1000); 29 | } 30 | 31 | private heartbeat(ms: number) { 32 | this.sendHeartbeat = this.client.setInterval(() => { 33 | this.ws!.send(JSON.stringify({ op: 9 })); 34 | }, ms); 35 | } 36 | 37 | private onOpen() { 38 | this.client.clearInterval(this.sendHeartbeat!); 39 | this.ws!.send(JSON.stringify({ op: 0, d: { auth: '' } })); 40 | } 41 | 42 | private onMessage(data: any) { 43 | if (!data.length) return; 44 | let response; 45 | try { 46 | response = JSON.parse(data); 47 | } catch (error) { 48 | this.client.logger.error(error); 49 | return; 50 | } 51 | 52 | if (response.op === 0) return this.heartbeat(response.d.heartbeat); 53 | if (response.op === 1) { 54 | if (response.t !== 'TRACK_UPDATE' && response.t !== 'TRACK_UPDATE_REQUEST') return; 55 | 56 | let artist = null; 57 | if (response.d.song.artists.length) { 58 | artist = response.d.song.artists 59 | .map((elem: { name: string; nameRomaji: string }) => elem.nameRomaji || elem.name) 60 | .join(', '); 61 | } 62 | 63 | let artists = null; 64 | if (response.d.song.artists.length) { 65 | artists = response.d.song.artists 66 | .map((elem: { id: number; name: string; nameRomaji: string }) => { 67 | if (elem.nameRomaji) { 68 | return `[${elem.nameRomaji}](https://listen.moe/artists/${elem.id})`; 69 | } 70 | return `[${elem.name}](https://listen.moe/artists/${elem.id})`; 71 | }) 72 | .join(', '); 73 | } 74 | 75 | let requester = ''; 76 | if (response.d.requester) { 77 | requester = `[${response.d.requester.displayName}](https://listen.moe/u/${response.d.requester.username})`; 78 | } 79 | 80 | let source = ''; 81 | if (response.d.song.sources.length) { 82 | source = response.d.song.sources[0].nameRomaji || response.d.song.sources[0].name; 83 | } 84 | 85 | let album = ''; 86 | if (response.d.song.albums && response.d.song.albums.length > 0) { 87 | album = `[${response.d.song.albums[0].name}](https://listen.moe/albums/${response.d.song.albums[0].id})`; 88 | } 89 | 90 | let cover = 'https://listen.moe/public/images/icons/android-chrome-192x192.png'; 91 | if (response.d.song.albums && response.d.song.albums.length > 0 && response.d.song.albums[0].image) { 92 | cover = `https://cdn.listen.moe/covers/${response.d.song.albums[0].image}`; 93 | } 94 | 95 | let event = false; 96 | let eventName = null; 97 | let eventCover = null; 98 | if (response.d.event) { 99 | event = true; 100 | eventName = response.d.event.name; 101 | eventCover = response.d.event.image; 102 | } 103 | 104 | if (this.type === 'kpop') { 105 | this.client.radioInfoKpop = { 106 | songName: response.d.song.title, 107 | artistName: artist, 108 | artistList: artists, 109 | artistCount: response.d.song.artists.length, 110 | sourceName: source, 111 | albumName: album, 112 | albumCover: cover, 113 | listeners: response.d.listeners, 114 | requestedBy: requester, 115 | event, 116 | eventName, 117 | eventCover, 118 | }; 119 | } else { 120 | this.client.radioInfo = { 121 | songName: response.d.song.title, 122 | artistName: artist, 123 | artistList: artists, 124 | artistCount: response.d.song.artists.length, 125 | sourceName: source, 126 | albumName: album, 127 | albumCover: cover, 128 | listeners: response.d.listeners, 129 | requestedBy: requester, 130 | event, 131 | eventName, 132 | eventCover, 133 | }; 134 | } 135 | 136 | this.currentSongGame(); 137 | } 138 | } 139 | 140 | private onClose(code: number) { 141 | if (code === 1000) return; 142 | this.client.clearInterval(this.sendHeartbeat!); 143 | this.client.setTimeout(this.connect.bind(this), 5000); 144 | } 145 | 146 | private currentSongGame() { 147 | if (this.type === 'kpop') return; 148 | let game = 'Loading data...'; 149 | if (Object.keys(this.client.radioInfo).length) { 150 | game = `${this.client.radioInfo.artistName} - ${this.client.radioInfo.songName}`; 151 | } 152 | this.client.user!.setActivity(game); 153 | } 154 | } 155 | -------------------------------------------------------------------------------- /src/listen.ts: -------------------------------------------------------------------------------- 1 | import 'reflect-metadata'; 2 | import ListenClient from './bot/client/ListenClient'; 3 | 4 | const client = new ListenClient({ owner: process.env.OWNERS, token: process.env.TOKEN }); 5 | 6 | client 7 | .on('error', (err) => client.logger.error(`[CLIENT ERROR] ${err.message}`, err.stack)) 8 | .on('shardError', (err, id) => client.logger.error(`[SHARD ${id} ERROR] ${err.message}`, err.stack)) 9 | .on('warn', (warn) => client.logger.warn(`[CLIENT WARN] ${warn}`)); 10 | 11 | client.start(); 12 | -------------------------------------------------------------------------------- /src/util/logger.ts: -------------------------------------------------------------------------------- 1 | import { createLogger, transports, format } from 'winston'; 2 | import * as DailyRotateFile from 'winston-daily-rotate-file'; 3 | 4 | export const logger = createLogger({ 5 | format: format.combine( 6 | format.errors({ stack: true }), 7 | format.label({ label: 'BOT' }), 8 | format.timestamp({ format: 'YYYY/MM/DD HH:mm:ss' }), 9 | format.printf((info: any): string => { 10 | const { timestamp, label, level, message, ...rest } = info; 11 | return `[${timestamp}][${label}][${level.toUpperCase()}]: ${message}${ 12 | Object.keys(rest).length ? `\n${JSON.stringify(rest, null, 2)}` : '' 13 | }`; 14 | }), 15 | ), 16 | transports: [ 17 | new transports.Console({ 18 | format: format.colorize({ level: true }), 19 | level: 'info', 20 | }), 21 | new DailyRotateFile({ 22 | format: format.combine(format.timestamp(), format.json()), 23 | level: 'debug', 24 | filename: 'listen-%DATE%.log', 25 | maxFiles: '14d', 26 | }), 27 | ], 28 | }); 29 | -------------------------------------------------------------------------------- /src/util/paginate.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2017 - 2018 Schuyler Cebulskie 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | export default function paginate(items: any[], page = 1, pageLength = 10) { 18 | const maxPage = Math.ceil(items.length / pageLength); 19 | if (page < 1) page = 1; 20 | if (page > maxPage) page = maxPage; 21 | const startIndex = (page - 1) * pageLength; 22 | 23 | return { 24 | items: items.length > pageLength ? items.slice(startIndex, startIndex + pageLength) : items, 25 | page, 26 | maxPage, 27 | pageLength, 28 | }; 29 | } 30 | -------------------------------------------------------------------------------- /src/util/timeStrings.ts: -------------------------------------------------------------------------------- 1 | export default function timeString(seconds: number, forceHours = false, ms = true) { 2 | if (ms) seconds /= 1000; 3 | const hours = Math.floor(seconds / 3600); 4 | const minutes = Math.floor((seconds % 3600) / 60); 5 | 6 | return `${forceHours || hours >= 1 ? `${hours}:` : ''}${ 7 | hours >= 1 ? `0${minutes}`.slice(-2) : minutes 8 | }:${`0${Math.floor(seconds % 60)}`.slice(-2)}`; 9 | } 10 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "module": "commonjs", 5 | "moduleResolution": "node", 6 | "declaration": false, 7 | "removeComments": false, 8 | "alwaysStrict": true, 9 | "pretty": true, 10 | "target": "es2019", 11 | "lib": [ 12 | "esnext", 13 | "esnext.array", 14 | "esnext.asynciterable", 15 | "esnext.intl", 16 | "esnext.symbol" 17 | ], 18 | "sourceMap": true, 19 | "inlineSources": true, 20 | "sourceRoot": "/", 21 | "outDir": "dist", 22 | "incremental": true, 23 | "experimentalDecorators": true, 24 | "emitDecoratorMetadata": true, 25 | "noEmitHelpers": true, 26 | "importHelpers": true 27 | } 28 | } 29 | --------------------------------------------------------------------------------