miao-plugin/models/ProfileReq.js

127 lines
3.3 KiB
JavaScript
Raw Normal View History

2022-08-18 10:13:42 +00:00
import Base from './Base.js'
import fetch from 'node-fetch'
export default class ProfileReq extends Base {
2023-02-09 16:57:25 +00:00
constructor (e) {
2022-08-18 10:13:42 +00:00
super()
this.e = e
2023-02-09 16:57:25 +00:00
this.uid = e.uid
}
static create (e) {
if (!e || !e.uid) {
return false
}
if (e.uid * 1 < 100000005) {
return false
}
2023-02-09 16:57:25 +00:00
return new ProfileReq(e)
2022-08-18 10:13:42 +00:00
}
async setCd (seconds = 60) {
let ext = new Date() * 1 + seconds * 1000
2022-08-18 21:04:31 +00:00
await redis.set(`miao:profile-cd:${this.uid}`, ext + '', { EX: seconds })
2022-08-18 10:13:42 +00:00
}
async inCd () {
2022-08-18 21:04:31 +00:00
let ext = await redis.get(`miao:profile-cd:${this.uid}`)
2022-08-18 10:13:42 +00:00
if (!ext || isNaN(ext)) {
return false
}
let cd = (new Date() * 1) - ext
if (cd < 0 && Math.abs(cd) < 100 * 60 * 1000) {
2022-08-18 10:13:42 +00:00
return Math.ceil(0 - cd / 1000)
}
return false
}
err (msg = '', cd = 0) {
2023-02-12 15:39:46 +00:00
let serv = this.serv
let extra = serv.name ? `当前面板服务${serv.name}` : ''
2022-08-18 10:13:42 +00:00
const msgs = {
error: `UID${this.uid}更新面板失败,${extra}\n可能是面板服务维护中,请稍后重试...`,
2022-08-18 10:13:42 +00:00
empty: '请将角色放置在【游戏内】角色展柜并打开【显示详情】等待5分钟重新获取面板'
}
msg = msgs[msg] || msg
this.msg(msg)
2022-08-18 10:13:42 +00:00
// 设置CD
if (cd) {
this.setCd(cd)
}
return false
}
msg (msg) {
let e = this.e
if (msg && !e._isReplyed) {
e.reply(msg)
e._isReplyed = true
}
2022-08-18 10:13:42 +00:00
}
2023-02-21 19:49:49 +00:00
log (msg) {
logger.mark(`【面板】${this.uid} ${msg}`)
2023-02-21 19:49:49 +00:00
}
2023-02-09 16:57:25 +00:00
async requestProfile (player, serv) {
2023-02-21 19:49:49 +00:00
let self = this
2023-02-12 15:39:46 +00:00
this.serv = serv
2023-02-19 17:08:05 +00:00
let uid = this.uid
let reqParam = await serv.getReqParam(uid)
2022-08-18 10:13:42 +00:00
let cdTime = await this.inCd()
2023-02-12 15:39:46 +00:00
if (cdTime && !process.argv.includes('web-debug')) {
return this.err(`请求过快,请${cdTime}秒后重试..`)
2022-08-18 10:13:42 +00:00
}
await this.setCd(20)
2023-02-19 17:08:05 +00:00
// 若3秒后还未响应则返回提示
setTimeout(() => {
if (self._isReq) {
this.msg(`开始获取uid:${uid}的数据,可能会需要一定时间~`)
}
}, 2000)
2022-08-18 10:13:42 +00:00
// 发起请求
2023-02-21 19:49:49 +00:00
this.log(`${logger.yellow('开始请求数据')},面板服务:${serv.name}...`)
const startTime = new Date() * 1
2022-08-22 20:53:31 +00:00
let data = {}
try {
let params = reqParam.params || {}
params.timeout = params.timeout || 1000 * 20
2023-02-19 17:08:05 +00:00
self._isReq = true
let req = await fetch(reqParam.url, params)
data = await req.text()
2023-02-19 17:08:05 +00:00
self._isReq = false
2023-02-21 19:49:49 +00:00
const reqTime = new Date() * 1 - startTime
this.log(`${logger.green(`请求结束,请求用时${reqTime}ms`)},面板服务:${serv.name}...`)
if (data[0] === '<') {
let titleRet = /<title>(.+)<\/title>/.exec(data)
if (titleRet && titleRet[1]) {
data = { error: titleRet[1] }
} else {
return this.err('error', 60)
}
} else {
data = JSON.parse(data)
}
2022-08-22 20:53:31 +00:00
} catch (e) {
console.log('面板请求错误', e)
2023-02-19 17:08:05 +00:00
self._isReq = false
2022-08-22 20:53:31 +00:00
data = {}
}
2023-02-09 16:57:25 +00:00
data = await serv.response(data, this)
2022-08-18 10:13:42 +00:00
// 设置CD
2023-02-09 16:57:25 +00:00
cdTime = serv.getCdTime(data)
2022-08-18 10:13:42 +00:00
if (cdTime) {
await this.setCd(cdTime)
}
if (data === false) {
return false
}
2023-02-09 16:57:25 +00:00
serv.updatePlayer(player, data)
cdTime = serv.getCdTime(data)
if (cdTime) {
await this.setCd(cdTime)
}
2023-02-08 20:55:54 +00:00
return player
2022-08-18 10:13:42 +00:00
}
}