UNPKG

koishi-plugin-genshin

Version:

Genshin Impact player data fetcher and gacha simulator for Koishi.js

119 lines (109 loc) 3.96 kB
const { template, segment, Time } = require('koishi-utils') const { isValidCnUid, CharactersFilter } = require('genshin-kit').util const { dateFormat, getTimeLeft } = require('../utils/dateFormat') /** * @param {import('koishi-core').Context} ctx * @param {{genshin: import('genshin-kit').GenshinKit}} arg1 */ function apply(ctx, { genshin }) { ctx .command('genshin.abyss', template('genshin.cmd_abyss_desc'), { minInterval: Time.second * 15, }) // .shortcut(/(原神深渊|深境螺旋)/) .option('uid', `-u <uid:posint> ${template('genshin.cmd_specify_uid')}`) .option('previous', '-p 查询上一期的数据', { type: 'boolean' }) .userFields(['genshin_uid']) .check(({ session, options }) => { let uid = options.uid || session.user.genshin_uid if (!uid) return template('genshin.not_registered') if (!isValidCnUid(uid)) return template('genshin.invalid_cn_uid') }) .action(async ({ session, options }) => { let uid = options.uid || session.user.genshin_uid const type = options.previous ? 'prev' : 'cur' Promise.all([ genshin.getAbyss(uid, type === 'cur' ? 1 : 2, true), genshin.getUserInfo(uid, true), ]).then( (data) => { // 变量 const [abyssInfo, basicInfo] = data const Filter = new CharactersFilter(basicInfo.avatars || []) const { start_time, end_time, total_battle_times, total_win_times, max_floor, total_star, is_unlock, reveal_rank, damage_rank, take_damage_rank, energy_skill_rank, } = abyssInfo const startTimeStr = dateFormat( 'yyyy年M月d日 hh:mm:ss', new Date(start_time * 1000) ) const endTimeStr = dateFormat( 'yyyy年M月d日 hh:mm:ss', new Date(end_time * 1000) ) // 格式化的顶尖信息 function formatedCharacterValue(data) { if (data.length < 1) return '无' let top = data[0] return `${Filter.id(top.avatar_id).name || top.avatar_id} ${ top.value }` } // 格式化信息 let msg = '' if (!is_unlock) { msg += template(`genshin.abyss_${type}_not_active`, uid) } else { msg += [ template(`genshin.abyss_${type}_is_active`, uid), template('genshin.abyss_basic_data', { max_floor, total_win_times, total_battle_times, total_star, }), template('genshin.abyss_top_stats', { damage_rank: formatedCharacterValue(damage_rank), take_damage_rank: formatedCharacterValue(take_damage_rank), reveal_rank: formatedCharacterValue(reveal_rank), energy_skill_rank: formatedCharacterValue(energy_skill_rank), }), ].join('\n') } // 时间信息 msg += '\n\n' if (type === 'cur') { msg += template( 'genshin.abyss_cur_time', endTimeStr, getTimeLeft(end_time * 1000) ) } else { msg += template('genshin.abyss_prev_time', startTimeStr, endTimeStr) } // 发送 session.send(segment('quote', { id: session.messageId }) + msg) }, (err) => { session.send( segment('quote', { id: session.messageId }) + template('genshin.failed', err.message || '出现未知问题') ) } ) }) } module.exports = { name: 'genshin/abyss', apply, }