Miao-Yunzai/apps/payLog.ts

190 lines
5.7 KiB
TypeScript
Raw Permalink 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 { 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')
}
}
}