178 lines
5.6 KiB
TypeScript
178 lines
5.6 KiB
TypeScript
import { plugin } from 'yunzai/core'
|
||
import { PayData, renderImg } from '../model/payLogData.js'
|
||
import {NoteUser} from 'yunzai/mys'
|
||
import fs from 'fs'
|
||
import path from 'path'
|
||
import yaml from 'yaml'
|
||
export class payLog extends plugin {
|
||
dirPath = path.resolve('./data/payLog/')
|
||
authKey = ''
|
||
constructor () {
|
||
/**
|
||
name: '充值记录',
|
||
dsc: '充值记录,消费记录,充值统计,消费统计',
|
||
*/
|
||
super({
|
||
priority: 299,
|
||
rule: [
|
||
{
|
||
reg: '^#?(充值|消费)(记录|统计)$',
|
||
fnc: 'payLog'
|
||
},
|
||
{
|
||
reg: '^#?更新(充值|消费)(记录|统计)$',
|
||
fnc: 'updatePayLog'
|
||
},
|
||
{
|
||
// 优先级高于抽卡记录,但是发送抽卡链接时不会抢指令,对比过米游社链接和抽卡链接,该字段为米游社链接字段
|
||
reg: '(.*)(user-game-search|bill-record-user|customer-claim|player-log|user.mihoyo.com)(.*)',
|
||
fnc: 'getAuthKey'
|
||
},
|
||
{
|
||
reg: '^#?(充值|消费)(记录|统计)帮助$',
|
||
fnc: 'payLogHelp'
|
||
}
|
||
]
|
||
})
|
||
}
|
||
|
||
async payLog (e) {
|
||
// 判断是否存有已经生成的数据
|
||
if (!fs.readdirSync(this.dirPath, 'utf-8').includes(e.user_id + '.yaml')) {
|
||
// 如果没有则判断是否已经缓存了authkey,这个主要针对使用抽卡链接的,和苹果用户
|
||
await this.updatePayLog()
|
||
return true
|
||
}
|
||
|
||
// 如果有就判断用户的主分支uid是什么
|
||
const mainUid = await this.isMain(e.user_id)
|
||
|
||
// 再读取现有数据
|
||
// const _path = path.resolve(`./data/payLog/${e.user_id}.yaml`)
|
||
let data = fs.readFileSync(this.dirPath + `/${e.user_id}.yaml`, 'utf-8')
|
||
data = yaml.parse(data)
|
||
|
||
// 如果用户没有绑定ck,就直接发送保存的数据
|
||
if (!mainUid) {
|
||
let key = Object.keys(data)
|
||
let img = await renderImg(data[key[0]])
|
||
this.reply(img)
|
||
return true
|
||
}
|
||
|
||
// 判断已有数据里是否有该uid的数据
|
||
if (data[mainUid]) {
|
||
// 如果有该uid的数据,就发送
|
||
let img = await renderImg(data[mainUid])
|
||
this.reply(img)
|
||
return true
|
||
} else {
|
||
// 没有就获取
|
||
this.reply('当前绑定的uid未获取数据,请私聊获取')
|
||
return false
|
||
}
|
||
}
|
||
|
||
// 获取authKey
|
||
async getAuthKey () {
|
||
// 判断是否为群聊发送
|
||
if (this.e.isGroup) {
|
||
return false
|
||
}
|
||
|
||
// 判断字段中是否有authkey
|
||
if (!this.e.msg.includes('authkey')) {
|
||
this.reply('链接无效,请重新发送')
|
||
return false
|
||
}
|
||
|
||
// 解析出authKey
|
||
let match = this.e.msg.match(/&authkey=([^&\s\u4e00-\u9fa5]+)/)
|
||
if (!match) {
|
||
this.reply('链接无效,请重新发送')
|
||
return false
|
||
}
|
||
this.authKey = decodeURIComponent(match[1])
|
||
|
||
// 获取数据
|
||
this.reply('正在获取消费数据,可能需要30s~~')
|
||
let data = new PayData(this.authKey)
|
||
let imgData = await data.filtrateData()
|
||
if (imgData?.errorMsg) {
|
||
this.reply(imgData?.errorMsg)
|
||
return true
|
||
}
|
||
|
||
// 发送图片
|
||
let img = await renderImg(imgData)
|
||
this.reply(img)
|
||
|
||
// 存储数据
|
||
await this.writeData(imgData)
|
||
await redis.setEx(`Yz:genshin:mys:qq-uid:${this.e.user_id}`, 3600 * 24 * 30, imgData.uid)
|
||
await redis.setEx(`Yz:genshin:payLog:${imgData.uid}`, 3600 * 24, this.authKey)
|
||
return true
|
||
}
|
||
|
||
/** 更新充值统计 */
|
||
async updatePayLog (e) {
|
||
// 读一下uid
|
||
let uid = await redis.get(`Yz:genshin:mys:qq-uid:${this.e.user_id}`)
|
||
if (uid) {
|
||
let mainUid = await this.isMain(this.e.user_id)
|
||
if (mainUid) uid = mainUid
|
||
// 读米游社链接的authkey
|
||
// 读抽卡链接的authkey
|
||
this.authKey = await redis.get(`Yz:genshin:payLog:${uid}`) || await redis.get(`Yz:genshin:gachaLog:url:${uid}`)
|
||
if (this.authKey) {
|
||
this.reply('正在获取数据,可能需要30s')
|
||
let imgData = await new PayData(this.authKey).filtrateData()
|
||
if (imgData?.errorMsg) {
|
||
this.reply(imgData.errorMsg)
|
||
} else {
|
||
let img = await renderImg(imgData)
|
||
this.reply(img)
|
||
await this.writeData(imgData)
|
||
}
|
||
return true
|
||
} else {
|
||
this.reply(['请私聊发送米游社链接,可以发送【#充值统计帮助】查看链接教程',
|
||
segment.button([
|
||
{ text: "充值帮助", callback: "#充值统计帮助" },
|
||
])])
|
||
}
|
||
} else {
|
||
this.reply(['请私聊发送米游社链接,可以发送【#充值统计帮助】查看链接教程',
|
||
segment.button([
|
||
{ text: "充值帮助", callback: "#充值统计帮助" },
|
||
])])
|
||
}
|
||
return true
|
||
}
|
||
|
||
payLogHelp (e) {
|
||
e.reply('安卓教程: https://b23.tv/K5qfLad\n苹果用户可【先】发送最新获取的抽卡记录链接,【再】发送【#充值记录】或【#更新充值统计】来获取(注:通过抽卡链接获取充值记录大概率已失效)')
|
||
}
|
||
|
||
/** 判断主uid,若没有则返回false,有则返回主uid */
|
||
async isMain (id, game = 'gs') {
|
||
let user = await NoteUser.create(id)
|
||
return user.getCkUid(game)
|
||
}
|
||
|
||
/** 存储数据 */
|
||
async writeData (imgData) {
|
||
let userPath = this.dirPath + '/' + this.e.user_id + '.yaml'
|
||
if (fs.readdirSync(this.dirPath).includes(`${this.e.user_id}.yaml`)) {
|
||
let data = fs.readFileSync(userPath, 'utf-8')
|
||
data = yaml.parse(data)
|
||
data[imgData.uid] = imgData
|
||
fs.writeFileSync(userPath, yaml.stringify(data), 'utf-8')
|
||
} else {
|
||
let data = {}
|
||
data[imgData.uid] = imgData
|
||
fs.writeFileSync(userPath, yaml.stringify(data), 'utf-8')
|
||
}
|
||
}
|
||
}
|