@shangxueink/koishi-plugin-qq-markdown-button
Version:
[<ruby>**QQ机器人按钮菜单**<rp>(</rp><rt>点我查看使用说明</rt><rp>)</rp></ruby>](https://www.npmjs.com/package/@shangxueink/koishi-plugin-qq-markdown-button) 自用小插件咪~ 使用json文件设置你的机器人菜单这样就不需要一堆配置项还很烧脑了。自用插件哦~
87 lines (73 loc) • 2.61 kB
text/typescript
import path from 'node:path'
import { Context, Session } from 'koishi'
import { Config, usage } from './config'
import { ensureTemplateFiles, resolveBaseDir } from './files'
import { createLogger } from './logger'
import { getButtonData, getInteractionId, isSupportedPlatform } from './session'
import { sendMenuSequence } from './sender'
import { setupTemplateCatalog } from './template-catalog'
import type { Config as PluginConfig } from './types'
export const name = 'qq-markdown-button'
export const reusable = true
export const inject = {
optional: ['database'],
}
export { Config, usage }
export function apply(ctx: Context, config: PluginConfig) {
const logger = createLogger(ctx, config.consoleinfo)
const baseDir = resolveBaseDir(ctx.baseDir, config.file_name_v2)
const templateRoot = path.resolve(__dirname, '..', 'qq')
try {
ensureTemplateFiles(baseDir, templateRoot)
logger.debug(`模板目录:${baseDir}`)
} catch (error) {
logger.error('初始化模板文件时出错', error)
}
const disposeTemplateCatalog = setupTemplateCatalog(ctx, baseDir, logger)
ctx.effect(() => {
return () => {
disposeTemplateCatalog()
}
})
if (config.Allow_INTERACTION_CREATE) {
ctx.on('interaction/button', async (session: Session) => {
const buttonData = getButtonData(session)
if (!buttonData) return
logger.debug(`接收到回调按钮内容:${buttonData}`)
const interactionId = getInteractionId(session)
if (session.qq && interactionId) {
void session.qq.acknowledgeInteraction(interactionId, { code: 0 }).catch((error) => {
logger.error('执行 acknowledgeInteraction 时出错', error)
})
}
try {
await session.execute(buttonData)
} catch (error) {
logger.error('执行回调按钮内容时出错', error)
}
})
}
ctx.command(`${config.command_name} [...args]`, '发送按钮菜单', { strictOptions: true })
.action(async ({ session }, ...args: string[]) => {
if (!session) return
if (!isSupportedPlatform(session)) {
await session.send('仅支持QQ官方平台使用本指令。')
return
}
if (!config.send_sequence.length) {
await session.send('当前未配置发送步骤。')
return
}
try {
await sendMenuSequence({
baseDir,
session,
config,
args,
interactionId: getInteractionId(session),
}, logger)
} catch (error) {
logger.error('处理指令时出错', error)
}
})
}