el-bot
Version:
A quick qq bot framework for mirai.
93 lines (83 loc) • 1.73 kB
text/typescript
import type { Bot } from 'el-bot'
import * as shell from 'shelljs'
/**
* 任务
*/
interface Job {
name: string
do: string[]
}
/**
* 步骤
*/
interface Step {
cmd: string
async: boolean
}
/**
* cli 配置项
*/
export interface CliOptions {
jobs: Job[]
}
/**
* 执行对应任务
* @param jobs
* @param name
*/
function doJobByName(jobs: Job[], name: string) {
jobs.forEach((job: Job) => {
if (job.name && job.name === name && job.do) {
job.do.forEach((step: string | Step) => {
let cmd = ''
let async = false
if (typeof step === 'string') {
cmd = step
}
else {
cmd = step.cmd
async = step.async
}
if (cmd.includes('el run ')) {
name = cmd.slice(7)
doJobByName(jobs, name)
}
shell.exec(cmd, {
async,
})
})
}
})
}
/**
* 为 program 添加初始指令
* @param ctx
* @param options
*/
export function initProgram(ctx: Bot, options: CliOptions, qq: number) {
const program = ctx.cli
// 任务
program
.command('jobs')
.description('任务列表')
.action(async () => {
if (!ctx.user.isAllowed(qq, true))
return
let content = '任务列表:'
options.jobs.forEach((job: Job) => {
if (job.name)
content += `\n- ${job.name}`
})
ctx.reply(content)
})
// 自定义任务
program
.command('run <name>')
.description('运行自定义任务')
.action(async (name: string) => {
if (!ctx.user.isAllowed(qq, true))
return
if (options && options.jobs && options.jobs.length > 0)
doJobByName(options.jobs, name)
})
}