Miao-Yunzai/apps/payLog.ts

178 lines
5.6 KiB
TypeScript
Raw Normal View History

2024-06-14 10:44:18 +08:00
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')
}
}
}