添加TGBot前端玩家注册
continuous-integration/drone/push Build is failing Details

This commit is contained in:
Qumolama.d 2022-05-15 00:29:52 +08:00
parent 5f5918e830
commit 4d448d876e
Signed by: Lama3L9R
GPG Key ID: 1762AFC05157CE18
11 changed files with 408 additions and 6 deletions

View File

@ -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
- [ ] 单元测试

View File

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

View File

@ -39,6 +39,9 @@ export const config = {
preHooks: (fastify) => {}, // 在这里添加自定义hook
preRouting: (fastify) => {}, // 在这里添加自定义路由
postRouting: (fastify) => {}, // 我也不知道你在这里写了有啥用...
},
telegram: {
token: '5161996862:AAHY79HdmI9A9Xoumv4E8hzi5UUrY38n5h0',
}
}

View File

@ -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()
}

View File

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

9
src/models/invite.js Normal file
View File

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

View File

@ -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 = {

View File

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

View File

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

2
test.js Normal file
View File

@ -0,0 +1,2 @@
import axios from "axios"

152
yarn.lock
View File

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