miao-plugin/models/ProfileReq.js
Kokomi efc9952cdc 适配Enka 3.4角色信息获取
增加迪希雅、米卡的角色信息,可通过`#迪希雅天赋`、`#迪希雅图鉴`等查看
2023-01-19 05:44:14 +08:00

117 lines
2.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import lodash from 'lodash'
import Base from './Base.js'
import ProfileServ from './ProfileServ.js'
import fetch from 'node-fetch'
function sleep (ms) {
return new Promise((resolve) => setTimeout(resolve, ms))
}
export default class ProfileReq extends Base {
constructor ({ e, uid }) {
super()
this.e = e
this.uid = uid
}
async setCd (seconds = 60) {
let ext = new Date() * 1 + seconds * 1000
await redis.set(`miao:profile-cd:${this.uid}`, ext + '', { EX: seconds })
}
async inCd () {
let ext = await redis.get(`miao:profile-cd:${this.uid}`)
if (!ext || isNaN(ext)) {
return false
}
let cd = (new Date() * 1) - ext
if (cd < 0 && Math.abs(cd) < 100 * 60 * 1000) {
return Math.ceil(0 - cd / 1000)
}
return false
}
err (msg = '', cd = 0) {
const msgs = {
error: '请求失败,可能是面板服务升级维护或遇到故障,请稍后重试...',
empty: '请将角色放置在【游戏内】角色展柜并打开【显示详情】等待5分钟重新获取面板'
}
msg = msgs[msg] || msg
if (msg) {
this.e.reply(msg)
}
// 设置CD
if (cd) {
this.setCd(cd)
}
return false
}
msg (msg) {
this.e.reply(msg)
}
async request () {
let Serv = ProfileReq.getServ(this.uid)
let reqParam = await Serv.getReqParam(this.uid)
let cdTime = await this.inCd()
if (cdTime) {
return this.err(`请求过快,请${cdTime}秒后重试..`)
}
await this.setCd(20)
this.msg(`开始获取uid:${this.uid}的数据,可能会需要一定时间~`)
await sleep(100)
// 发起请求
let data = {}
try {
let params = reqParam.params || {}
params.timeout = params.timeout || 1000 * 20
let req = await fetch(reqParam.url, params)
data = await req.text()
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)
}
} catch (e) {
console.log('面板请求错误', e)
data = {}
}
data = await Serv.response(data, this)
// 设置CD
cdTime = Serv.getCdTime(data)
if (cdTime) {
await this.setCd(cdTime)
}
if (data === false) {
return false
}
let userData = Serv.getUserData(data)
let profiles = Serv.getProfileData(data)
cdTime = Serv.getCdTime(data)
if (cdTime) {
await this.setCd(cdTime)
}
return lodash.extend({
uid: this.uid,
chars: profiles
}, userData)
}
}
ProfileReq.serv = {}
ProfileReq.regServ = function (serv) {
for (let key in serv) {
ProfileReq.serv[key] = serv[key]
}
}
ProfileReq.getServ = function (uid) {
return ProfileServ.getServ({ uid, serv: ProfileReq.serv })
}