koishi-plugin-genshin
Version:
Genshin Impact player data fetcher and gacha simulator for Koishi.js
169 lines (148 loc) • 5.3 kB
JavaScript
const { GenshinGachaKit, util } = require('genshin-gacha-kit')
const { Logger } = require('koishi-core')
const logger = new Logger('genshin')
logger.log = logger.info
const gachaTypeNameToId = {
角色: 301,
武器: 302,
常驻: 200,
}
const gachaAppTypeToTypeName = {
character: '角色',
weapon: '武器',
permanent: '常驻',
novice: '新手',
}
/**
* @param {import('koishi-core').Context} ctx
* @param {*} pOptions
*/
function apply(ctx, pOptions) {
ctx
.command('genshin.wish')
.alias('原神抽卡')
.option('number', '-n <number:posint>', { fallback: 1 })
// .option('name','-n <pool> 选定抽卡时的卡池名称')
.option('type', '-t <type> 选定抽卡时的卡池类别(角色/武器/常驻)', {
fallback: '角色',
})
.option('list-all', '-L 查看全部可用卡池')
.option('list', '-l <type> 查看相关类型卡池的内容')
// .option('add', '-a <name> 为本群添加卡池', { authority: 2 })
// .option('remove', '-r <name> 为本群移除卡池', { authority: 2 })
// .channelFields(['genshin_gacha_pool'])
.userFields(['genshin_gacha'])
.check(check)
.action(action)
async function check({ session, options }) {
logger.info('wish', options)
if (options['list-all']) {
const index = await util.getGachaIndex()
const poolIds = index.map((i) => i.gacha_id)
const queue = []
poolIds.forEach((id) => queue.push(util.getGachaData(id)))
let pools = await Promise.all(queue)
pools = pools.map((i) => util.poolStructureConverter(i))
return [
`当前可用的卡池共有 ${pools.length} 个:`,
pools
.map((i) => {
return `${i.name} (${i.upSSR.map((i) => i.name).join('、')} UP)`
})
.join('\n'),
].join('\n')
}
if (options.list) {
if (!gachaTypeNameToId[options.list])
return '没有这个类型的卡池:' + options.list
let pool = await util.getOfficialGachaPool(
gachaTypeNameToId[options.list]
)
pool = util.poolStructureConverter(pool)
return [
`${pool.name}`,
`${gachaAppTypeToTypeName[pool.type]}池`,
`5星 UP:${pool.upSSR.map((i) => i.name).join('、') || '无'}`,
`4星 UP:${pool.upSR.map((i) => i.name).join('、') || '无'}`,
].join('\n')
}
}
async function action({ session, options }) {
const gacha = new GenshinGachaKit()
let genshin_gacha = session.user.genshin_gacha
console.log('1111', genshin_gacha)
const { counter, result } = genshin_gacha
console.log('2222', { counter, result })
if (counter?.total !== undefined && result?.r !== undefined) {
gacha.setCounter(counter)
gacha.setResult(result)
}
let number = options.number
number = Math.min(90, number)
number = Math.max(1, number)
let pool = await util.getOfficialGachaPool(gachaTypeNameToId[options.type])
if (!pool) return `无法拉取 ${options.type} 的卡池信息。`
pool = util.poolStructureConverter(pool)
gacha.setGachaPool(pool)
const items = gacha.multiWish(number)
const savedData = {
counter: gacha.getCounter(),
result: gacha.getResult(),
}
console.log('保存数据', savedData)
genshin_gacha = savedData
await session.user._update()
console.log('数据库中的数据', session.user.genshin_gacha)
return `抽到了 ${items
.map((i) => `${i.name}(${i.rarity}星)x${i.count}`)
.join('、')}`
}
ctx
.command('genshin.backpack')
.option('reset', '-R')
.userFields(['genshin_gacha'])
.action(async ({ session, options }) => {
let genshin_gacha = session.user.genshin_gacha
if (!genshin_gacha) return '您还未抽过卡。'
if (options.reset) {
const gacha = new GenshinGachaKit()
gacha.clearCounter().clearResult()
genshin_gacha = {
counter: gacha.getCounter(),
result: gacha.getResult(),
}
await session.user._update()
return '已重置背包。'
}
const { counter, result } = Object.assign({}, genshin_gacha)
console.log(JSON.stringify({ counter, result }))
return [
`您共抽了 ${counter.total} 次卡`,
`五星角色:${result.ssr
.filter((i) => i.type === 'character')
.map((i) => i.name)
.join('、') || '无'}`,
`五星武器:${result.ssr
.filter((i) => i.type === 'weapon')
.map((i) => i.name)
.join('、') || '无'}`,
`距离上一次五星 ${counter.lastSSR} 抽,您现在${
counter.ensureSSR === 1 ? '有' : '没有'
}大保底。`,
].join('\n')
})
ctx
.command('arr')
.userFields(['arr_test'])
.action(async ({ session }) => {
const arr = session.user.arr_test || []
arr.push({ length: { foo: { bar: [arr.length] } } })
session.user.arr_test = arr
await session.user._update()
return JSON.stringify(arr)
})
}
module.exports = {
name: 'genshin/wish',
apply,
}