Merge branch 'pr_84'

# Conflicts:
#	plugins/genshin/apps/gcLog.js
This commit is contained in:
Kokomi 2023-08-21 03:10:45 +08:00
commit aa19c3d793
18 changed files with 970 additions and 148 deletions

View File

@ -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(`${data.srtempFile}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 = `<style> .head_box { background: url(${this._path}/plugins/genshin/resources/StarRail/img/worldcard/星穹列车.png) #fff; background-position-x: -10px; background-repeat: no-repeat; background-size: 540px; background-position-y: -100px; </style>`
}
return name
}
}

View File

@ -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(`${data.srtempFile}dailyNote`, data)
if (img) await this.reply(img)
}

View File

@ -55,12 +55,11 @@ 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){
let file = ['./data/gachaJson', './data/srJson', './temp/html/StarRail']
for (let i of file) {
if (!fs.existsSync(i)) {
fs.mkdirSync(i)
}
@ -98,8 +97,8 @@ 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(`${data.srtempFile}gachaLog`, data)
if (img) await this.reply(img)
}
@ -121,13 +120,8 @@ 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 = `<style> .head_box { background: url(${this._path}/plugins/genshin/resources/StarRail/img/worldcard/星穹列车.png) #fff; background-repeat: no-repeat; background-position-x: -10px; background-size: 500px; background-position-y: -90px; }</style>`
}
let img = await puppeteer.screenshot(url, data)
let img = await puppeteer.screenshot(`${data.srtempFile}gachaLog`, data)
if (img) await this.reply(img)
}
@ -211,6 +205,7 @@ 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) {
@ -220,6 +215,7 @@ export class gcLog extends plugin {
}
return name
}
async logCount () {
let data = await new LogCount(this.e).count()
if (!data) return

View File

@ -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(`${data.srtempFile}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(`${data.srtempFile}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(`${data.srtempFile}ledgerCount`, data)
if (img) await this.reply(img)
}
}

View File

@ -20,13 +20,25 @@ 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: `<style> .head_box { background: url(${this._path}/plugins/genshin/resources/StarRail/img/worldcard/星穹列车.png) #fff; background-position-x: -10px; background-repeat: no-repeat; background-size: 540px; background-position-y: -100px; </style>`,
srtempFile: 'StarRail/'
}
return {
saveId: this.userId,
cwd: this._path,
tplFile: `./plugins/genshin/resources/html/${this.model}/${this.model}.html`,
/** 绝对路径 */
pluResPath: `${this._path}/plugins/genshin/resources/`,
headStyle: `<style> .head_box { background: url(${this._path}/plugins/genshin/resources/img/namecard/${headImg}.png) #fff; background-position-x: 42px; background-repeat: no-repeat; background-size: auto 101%; }</style>`
headStyle: `<style> .head_box { background: url(${this._path}/plugins/genshin/resources/img/namecard/${headImg}.png) #fff; background-position-x: 42px; background-repeat: no-repeat; background-size: auto 101%; }</style>`,
srtempFile: ''
}
}
}

View File

@ -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,102 @@ 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]]
item.action_name = item.action_name.slice(0, 4)
} 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)
let week = [
'星期日',
'星期一',
'星期二',
'星期三',
'星期四',
'星期五',
'星期六'
]
let srday = `${week[moment().day()]}`
return {
saveId: this.e.uid,
uid: this.e.uid,
day,
day, icon, srday,
nowDay: moment(new Date()).format('YYYY年MM月DD日'),
...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 +196,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 +212,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')).ck
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 +269,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 +282,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 +302,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 +324,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 +368,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 +411,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.slice(0, 4)
})
let pieData = {}
for (let val of groupBy) {
if (!pieData[val.action]) {
@ -370,7 +437,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

View File

@ -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}`
},
/** 角色详情 */

View File

@ -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
}

View File

@ -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

View File

@ -4,7 +4,7 @@
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<link rel="shortcut icon" href="#" />
<link rel="stylesheet" type="text/css" href="{{pluResPath}}StarRail/html/dailyNote/dailyNote.css"/>
<link rel="stylesheet" type="text/css" href="{{pluResPath}}html/dailyNote/dailyNote.css"/>
<link rel="preload" href="{{resPath}}font/tttgbnumber.ttf" as="font">
</head>
@ -18,7 +18,7 @@
</div>
<div class="title_date">
<div class="icon">
<img src="{{pluResPath}}StarRail/img/role/{{icon}}.webp" />
<img src="{{pluResPath}}img/role/{{icon}}.webp" />
</div>
<div class="title_date_text">
<div>{{nowDay}}</div>
@ -51,7 +51,7 @@
<div class="bottom_icon">
{{each ex.avatars avatars}}
{{if avatars=='派遣头像'}}
<div><img src="{{pluResPath}}StarRail/img/role/{{avatars}}.png" alt=""></div>
<div><img src="{{pluResPath}}img/role/{{avatars}}.png" alt=""></div>
{{else}}
<div><img src="{{avatars}}" alt=""></div>
{{/if}}

View File

@ -3,9 +3,9 @@
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<link rel="shortcut icon" href="#"/>
<link rel="stylesheet" type="text/css" href="{{pluResPath}}StarRail/html/gachaLog/gachaLog.css"/>
<link rel="stylesheet" type="text/css" href="{{pluResPath}}html/gachaLog/gachaLog.css"/>
<link rel="preload" href="{{resPath}}font/tttgbnumber.ttf" as="font">
<link rel="preload" href="{{pluResPath}}StarRail/img/worldcard/星穹列车.png" as="image">
<link rel="preload" href="{{pluResPath}}img/worldcard/星穹列车.png" as="image">
{{@headStyle}}
</head>
<body id="container" class="body_box">
@ -20,7 +20,7 @@
{{allNum}}抽
<span class="label label_{{type}}">{{typeName}}池</span>
</h2>
<img class="starrail_logo" src="{{pluResPath}}StarRail/img/other/logo.png"/>
<img class="starrail_logo" src="{{pluResPath}}img/other/logo.png"/>
</div>
<div class="data_box">
@ -50,7 +50,7 @@
<span class="minimum">UP</span>
{{/if}}
<img class="role"
src="{{pluResPath}}StarRail/img/{{val.item_type=='角色'?'role':'weapon'}}/{{val.name}}.webp"
src="{{pluResPath}}img/{{val.item_type=='角色'?'role':'weapon'}}/{{val.name}}.webp"
onerror="whenError(this,'{{val.item_type=='角色'?'role':'weapon'}}')"/>
<!-- <div class="num">{{val.num}}</div>-->
<div class="num_name">{{val.num}}</div>

View File

@ -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: 470px;
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: 100px;
}
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: 70px;
}
.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: 250px;
}
.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;
}

View File

@ -0,0 +1,138 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<link rel="shortcut icon" href="#" />
<link rel="stylesheet" type="text/css" href="{{pluResPath}}html/ledger/ledger.css" />
<link rel="preload" href="https://unpkg.com/@antv/g2plot@latest/dist/g2plot.min.js" as="script" />
<link rel="preload" href="{{resPath}}font/tttgbnumber.ttf" as="font">
</head>
<body id="container">
<div class="container">
<div class="title">
<div class="uid">
<div class="uid_item"><span class="uid_text">UID:</span><span class="uid_span">{{uid}}</span>
</div>
<div class="uid_item"><span class="day_span">开拓月历·{{day}}</span></div>
</div>
</div>
<div class="title_date">
<div class="icon">
<img src="{{pluResPath}}img/role/{{icon}}" />
</div>
<div class="title_date_text">
<div>{{nowDay}}</div>
<div>{{srday}}</div>
</div>
</div>
<div class="subject">
<div class="subject_solid"><span style="width: {{bfStamina}};"></span></div>
<div class="data-box">
<div class="month">
<div class="head">当月获取:</div>
<div class="primogems">
<div class="icon-ys"></div>
<div class="text">星琼:{{month_data.current_hcoin}} | {{month_data.gacha}} 抽</div>
</div>
<div class="primogems">
<div class="icon-mola"></div>
<div class="text">&通票:{{month_data.current_rails_pass}} 张</div>
</div>
</div>
<div class="day">
<div class="head">上月获取:</div>
<div class="primogems">
<div class="icon-ys"></div>
<div class="text">星琼:{{month_data.last_hcoin}} | {{month_data.last_gacha}} 抽</div>
</div>
<div class="primogems">
<div class="icon-mola"></div>
<div class="text">&通票:{{month_data.last_rails_pass}} 张</div>
</div>
</div>
</div>
</div>
<div class="title_wt">
<div>
星琼收入统计
</div>
</div>
<div class="chart-box">
<div class="chart-info">
<div id="chartContainer"></div>
<ul class="tooltip">
{{each month_data.group_by val}}
<li>
<i style="background: {{val.color}}"></i>
<span class="action"><em>{{val.action_name}}</em></span> <span
class="num"><em>{{val.num}}</em></span><span
class="percent"><em>{{val.percent}}%</em></span>
</li>
{{/each}}
</ul>
</div>
</div>
<div class="logo"> Created By MiaoYunzai-Bot</div>
</div>
</div>
</div>
</body>
<script type="text/javascript" src="https://unpkg.com/@antv/g2plot@latest/dist/g2plot.min.js"></script>
<script>
const { Pie } = G2Plot;
const data = JSON.parse(`{{@ group_by}}`);
const piePlot = new Pie("chartContainer", {
renderer: "svg",
animation: false,
data: data,
appendPadding: 10,
angleField: "num",
colorField: "action_name",
radius: 1,
innerRadius: 0.7,
color: JSON.parse(`{{@ color}}`),
meta: {
// num: {
// formatter: (v) => `${v}`,
// },
},
label: {
type: "inner",
offset: "-50%",
autoRotate: false,
style: {
textAlign: "center",
fontFamily: "tttgbnumber",
"fontSize": 24,
},
formatter: ({ percent }) => {
percent = (percent * 100).toFixed(0);
return percent > 2 ? `${percent}%` : "";
},
},
statistic: {
title: {
offsetY: -18,
content: "总计",
style: {
fontFamily: "tttgbnumber",
"fontSize": 32,
},
},
content: {
offsetY: -10,
style: {
fontFamily: "tttgbnumber",
"fontSize": 48,
},
},
},
legend: false,
});
piePlot.render();
</script>
</html>

View File

@ -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;
}

View File

@ -0,0 +1,188 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<link rel="shortcut icon" href="#" />
<link rel="stylesheet" type="text/css" href="{{pluResPath}}html/ledgerCount/ledgerCount.css" />
<link rel="preload" href="https://unpkg.com/@antv/g2plot@latest/dist/g2plot.min.js" as="script" />
<link rel="preload" href="{{resPath}}font/tttgbnumber.ttf" as="font">
<link rel="preload" href="{{pluResPath}}img/other/logo.png" as="image">
{{@headStyle}}
</head>
<body>
<div class="container" id="container">
<div class="head_box">
<div class="id_text">ID: {{uid}}</div>
<h2 class="day_text">{{yearText}}星琼统计</h2>
<img class="genshin_logo" src="{{pluResPath}}img/other/logo.png" />
</div>
<div class="data_box">
<div class="tab_lable">数据总览</div>
<div class="data_line">
<div class="data_line_item">
<div class="num">{{allPrimogemsShow}}</div>
<div class="lable">总星琼</div>
</div>
<div class="data_line_item">
<div class="num">{{allGacha}}抽</div>
<div class="lable">总抽数</div>
</div>
<div class="data_line_item">
<div class="num">{{maxPrimogems.month}}月</div>
<div class="lable">星琼最多</div>
</div>
<div class="data_line_item">
<div class="num">{{maxPrimogems.value}}</div>
<div class="lable">{{maxPrimogems.month}}月星琼</div>
</div>
</div>
<div class="data_line">
<div class="data_line_item">
<div class="num">{{allMora}}</div>
<div class="lable">总专&通票</div>
</div>
<div class="data_line_item">
<div class="num">{{maxMora.month}}月</div>
<div class="lable">&通票最多</div>
</div>
<div class="data_line_item">
{{if group_by.length>0 }}
<div class="num">{{group_by[0].num}}</div>
<div class="lable">{{group_by[0].action}}</div>
{{/if}}
</div>
<div class="data_line_item">
{{if group_by.length>0 }}
<div class="num">{{group_by[1].num}}</div>
<div class="lable">{{group_by[1].action}}</div>
{{/if}}
</div>
</div>
</div>
<div class="data_box">
<div class="tab_lable">月份统计</div>
<div id="chartContainer"></div>
</div>
<div class="data_box">
<div class="tab_lable">详细统计</div>
<div id="chartContainer2"></div>
</div>
{{if hasMore }}
<div class="hasMore">*该数据只显示最近12个月</div>
{{/if}}
<div class="logo">Created By MiaoYunzai-Bot</div>
</div>
</body>
<script type="text/javascript" src="https://unpkg.com/@antv/g2plot@latest/dist/g2plot.min.js"></script>
<script>
const { Column, Pie } = G2Plot;
const primogemsMonth = JSON.parse(`{{@ primogemsMonth}}`);
const primogemsMax = {{ maxPrimogems.value }};
const stackedColumnPlot = new Column("chartContainer", {
data: primogemsMonth,
isGroup: true,
xField: "month",
yField: "value",
seriesField: "name",
animation: false,
renderer: "svg",
padding: [40, 10, 30, 52],
label: {
position: "top",
style: {
fontFamily: "tttgbnumber",
},
offsetY: 10,
},
xAxis: {
label: {
autoHide: false,
formatter: (v) => {
return v + "月";
},
style: {
fontFamily: "tttgbnumber",
fontSize: 14,
},
},
},
yAxis: {
label: {
style: {
fontFamily: "tttgbnumber",
fontSize: 14,
},
},
},
});
stackedColumnPlot.render();
const countdata = JSON.parse(`{{@ pieData}}`);
const piePlot = new Pie("chartContainer2", {
renderer: "svg",
animation: false,
data: countdata,
appendPadding: 10,
angleField: "num",
colorField: "action",
radius: 1,
innerRadius: 0.7,
// appendPadding: 20,
color: JSON.parse(`{{@ color}}`),
meta: {
// num: {
// formatter: (v) => `${v}`,
// },
},
label: {
type: "inner",
offset: "-50%",
autoRotate: false,
style: {
textAlign: "center",
fontFamily: "tttgbnumber",
},
formatter: ({ percent }) => {
percent = (percent * 100).toFixed(0);
return percent >= 2 ? `${percent}%` : "";
},
},
statistic: {
title: {
offsetY: -8,
content: "总计",
},
content: {
style: {
fontFamily: "tttgbnumber",
},
},
},
legend: {
offsetX: -56,
itemValue: {
formatter: (text, item) => {
const items = countdata.filter((d) => d.action === item.value)[0];
return items.num;
},
style: {
opacity: 0.65,
fontFamily: "tttgbnumber",
"fontSize": 16,
},
},
itemName: {
style: {
"fontSize": 16,
},
}
},
});
piePlot.render();
</script>
</html>

View File

@ -3,7 +3,7 @@
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<link rel="shortcut icon" href="#" />
<link rel="stylesheet" type="text/css" href="{{pluResPath}}StarRail/html/logCount/logCount.css"/>
<link rel="stylesheet" type="text/css" href="{{pluResPath}}html/logCount/logCount.css"/>
<link rel="preload" href="{{resPath}}/font/HYWenHei-55W.ttf" as="font">
<link rel="preload" href="{{resPath}}/font/tttgbnumber.ttf" as="font">
{{@headStyle}}
@ -13,7 +13,7 @@
<div class="head_box">
<div class="id_text">ID: {{uid}}</div>
<h2 class="day_text">抽卡统计-{{typeName}}</h2>
<img class="starrail_logo" src="{{pluResPath}}StarRail/img/other/logo.png"/>
<img class="starrail_logo" src="{{pluResPath}}img/other/logo.png"/>
</div>
{{each pool val}}
{{if val.roleNum > 0}}
@ -33,10 +33,10 @@
<div class="bg{{v.rank_type}}"></div>
<span class="num {{if v.count>=5 && v.rank_type ==5}}life5{{/if}}">{{v.count}}</span>
{{if v.item_type=='角色'}}
<img class="role_img" src="{{pluResPath}}StarRail/img/role/{{v.name}}.webp" onerror="whenError(this,'role')"/>
<img class="role_img" src="{{pluResPath}}img/role/{{v.name}}.webp" onerror="whenError(this,'role')"/>
{{/if}}
{{if v.item_type=='光锥'}}
<img class="role_img" src="{{pluResPath}}StarRail/img/weapon/{{v.name}}.webp" onerror="whenError(this)"/>
<img class="role_img" src="{{pluResPath}}img/weapon/{{v.name}}.webp" onerror="whenError(this)"/>
{{/if}}
</div>
{{/each}}

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB