From 5efa128a621f73631f803ddaa4dff18d88816f8a Mon Sep 17 00:00:00 2001 From: bbaban <3102509561@qq.com> Date: Fri, 18 Aug 2023 10:19:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=98=9F=E7=90=BC=E3=80=81?= =?UTF-8?q?=E6=98=9F=E7=90=BC=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/genshin/apps/calculator.js | 13 +- plugins/genshin/apps/dailyNote.js | 6 +- plugins/genshin/apps/gcLog.js | 60 ++-- plugins/genshin/apps/ledger.js | 48 ++- plugins/genshin/model/base.js | 10 + plugins/genshin/model/ledger.js | 174 ++++++---- plugins/genshin/model/mys/apiTool.js | 2 +- plugins/genshin/model/mys/mysInfo.js | 36 +- plugins/genshin/model/note.js | 1 - .../StarRail/html/dailyNote/dailyNote.html | 6 +- .../StarRail/html/gachaLog/gachaLog.html | 8 +- .../resources/StarRail/html/ledger/ledger.css | 310 ++++++++++++++++++ .../StarRail/html/ledger/ledger.html | 137 ++++++++ .../StarRail/html/ledgerCount/ledgerCount.css | 131 ++++++++ .../html/ledgerCount/ledgerCount.html | 188 +++++++++++ .../StarRail/html/logCount/logCount.html | 8 +- .../resources/StarRail/img/other/chart.png | Bin 0 -> 13767 bytes .../StarRail/img/other/rails_pass.png | Bin 0 -> 8235 bytes 18 files changed, 967 insertions(+), 171 deletions(-) create mode 100644 plugins/genshin/resources/StarRail/html/ledger/ledger.css create mode 100644 plugins/genshin/resources/StarRail/html/ledger/ledger.html create mode 100644 plugins/genshin/resources/StarRail/html/ledgerCount/ledgerCount.css create mode 100644 plugins/genshin/resources/StarRail/html/ledgerCount/ledgerCount.html create mode 100644 plugins/genshin/resources/StarRail/img/other/chart.png create mode 100644 plugins/genshin/resources/StarRail/img/other/rails_pass.png diff --git a/plugins/genshin/apps/calculator.js b/plugins/genshin/apps/calculator.js index 9766fee..f3312e7 100644 --- a/plugins/genshin/apps/calculator.js +++ b/plugins/genshin/apps/calculator.js @@ -66,18 +66,7 @@ export class calculator extends plugin { if (!data) return /** 生成图片 */ - let url = this.srHead('calculator', data) - let img = await puppeteer.screenshot(url, data) + let img = await puppeteer.screenshot(this.e.isSr ?'StarRail/calculator':'calculator', data) if (img) await this.reply(img) } - srHead = (url, data) => { - let name = url - if (this.e.isSr) { - name = `StarRail/${url}` - data.pluResPath = `${this._path}/plugins/genshin/resources/StarRail/` - data.tplFile = `./plugins/genshin/resources/StarRail/html/${url}/${url}.html` - data.headStyle = `` - } - return name - } } diff --git a/plugins/genshin/apps/dailyNote.js b/plugins/genshin/apps/dailyNote.js index f139103..bc71be3 100644 --- a/plugins/genshin/apps/dailyNote.js +++ b/plugins/genshin/apps/dailyNote.js @@ -6,7 +6,7 @@ import puppeteer from '../../../lib/puppeteer/puppeteer.js' gsCfg.cpCfg('mys', 'set') export class dailyNote extends plugin { - constructor () { + constructor() { super({ name: '体力查询', dsc: '体力查询', @@ -22,12 +22,12 @@ export class dailyNote extends plugin { } /** #体力 */ - async note () { + async note() { let data = await Note.get(this.e) if (!data) return /** 生成图片 */ - let img = await puppeteer.screenshot('dailyNote', data) + let img = await puppeteer.screenshot(this.e.isSr ? 'StarRail/dailyNote' : 'dailyNote', data) if (img) await this.reply(img) } diff --git a/plugins/genshin/apps/gcLog.js b/plugins/genshin/apps/gcLog.js index c044ae0..e1c3539 100644 --- a/plugins/genshin/apps/gcLog.js +++ b/plugins/genshin/apps/gcLog.js @@ -8,7 +8,7 @@ import LogCount from '../model/logCount.js' const _path = process.cwd() + '/plugins/genshin' export class gcLog extends plugin { - constructor () { + constructor() { super({ name: '抽卡记录', dsc: '抽卡记录数据统计', @@ -55,19 +55,18 @@ export class gcLog extends plugin { }) this.androidUrl = 'docs.qq.com/doc/DUWpYaXlvSklmVXlX' - this._path = process.cwd().replace(/\\/g, '/') } - async init () { - let file = ['./data/gachaJson','./data/srJson','./temp/html/StarRail'] - for(let i of file){ + async init() { + let file = ['./data/gachaJson', './data/srJson', './temp/html/StarRail'] + for (let i of file) { if (!fs.existsSync(i)) { fs.mkdirSync(i) } } } - accept () { + accept() { if (this.e.file && this.e.isPrivate) { let name = this.e.file?.name if (name.includes('txt')) { @@ -90,7 +89,7 @@ export class gcLog extends plugin { } /** 抽卡记录链接 */ - async logUrl () { + async logUrl() { if (!this.e.isPrivate) { this.e.reply('请私聊发送链接', false, { at: true }) return true @@ -98,13 +97,13 @@ export class gcLog extends plugin { let data = await new GachaLog(this.e).logUrl() if (!data) return - let url = this.srHead('gachaLog', data) - let img = await puppeteer.screenshot(url, data) + + let img = await puppeteer.screenshot(this.e.isSr ? 'StarRail/gachaLog' : 'gachaLog', data) if (img) await this.reply(img) } /** 发送output_log.txt日志文件 */ - async logFile () { + async logFile() { if (!this.e.isPrivate) { await this.e.reply('请私聊发送日志文件', false, { at: true }) return true @@ -121,27 +120,22 @@ export class gcLog extends plugin { if (!data) return false if (typeof data != 'object') return - let url='gachaLog' - if(this.e.isSr){ - url ='StarRail/gachaLog' - data.tplFile = './plugins/genshin/resources/StarRail/html/gachaLog/gachaLog.html' - data.headStyle = `` - } - let img = await puppeteer.screenshot(url, data) + + let img = await puppeteer.screenshot(this.e.isSr ? 'StarRail/gachaLog' : 'gachaLog', data) if (img) await this.reply(img) } /** #抽卡记录 */ - async getLog () { + async getLog() { let data = await new GachaLog(this.e).getLogData() if (!data) return - let url = this.srHead('gachaLog', data) - let img = await puppeteer.screenshot(url, data) + + let img = await puppeteer.screenshot(this.e.isSr ? 'StarRail/gachaLog' : 'gachaLog', data) if (img) await this.reply(img) } /** 导出记录 */ - async exportLog () { + async exportLog() { if (this.e.isGroup) { await this.reply('请私聊导出', false, { at: true }) return @@ -162,7 +156,7 @@ export class gcLog extends plugin { } } - async logXlsx () { + async logXlsx() { if (!this.e.isPrivate) { await this.e.reply('请私聊发送日志文件', false, { at: true }) return true @@ -176,7 +170,7 @@ export class gcLog extends plugin { await new ExportLog(this.e).logXlsx() } - async logJson () { + async logJson() { if (!this.e.isPrivate) { await this.e.reply('请私聊发送Json文件', false, { at: true }) return true @@ -190,11 +184,11 @@ export class gcLog extends plugin { await new ExportLog(this.e).logJson() } - async help () { + async help() { await this.e.reply(segment.image(`file:///${_path}/resources/logHelp/记录帮助.png`)) } - async helpPort () { + async helpPort() { let msg = this.e.msg.replace(/#|帮助/g, '') if (['电脑', 'pc'].includes(msg)) { @@ -205,20 +199,12 @@ export class gcLog extends plugin { await this.e.reply(segment.image(`file:///${_path}/resources/logHelp/记录帮助-苹果.png`)) } } - srHead = (url, data) => { - let name = url - if (this.e.isSr) { - name = `StarRail/${url}` - data.tplFile = `./plugins/genshin/resources/StarRail/html/${url}/${url}.html` - data.headStyle = `` - } - return name - } - async logCount () { + + async logCount() { let data = await new LogCount(this.e).count() if (!data) return - let url = this.srHead('logCount', data) - let img = await puppeteer.screenshot(url, data) + + let img = await puppeteer.screenshot(this.e.isSr ? 'StarRail/logCount' : 'logCount', data) if (img) await this.reply(img) } } diff --git a/plugins/genshin/apps/ledger.js b/plugins/genshin/apps/ledger.js index 2ea3640..3323fb3 100644 --- a/plugins/genshin/apps/ledger.js +++ b/plugins/genshin/apps/ledger.js @@ -4,84 +4,74 @@ import puppeteer from '../../../lib/puppeteer/puppeteer.js' import fs from 'node:fs' export class ledger extends plugin { - constructor () { + constructor() { super({ name: '札记查询', - dsc: '原神体米游社札记原神查询', + dsc: '米游社札记·开拓月历查询', event: 'message', priority: 300, rule: [ { - reg: '^(#原石|#*札记)([0-9]|[一二两三四五六七八九十]+)*月*$', + reg: '^(#原石|#*札记|#*(星铁)?星琼)([0-9]|[一二两三四五六七八九十]+)*月*$', fnc: 'ledger' }, { - reg: '^(#签到|#*米游社(自动)*签到)$', - fnc: 'sign' - }, - { - reg: '^#原石任务$', + reg: '^#(原石|#*(星铁)?星琼)任务$', permission: 'master', fnc: 'ledgerTask' }, { - reg: '^#*(原石|札记)统计$', + reg: '^#*(原石|札记|#*(星铁)?星琼)统计$', fnc: 'ledgerCount' }, { - reg: '^#*(去年|今年|\\d{4}年)(原石|札记)统计$', + reg: '^#*(去年|今年|\\d{4}年)(原石|札记|(星铁)?星琼)统计$', fnc: 'ledgerCountHistory' } ] }) - - // this.set = gsCfg.getConfig('mys', 'set') - - // /** 定时任务 */ - // this.task = { - // cron: this.set.signTime, - // name: '米游社签到任务', - // fnc: () => this.signTask() - // } } - async init () { - if (!fs.existsSync('./data/NoteData')) { - fs.mkdirSync('./data/NoteData') + async init() { + let file = ['./data/NoteData', './data/SR_NoteData'] + for (let i of file) { + if (!fs.existsSync(i)) { + fs.mkdirSync(i) + } } } /** #原石札记 */ - async ledger () { + async ledger() { let data = await new Ledger(this.e).get() if (!data) return /** 生成图片 */ - let img = await puppeteer.screenshot('ledger', data) + let img = await puppeteer.screenshot(this.e.isSr ?'StarRail/ledger':'ledger', data) if (img) await this.reply(img) } /** 原石任务 */ - async ledgerTask () { + async ledgerTask() { let ledger = new Ledger(this.e) await ledger.ledgerTask(!!this?.e?.msg) } - async ledgerCount () { + async ledgerCount() { let data = await new Ledger(this.e).ledgerCount() if (!data) return /** 生成图片 */ - let img = await puppeteer.screenshot('ledgerCount', data) + let img = await puppeteer.screenshot(this.e.isSr ?'StarRail/ledgerCount':'ledgerCount', data) if (img) await this.reply(img) } - async ledgerCountHistory () { + async ledgerCountHistory() { let data = await new Ledger(this.e).ledgerCountHistory() if (!data) return /** 生成图片 */ - let img = await puppeteer.screenshot('ledgerCount', data) + let img = await puppeteer.screenshot(this.e.isSr ? 'StarRail/ledgerCount' : 'ledgerCount', data) if (img) await this.reply(img) } } diff --git a/plugins/genshin/model/base.js b/plugins/genshin/model/base.js index 57fcd43..78a8080 100644 --- a/plugins/genshin/model/base.js +++ b/plugins/genshin/model/base.js @@ -20,6 +20,16 @@ export default class base { get screenData() { let headImg = '林尼' + if(this.e?.isSr) + return { + saveId: this.userId, + cwd: this._path, + tplFile: `./plugins/genshin/resources/StarRail/html/${this.model}/${this.model}.html`, + /** 绝对路径 */ + pluResPath: `${this._path}/plugins/genshin/resources/StarRail/`, + headStyle: `` + } + return { saveId: this.userId, cwd: this._path, diff --git a/plugins/genshin/model/ledger.js b/plugins/genshin/model/ledger.js index 9589286..60f3571 100644 --- a/plugins/genshin/model/ledger.js +++ b/plugins/genshin/model/ledger.js @@ -1,4 +1,5 @@ import base from './base.js' +import GsCfg from './gsCfg.js' import MysInfo from './mys/mysInfo.js' import MysApi from './mys/mysApi.js' import lodash from 'lodash' @@ -7,12 +8,26 @@ import fs from 'node:fs' import common from '../../../lib/common/common.js' export default class Ledger extends base { - constructor (e) { + constructor(e) { super(e) + this.e = e this.model = 'ledger' + if (this.e.msg?.includes('星琼')) + this.e.isSr = true + + this.color = ['#73a9c6', '#d56565', '#70b2b4', '#bd9a5a', '#739970', '#7a6da7', '#597ea0'] + this.action = { + "other": 0, + "adventure_reward": 1, + "space_reward": 2, + "daily_reward": 3, + "abyss_reward": 4, + "mail_reward": 5, + "event_reward": 6 + } } - async get () { + async get() { this.getMonth() if (!this.month) return @@ -27,8 +42,8 @@ export default class Ledger extends base { return data } - getMonth () { - let month = this.e.msg.replace(/#|原石|月|札记/g, '') + getMonth() { + let month = this.e.msg.replace(/#|原石|月|札记|星铁|星琼/g, '') let NowMonth = Number(moment().month()) + 1 let monthData = ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'] if (month) { @@ -59,74 +74,89 @@ export default class Ledger extends base { if ((NowMonth >= 3 && month > NowMonth) || (NowMonth < 3 && month > NowMonth && month <= 9 + month)) { month = NowMonth } - - this.NowMonth = NowMonth - this.month = month + if (this.e.isSr) { + this.NowMonth = moment().year().toString() + (NowMonth < 10 ? '0' : '') + NowMonth.toString() + this.month = moment().year().toString() + (month < 10 ? '0' : '') + month.toString() + this.srmonth = month + } else { + this.NowMonth = NowMonth + this.month = month + } } - dealData (ledgerInfo) { + dealData(ledgerInfo) { let day if (this.month == this.NowMonth) { - day = `${this.month}月${moment().date()}号` + day = `${this[this.e.isSr ? 'srmonth' : 'month']}月${moment().date()}号` } else { - day = `${this.month}月` + day = `${this[this.e.isSr ? 'srmonth' : 'month']}月` } - ledgerInfo.month_data.gacha = (ledgerInfo.month_data.current_primogems / 160).toFixed(0) - ledgerInfo.month_data.last_gacha = (ledgerInfo.month_data.last_primogems / 160).toFixed(0) - if (ledgerInfo.month_data.current_primogems > 10000) { - ledgerInfo.month_data.current_primogems = (ledgerInfo.month_data.current_primogems / 10000).toFixed(2) + ' w' + let gacha = this.e.isSr ? 'current_hcoin' : 'current_primogems' + let last_gacha = this.e.isSr ? 'last_hcoin' : 'last_primogems' + let mora = this.e.isSr ? 'current_rails_pass' : 'current_mora' + let last_mora = this.e.isSr ? 'last_rails_pass' : 'last_mora' + + ledgerInfo.month_data.gacha = (ledgerInfo.month_data[gacha] / 160).toFixed(0) + ledgerInfo.month_data.last_gacha = (ledgerInfo.month_data[last_gacha] / 160).toFixed(0) + if (ledgerInfo.month_data[gacha] > 10000) { + ledgerInfo.month_data[gacha] = (ledgerInfo.month_data[gacha] / 10000).toFixed(2) + ' w' } - if (ledgerInfo.month_data.last_primogems > 10000) { - ledgerInfo.month_data.last_primogems = (ledgerInfo.month_data.last_primogems / 10000).toFixed(2) + ' w' + if (ledgerInfo.month_data[last_gacha] > 10000) { + ledgerInfo.month_data[last_gacha] = (ledgerInfo.month_data[last_gacha] / 10000).toFixed(2) + ' w' } - if (ledgerInfo.month_data.current_mora > 10000) { - ledgerInfo.month_data.current_mora = (ledgerInfo.month_data.current_mora / 10000).toFixed(1) + ' w' + if (ledgerInfo.month_data[mora] > 10000) { + ledgerInfo.month_data[mora] = (ledgerInfo.month_data[mora] / 10000).toFixed(1) + ' w' } - if (ledgerInfo.month_data.last_mora > 10000) { - ledgerInfo.month_data.last_mora = (ledgerInfo.month_data.last_mora / 10000).toFixed(1) + ' w' + if (ledgerInfo.month_data[last_mora] > 10000) { + ledgerInfo.month_data[last_mora] = (ledgerInfo.month_data[last_mora] / 10000).toFixed(1) + ' w' } - if (ledgerInfo.day_data.current_primogems > 10000) { - ledgerInfo.day_data.current_primogems = (ledgerInfo.day_data.current_primogems / 10000).toFixed(1) + ' w' + if (ledgerInfo.day_data[gacha] > 10000) { + ledgerInfo.day_data[gacha] = (ledgerInfo.day_data[gacha] / 10000).toFixed(1) + ' w' } - if (ledgerInfo.day_data.current_mora > 10000) { - ledgerInfo.day_data.current_mora = (ledgerInfo.day_data.current_mora / 10000).toFixed(1) + ' w' + if (ledgerInfo.day_data[mora] > 10000) { + ledgerInfo.day_data[mora] = (ledgerInfo.day_data[mora] / 10000).toFixed(1) + ' w' } - let color = ['#73a9c6', '#d56565', '#70b2b4', '#bd9a5a', '#739970', '#7a6da7', '#597ea0'] - for (let i in ledgerInfo.month_data.group_by) { - ledgerInfo.month_data.group_by[i].color = color[ledgerInfo.month_data.group_by[i].action_id] - } ledgerInfo.color = [] ledgerInfo.month_data.group_by.forEach((item) => { - ledgerInfo.color.push(['#73a9c6', '#d56565', '#70b2b4', '#bd9a5a', '#739970', '#7a6da7', '#597ea0'][item.action_id]) + if (this.e.isSr) + item.color = this.color[this.action[item.action]] + else + item.color = this.color[item.action_id] + ledgerInfo.color.push(item.color) }) + ledgerInfo.group_by = JSON.stringify(ledgerInfo.month_data.group_by) ledgerInfo.color = JSON.stringify(ledgerInfo.color) + let files = fs.readdirSync('./plugins/genshin/resources/StarRail/img/role').filter(file => file.endsWith('.webp')) + let icon = lodash.sample(files) + return { saveId: this.e.uid, uid: this.e.uid, day, + icon, ...ledgerInfo, ...this.screenData } } // 保存上两个原石数据 - async saveLedger (uid, ck = '') { + async saveLedger(uid, ck = '', isTask = false) { if (ck) { uid = ck.uid } else { /** 获取个人ck */ - ck = await MysInfo.checkUidBing(uid) + ck = await MysInfo.checkUidBing(uid, this.e.isSr ? 'sr' : 'gs') } if (!ck || lodash.isEmpty(ck)) { return false } - let dataPath = `./data/NoteData/${uid}.json` + let dataPath = `./data/${this.e?.isSr ? 'SR_NoteData' : 'NoteData'}/${uid}.json` let NoteData = {} if (fs.existsSync(dataPath)) { NoteData = JSON.parse(fs.readFileSync(dataPath, 'utf8')) @@ -153,7 +183,10 @@ export default class Ledger extends base { if (NowMonth == month && this.e.nowData && this.e.nowData?.data?.data_month == NowMonth) { ledgerInfo = this.e.nowData } else { - ledgerInfo = await this.ysLedger(ck, month) + let months = month + if (this.e.isSr) months = String(year) + (month < 10 ? '0' : '') + String(month) + + ledgerInfo = await this.ysLedger(ck, months, isTask) if (!ledgerInfo) continue } @@ -166,47 +199,52 @@ export default class Ledger extends base { common.sleep(100) } - logger.mark(`[札记查询][自动保存] uid:${uid} 原石数据已保存`) + logger.mark(`[札记查询][自动保存] uid:${uid} 数据已保存`) fs.writeFileSync(dataPath, JSON.stringify(NoteData, '', '\t')) return NoteData } - async ysLedger (ck, month) { - let mysApi = new MysApi(ck.uid, ck.ck, { log: false }) - - let ledgerInfo = await mysApi.getData('ys_ledger', { month }) + async ysLedger(ck, month, isTask) { + let ledgerInfo = {} + if (isTask) { + let mysApi = new MysApi(ck.uid, ck.ck, { log: false }, this.e?.isSr) + ledgerInfo = await mysApi.getData('ys_ledger', { month }) + ledgerInfo = await new MysInfo(this.e).checkCode(ledgerInfo, 'ys_ledger', mysApi, { month }, isTask) + } else { + ledgerInfo = await MysInfo.get(this.e, 'ys_ledger', { month }) + } if (!ledgerInfo || ledgerInfo.retcode != 0) return false return ledgerInfo.data } - async ledgerTask (manual) { - let cks = await MysInfo.getBingCkUid() + async ledgerTask(manual) { + let cks = await GsCfg.getBingCk(this.e?.isSr ? 'sr' : 'gs') let uids = lodash.map(cks, 'uid') let finishTime = moment().add(uids.length * 0.7, 's').format('MM-DD HH:mm:ss') - logger.mark(`札记ck:${uids.length}个,预计需要${this.countTime(uids.length)} ${finishTime} 完成`) + logger.mark(`${this.e?.isSr ? '开拓月历' : '札记'}ck:${uids.length}个,预计需要${this.countTime(uids.length)} ${finishTime} 完成`) if (manual) { - await this.e.reply('开始任务:保存原石数据,完成前请勿重复执行') - await this.e.reply(`札记ck:${uids.length}个\n预计需要:${this.countTime(uids.length)}\n完成时间:${finishTime}`) + await this.e.reply(`开始任务:保存${this.e?.isSr ? '星琼' : '原石'}数据,完成前请勿重复执行`) + await this.e.reply(`${this.e?.isSr ? '开拓月历' : '札记'}ck:${uids.length}个\n预计需要:${this.countTime(uids.length)}\n完成时间:${finishTime}`) } for (let uid of uids) { let ck = cks[uid] this.e.user_id = ck.qq - await this.saveLedger(uid, ck) + await this.saveLedger(uid, ck, true) await common.sleep(500) } if (manual) { - this.e.reply('原石任务完成') + this.e.reply(`${this.e?.isSr ? '星琼' : '原石'}任务完成`) } } - countTime (num) { + countTime(num) { let time = num * 0.7 let hour = Math.floor((time / 3600) % 24) let min = Math.floor((time / 60) % 60) @@ -218,7 +256,7 @@ export default class Ledger extends base { return msg } - async ledgerCount () { + async ledgerCount() { this.model = 'ledgerCount' let mysInfo = await MysInfo.init(this.e, 'ys_ledger') @@ -231,7 +269,7 @@ export default class Ledger extends base { return this.ledgerCountData(NoteData) } - async ledgerCountHistory () { + async ledgerCountHistory() { let nowYear if (this.e.msg.includes('去年')) { nowYear = moment().year() - 1 @@ -251,19 +289,19 @@ export default class Ledger extends base { let mysInfo = await MysInfo.init(this.e, 'ys_ledger') let uid = mysInfo?.uid if (!uid) return false - let dataPath = `./data/NoteData/${uid}.json` + let dataPath = `./data/${this.e?.isSr ? 'SR_NoteData' : 'NoteData'}/${uid}.json` let NoteData = {} if (fs.existsSync(dataPath)) { NoteData = JSON.parse(fs.readFileSync(dataPath, 'utf8')) } // console.log(NoteData) if (!NoteData || lodash.isEmpty(NoteData)) { - this.e.reply('暂无原石数据,请先发送 #原石', false, { at: true }) + this.e.reply(`${this.e?.isSr ? '暂无星琼数据,请先发送 *星琼' : '暂无原石数据,请先发送 #原石'}`, false, { at: true }) return false } NoteData = NoteData[nowYear] if (!NoteData) { - this.e.reply(`uid:${uid} ${nowYear}年无原石统计数据!`, false, { at: true }) + this.e.reply(`uid:${uid} ${nowYear}年无${this.e?.isSr ? '星琼' : '原石'}统计数据!`, false, { at: true }) return false } lodash.forEach(NoteData, (val) => { @@ -273,7 +311,7 @@ export default class Ledger extends base { return this.ledgerCountData(NoteData, String(nowYear)) } - ledgerCountData (NoteData, nowYear) { + ledgerCountData(NoteData, nowYear) { let hasMore = false let yearText if (!nowYear) { @@ -317,28 +355,38 @@ export default class Ledger extends base { yearText } + let Primogems = this.e.isSr ? 'current_hcoin' : 'current_primogems' + let Mora = this.e.isSr ? 'current_rails_pass' : 'current_mora' lodash.forEach(NoteData, (val) => { - data.allPrimogems += val.month_data.current_primogems - data.allMora += val.month_data.current_mora + data.allPrimogems += val.month_data[Primogems] + data.allMora += val.month_data[Mora] // 柱状图数据 + if (this.e.isSr) + val.data_month = val.data_month.slice(-2, -1) == '0' ? val.data_month.slice(-1) : val.data_month.slice(-2) + data.primogemsMonth.push({ - value: val.month_data.current_primogems, + value: val.month_data[Primogems], month: String(val.data_month), year: String(val.year), - name: '原石' + name: this.e.isSr ? '星琼' : '原石' }) data.moraMonth.push({ - value: (val.month_data.current_mora / 1000).toFixed(0), + value: (val.month_data[Mora] / 1000).toFixed(0), month: String(val.data_month), year: String(val.year), - name: '摩拉' + name: this.e.isSr ? '专&通票' : '摩拉' }) }) // 单位处理 - data.allMora = (data.allMora / 10000).toFixed(0) + 'w' data.allPrimogemsShow = (data.allPrimogems / 10000).toFixed(2) + 'w' data.allGacha = (data.allPrimogems / 160).toFixed(0) + if (this.e.isSr) { + data.allGacha = (data.allPrimogems / 160 + data.allMora).toFixed(0) + data.allMora = data.allMora.toFixed(0) + '张' + } else { + data.allMora = (data.allMora / 10000).toFixed(0) + 'w' + } // 原石最多 data.maxPrimogems = lodash.maxBy(data.primogemsMonth, 'value') @@ -350,6 +398,12 @@ export default class Ledger extends base { let groupBy = lodash(NoteData).map('month_data').map('group_by').flatMap().value() + if (this.e.isSr) + groupBy.forEach((item) => { + item.action_id = this.action[item.action] + item.action = item.action_name + }) + let pieData = {} for (let val of groupBy) { if (!pieData[val.action]) { @@ -370,7 +424,7 @@ export default class Ledger extends base { data.color = [] pieData.forEach((item) => { - data.color.push(['#73a9c6', '#d56565', '#70b2b4', '#bd9a5a', '#739970', '#7a6da7', '#597ea0'][item.action_id]) + data.color.push(this.color[item.action_id]) }) data.group_by = pieData diff --git a/plugins/genshin/model/mys/apiTool.js b/plugins/genshin/model/mys/apiTool.js index 036e770..3df51e3 100644 --- a/plugins/genshin/model/mys/apiTool.js +++ b/plugins/genshin/model/mys/apiTool.js @@ -161,7 +161,7 @@ export default class apiTool { * 开拓阅历接口 */ ys_ledger: { - url: `${host}/event/srledger/month_info`, + url: `${host}event/srledger/month_info`, query: `region=${this.server}&uid=${this.uid}&month=${data.month}` }, /** 角色详情 */ diff --git a/plugins/genshin/model/mys/mysInfo.js b/plugins/genshin/model/mys/mysInfo.js index 31bb030..26aa0af 100644 --- a/plugins/genshin/model/mys/mysInfo.js +++ b/plugins/genshin/model/mys/mysInfo.js @@ -177,7 +177,7 @@ export default class MysInfo { } for (let i in res) { - res[i] = await mysInfo.checkCode(res[i], res[i].api, mysApi) + res[i] = await mysInfo.checkCode(res[i], res[i].api, mysApi, api[res[i].api]) if (res[i]?.retcode === 0) continue @@ -185,7 +185,7 @@ export default class MysInfo { } } else { res = await mysApi.getData(api, data) - res = await mysInfo.checkCode(res, api, mysApi) + res = await mysInfo.checkCode(res, api, mysApi, data) } return res @@ -329,15 +329,15 @@ export default class MysInfo { } else { // 重新分配 await mysUser.disable(game) - return onlySelfCk ? '' : await this.getCookie() + return onlySelfCk ? '' : await this.getCookie(game) } } return this.ckUser?.ck } - async checkCode(res, type, mysApi = {}) { + async checkCode(res, type, mysApi = {}, data = {}, isTask = false) { if (!res) { - this.e.reply('米游社接口请求失败,暂时无法查询') + if (!isTask) this.e.reply('米游社接口请求失败,暂时无法查询') return false } @@ -359,28 +359,30 @@ export default class MysInfo { if (/(登录|login)/i.test(res.message)) { if (this.ckInfo.uid) { logger.mark(`[ck失效][uid:${this.uid}][qq:${this.userId}]`) - this.e.reply(`UID:${this.ckInfo.uid},米游社cookie已失效`) + if (!isTask) this.e.reply(`UID:${this.ckInfo.uid},米游社cookie已失效`) } else { logger.mark(`[公共ck失效][ltuid:${this.ckInfo.ltuid}]`) - this.e.reply('米游社查询失败,请稍后再试') + if (!isTask) this.e.reply('米游社查询失败,请稍后再试') } - await this.delCk() + if (!isTask) await this.delCk() } else { - this.e.reply(`米游社接口报错,暂时无法查询:${res.message}`) + if (!isTask) this.e.reply(`米游社接口报错,暂时无法查询:${res.message}`) } break case 1008: - this.e.reply('\n请先去米游社绑定角色', false, { at: this.userId }) + if (!isTask) this.e.reply('\n请先去米游社绑定角色', false, { at: this.userId }) break case 10101: - await this.disableToday() - this.e.reply('查询已达今日上限') + if (!isTask) { + await this.disableToday() + this.e.reply('查询已达今日上限') + } break case 10102: if (res.message === 'Data is not public for the user') { - this.e.reply(`\nUID:${this.uid},米游社数据未公开`, false, { at: this.userId }) + if (!isTask) this.e.reply(`\nUID:${this.uid},米游社数据未公开`, false, { at: this.userId }) } else { - this.e.reply(`uid:${this.uid},请先去米游社绑定角色`) + if (!isTask) this.e.reply(`uid:${this.uid},请先去米游社绑定角色`) } break // 伙伴不存在~ @@ -389,17 +391,17 @@ export default class MysInfo { break case 1034: logger.mark(`[米游社查询失败][uid:${this.uid}][qq:${this.userId}] 遇到验证码`) - this.e.reply('米游社查询遇到验证码,请稍后再试') + if (!isTask) this.e.reply('米游社查询遇到验证码,请稍后再试') break default: - this.e.reply(`米游社接口报错,暂时无法查询:${res.message || 'error'}`) + if (!isTask) this.e.reply(`米游社接口报错,暂时无法查询:${res.message || 'error'}`) break } if (res.retcode !== 0) { logger.mark(`[mys接口报错]${JSON.stringify(res)},uid:${this.uid}`) } // 添加请求记录 - await this.ckUser.addQueryUid(this.uid) + if (!isTask) await this.ckUser.addQueryUid(this.uid) return res } diff --git a/plugins/genshin/model/note.js b/plugins/genshin/model/note.js index 3664249..3f2caa6 100644 --- a/plugins/genshin/model/note.js +++ b/plugins/genshin/model/note.js @@ -33,7 +33,6 @@ export default class Note extends base { let screenData = this.screenData if (this.e.isSr) { - screenData.tplFile = './plugins/genshin/resources/StarRail/html/dailyNote/dailyNote.html' resUser = await MysInfo.get(this.e, 'UserGame') resUser.data?.list?.forEach(v => this.e.uid.includes(v.game_biz)) if (!resUser || resUser.retcode !== 0) return false diff --git a/plugins/genshin/resources/StarRail/html/dailyNote/dailyNote.html b/plugins/genshin/resources/StarRail/html/dailyNote/dailyNote.html index 20b87b7..319b7b0 100644 --- a/plugins/genshin/resources/StarRail/html/dailyNote/dailyNote.html +++ b/plugins/genshin/resources/StarRail/html/dailyNote/dailyNote.html @@ -4,7 +4,7 @@ - + @@ -18,7 +18,7 @@
- +
{{nowDay}}
@@ -51,7 +51,7 @@
{{each ex.avatars avatars}} {{if avatars=='派遣头像'}} -
+
{{else}}
{{/if}} diff --git a/plugins/genshin/resources/StarRail/html/gachaLog/gachaLog.html b/plugins/genshin/resources/StarRail/html/gachaLog/gachaLog.html index 2b48450..c53c06b 100644 --- a/plugins/genshin/resources/StarRail/html/gachaLog/gachaLog.html +++ b/plugins/genshin/resources/StarRail/html/gachaLog/gachaLog.html @@ -3,9 +3,9 @@ - + - + {{@headStyle}} @@ -20,7 +20,7 @@ {{allNum}}抽 {{typeName}}池 - +
@@ -50,7 +50,7 @@ UP {{/if}}
{{val.num}}
diff --git a/plugins/genshin/resources/StarRail/html/ledger/ledger.css b/plugins/genshin/resources/StarRail/html/ledger/ledger.css new file mode 100644 index 0000000..1eb329a --- /dev/null +++ b/plugins/genshin/resources/StarRail/html/ledger/ledger.css @@ -0,0 +1,310 @@ +@font-face { + font-family: "HYWenHei-55W"; + src: url("../../../../../../resources/font/HYWenHei-55W.ttf"); + font-weight: normal; + font-style: normal; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; + font-family: HYWenHei-55W; + font-weight: bold; +} + +body { + font-size: 18px; + color: #1e1f20; + font-family: PingFangSC-Medium, PingFang SC, sans-serif; + transform: scale(1.5); + transform-origin: 0 0; + width: 1200px; +} + +.container { + width: 1200px; + height: 1835px; + background-color: #f5f6fb; + background-image: url("../../img/note/bg.png"); +} + +.uid { + border-radius: 0 25px 25px 0px; + display: flex; + width: 670px; + height: 200px; + justify-content: center; + flex-direction: column; + margin-top: 195px; + margin-left: 50px; + background-image: url('../../img/note/uidbg.png'); +} + +.uid_item { + /* background-color: #302b25; */ + color: #fff; + margin-left: 50px; + align-items: center; + justify-content: left; + display: flex; + padding: 8px 10px; + font-size: 45px; + height: 100px; + border-radius: 0 12px 0 0px; + font-family: MiSans-Demibold; +} + +.uid_span { + text-indent: 1em; + font-size: 48px; + display: flex; +} + +.uid_name { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 10em; +} + +.day_span { + text-indent: 1em; + font-size: 48px; + display: flex; + margin-left: -30px; +} + +.uid_item:nth-child(2) { + /* background-color: #595045; */ + border-radius: 0 0 12px 0px; + font-size: 40px; + font-family: MiSans-Medium; +} + +.uid_text { + width: 150px; + text-align: right; +} + +.title { + display: flex; + position: relative; +} + +.title_date { + width: 370px; + height: 450px; + position: absolute; + right: 83px; + top: 27px; + padding: 10px; + transform: rotate(4deg); + background-color: #fff; + border-bottom: 10px solid #b47f4c; + box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.2); +} + +.icon { + width: 350px; + height: 350px; +} + +.title_date_text { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + font-size: 36px; + color: #808080; + height: 80px; +} + +img { + width: 100%; + height: 100%; +} + +.subject { + width: 1000px; + margin: 0 auto; + margin-top: 60px; + height: 400px; + background-color: #e5e5e5; + padding-left: 60px; +} + +.subject_note { + font-size: 24px; + margin-top: 49px; + padding-top: 24px; + color: #000000; +} + +.subject_note span:nth-child(1) { + font-size: 82px; + color: #b47f4c; +} + +.subject_solid { + display: flex; + width: 880px; + border-radius: 10px; + background-color: #a1a1a1; + height: 20px; + margin-top: 44px; + margin-bottom: 20px; +} + +.subject_solid span { + background-color: #b47f4c; + width: 50%; + border-radius: 10px; +} + +.data-box { + display: flex; + margin-bottom: 30px; +} + +.data-box .head { + margin-bottom: 6px; + font-weight: 700; + font-size: 48px; +} + +.month .primogems { + background: url(data:image/png;base64,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) no-repeat; + background-size: auto 100%; + width: 500px; + height: 120px; + line-height: 120px; + display: flex; + align-items: center; + margin-left: -50px; +} + +.primogems .icon-ys { + width: 80px; + height: 80px; + margin-left: 20px; + background: url(https://webstatic.mihoyo.com/upload/event/2023/03/28/77cb5426637574ba524ac458fa963da0_8938800417123864478.png) no-repeat 50% / cover; + ; +} + +.primogems .icon-mola { + width: 80px; + height: 80px; + margin-left: 20px; + background: url(../../img/other/rails_pass.png) no-repeat 50% / cover; +} + +.primogems .text { + margin-left: 35px; + white-space: nowrap; + font-size: 32px; +} + +.day { + margin-left: 10px; +} + +.day .primogems { + background: url(data:image/png;base64,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) no-repeat; + background-size: auto 100%; + width: 500px; + height: 120px; + line-height: 120px; + display: flex; + align-items: center; + margin-left: -15px; +} + +.chart-box .chart-info { + display: flex; +} + +.chart-box .head { + margin-bottom: 30px; + font-weight: 800; + font-size: 48px; + margin-left: 70px; +} + +.title_wt { + margin: 30px 0; + background-color: #b47f4c; + display: flex; + height: 80px; + width: 330px; + margin-left: 100px; + justify-content: center; + align-items: center; +} + +.title_wt div { + font-size: 38px; + color: #fff; + background-color: #302b25; + height: 80px; + display: flex; + margin-left: 30px; + padding-left: 30px; + justify-content: left; + align-items: center; + width: calc(100% - 30px); +} + +#chartContainer { + width: 440px; + height: 440px; + background: url(../../img/other/chart.png) no-repeat 50% / cover; + margin-left: 60px; +} + +.tooltip { + margin-left: 20px; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.tooltip li { + list-style: none; + display: flex; + justify-content: flex-start; + align-items: center; +} + +.tooltip li i { + width: 10px; + height: 10px; + margin-right: 10px; +} + +.tooltip li .action { + width: 300px; +} + +.tooltip li em { + font-size: 40px; + color: #28384d; + font-style: normal; + width: 30px; +} + +.tooltip li .num { + width: 180px; +} + +.tooltip li .percent { + width: 10px; +} + +.logo { + position: absolute; + bottom: 90px; + left: 130px; + color: #fff; +} \ No newline at end of file diff --git a/plugins/genshin/resources/StarRail/html/ledger/ledger.html b/plugins/genshin/resources/StarRail/html/ledger/ledger.html new file mode 100644 index 0000000..7664dde --- /dev/null +++ b/plugins/genshin/resources/StarRail/html/ledger/ledger.html @@ -0,0 +1,137 @@ + + + + + + + + + + + + +
+
+
+
UID:{{uid}} +
+
开拓月历·{{day}}
+
+
+
+
+ +
+
+
{{day}}
+
+
+
+
+
+
+
当月获取:
+
+
+
星琼:{{month_data.current_hcoin}} | {{month_data.gacha}} 抽
+
+
+
+
专&通票:{{month_data.current_rails_pass}} 张
+
+
+
+
上月获取:
+
+
+
星琼:{{month_data.last_hcoin}} | {{month_data.last_gacha}} 抽
+
+
+
+
专&通票:{{month_data.last_rails_pass}} 张
+
+
+
+
+
+
+ 星琼收入统计 +
+
+
+
+
+
    + {{each month_data.group_by val}} +
  • + + {{val.action_name}} {{val.num}}{{val.percent}}% +
  • + {{/each}} +
+
+
+ +
+
+
+ + + + + + \ No newline at end of file diff --git a/plugins/genshin/resources/StarRail/html/ledgerCount/ledgerCount.css b/plugins/genshin/resources/StarRail/html/ledgerCount/ledgerCount.css new file mode 100644 index 0000000..e6561e1 --- /dev/null +++ b/plugins/genshin/resources/StarRail/html/ledgerCount/ledgerCount.css @@ -0,0 +1,131 @@ +@font-face { + font-family: "tttgbnumber"; + src: url("../../../../../../resources/font/tttgbnumber.ttf"); + font-weight: normal; + font-style: normal; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + user-select: none; +} + +body { + font-size: 16px; + width: 530px; + color: #1e1f20; + transform: scale(1.3); + transform-origin: 0 0; +} + +.container { + width: 530px; + padding: 20px 15px 10px 15px; + background-color: #f5f6fb; +} + +.head_box { + border-radius: 15px; + font-family: tttgbnumber; + padding: 10px 20px; + position: relative; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); +} + +.head_box .id_text { + font-size: 24px; + color: #e8ebee; +} + +.head_box .day_text { + font-size: 20px; + color: #f3f6f8; +} + +.head_box .genshin_logo { + position: absolute; + top: -15px; + right: 15px; + width: 150px; +} + +.base_info { + position: relative; + padding-left: 10px; +} + +.uid { + font-family: tttgbnumber; +} + +.data_box { + border-radius: 15px; + margin-top: 20px; + margin-bottom: 20px; + padding: 20px 15px 5px 15px; + background: #fff; + box-shadow: 0 5px 10px 0 rgb(0 0 0 / 15%); + position: relative; +} + +.tab_lable { + position: absolute; + top: -10px; + left: -8px; + background: #d4b98c; + color: #fff; + font-size: 14px; + padding: 3px 10px; + border-radius: 15px 0px 15px 15px; + z-index: 20; +} + +.data_line { + display: flex; + justify-content: space-around; + margin-bottom: 14px; +} + +.data_line_item { + width: 100px; + text-align: center; + /*margin: 0 20px;*/ +} + +.num { + font-family: tttgbnumber; + font-size: 24px; +} + +.data_box .lable { + font-size: 14px; + color: #7f858a; + line-height: 1; + margin-top: 3px; +} + +#chartContainer { + width: 100%; + height: 300px; +} + +#chartContainer2 { + width: 115%; + height: 280px; + margin-left: -60px; +} + +.logo { + font-size: 14px; + font-family: "tttgbnumber"; + text-align: center; + color: #7994a7; +} + +.hasMore { + font-size: 12px; + margin: 6px 0; + color: #7f858a; +} \ No newline at end of file diff --git a/plugins/genshin/resources/StarRail/html/ledgerCount/ledgerCount.html b/plugins/genshin/resources/StarRail/html/ledgerCount/ledgerCount.html new file mode 100644 index 0000000..56252f3 --- /dev/null +++ b/plugins/genshin/resources/StarRail/html/ledgerCount/ledgerCount.html @@ -0,0 +1,188 @@ + + + + + + + + + + + {{@headStyle}} + + + +
+
+
ID: {{uid}}
+

{{yearText}}星琼统计

+ +
+
+
数据总览
+
+
+
{{allPrimogemsShow}}
+
总星琼
+
+
+
{{allGacha}}抽
+
总抽数
+
+
+
{{maxPrimogems.month}}月
+
星琼最多
+
+
+
{{maxPrimogems.value}}
+
{{maxPrimogems.month}}月星琼
+
+
+
+
+
{{allMora}}
+
总专&通票
+
+
+
{{maxMora.month}}月
+
专&通票最多
+
+
+ {{if group_by.length>0 }} +
{{group_by[0].num}}
+
{{group_by[0].action}}
+ {{/if}} +
+
+ {{if group_by.length>0 }} +
{{group_by[1].num}}
+
{{group_by[1].action}}
+ {{/if}} +
+
+
+
+
月份统计
+
+
+
+
详细统计
+
+
+ {{if hasMore }} +
*该数据只显示最近12个月
+ {{/if}} + +
+ + + + + + \ No newline at end of file diff --git a/plugins/genshin/resources/StarRail/html/logCount/logCount.html b/plugins/genshin/resources/StarRail/html/logCount/logCount.html index 89f7e0d..981ce5d 100644 --- a/plugins/genshin/resources/StarRail/html/logCount/logCount.html +++ b/plugins/genshin/resources/StarRail/html/logCount/logCount.html @@ -3,7 +3,7 @@ - + {{@headStyle}} @@ -13,7 +13,7 @@
ID: {{uid}}

抽卡统计-{{typeName}}

- +
{{each pool val}} {{if val.roleNum > 0}} @@ -33,10 +33,10 @@
{{v.count}} {{if v.item_type=='角色'}} - + {{/if}} {{if v.item_type=='光锥'}} - + {{/if}}
{{/each}} diff --git a/plugins/genshin/resources/StarRail/img/other/chart.png b/plugins/genshin/resources/StarRail/img/other/chart.png new file mode 100644 index 0000000000000000000000000000000000000000..c0eaf85770ca2c896c95c7161076b8b65b46706a GIT binary patch literal 13767 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 Sq40m{KL9GHCR-