koishi-plugin-genshin
Version:
Genshin Impact player data fetcher and gacha simulator for Koishi.js
97 lines (90 loc) • 3.1 kB
JavaScript
const { template, segment, Time } = require('koishi-utils')
const {
isValidCnUid,
CharactersFilter,
activedConstellations,
} = require('genshin-kit').util
/**
* @param {import('koishi-core').Context} ctx
* @param {{genshin: import('genshin-kit').GenshinKit}} arg1
*/
function apply(ctx, { genshin }) {
ctx
.command(
'genshin.character <name>',
template('genshin.cmd_character_desc'),
{
minInterval: Time.second * 15,
}
)
.option('uid', `-u <uid:posint> ${template('genshin.cmd_specify_uid')}`)
.example('genshin.character 旅行者')
.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 }, name = '旅行者') => {
let uid = options.uid || session.user.genshin_uid
try {
const allCharacters = await genshin.getAllCharacters(uid, true)
const Filter = new CharactersFilter(allCharacters)
const character = Filter.name(name)
if (!character) return template('genshin.no_character', uid, name)
// 截图
if (ctx.app.puppeteer) {
const image = await require('../modules/renderCharacter')({
uid,
character,
ctx,
})
return segment('quote', { id: session.messageId }) + image
}
// 文字版
return [
template('genshin.has_character', uid, character.name),
template('genshin.character_basic', {
icon: segment('image', { url: character.icon }),
image: segment('image', { url: character.image }),
name: character.name,
rarity: character.rarity,
constellation: activedConstellations(character),
level: character.level,
fetter: character.fetter,
}),
template('genshin.character_weapon', {
name: character.weapon.name,
rarity: character.weapon.rarity,
type_name: character.weapon.type_name,
level: character.weapon.level,
affix_level: character.weapon.affix_level,
}),
template(
'genshin.character_reliquaries',
reliquariesFmt(character.reliquaries)
),
].join('\n')
} catch (err) {
return (
segment('quote', { id: session.messageId }) +
template(
'genshin.failed',
err.message || template('genshin.error_unknown')
)
)
}
})
function reliquariesFmt(reliquaries) {
if (reliquaries.length < 1) return '无'
let msg = ''
reliquaries.forEach((item) => {
msg += `${item.pos_name}:${item.name} (${item.rarity}★)\n`
})
return msg.trim()
}
}
module.exports = {
name: 'genshin/character',
apply,
}