From 4d448d876e4e0354483abc9bd02ff55f998b451b Mon Sep 17 00:00:00 2001 From: "Qumolama.d" Date: Sun, 15 May 2022 00:29:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0TGBot=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E7=8E=A9=E5=AE=B6=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.MD | 7 +- package.json | 4 +- src/config.js | 3 + src/index.js | 19 ++- src/models/index.js | 2 + src/models/invite.js | 9 ++ src/models/player.js | 4 + src/routes/authenticate.js | 8 ++ src/telegram/player-commands.js | 204 ++++++++++++++++++++++++++++++++ test.js | 2 + yarn.lock | 152 +++++++++++++++++++++++- 11 files changed, 408 insertions(+), 6 deletions(-) create mode 100644 src/models/invite.js create mode 100644 src/telegram/player-commands.js create mode 100644 test.js diff --git a/README.MD b/README.MD index 1723e4f..2d243d9 100644 --- a/README.MD +++ b/README.MD @@ -20,11 +20,11 @@ ## 开发计划: #### Beta 1.0: -- [ ] 基础世界树 API +- [x] 基础世界树 API + [x] /authserver + [x] /sessionserver + [x] 测试 - + [ ] /api + + [x] /api - [ ] 进阶 API - [ ] 皮肤上传和安全检查 + [x] 皮肤数据的RSA签名 @@ -34,6 +34,9 @@ - [x] 服务器状态接口 - [x] authlib-injector 元数据接口 - [ ] TGbot前端 + + [x] 注册 + + [ ] 用户查询、改密等 + + [ ] 管理员指令 #### Release 1.0 - [ ] 单元测试 diff --git a/package.json b/package.json index e6ba207..41e5749 100644 --- a/package.json +++ b/package.json @@ -13,11 +13,13 @@ "shelljs.exec": "^1.1.8" }, "dependencies": { + "axios": "^0.27.2", "fastify": "^3.29.0", "hex-to-uuid": "^1.1.1", "mongoose": "^6.3.1", "pino-pretty": "^7.6.1", - "pngjs": "^6.0.0" + "pngjs": "^6.0.0", + "telegraf": "^4.8.2" }, "scripts": { "dev": "nodemon --watch src/index.js", diff --git a/src/config.js b/src/config.js index 646d060..8b4d810 100644 --- a/src/config.js +++ b/src/config.js @@ -39,6 +39,9 @@ export const config = { preHooks: (fastify) => {}, // 在这里添加自定义hook preRouting: (fastify) => {}, // 在这里添加自定义路由 postRouting: (fastify) => {}, // 我也不知道你在这里写了有啥用... + }, + telegram: { + token: '5161996862:AAHY79HdmI9A9Xoumv4E8hzi5UUrY38n5h0', } } diff --git a/src/index.js b/src/index.js index 8d3a6de..b087478 100644 --- a/src/index.js +++ b/src/index.js @@ -8,6 +8,8 @@ import * as AdvancedRoutings from './routes/advanced.js' import * as APIRoutings from './routes/api.js' import { config } from './config.js' import { readFileSync } from 'fs' +import { Scenes, session, Telegraf } from 'telegraf' +import { allScenes, registerAllPlayerCommands } from './telegram/player-commands.js'; export const server = fastify({ logger: { @@ -16,6 +18,8 @@ export const server = fastify({ } }) +export const telegraf = new Telegraf(config.telegram.token) + export const setup = async () => { const mongooseClient = await mongoose.connect(config.database.url) const models = registerModels(mongooseClient) @@ -61,15 +65,27 @@ export const setup = async () => { cape: 'assets.lama.icu/textures/cape/default.png' }, registerDate: Date.now(), - permissions: [{ node: 'login', allowed: true, duration: 0, eternal: true, startDate: Date.now(), highPriority: false }] + permissions: [{ node: 'login', allowed: true, duration: 0, eternal: true, startDate: Date.now(), highPriority: false }], + telegramBind: { + username: 'test', + verified: true, + } }).save() } + + const stage = new Scenes.Stage([ ...allScenes ]) + telegraf.use(session()) + telegraf.use(stage.middleware()) + + registerAllPlayerCommands() } const launch = async () => { process.on('SIGINT', () => { new Promise(shutdown) }) + + telegraf.launch() await server.listen(config.server.port, config.server.url) @@ -78,6 +94,7 @@ const launch = async () => { export const shutdown = async () => { server.close() + telegraf.stop() mongoose.disconnect() } diff --git a/src/models/index.js b/src/models/index.js index 99188c0..054a3bd 100644 --- a/src/models/index.js +++ b/src/models/index.js @@ -1,9 +1,11 @@ import { TokenSchema } from "./token.js"; import { PlayerSchema } from "./player.js"; +import { InviteTokenSchema } from "./invite.js"; export function registerModels(mongoose) { return { Token: mongoose.model("Token", TokenSchema), Player: mongoose.model("Player", PlayerSchema), + Invitation: mongoose.model('Invitation', InviteTokenSchema) } } \ No newline at end of file diff --git a/src/models/invite.js b/src/models/invite.js new file mode 100644 index 0000000..b0ec129 --- /dev/null +++ b/src/models/invite.js @@ -0,0 +1,9 @@ +import mongoose from 'mongoose' +const { Schema } = mongoose + +export const InviteTokenSchema = new Schema({ + by: String, // Telegram username + token: String +}) + +// { from: string, id: number, sign: string } \ No newline at end of file diff --git a/src/models/player.js b/src/models/player.js index e4cecaa..cfa605f 100644 --- a/src/models/player.js +++ b/src/models/player.js @@ -14,6 +14,10 @@ export const PlayerSchema = new Schema({ }, registerDate: Number, permissions: [{ node: String, allowed: Boolean, duration: Number, startDate: Number, highPriority: Boolean }], // ban -> true + telegramBind: { + username: String, + verified: Boolean, + } }) export const PlayerSeriliazationSchema = { diff --git a/src/routes/authenticate.js b/src/routes/authenticate.js index 35db7f1..9fe587a 100644 --- a/src/routes/authenticate.js +++ b/src/routes/authenticate.js @@ -78,6 +78,14 @@ export const authenticate = { }) } + if(!player.telegramBind || !player.telegramBind.verified) { + return await rep.code(401).send({ + error: "Unauthorized", + errorMessage: "未绑定 Telegram 账号或账号验证未通过,登录请求已禁止", + cause: "未绑定 Telegram 账号或账号验证未通,登录请求已禁止" + }) + } + if(!clientToken) { clientToken = createHash('sha256').update( "" + Math.random() * 1.048596).digest().toString('hex') } diff --git a/src/telegram/player-commands.js b/src/telegram/player-commands.js new file mode 100644 index 0000000..066b7d2 --- /dev/null +++ b/src/telegram/player-commands.js @@ -0,0 +1,204 @@ +import { Scenes } from 'telegraf' +import { telegraf, server } from '../index.js' +import { createHash } from 'crypto' +import axios from 'axios' +import { uuid } from '../generator.js' + +export const registerAllPlayerCommands = async () => { + await register() +} + + + +const defaultSkin = "http://textures.minecraft.net/texture/ddb8684e59f771666bde5f411fcb2e495c452f2ecabc31981bc132ac71bdd394" + +const registerWizard = new Scenes.WizardScene('REGISTRIATION_WIZARD', + (ctx) => { + ctx.reply('欢迎来到注册流程,如果想中途取消使用指令 "/cancle" ,请先告诉我您的用户名') + ctx.scene.session.data = { + username: ctx.from.username + } + return ctx.wizard.next() + }, + (ctx) => { + if(!ctx.message.text || ctx.message.text < 3) { + return ctx.reply('用户名不能少于 3 个字符!请重新输入') + } + + const username = ctx.from.username === 'Lapis_Apple' ? 'LSP' : ctx.message.text + ctx.reply(`请设置玩家 ${username} 的密码`) + ctx.scene.session.data.playerUsername = username + + return ctx.wizard.next() + }, + async (ctx) => { + if(!ctx.message.text || ctx.message.text < 6) { + return ctx.reply('密码不能少于 6 个字符!请重新输入') + } + + ctx.scene.session.data.password = createHash('sha256').update(ctx.message.text).digest('hex') + + const duplicated = await server.models.Player.findOne({ password: ctx.scene.session.data.password }) + if(duplicated) { + return ctx.reply(`该密码hash为:${ctx.scene.session.data.password.substring(3,10)} 已检测到数据库中存在重复密码(${JSON.stringify({d: duplicated})}),为了安全请重新输入`) + } + + ctx.reply(`该密码hash为:${ctx.scene.session.data.password.substring(3,10)} 请确认是否正确,若正确请输入 'confirm'`) + + return ctx.wizard.next() + }, + (ctx) => { + if(!ctx.message.text || ctx.message.text !== 'confirm') { + return ctx.reply('请输入 "confirm" 确认您的密码,或者输入 /cancle 取消注册') + } + + ctx.replyWithMarkdownV2("请输入您的邮箱。**注意:我们并不会向您发送注册确认,邮箱仅作为符合 authlib\\-injector 登陆规范在登陆时使用**") + return ctx.wizard.next() + }, + (ctx) => { + if(!ctx.message.text || ctx.message.text.length < 6) { + return ctx.reply('邮箱不能少于 6 个字符!请重新输入') + } + + ctx.scene.session.data.email = ctx.message.text + ctx.reply(`是否需要同步同用户名正版玩家的皮肤和披风? 输入 'yes' 或者 'no'`) + return ctx.wizard.next() + }, + (ctx) => { + if(!ctx.message.text || ctx.message.text !== 'yes' && ctx.message.text !== 'no') { + return ctx.reply('请输入 "yes" 或者 "no"') + } + + ctx.scene.session.data.sync = ctx.message.text === 'yes' + ctx.reply(`请问您是否有注册邀请码? 有请输入邀请码,没有输入 'skip'`) + return ctx.wizard.next() + }, + (ctx) => { + if(!ctx.message.text || ctx.message.text === 'skip') { + ctx.scene.session.data.inviteCode = null + } else { + if(!ctx.message.text || ctx.message.text.length < 6) { + return ctx.reply('邀请码不能少于 6 个字符!请重新输入') + } + ctx.scene.session.data.inviteCode = ctx.message.text + } + + ctx.reply( + `好的现在来确认一下信息:\n`+ + `用户名:${ctx.scene.session.data.playerUsername}\n`+ + `密码:${ctx.scene.session.data.password.substring(3,10)}\n`+ + `邮箱:${ctx.scene.session.data.email}\n`+ + `同步皮肤和披风:${ctx.scene.session.data.sync ? '是' : '否'}\n`+ + `邀请码:${ctx.scene.session.data.inviteCode ?? '无'}\n`+ + `是否确认? 输入 'yes' 或者 'no'` + ) + return ctx.wizard.next() + }, + async (ctx) => { + if(!ctx.message.text || ctx.message.text !== 'yes' && ctx.message.text !== 'no') { + return ctx.reply('请输入 "yes" 或者 "no"') + } + + if(ctx.message.text === 'no') { + ctx.reply("已取消注册") + return ctx.scene.leave() + } else { + let message = await ctx.reply("正在注册...") + + let skin = defaultSkin + let cape = "" + + if(ctx.scene.session.data.sync) { + try{ + message = await telegraf.telegram.editMessageText(ctx.chat.id, message.message_id, null, '获取对应正版玩家皮肤中...') + const uuid = await axios({ + method: 'GET', + url: "https://api.mojang.com/users/profiles/minecraft/" + ctx.scene.session.data.playerUsername, + }) + + if(uuid.status === 400) { + message = await telegraf.telegram.editMessageText(ctx.chat.id, message.message_id, null, '对应正版玩家不存在!已跳过皮肤获取') + } else { + const skinResponse = await axios({ + method: 'GET', + url: `https://sessionserver.mojang.com/session/minecraft/profile/${uuid.data.id}`, + responseType: 'json', + }) + + const skinData = JSON.parse(Buffer.from(skinResponse.data.properties[0].value, 'base64').toString()) + skin = skinData.textures.SKIN.url + cape = skinData.textures.CAPE?.url + + message = await telegraf.telegram.editMessageText(ctx.chat.id, message.message_id, null, '成功同步皮肤和披风') + } + } catch(err) { + server.log.info(err.toJSON()) + } + } + + let verified = false + if(ctx.scene.session.data.inviteCode) { + await telegraf.telegram.editMessageText(ctx.chat.id, message.message_id, null, message.text + '\n验证邀请码中...') + const invi = server.models.Invitation.findOne({ + token: ctx.scene.session.data.inviteCode + }) + if(invi) { + message = await telegraf.telegram.editMessageText(ctx.chat.id, message.message_id, null, message.text + '\n邀请码验证成功!邀请人: ' + invi.by) + verified = true + } else { + message = await telegraf.telegram.editMessageText(ctx.chat.id, message.message_id, null, message.text + '\n邀请码无效! 已跳过') + } + } + + const player = new server.models.Player({ + uuid: uuid("LSP-yggdrasil:" + ctx.scene.session.data.playerUsername), + username: ctx.scene.session.data.playerUsername, + password: ctx.scene.session.data.password, + email: ctx.scene.session.data.email, + textures: { + skin: skin, + cape: cape + }, + registerDate: Date.now(), + permissions: [{ node: 'login', allowed: true, duration: 0, eternal: true, startDate: Date.now(), highPriority: false }], + telegramBind: { + username: ctx.from.username, + verified: verified + } + }) + + player.save() + + message = await telegraf.telegram.editMessageText(ctx.chat.id, message.message_id, null, message.text + '\n注册成功!') + + ctx.scene.leave() + } + } +) + +export const allScenes = [ + registerWizard, +] + +const register = async () => { + registerWizard.command('cancel', (ctx) => { + ctx.reply("注册已取消") + return ctx.scene.leave() + }) + + telegraf.command('register', async (ctx) => { + const username = ctx.from.username + if(!username) { + return ctx.reply("请设置 Telegram 用户名!") + } + + const player = await server.models.Player.findOne({ "telegramBind.username": username }) + server.log.info(player) + if(!player) { + return ctx.scene.enter('REGISTRIATION_WIZARD') + } else { + return ctx.reply(`您已绑定用户: ${player.username} (${player.uuid})`) + } + + }) +} \ No newline at end of file diff --git a/test.js b/test.js new file mode 100644 index 0000000..725fdcb --- /dev/null +++ b/test.js @@ -0,0 +1,2 @@ +import axios from "axios" + diff --git a/yarn.lock b/yarn.lock index fbf92e0..921569d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -671,6 +671,13 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + abstract-logging@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/abstract-logging/-/abstract-logging-2.0.1.tgz#6b0c371df212db7129b57d2e7fcf282b8bf1c839" @@ -764,6 +771,11 @@ args@^5.0.1: leven "2.1.0" mri "1.1.4" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + atomic-sleep@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" @@ -779,6 +791,14 @@ avvio@^7.1.2: fastq "^1.6.1" queue-microtask "^1.1.2" +axios@^0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + babel-jest@^28.0.3: version "28.0.3" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.0.3.tgz#843dc170da5b9671d4054ada9fdcd28f85f92a6e" @@ -908,6 +928,24 @@ bson@^4.6.2: dependencies: buffer "^5.6.0" +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -1071,6 +1109,13 @@ colorette@^2.0.7: resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -1126,7 +1171,7 @@ dateformat@^4.6.3: resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== -debug@4.x, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1: +debug@4.x, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.3: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -1167,6 +1212,11 @@ defer-to-connect@^1.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + denque@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/denque/-/denque-2.0.1.tgz#bcef4c1b80dc32efe97515744f21a4229ab8934a" @@ -1384,6 +1434,11 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -1515,6 +1570,20 @@ flatstr@^1.0.12: resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931" integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw== +follow-redirects@^1.14.9: + version "1.15.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.0.tgz#06441868281c86d0dda4ad8bdaead2d02dca89d4" + integrity sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" @@ -2376,6 +2445,18 @@ micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -2393,11 +2474,16 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0: +minimist@^1.2.0, minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +module-alias@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.2.2.tgz#151cdcecc24e25739ff0aa6e51e1c5716974c0e0" + integrity sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q== + mongodb-connection-string-url@^2.5.2: version "2.5.2" resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz#f075c8d529e8d3916386018b8a396aed4f16e5ed" @@ -2463,6 +2549,13 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +node-fetch@^2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -2551,6 +2644,11 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-timeout@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-4.1.0.tgz#788253c0452ab0ffecf18a62dff94ff1bd09ca0a" + integrity sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw== + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -2859,6 +2957,13 @@ safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-compare@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/safe-compare/-/safe-compare-1.1.4.tgz#5e0128538a82820e2e9250cd78e45da6786ba593" + integrity sha512-b9wZ986HHCo/HbKrRpBJb2kqXMK9CEWIE1egeEvZsYn69ay3kdfl9nG3RyOcR+jInTDf7a86WQ1d4VJX7goSSQ== + dependencies: + buffer-alloc "^1.2.0" + safe-regex2@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/safe-regex2/-/safe-regex2-2.0.0.tgz#b287524c397c7a2994470367e0185e1916b1f5b9" @@ -2866,6 +2971,11 @@ safe-regex2@^2.0.0: dependencies: ret "~0.2.0" +sandwich-stream@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/sandwich-stream/-/sandwich-stream-2.0.2.tgz#6d1feb6cf7e9fe9fadb41513459a72c2e84000fa" + integrity sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ== + saslprep@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" @@ -3109,6 +3219,21 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +telegraf@^4.8.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/telegraf/-/telegraf-4.8.2.tgz#6357102712be3d2472b6d5afc099be86e677ccb4" + integrity sha512-FFxdhFVnoAzxK6x6980rDPqadLI6AWjKhYe/dwkzd29+hmzVPzOQBKRujjkv4iVIfIJGt2QbuNtJUBukdDwBLg== + dependencies: + abort-controller "^3.0.0" + debug "^4.3.3" + minimist "^1.2.6" + module-alias "^2.2.2" + node-fetch "^2.6.7" + p-timeout "^4.1.0" + safe-compare "^1.1.4" + sandwich-stream "^2.0.2" + typegram "^3.9.0" + terminal-link@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" @@ -3172,6 +3297,11 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -3194,6 +3324,11 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +typegram@^3.9.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/typegram/-/typegram-3.9.1.tgz#b4ebfc83579ab01e8e95391e8f10e84abe265cdd" + integrity sha512-vfFr2o0iX+amnUj1h/0c49y8bCvGwt6DgdmTVD732Kf81XG26vgFwNWj+33Ol+xORC7m0cqU2hPYGRtcGinwZg== + undefsafe@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" @@ -3271,6 +3406,11 @@ walker@^1.0.7: dependencies: makeerror "1.0.12" +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + webidl-conversions@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" @@ -3284,6 +3424,14 @@ whatwg-url@^11.0.0: tr46 "^3.0.0" webidl-conversions "^7.0.0" +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"