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 @@n`2X>y|Nb1v@;hQ+wa_W&F_H< zDi;+UXrxtt_XAmb0heYiL+Q<&LzYt<^#$v=J-h!{T}h-GB8#>Hl}FP1aeQF$a@59V zHC)%-*)OCdG$YaY>>2c!jX58c28>YtoQU+54EJ!Aqurr27Ta35L>9_j9ycQ!w$mpF zZUlOBtUh6Xy;mkVD`YFx?M7gXT1(m*{5fzOQL?PoY##WB^iCd@4SNqUxom+(Wp0)p z_+<0l(PL~R0EI%!ISWvP9l*8HM~?asA7$x|o*MTFy;?V(w`4z~m41(ZW=uxPXy3N_ zDF2DFd?c-^Ylk};`gfFzmB6VG%m_A?nTRqUFWu5#7^(TMyX*2|t&!$VI`(m%=TYZJ z<}QTH1dUX89@gjOvtoYBJHMdmqeuK2lKGu?u)r^{%4F+HD_bA9josX6$obE>@Z$%7 zE8k>e1@Ok+9{|&bD_3%2*WHJHX^1#5aR zz&7o|{z1EtTPf*?h&ihFlN&Kye2#r(et5`78!bc<9AejS1)i}}@l8YZkf5^D8)3%p zm*b~AwzGAv!;*QNVbAwwIPT*yqPp%|Uu9vhp{xVcxXbi>QPS*^19`)oJ`Sj_j1&t` zN1t1)$lYEJeC`vESCN* 9;w=X7q}|Aos t|kP9ekl$)YB@meRl{EzpWMNUVBh9XlG z!||m=KiDsdG?lxcm#vTwyEXdShy-U10V4J;m5l@19(~6zC`5X21d8{QKlAiZK_L#T zf9Ukp&WTV~1 lAWiQ5RnEWJBre~8kd7gVjo&_ed{ zPF_@3mOW8RQsGu^O_5nr^qS_S+J J_0k{~1x!CRrI$38UwmwoNn<`!2K7%@Sdc!%dao};SCetc!LWC5>NE4F?Y49s z-6-`J{)WM;ZISnzJLu&Z#F|2tqf3{df%&X&d0$@#id^$NI~rWOr@A2mg9hdG3daQL zyZJ{kqGtsGrGGz#p+=;G!BPG%71#fj-uv}>q(bcX8+}m$rA}}+NWeOo{$kshA@dfH zaa-COx)GIj=0HKED%v$`RyG5w)Iirm)K !2T;Gq2u@k(gJ<bQ3y0Et?%d7MSbb{W5yd8Kb+@MwTD_wya+v`wVgdC5jNOL%_amFhn#HXMQK|5a0n zmu?QbEcBMp%);4TS6SHjvAGXFtIn!$=|BI-)0Mi_#c@RGonP^@cB3JemWxREQ*VhO z4i}~-z1_|uL(*kVqd$ _8?VWU=>~Hnr#JuP-heGy6*SgB zlcW%}L>ybkqw%)Y-ebRag=Qes3cAvXq+i<-;H3pf2h})^i#_nX&7_W`BY+qY%5{a! z;8v$<;xe9eJ^!;_QYXx>_5P0@?FlX0&{CL`uz&MX5od*U#ldj>x9?=4g@P~8ui0I+ z6_zv5ORx|N=56yk&DVFOU>f+^Y|9$g13Lc68Q)kOUO+3d+f*QJW~*rX?=#-M0;LuC zO1FQ|ykN+CMZ5fGEGol3Q=gBriO8Uc_BA8sQTkF0`y#lt&_P~zK5Yg*wMrLb`1(&Y zMmyrS#;~nkN*lEda5gD=39_NFV>@?yNQVI5iq2Eaui}hsbYI|gMoKW7Ij$_4gLO;X z?m)lZk^`4D!aO+q;gOPr#(SL!7}AKp%1&${eeFc{RVd_W`P|L0^LNDkr=+-oT(I|& zJRAvwSw5kIN0+PrubGsBNtq;9q)bAQe3F;aH5ePocpCu9r44dj`0ok*!+#LemFZf# zN(17pZ%*f_+{X7(TT;-!(~382ua*o43B#$*xp{x39pAvAzXYuG{1?;WtU$dql7}2! zhsE$8-iI5mmSrcT{pZ+7gDd-?e3&+SD- nN0|uGpi1E8YOtCx%L~_dMtm9(!AI52#ongk7 zMPM8NQ1md7?bIeZFOhD(a35j&F{XGGb<4WBN*@KaOo*QlaOFd98 m(u2GG}0i zDEmJ0M&2Vj`;QK(fUJCF#PN1>Gv-xx)I;oDcRApDS4dMQt!(Qk)F4j{(<9cKH{!2L zuQc(7%^P9SQOq_)YnJEG-JHeNAsSu?LXQ{)$59KDs#lN1JA#AppoBKkh;E;Rj8q89 zA{kBY8Gn!6D};&`{1GzE#%mV4bvQeA%MfHkI)yl1?K5{pV`#t{pXa@oEauI}eRV;) zZE(sBdpshT77h;@d@#?lmAX?9;7{YOKkh>eFLx`v{tzTfcKJuQh5x;CZZ=2vb>}h$ zU4F_5Tjj!Tv{7jxCD9h)9Dg)74siNSb+3|N=S7kwVZbUE=14OB1ii?zl^L>9Ep``H zfaifS5`g}Alxym2FoE)BJV~=lyT2&Hh 8RW?{C683U6-ZRpizQkC6JCZ!wxk&z z%XybWCKp~eKW{*0%NcM$Oj$a$^G2F8Te|-)S%d`$+ ~R@~iP0u+ZrkwS5b6>WeLptu&-;%?vn zyH9uS%Y8WedpR>Zv$L}^J115{P2mj|1r`7Rcmq|G)%uS%|0^K+f7NXxQ|CWmx+xlZ z007uT|0@Jf92zpk0B=O6mCIALsjLQ0WKmN(6RxbadSFh^_EVi*b#^Al6+>qm7K% zp|;i+IOvoZPJ}@F&~KO#_$ =@+5oKCK_Q&cu*Iwy-xa7FRWcZ0+@R7KCqcLR4Hj9xhIR-IZuiKDjf z%)aaTyModF^sXm*(d{jhBO&W3@fE1g1h+I}SXiJJ?}p0yp<5G92=!k3;c6Comx$VU z_inW7#cu^&c9$8qyE~7FD4dZ!S(x!YX;W6;i^zOZu1r|gQ6WFP{^nwFRAH|^#4*Y+ z|HDQom$<(f%F_^F!RO-r4@y0Sg~vYiZ@UxSzrOY?Pn2+(C*SXLiip2RRnV-43X6to zXKrmW9|V%7D?yN?XX#{xWiRWP|0EzomX?i8rHRhw!P`GVe5ZMA#P?hO`PGwd5$DxC zK}zw&M!Op@tH*g3r<`pBIEJb6>7OTSw`k_kBY8txgm#{me!WI@a!k?$-t8ML4qeS% zTO=k}@3Myl&+jA>7V%`3@Xd_jy_}wTpzaBxD*D=`aRs0AX6$WcNZ{$$4K07nuOeb# z)Vt(vz5t&!kEVw6!HPlN9#mg>!s;Gam7+rkieJh%sobh_l#MZ)TD}WVY;H>VTwMj3 z9Z4V%3|(dl%6#g9SLNTacET{+2c1vO#Glk8tVV
H zhnAQutm*sfnE|cZqJ4u0bfgT5(vyq<58539@Y^J}5l< vAM3Eiulh8a}@TJR}BP0LD>YMGP3%bx>jC@sj+|sNm zhN?ZmC{bi8pDJ#q-DX5=8p0IiKiXjlsh`MZeuZ_J4p_Yra$I7qEb*zM&tTP3lf!() zkL7dAFF_AF#pcFl;+;5RxNw(HVA-9Y{-bhO!C%8C<214hK3Y=0IBCvLouMbKiF};B zkysB5c*m&!%#svzJ^Dp4XJjT@S{-9J_!`ykCnE`vz<4QI0~B51=1pDf=|e^!fHX=c zR*~?w58ID59Lf9wNBQHH^dTJ6Kl=2iRCS2fItrE>8?NsDR9g_Hqsu&E;>0Ix9u{R| zOf=!o+24BI!=&5};@HBj59l|Z=7G*F@{bGw11_ v<;iQ0tcQ?WxmxAIbj@cTl?H}DY^;8ODu#;=1bPNuw*3h*dG-2y6T^y zb>DM4N>Q(HyV>n $7Y 4ah}qLtT)2 z_rkKyP?o=pFK~<4r8_~~e)ALK=UuHUQDnG|Q}o`Vi(ZfgL->Q5`)M(C*&=*_734o0 zE9lHbYLa!Ocx0(Q2uT|^J-VIby6w$Ut~wHye}uO(GiF)k9_LUW0k`K7dN@>@A&;ws zg5j0+n~1bGI#Cs@)Okg`+)^{TIq_*aMygql`vpx#A8BqM)`knI6_V5m4iBwhPVn07 zn(bJVs8m;4A7!4cu!a R+VaQFon~KQAR_`mN9 *%oYo5;rg9nE_BTI`N!oH8fG{GA*Sp$>{q?bLmWNs)Z3!h+IYwZ`q zF;hTqfpBN_NsHUI6LS}-d8V2;i B$`QU_1n!rN<{-EJ8v49 zrG?}!#>9UYrOb^ZlMX5q3e8*i0Mw9NE=_m?_%=`l6MFH!e*2TlEtZsZOo3Wb2}&pK ziM2>4UQ`7vV0g*LbJx+HQKkcAGCONL>lb`^39dV&h#O?w4V8E6&>O zh-*Zj(MU5mkw?%)&j^}@?kx=TVLX#YpFEIsaVXFK)lYa_dFIn1`|S@BTx}gXTs?IV zzy14e nNPKX>ylg z97xS#wi*@T83SxSU}&TZV^!LnL0?;jv#tBmAkem@W@@#(m|ApT)Xt0&0cfTEW $gJBd9sZHb34mQME6Ig$nE1cm(26Ck2P~@_@{T8 za9Yyj>aSns-&RY`oXC(MBIe3|sb(8?+46nrYRR6W4!5r< g{+ds zpXz@SAD_%+r&W&H--8Xz6_kjk_rKFkHH?Sp^Tp1r#2DarZfG^X`*AtKIrY=Retvyx z?MS?Ie9)Kj&)P!)$0~pDIlqxM?yLsMxRW##yBGoFh)W}klm%++0e~nY0F6ObH4En1 zq8dW1H=1d(V-SG({lQ!jx0Ibr#M^Yk>dqVYvqiOQr^2mY`tohJFbT?fqwwqNc!R*J z!J}30lzr;xs BAYj2=Alg#@%jzk4wR97$6x{(Fs2$xF*(0J zlO$M!FaoJj@~ ixhK}aG z(%$g;!T79&)_$%^_;Y|)PF;E_8A8TUnFw08|GXzcvoDe4ak52TNST|>>9{?f*L4zf zQfT4*UJG4A3G@XN@yhZ~H)DKAj{s5{BLG|(;>oL{B%I-nBGETub?Jj4ol`_* qWfVM z9`hnNt_)K5{C7itPCR>riI0*(B8?5eia>8Pc`$)B7Xme~m`1^dvRM_9Qg4A2ntvR8 zs*M~g;{f2~xEgv$fm?v^f=XmVszZV#aQkhH0-Aw0t^&ri_g(nQHJDOw(1F`4KW+3v z@L2Sn >~oa>j2x4xa3{*?7op^O}i6W5y^2qZ)x?qCr?3 zNzf6B92dbclvrf~;Yjwg5%b7M6=8{|OaB^xbnYobiZC%$eO@Jkq>1d`ppWr^zCOEr zz4@DL63%~%BaK(AL++6Hgm}TO{XMAuq=~UVn|xjRWwu5Nh$>wlSiz_SYYvmvT?^6F zZNxRCFUKnfY+L0pcT|K{Yk@Oze&;|0$pd!P*ZQ9O$rp{5ejkvHy#obb)%KKeHxbe4 zIENI8$6%FLgP9zAWW-#+MbAyxZ-AgC?n*pdjp%YVaKM#KFP_h Qp<*10E$o9+qQl_dqi!HYg!pROHdCAPXf9ud2U7?_%*N|1U@HS#cft3^myiMSM zY~V{fc}yl{T@Ca`y{mULGZ^U%z9n#-zPBBt3BZboc1M79t1z52u5OEge^%!9iS5!*YRBT=QS)JADVyqVj*=lk5Z(%2R` zmPUD0Gy#5sle1gG =BA%X)RO=)Qt86{hLIwkV-SgSB5~ zK=M=^WKwe~`S;WH)dGqb ^
#4e0-EqUQYD4SC5x$AhcLM> z0rT1c`^FO1znDgIg%qsaS3{QFhBH5(UE7i+@c4P+`Sm8#I5OrNgn52I(T#5^<}Y(p zuX~4&LamVHwu2R7>|qOzK;j$WGkpac7L(XB0&Bf%+z(^nJ$7Omj%%a5Q=f;pwHb}! z -C z5(4CmZ4z2gIQTnZj_o)u(Gzi16l4^Xp 27%ta|20<6OM^mIW(v9#p-c>jK4pY7HIckBLr{bg3*IhN8Uk-;>} z{^BiXhW5ph2a&bn5_3LGp6IPoJ0X}> ^pq zh|y@79eJ}cNeCfUL^2=<5s8@*_Qh=bZ1`T7*AMtWdFRp1^fw }`dHlj376T gpmd_{ z+Ld%PFI3zHz5WB#6No>(Lta{l-Nr4-rl)}dZzI3hYJgLkSxnX+;fK{vwIu7NCMIEa zs08YCKoEp_Jf_&DS^T>}pZ9q)wpR6ZJA2r9@gW7CSbKcd5K?%w`nmZxdCJXl%WCIY zy@aw?MNFE&Gz&|wm((pFv}PXIqjy59r_mUPL~FZZTTYg&V$%` SW7J`QVua)0@WrIr>C z^s H^aS` wfK0+V+CqfQNi4P>`t-Yx^TE?*}iPfmV9ESI) zcoy4W?h~g*qHZt0O5zW%$OEckl)GjAOn!1yg bNYrz$Q=#|{ zcl8_x?%mAt`K*)qY0R?O-{|A_%CJUiHz329rTLJ=SKZoyr#iKfB~3=O%F{A22Jbwy zStP%}b%h0{Sc~^H@q;ov4==zPnVClA$+SIRvNzg_ J?M?{UsdQR+H7->2 z#XvX$NSMST#oB1Cps5zgOJ2fZO4eXk-4fY!@u#DA`+l11fTUa_N&CB!RIRm1Fb-M= zG>C2VCBTQY{r$vPM|ErUcdV^`iKm>_kE8UL2JhD`^w~wYjE34QQz*rxs$iDe9>BjW zg8Z@bHzKIWFuE}qO#~=SkwC2}ByH@oXpAQU)`1H=*Jg=f7Qq~x&cL?Vt-f%4gd{c?D9Avl!U!EBrAAvpaCY?SIMs4IeeSSi$qjn;n3eHxbg=tT_MK zkeWMxn=?t0uk?1?7d$5g#am*dFE>tR2paR@D>le)uOeVhK4Hj*4aPM8S {JBLM$te^%ED`OKCspv&iWg>I0wnLHz##D6UFf(gJJm!=01s2V)j8-BY881|9wlM zPp@4k{XIM(pLjh3@QX2!Z>TGEq*+N-UvU#9HVs;3xNFbLVQh=A2QOvjOrpEJE~0y+ zfL9bB@<^vLLl{)bJyH24p_14| 8DL&{RVs siqBcVZiKGZg zl5W{WNv4gx9ZV6z^PcAyay5{+VmM}?q=?uE+3VzFwXZ9fMky+JvB5u hz+h; zfR>pS)2)PSBN& r^%?>i zk9KNT`DqV}z3v8as6`d++|&A=FdBB0nmljZ4o0MGbi 34LaLEd zlYNNM`ih* ghNc;$s?I5kjtx6J*$Hn^w z+n0l(5IHOnpBrv)I0%?ONZrqxC!`Tp>d>z&{Ei#Xo^EU-)$d>=t+hHr(j2A9K~`lg zt#W3|NjEd>$$Yl=jaICTfgBOYaAIt}W}o!jGABdDZGt30Lg)RW;#!Qzcy?P%d6l5k z(|8Ee#DmR#PZb{)<1%1BN{?cLLs7vBZYh$@Y3bya(Gu@BGPc8Q&3aiB8j7l4T*jEI zHa*o4Gy5A-H4EYEXHYaODYt)He)Nh#!FyBZT%}M{@o*|}k4~aA+M7_h#geol^_nUv zQ%c0PMkOk$g7~i@nwFka2e8<3*AA$lVzv?#Qrd5=vL+xgwH#c_hi-FmZ2SYyq$Nw| z#$EESkS_aIMQx9??$KGg5GKbtWX6Xf&ZQy;8$MyPrDrUUNYO-9%>1};Z7+jv2efUI zD4QihI7$5grwZs1rR pQ*4M2TS8= zB2q$_z4wT% z(Mp?|Dulj0faZdB7$O)fcd%2i`(wUCk7B<& yLh5?+9d5X zAAXYZHZ#J=4=s8&ZgoAouXAOgN$_yr12))X{IjLD8QSqVs4Gk(FOY}I_0XDBB3cSX zp+dP97Z3IHGpX{^Xc@=6ccF&F-HY*-m-uvi(lXW5CeX6)*+V)QrO}`G_&mv$I8mfX zYFA`O5=!mZgj(bt&acKki%78+4g(dW_O^!59gYouB^^Kby3ElnKkRbh_{4J_s?)U3 zzSDWfeqw+)t>T$=GELmayI4kB^0|Iy`K7vp`RdIW4A>9BWT6!HT?Zptpd9-Qt2q{@ zdjzO(d6^P|X&gFg%1WIggAwlc?)gW5$jaMMQ)RK?mT9n)@`l=Yg9j_-`(&Q?0*clh zM26L>icIhQVCEfJQJ$ocRoXdc#CKJ!L6>{Vo?cPE|FjkGcR66+?OZ4Ow@SRw3kF`x zB&bd_98Gavi+wM2#uHPJDG8M<^S U}^JR~wbikOtvtU5I zJweoYNAs*yoe^nqET88`RX(CW%-%UupORROWJ`Q3zgczUWGFCsrQ^GmgfU`&9zpcR zN9*tOL86!b--~d3@yFY~lTuOp$@T!&p1^7QTp9|SiEC 4v7HMC1R@3!WzDZg11}yL%Oq()a986VLMPYmic; zLx+Bu;h$`~?Hy$yexaWRFWhx(+O>LTj?6)S(L_zEdMmk02;8Wz#jkLr_kKKB&k;fS z&z1x6=pz)${+&nQXEgE^NeWVEOfh_R8Rmi@^iYcLaz%YN5(jbN6`CVk_>Di4vLA9= zcEQVL-Jlw@)wsxk@FNk(*jwXSZuTc)EZ^#K_Q4WWV^{dwLq9U|d@Glh0c3IMd{QKN z{GT IWb1&4eJJQ6{^S_$kTOC{5D!7ZONiBwDN zc}eA6kQN9-0oz|iDtt16^#1o|jC?$aI;Zo>PwYKT!ks(152tH$#?>;MPos&eUMD@o z3|qr&;RL*jHypMn@tv6W90{N%NUO#-;&c|4y*2-c56xlt>q^-(#+-Kh9p$1=6Y3V( z%Ikgu#&F-=H?$>mBnrU9xJ?UNJJxLvoTH%3C{Gqu>VgF7d70t38PD48HgN?)8@Cge zYtaj;udOaS|7e}8kpvmtoi||(xIXb-iVF>GSF0@Co(1t-2R4WA1?ZIHoO|YReae>L z`zDMI%7ai2=+t}*=CIzF>Ml7sSxN8&fxr((hFDMR++S7q?x4i$e}mvEp|(xi2=f$} zYd 3JkEf%g4S?{9s>hu@ 7_cXanChXTl(?rVm?F9hGBcwil zl>nMpeG=1i>Vo&JymxSdS_=%d-?a?Gj3!4zxkT@1iAL%je`Wi3C2S+f94tQizcW4N zP*F?d5lfeX#tf+VJ#;`Jx3ThJBh@mZ3j F!#{o1wt>KUS!VO~fwN6A`50YCJt7`Z<_CZwJ)ydlF{j6ZXy!8ecWZ`# zy@_sFOXmK8hSHkO`vMi*Yq7hll8` `ApU;hs LC(IkYqi+#cFe2 z 6Jc2O8$LngM*g-gMg z%J;KPr}wJ$oB-eN9S2#;T>(`}%=VgKy|cS8_75&4oqUmQJ26An%RbY=mM45K3DqPG z${y?;dxS=vq#n1;rUMjd`681OPZA4#KDJ5i#%g9rZVQ^O!>u@D0Ust~UQt7f4~r!n zsTQL{S2YKYLqK0yLRDhkX&6d)`MYes`CzJdd6p;LmO y^V;6YG8^D^=TLZU@eJRPy&byxudl!&DFx-t!o>y&GRf-3;oI*c)hM7Mv _fRzo%`W)Hx?FD{{N=l|KC{rKSNL1lPke?7-w_w Sq40m{KL9GHCR-