mioki 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.cjs +2 -2
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.mjs +2 -2
- package/dist/cli.mjs.map +1 -1
- package/dist/index.cjs +9 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +9 -9
- package/dist/index.mjs.map +1 -1
- package/dist/package-C-2yoqkl.mjs +6 -0
- package/dist/package-C-2yoqkl.mjs.map +1 -0
- package/dist/{package-CBPOLltF.cjs → package-DtVmw4Ds.cjs} +2 -2
- package/dist/package-DtVmw4Ds.cjs.map +1 -0
- package/package.json +2 -2
- package/dist/package-BcfUfnW0.mjs +0 -6
- package/dist/package-BcfUfnW0.mjs.map +0 -1
- package/dist/package-CBPOLltF.cjs.map +0 -1
package/dist/cli.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
const require_package = require('./package-
|
|
2
|
+
const require_package = require('./package-DtVmw4Ds.cjs');
|
|
3
3
|
let node_fs = require("node:fs");
|
|
4
4
|
node_fs = require_package.__toESM(node_fs);
|
|
5
5
|
let node_path = require("node:path");
|
|
@@ -156,7 +156,7 @@ const args = process.argv.slice(2);
|
|
|
156
156
|
// 调用消息实例上挂载的快速方法
|
|
157
157
|
// e.reply('这是群消息的回复') // 回复消息
|
|
158
158
|
// e.recall() // 撤回消息
|
|
159
|
-
// e.
|
|
159
|
+
// e.getQuoteMsg() // 获取引用的消息
|
|
160
160
|
// e.group.getInfo(); // 也可以通过群消息事件获取群实例,并调用群实例方法获取群信息
|
|
161
161
|
})
|
|
162
162
|
|
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.cjs","names":["version","fs","path"],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport fs from 'node:fs'\nimport mri from 'mri'\nimport path from 'node:path'\nimport dedent from 'dedent'\nimport consola from 'consola'\nimport { version } from '../package.json'\n\nimport type { ConfirmPromptOptions, TextPromptOptions } from 'consola'\n\nconst args = process.argv.slice(2)\n\ninterface CliOptions {\n name?: string\n protocol?: string\n host?: string\n port?: number\n token?: string\n prefix?: string\n owners?: string\n admins?: string\n help?: boolean\n version?: boolean\n 'use-npm-mirror'?: boolean\n}\n\n;(async () => {\n const cli = mri<CliOptions>(args, {\n alias: {\n v: 'version',\n h: 'help',\n },\n })\n\n const helpInfo = dedent(\n `\n mioki 命令行工具 v${version}\n\n 选项:\n -h, --help 显示帮助信息\n -v, --version 显示版本号\n\n 用法: mioki <命令> [选项]\n\n 命令:\n init [选项] 创建一个新的 mioki 项目\n\n 选项:\n --name <name> 指定项目名称\n --protocol <protocol> 指定 NapCat 协议,默认 ws\n --host <host> 指定 NapCat 主机,默认 localhost\n --port <port> 指定 NapCat 端口,默认 3333\n --token <token> 指定 NapCat 连接令牌\n --prefix <prefix> 指定命令前缀,默认 #\n --owners <owners> 指定主人 QQ,英文逗号分隔\n --admins <admins> 指定管理员 QQ,英文逗号分隔\n --use-npm-mirror 使用 npm 镜像源加速依赖安装\n`,\n )\n\n switch (true) {\n case cli.version:\n console.log(`v${version}`)\n process.exit(0)\n\n case cli.help:\n console.log(helpInfo)\n process.exit(0)\n }\n\n const {\n name = await input('请输入项目名称', { default: 'bot', placeholder: 'bot', required: true }),\n protocol = await input('请输入 NapCat WS 协议', { default: 'ws', placeholder: 'ws', required: true }),\n host = await input('请输入 NapCat WS 主机', { default: 'localhost', placeholder: 'localhost', required: true }),\n port = parseInt(await input('请输入 NapCat WS 端口', { default: '3333', placeholder: '3333', required: true })),\n token = await input('请输入 NapCat WS Token(必填)', { default: '', placeholder: '请输入', required: true }),\n prefix = await input('请输入消息命令前缀', { default: '#', placeholder: '#', required: true }),\n owners = await input('请输入主人 QQ (最高权限,英文逗号分隔,必填)', { placeholder: '请输入', required: true }),\n admins = (await input('请输入管理员 QQ (插件权限,英文逗号分隔,可空)', { placeholder: '可空' })) || '',\n 'use-npm-mirror': useNpmMirror = await confirm('是否使用 npm 镜像源加速依赖安装?'),\n } = cli\n\n const pkgJson = dedent(`\n {\n \"name\": \"mioki-bot\",\n \"private\": true,\n \"dependencies\": {\n \"mioki\": \"^${version}\"\n },\n \"mioki\": {\n \"prefix\": \"${prefix}\",\n \"owners\": [${owners\n .split(',')\n .map((o) => o.trim())\n .join(', ')}],\n \"admins\": [${\n admins\n ? admins\n .split(',')\n .map((o) => `\"${o.trim()}\"`)\n .join(', ')\n : ''\n }],\n \"plugins\": [],\n \"log_level\": \"info\",\n \"online_push\": true,\n \"error_push\": true,\n \"napcat\": {\n \"protocol\": \"${protocol}\",\n \"port\": ${port},\n \"host\": \"${host}\",\n \"token\": \"${token}\"\n }\n },\n \"scripts\": {\n \"start\": \"node app.ts\"\n }\n }\n`)\n\n const pluginCode = dedent(`\n import { definePlugin } from 'mioki'\n\n export default definePlugin({\n name: 'demo',\n version: '${version}',\n async setup(ctx) {\n ctx.logger.info('Demo 插件已加载')\n\n // ctx.bot.nickname;\n // ctx.bot.uin;\n // ctx.bot.api('xxx', params);\n\n // ctx.bot.sendGroupMsg(123456789, 'Hello Group!') // 发送群消息\n\n // const group = await ctx.bot.pickGroup(123456789) // 使用群号选择一个群实例\n // group?.sign() // 调用群实例方法\n\n // const friend = await ctx.bot.pickFriend(987654321) // 使用好友号选择一个好友实例\n // friend?.delete() // 调用好友实例方法\n\n // 处理所有消息:群、好友\n ctx.handle('message', async (e) => {\n // 收到 hello 消息时回复 world\n if (e.raw_message === 'hello') {\n // 第二个参数表示是否回复原消息\n e.reply('world', true)\n }\n\n // 收到 love 消息时回复\"爱你哟\"和一个爱心 QQ 表情\n if (e.raw_message === 'love') {\n // 复杂消息消息可以使用数组组合\n e.reply(['爱你哟 ', ctx.segment.face(66)])\n }\n\n // 收到 壁纸 消息时回复今天的 bing 壁纸\n if (e.raw_message === '壁纸') {\n e.reply(ctx.segment.image('https://60s.viki.moe/v2/bing?encoding=image'))\n }\n\n // 收到 一言 消息时回复一言\n if (e.raw_message === '一言') {\n const data = await (await fetch('https://v1.hitokoto.cn/')).json()\n e.reply(data.hitokoto, true)\n }\n })\n\n ctx.handle('message.group', (e) => {\n // 处理群消息\n // 调用消息实例上挂载的快速方法\n // e.reply('这是群消息的回复') // 回复消息\n // e.recall() // 撤回消息\n // e.getQuoteMessage() // 获取引用的消息\n // e.group.getInfo(); // 也可以通过群消息事件获取群实例,并调用群实例方法获取群信息\n })\n\n ctx.handle('message.private', (e) => {\n // 处理好友消息\n })\n\n // 处理所有请求:好友、群,添加好友、邀请入群等等\n ctx.handle('request', (e) => {\n e.approve() // 同意请求\n // e.reject() // 拒绝请求\n })\n\n // 处理所有通知,好友、群的数量增加与减少、戳一戳、撤回等等\n ctx.handle('notice', (e) => {\n ctx.logger.info('Notice', e)\n })\n\n // 注册定时任务\n ctx.cron('*/3 * * * * *', async (ctx, task) => {\n ctx.logger.info('Cron', task)\n })\n\n return () => {\n ctx.logger.info('Demo 插件已卸载')\n }\n },\n })\n\n`)\n\n const npmrc = dedent(`\n registry=https://registry.npmmirror.com\n fund=false\n`)\n\n const fileTree = {\n 'app.ts': \"require('mioki').start({ cwd: __dirname })\",\n 'package.json': pkgJson,\n plugins: { demo: { 'index.ts': pluginCode } },\n ...(useNpmMirror ? { '.npmrc': npmrc } : {}),\n }\n\n createNewProject(name, fileTree)\n})()\n\nasync function createNewProject(name: string, fileTree: Record<string, any>) {\n const projectName = name\n const projectPath = withRoot(`./${projectName}`)\n\n if (fs.existsSync(projectPath)) {\n const overwrite = await confirm(`项目 ${projectName} 已存在,是否覆盖?`)\n\n if (!overwrite) {\n gracefullyExit()\n }\n\n if (projectPath === process.cwd()) {\n if (fs.readdirSync(projectPath).length !== 0) {\n const confirmOver = await confirm('项目路径与当前路径相同,将删除当前目录下所有内容再创建,是否继续?')\n if (!confirmOver) {\n gracefullyExit()\n }\n }\n }\n\n fs.rmSync(projectPath, { recursive: true })\n }\n\n fs.mkdirSync(projectPath)\n\n makeFileTree(fileTree, projectPath)\n\n console.log(`项目 ${projectName} 创建成功!根据下面的引导启动 mioki。`)\n console.log(`\\ncd ${projectPath} && npm install && npm start\\n`)\n}\n\nfunction gracefullyExit() {\n console.log('Bye!')\n process.exit(0)\n}\n\nfunction withRoot(_path: string) {\n return path.resolve(process.cwd(), _path)\n}\n\ntype OmitTypeWithRequired<T> = Omit<T, 'type' | 'required'> & { required?: boolean }\n\nasync function confirm(message: string, options?: OmitTypeWithRequired<ConfirmPromptOptions>) {\n return consola.prompt(message, { type: 'confirm', cancel: 'reject', ...options })\n}\n\nasync function input(message: string, options?: OmitTypeWithRequired<TextPromptOptions>) {\n const res = await consola.prompt(message, { type: 'text', cancel: 'reject', ...options })\n if (options?.required) required(res)\n return res\n}\n\nfunction makeFileTree(\n fileTree: Record<string, string | Record<string, string | Record<string, string>>>,\n base: string,\n) {\n for (const [name, content] of Object.entries(fileTree)) {\n if (typeof content === 'object' && content !== null) {\n const subPath = `${base}/${name}`\n if (!fs.existsSync(subPath)) {\n fs.mkdirSync(subPath)\n }\n for (const [subName, subContent] of Object.entries(content)) {\n if (typeof subContent === 'object') {\n makeFileTree(content, subPath)\n } else {\n fs.writeFileSync(`${subPath}/${subName}`, subContent)\n }\n }\n } else {\n const filePath = `${base}/${name}`\n const dirname = path.dirname(filePath)\n if (!fs.existsSync(dirname)) {\n fs.mkdirSync(dirname)\n }\n fs.writeFileSync(filePath, content)\n }\n }\n}\n\nfunction required<T extends string | undefined | null | Array<string | undefined | null>>(value: T): T {\n if (Array.isArray(value) ? !value.length : !value) {\n console.error('目标值不能为空')\n process.exit(1)\n }\n\n return value\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.cjs","names":["version","fs","path"],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport fs from 'node:fs'\nimport mri from 'mri'\nimport path from 'node:path'\nimport dedent from 'dedent'\nimport consola from 'consola'\nimport { version } from '../package.json'\n\nimport type { ConfirmPromptOptions, TextPromptOptions } from 'consola'\n\nconst args = process.argv.slice(2)\n\ninterface CliOptions {\n name?: string\n protocol?: string\n host?: string\n port?: number\n token?: string\n prefix?: string\n owners?: string\n admins?: string\n help?: boolean\n version?: boolean\n 'use-npm-mirror'?: boolean\n}\n\n;(async () => {\n const cli = mri<CliOptions>(args, {\n alias: {\n v: 'version',\n h: 'help',\n },\n })\n\n const helpInfo = dedent(\n `\n mioki 命令行工具 v${version}\n\n 选项:\n -h, --help 显示帮助信息\n -v, --version 显示版本号\n\n 用法: mioki <命令> [选项]\n\n 命令:\n init [选项] 创建一个新的 mioki 项目\n\n 选项:\n --name <name> 指定项目名称\n --protocol <protocol> 指定 NapCat 协议,默认 ws\n --host <host> 指定 NapCat 主机,默认 localhost\n --port <port> 指定 NapCat 端口,默认 3333\n --token <token> 指定 NapCat 连接令牌\n --prefix <prefix> 指定命令前缀,默认 #\n --owners <owners> 指定主人 QQ,英文逗号分隔\n --admins <admins> 指定管理员 QQ,英文逗号分隔\n --use-npm-mirror 使用 npm 镜像源加速依赖安装\n`,\n )\n\n switch (true) {\n case cli.version:\n console.log(`v${version}`)\n process.exit(0)\n\n case cli.help:\n console.log(helpInfo)\n process.exit(0)\n }\n\n const {\n name = await input('请输入项目名称', { default: 'bot', placeholder: 'bot', required: true }),\n protocol = await input('请输入 NapCat WS 协议', { default: 'ws', placeholder: 'ws', required: true }),\n host = await input('请输入 NapCat WS 主机', { default: 'localhost', placeholder: 'localhost', required: true }),\n port = parseInt(await input('请输入 NapCat WS 端口', { default: '3333', placeholder: '3333', required: true })),\n token = await input('请输入 NapCat WS Token(必填)', { default: '', placeholder: '请输入', required: true }),\n prefix = await input('请输入消息命令前缀', { default: '#', placeholder: '#', required: true }),\n owners = await input('请输入主人 QQ (最高权限,英文逗号分隔,必填)', { placeholder: '请输入', required: true }),\n admins = (await input('请输入管理员 QQ (插件权限,英文逗号分隔,可空)', { placeholder: '可空' })) || '',\n 'use-npm-mirror': useNpmMirror = await confirm('是否使用 npm 镜像源加速依赖安装?'),\n } = cli\n\n const pkgJson = dedent(`\n {\n \"name\": \"mioki-bot\",\n \"private\": true,\n \"dependencies\": {\n \"mioki\": \"^${version}\"\n },\n \"mioki\": {\n \"prefix\": \"${prefix}\",\n \"owners\": [${owners\n .split(',')\n .map((o) => o.trim())\n .join(', ')}],\n \"admins\": [${\n admins\n ? admins\n .split(',')\n .map((o) => `\"${o.trim()}\"`)\n .join(', ')\n : ''\n }],\n \"plugins\": [],\n \"log_level\": \"info\",\n \"online_push\": true,\n \"error_push\": true,\n \"napcat\": {\n \"protocol\": \"${protocol}\",\n \"port\": ${port},\n \"host\": \"${host}\",\n \"token\": \"${token}\"\n }\n },\n \"scripts\": {\n \"start\": \"node app.ts\"\n }\n }\n`)\n\n const pluginCode = dedent(`\n import { definePlugin } from 'mioki'\n\n export default definePlugin({\n name: 'demo',\n version: '${version}',\n async setup(ctx) {\n ctx.logger.info('Demo 插件已加载')\n\n // ctx.bot.nickname;\n // ctx.bot.uin;\n // ctx.bot.api('xxx', params);\n\n // ctx.bot.sendGroupMsg(123456789, 'Hello Group!') // 发送群消息\n\n // const group = await ctx.bot.pickGroup(123456789) // 使用群号选择一个群实例\n // group?.sign() // 调用群实例方法\n\n // const friend = await ctx.bot.pickFriend(987654321) // 使用好友号选择一个好友实例\n // friend?.delete() // 调用好友实例方法\n\n // 处理所有消息:群、好友\n ctx.handle('message', async (e) => {\n // 收到 hello 消息时回复 world\n if (e.raw_message === 'hello') {\n // 第二个参数表示是否回复原消息\n e.reply('world', true)\n }\n\n // 收到 love 消息时回复\"爱你哟\"和一个爱心 QQ 表情\n if (e.raw_message === 'love') {\n // 复杂消息消息可以使用数组组合\n e.reply(['爱你哟 ', ctx.segment.face(66)])\n }\n\n // 收到 壁纸 消息时回复今天的 bing 壁纸\n if (e.raw_message === '壁纸') {\n e.reply(ctx.segment.image('https://60s.viki.moe/v2/bing?encoding=image'))\n }\n\n // 收到 一言 消息时回复一言\n if (e.raw_message === '一言') {\n const data = await (await fetch('https://v1.hitokoto.cn/')).json()\n e.reply(data.hitokoto, true)\n }\n })\n\n ctx.handle('message.group', (e) => {\n // 处理群消息\n // 调用消息实例上挂载的快速方法\n // e.reply('这是群消息的回复') // 回复消息\n // e.recall() // 撤回消息\n // e.getQuoteMsg() // 获取引用的消息\n // e.group.getInfo(); // 也可以通过群消息事件获取群实例,并调用群实例方法获取群信息\n })\n\n ctx.handle('message.private', (e) => {\n // 处理好友消息\n })\n\n // 处理所有请求:好友、群,添加好友、邀请入群等等\n ctx.handle('request', (e) => {\n e.approve() // 同意请求\n // e.reject() // 拒绝请求\n })\n\n // 处理所有通知,好友、群的数量增加与减少、戳一戳、撤回等等\n ctx.handle('notice', (e) => {\n ctx.logger.info('Notice', e)\n })\n\n // 注册定时任务\n ctx.cron('*/3 * * * * *', async (ctx, task) => {\n ctx.logger.info('Cron', task)\n })\n\n return () => {\n ctx.logger.info('Demo 插件已卸载')\n }\n },\n })\n\n`)\n\n const npmrc = dedent(`\n registry=https://registry.npmmirror.com\n fund=false\n`)\n\n const fileTree = {\n 'app.ts': \"require('mioki').start({ cwd: __dirname })\",\n 'package.json': pkgJson,\n plugins: { demo: { 'index.ts': pluginCode } },\n ...(useNpmMirror ? { '.npmrc': npmrc } : {}),\n }\n\n createNewProject(name, fileTree)\n})()\n\nasync function createNewProject(name: string, fileTree: Record<string, any>) {\n const projectName = name\n const projectPath = withRoot(`./${projectName}`)\n\n if (fs.existsSync(projectPath)) {\n const overwrite = await confirm(`项目 ${projectName} 已存在,是否覆盖?`)\n\n if (!overwrite) {\n gracefullyExit()\n }\n\n if (projectPath === process.cwd()) {\n if (fs.readdirSync(projectPath).length !== 0) {\n const confirmOver = await confirm('项目路径与当前路径相同,将删除当前目录下所有内容再创建,是否继续?')\n if (!confirmOver) {\n gracefullyExit()\n }\n }\n }\n\n fs.rmSync(projectPath, { recursive: true })\n }\n\n fs.mkdirSync(projectPath)\n\n makeFileTree(fileTree, projectPath)\n\n console.log(`项目 ${projectName} 创建成功!根据下面的引导启动 mioki。`)\n console.log(`\\ncd ${projectPath} && npm install && npm start\\n`)\n}\n\nfunction gracefullyExit() {\n console.log('Bye!')\n process.exit(0)\n}\n\nfunction withRoot(_path: string) {\n return path.resolve(process.cwd(), _path)\n}\n\ntype OmitTypeWithRequired<T> = Omit<T, 'type' | 'required'> & { required?: boolean }\n\nasync function confirm(message: string, options?: OmitTypeWithRequired<ConfirmPromptOptions>) {\n return consola.prompt(message, { type: 'confirm', cancel: 'reject', ...options })\n}\n\nasync function input(message: string, options?: OmitTypeWithRequired<TextPromptOptions>) {\n const res = await consola.prompt(message, { type: 'text', cancel: 'reject', ...options })\n if (options?.required) required(res)\n return res\n}\n\nfunction makeFileTree(\n fileTree: Record<string, string | Record<string, string | Record<string, string>>>,\n base: string,\n) {\n for (const [name, content] of Object.entries(fileTree)) {\n if (typeof content === 'object' && content !== null) {\n const subPath = `${base}/${name}`\n if (!fs.existsSync(subPath)) {\n fs.mkdirSync(subPath)\n }\n for (const [subName, subContent] of Object.entries(content)) {\n if (typeof subContent === 'object') {\n makeFileTree(content, subPath)\n } else {\n fs.writeFileSync(`${subPath}/${subName}`, subContent)\n }\n }\n } else {\n const filePath = `${base}/${name}`\n const dirname = path.dirname(filePath)\n if (!fs.existsSync(dirname)) {\n fs.mkdirSync(dirname)\n }\n fs.writeFileSync(filePath, content)\n }\n }\n}\n\nfunction required<T extends string | undefined | null | Array<string | undefined | null>>(value: T): T {\n if (Array.isArray(value) ? !value.length : !value) {\n console.error('目标值不能为空')\n process.exit(1)\n }\n\n return value\n}\n"],"mappings":"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"}
|
package/dist/cli.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { t as version } from "./package-
|
|
2
|
+
import { t as version } from "./package-C-2yoqkl.mjs";
|
|
3
3
|
import fs from "node:fs";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import mri from "mri";
|
|
@@ -151,7 +151,7 @@ const args = process.argv.slice(2);
|
|
|
151
151
|
// 调用消息实例上挂载的快速方法
|
|
152
152
|
// e.reply('这是群消息的回复') // 回复消息
|
|
153
153
|
// e.recall() // 撤回消息
|
|
154
|
-
// e.
|
|
154
|
+
// e.getQuoteMsg() // 获取引用的消息
|
|
155
155
|
// e.group.getInfo(); // 也可以通过群消息事件获取群实例,并调用群实例方法获取群信息
|
|
156
156
|
})
|
|
157
157
|
|
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport fs from 'node:fs'\nimport mri from 'mri'\nimport path from 'node:path'\nimport dedent from 'dedent'\nimport consola from 'consola'\nimport { version } from '../package.json'\n\nimport type { ConfirmPromptOptions, TextPromptOptions } from 'consola'\n\nconst args = process.argv.slice(2)\n\ninterface CliOptions {\n name?: string\n protocol?: string\n host?: string\n port?: number\n token?: string\n prefix?: string\n owners?: string\n admins?: string\n help?: boolean\n version?: boolean\n 'use-npm-mirror'?: boolean\n}\n\n;(async () => {\n const cli = mri<CliOptions>(args, {\n alias: {\n v: 'version',\n h: 'help',\n },\n })\n\n const helpInfo = dedent(\n `\n mioki 命令行工具 v${version}\n\n 选项:\n -h, --help 显示帮助信息\n -v, --version 显示版本号\n\n 用法: mioki <命令> [选项]\n\n 命令:\n init [选项] 创建一个新的 mioki 项目\n\n 选项:\n --name <name> 指定项目名称\n --protocol <protocol> 指定 NapCat 协议,默认 ws\n --host <host> 指定 NapCat 主机,默认 localhost\n --port <port> 指定 NapCat 端口,默认 3333\n --token <token> 指定 NapCat 连接令牌\n --prefix <prefix> 指定命令前缀,默认 #\n --owners <owners> 指定主人 QQ,英文逗号分隔\n --admins <admins> 指定管理员 QQ,英文逗号分隔\n --use-npm-mirror 使用 npm 镜像源加速依赖安装\n`,\n )\n\n switch (true) {\n case cli.version:\n console.log(`v${version}`)\n process.exit(0)\n\n case cli.help:\n console.log(helpInfo)\n process.exit(0)\n }\n\n const {\n name = await input('请输入项目名称', { default: 'bot', placeholder: 'bot', required: true }),\n protocol = await input('请输入 NapCat WS 协议', { default: 'ws', placeholder: 'ws', required: true }),\n host = await input('请输入 NapCat WS 主机', { default: 'localhost', placeholder: 'localhost', required: true }),\n port = parseInt(await input('请输入 NapCat WS 端口', { default: '3333', placeholder: '3333', required: true })),\n token = await input('请输入 NapCat WS Token(必填)', { default: '', placeholder: '请输入', required: true }),\n prefix = await input('请输入消息命令前缀', { default: '#', placeholder: '#', required: true }),\n owners = await input('请输入主人 QQ (最高权限,英文逗号分隔,必填)', { placeholder: '请输入', required: true }),\n admins = (await input('请输入管理员 QQ (插件权限,英文逗号分隔,可空)', { placeholder: '可空' })) || '',\n 'use-npm-mirror': useNpmMirror = await confirm('是否使用 npm 镜像源加速依赖安装?'),\n } = cli\n\n const pkgJson = dedent(`\n {\n \"name\": \"mioki-bot\",\n \"private\": true,\n \"dependencies\": {\n \"mioki\": \"^${version}\"\n },\n \"mioki\": {\n \"prefix\": \"${prefix}\",\n \"owners\": [${owners\n .split(',')\n .map((o) => o.trim())\n .join(', ')}],\n \"admins\": [${\n admins\n ? admins\n .split(',')\n .map((o) => `\"${o.trim()}\"`)\n .join(', ')\n : ''\n }],\n \"plugins\": [],\n \"log_level\": \"info\",\n \"online_push\": true,\n \"error_push\": true,\n \"napcat\": {\n \"protocol\": \"${protocol}\",\n \"port\": ${port},\n \"host\": \"${host}\",\n \"token\": \"${token}\"\n }\n },\n \"scripts\": {\n \"start\": \"node app.ts\"\n }\n }\n`)\n\n const pluginCode = dedent(`\n import { definePlugin } from 'mioki'\n\n export default definePlugin({\n name: 'demo',\n version: '${version}',\n async setup(ctx) {\n ctx.logger.info('Demo 插件已加载')\n\n // ctx.bot.nickname;\n // ctx.bot.uin;\n // ctx.bot.api('xxx', params);\n\n // ctx.bot.sendGroupMsg(123456789, 'Hello Group!') // 发送群消息\n\n // const group = await ctx.bot.pickGroup(123456789) // 使用群号选择一个群实例\n // group?.sign() // 调用群实例方法\n\n // const friend = await ctx.bot.pickFriend(987654321) // 使用好友号选择一个好友实例\n // friend?.delete() // 调用好友实例方法\n\n // 处理所有消息:群、好友\n ctx.handle('message', async (e) => {\n // 收到 hello 消息时回复 world\n if (e.raw_message === 'hello') {\n // 第二个参数表示是否回复原消息\n e.reply('world', true)\n }\n\n // 收到 love 消息时回复\"爱你哟\"和一个爱心 QQ 表情\n if (e.raw_message === 'love') {\n // 复杂消息消息可以使用数组组合\n e.reply(['爱你哟 ', ctx.segment.face(66)])\n }\n\n // 收到 壁纸 消息时回复今天的 bing 壁纸\n if (e.raw_message === '壁纸') {\n e.reply(ctx.segment.image('https://60s.viki.moe/v2/bing?encoding=image'))\n }\n\n // 收到 一言 消息时回复一言\n if (e.raw_message === '一言') {\n const data = await (await fetch('https://v1.hitokoto.cn/')).json()\n e.reply(data.hitokoto, true)\n }\n })\n\n ctx.handle('message.group', (e) => {\n // 处理群消息\n // 调用消息实例上挂载的快速方法\n // e.reply('这是群消息的回复') // 回复消息\n // e.recall() // 撤回消息\n // e.getQuoteMessage() // 获取引用的消息\n // e.group.getInfo(); // 也可以通过群消息事件获取群实例,并调用群实例方法获取群信息\n })\n\n ctx.handle('message.private', (e) => {\n // 处理好友消息\n })\n\n // 处理所有请求:好友、群,添加好友、邀请入群等等\n ctx.handle('request', (e) => {\n e.approve() // 同意请求\n // e.reject() // 拒绝请求\n })\n\n // 处理所有通知,好友、群的数量增加与减少、戳一戳、撤回等等\n ctx.handle('notice', (e) => {\n ctx.logger.info('Notice', e)\n })\n\n // 注册定时任务\n ctx.cron('*/3 * * * * *', async (ctx, task) => {\n ctx.logger.info('Cron', task)\n })\n\n return () => {\n ctx.logger.info('Demo 插件已卸载')\n }\n },\n })\n\n`)\n\n const npmrc = dedent(`\n registry=https://registry.npmmirror.com\n fund=false\n`)\n\n const fileTree = {\n 'app.ts': \"require('mioki').start({ cwd: __dirname })\",\n 'package.json': pkgJson,\n plugins: { demo: { 'index.ts': pluginCode } },\n ...(useNpmMirror ? { '.npmrc': npmrc } : {}),\n }\n\n createNewProject(name, fileTree)\n})()\n\nasync function createNewProject(name: string, fileTree: Record<string, any>) {\n const projectName = name\n const projectPath = withRoot(`./${projectName}`)\n\n if (fs.existsSync(projectPath)) {\n const overwrite = await confirm(`项目 ${projectName} 已存在,是否覆盖?`)\n\n if (!overwrite) {\n gracefullyExit()\n }\n\n if (projectPath === process.cwd()) {\n if (fs.readdirSync(projectPath).length !== 0) {\n const confirmOver = await confirm('项目路径与当前路径相同,将删除当前目录下所有内容再创建,是否继续?')\n if (!confirmOver) {\n gracefullyExit()\n }\n }\n }\n\n fs.rmSync(projectPath, { recursive: true })\n }\n\n fs.mkdirSync(projectPath)\n\n makeFileTree(fileTree, projectPath)\n\n console.log(`项目 ${projectName} 创建成功!根据下面的引导启动 mioki。`)\n console.log(`\\ncd ${projectPath} && npm install && npm start\\n`)\n}\n\nfunction gracefullyExit() {\n console.log('Bye!')\n process.exit(0)\n}\n\nfunction withRoot(_path: string) {\n return path.resolve(process.cwd(), _path)\n}\n\ntype OmitTypeWithRequired<T> = Omit<T, 'type' | 'required'> & { required?: boolean }\n\nasync function confirm(message: string, options?: OmitTypeWithRequired<ConfirmPromptOptions>) {\n return consola.prompt(message, { type: 'confirm', cancel: 'reject', ...options })\n}\n\nasync function input(message: string, options?: OmitTypeWithRequired<TextPromptOptions>) {\n const res = await consola.prompt(message, { type: 'text', cancel: 'reject', ...options })\n if (options?.required) required(res)\n return res\n}\n\nfunction makeFileTree(\n fileTree: Record<string, string | Record<string, string | Record<string, string>>>,\n base: string,\n) {\n for (const [name, content] of Object.entries(fileTree)) {\n if (typeof content === 'object' && content !== null) {\n const subPath = `${base}/${name}`\n if (!fs.existsSync(subPath)) {\n fs.mkdirSync(subPath)\n }\n for (const [subName, subContent] of Object.entries(content)) {\n if (typeof subContent === 'object') {\n makeFileTree(content, subPath)\n } else {\n fs.writeFileSync(`${subPath}/${subName}`, subContent)\n }\n }\n } else {\n const filePath = `${base}/${name}`\n const dirname = path.dirname(filePath)\n if (!fs.existsSync(dirname)) {\n fs.mkdirSync(dirname)\n }\n fs.writeFileSync(filePath, content)\n }\n }\n}\n\nfunction required<T extends string | undefined | null | Array<string | undefined | null>>(value: T): T {\n if (Array.isArray(value) ? !value.length : !value) {\n console.error('目标值不能为空')\n process.exit(1)\n }\n\n return value\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":[],"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport fs from 'node:fs'\nimport mri from 'mri'\nimport path from 'node:path'\nimport dedent from 'dedent'\nimport consola from 'consola'\nimport { version } from '../package.json'\n\nimport type { ConfirmPromptOptions, TextPromptOptions } from 'consola'\n\nconst args = process.argv.slice(2)\n\ninterface CliOptions {\n name?: string\n protocol?: string\n host?: string\n port?: number\n token?: string\n prefix?: string\n owners?: string\n admins?: string\n help?: boolean\n version?: boolean\n 'use-npm-mirror'?: boolean\n}\n\n;(async () => {\n const cli = mri<CliOptions>(args, {\n alias: {\n v: 'version',\n h: 'help',\n },\n })\n\n const helpInfo = dedent(\n `\n mioki 命令行工具 v${version}\n\n 选项:\n -h, --help 显示帮助信息\n -v, --version 显示版本号\n\n 用法: mioki <命令> [选项]\n\n 命令:\n init [选项] 创建一个新的 mioki 项目\n\n 选项:\n --name <name> 指定项目名称\n --protocol <protocol> 指定 NapCat 协议,默认 ws\n --host <host> 指定 NapCat 主机,默认 localhost\n --port <port> 指定 NapCat 端口,默认 3333\n --token <token> 指定 NapCat 连接令牌\n --prefix <prefix> 指定命令前缀,默认 #\n --owners <owners> 指定主人 QQ,英文逗号分隔\n --admins <admins> 指定管理员 QQ,英文逗号分隔\n --use-npm-mirror 使用 npm 镜像源加速依赖安装\n`,\n )\n\n switch (true) {\n case cli.version:\n console.log(`v${version}`)\n process.exit(0)\n\n case cli.help:\n console.log(helpInfo)\n process.exit(0)\n }\n\n const {\n name = await input('请输入项目名称', { default: 'bot', placeholder: 'bot', required: true }),\n protocol = await input('请输入 NapCat WS 协议', { default: 'ws', placeholder: 'ws', required: true }),\n host = await input('请输入 NapCat WS 主机', { default: 'localhost', placeholder: 'localhost', required: true }),\n port = parseInt(await input('请输入 NapCat WS 端口', { default: '3333', placeholder: '3333', required: true })),\n token = await input('请输入 NapCat WS Token(必填)', { default: '', placeholder: '请输入', required: true }),\n prefix = await input('请输入消息命令前缀', { default: '#', placeholder: '#', required: true }),\n owners = await input('请输入主人 QQ (最高权限,英文逗号分隔,必填)', { placeholder: '请输入', required: true }),\n admins = (await input('请输入管理员 QQ (插件权限,英文逗号分隔,可空)', { placeholder: '可空' })) || '',\n 'use-npm-mirror': useNpmMirror = await confirm('是否使用 npm 镜像源加速依赖安装?'),\n } = cli\n\n const pkgJson = dedent(`\n {\n \"name\": \"mioki-bot\",\n \"private\": true,\n \"dependencies\": {\n \"mioki\": \"^${version}\"\n },\n \"mioki\": {\n \"prefix\": \"${prefix}\",\n \"owners\": [${owners\n .split(',')\n .map((o) => o.trim())\n .join(', ')}],\n \"admins\": [${\n admins\n ? admins\n .split(',')\n .map((o) => `\"${o.trim()}\"`)\n .join(', ')\n : ''\n }],\n \"plugins\": [],\n \"log_level\": \"info\",\n \"online_push\": true,\n \"error_push\": true,\n \"napcat\": {\n \"protocol\": \"${protocol}\",\n \"port\": ${port},\n \"host\": \"${host}\",\n \"token\": \"${token}\"\n }\n },\n \"scripts\": {\n \"start\": \"node app.ts\"\n }\n }\n`)\n\n const pluginCode = dedent(`\n import { definePlugin } from 'mioki'\n\n export default definePlugin({\n name: 'demo',\n version: '${version}',\n async setup(ctx) {\n ctx.logger.info('Demo 插件已加载')\n\n // ctx.bot.nickname;\n // ctx.bot.uin;\n // ctx.bot.api('xxx', params);\n\n // ctx.bot.sendGroupMsg(123456789, 'Hello Group!') // 发送群消息\n\n // const group = await ctx.bot.pickGroup(123456789) // 使用群号选择一个群实例\n // group?.sign() // 调用群实例方法\n\n // const friend = await ctx.bot.pickFriend(987654321) // 使用好友号选择一个好友实例\n // friend?.delete() // 调用好友实例方法\n\n // 处理所有消息:群、好友\n ctx.handle('message', async (e) => {\n // 收到 hello 消息时回复 world\n if (e.raw_message === 'hello') {\n // 第二个参数表示是否回复原消息\n e.reply('world', true)\n }\n\n // 收到 love 消息时回复\"爱你哟\"和一个爱心 QQ 表情\n if (e.raw_message === 'love') {\n // 复杂消息消息可以使用数组组合\n e.reply(['爱你哟 ', ctx.segment.face(66)])\n }\n\n // 收到 壁纸 消息时回复今天的 bing 壁纸\n if (e.raw_message === '壁纸') {\n e.reply(ctx.segment.image('https://60s.viki.moe/v2/bing?encoding=image'))\n }\n\n // 收到 一言 消息时回复一言\n if (e.raw_message === '一言') {\n const data = await (await fetch('https://v1.hitokoto.cn/')).json()\n e.reply(data.hitokoto, true)\n }\n })\n\n ctx.handle('message.group', (e) => {\n // 处理群消息\n // 调用消息实例上挂载的快速方法\n // e.reply('这是群消息的回复') // 回复消息\n // e.recall() // 撤回消息\n // e.getQuoteMsg() // 获取引用的消息\n // e.group.getInfo(); // 也可以通过群消息事件获取群实例,并调用群实例方法获取群信息\n })\n\n ctx.handle('message.private', (e) => {\n // 处理好友消息\n })\n\n // 处理所有请求:好友、群,添加好友、邀请入群等等\n ctx.handle('request', (e) => {\n e.approve() // 同意请求\n // e.reject() // 拒绝请求\n })\n\n // 处理所有通知,好友、群的数量增加与减少、戳一戳、撤回等等\n ctx.handle('notice', (e) => {\n ctx.logger.info('Notice', e)\n })\n\n // 注册定时任务\n ctx.cron('*/3 * * * * *', async (ctx, task) => {\n ctx.logger.info('Cron', task)\n })\n\n return () => {\n ctx.logger.info('Demo 插件已卸载')\n }\n },\n })\n\n`)\n\n const npmrc = dedent(`\n registry=https://registry.npmmirror.com\n fund=false\n`)\n\n const fileTree = {\n 'app.ts': \"require('mioki').start({ cwd: __dirname })\",\n 'package.json': pkgJson,\n plugins: { demo: { 'index.ts': pluginCode } },\n ...(useNpmMirror ? { '.npmrc': npmrc } : {}),\n }\n\n createNewProject(name, fileTree)\n})()\n\nasync function createNewProject(name: string, fileTree: Record<string, any>) {\n const projectName = name\n const projectPath = withRoot(`./${projectName}`)\n\n if (fs.existsSync(projectPath)) {\n const overwrite = await confirm(`项目 ${projectName} 已存在,是否覆盖?`)\n\n if (!overwrite) {\n gracefullyExit()\n }\n\n if (projectPath === process.cwd()) {\n if (fs.readdirSync(projectPath).length !== 0) {\n const confirmOver = await confirm('项目路径与当前路径相同,将删除当前目录下所有内容再创建,是否继续?')\n if (!confirmOver) {\n gracefullyExit()\n }\n }\n }\n\n fs.rmSync(projectPath, { recursive: true })\n }\n\n fs.mkdirSync(projectPath)\n\n makeFileTree(fileTree, projectPath)\n\n console.log(`项目 ${projectName} 创建成功!根据下面的引导启动 mioki。`)\n console.log(`\\ncd ${projectPath} && npm install && npm start\\n`)\n}\n\nfunction gracefullyExit() {\n console.log('Bye!')\n process.exit(0)\n}\n\nfunction withRoot(_path: string) {\n return path.resolve(process.cwd(), _path)\n}\n\ntype OmitTypeWithRequired<T> = Omit<T, 'type' | 'required'> & { required?: boolean }\n\nasync function confirm(message: string, options?: OmitTypeWithRequired<ConfirmPromptOptions>) {\n return consola.prompt(message, { type: 'confirm', cancel: 'reject', ...options })\n}\n\nasync function input(message: string, options?: OmitTypeWithRequired<TextPromptOptions>) {\n const res = await consola.prompt(message, { type: 'text', cancel: 'reject', ...options })\n if (options?.required) required(res)\n return res\n}\n\nfunction makeFileTree(\n fileTree: Record<string, string | Record<string, string | Record<string, string>>>,\n base: string,\n) {\n for (const [name, content] of Object.entries(fileTree)) {\n if (typeof content === 'object' && content !== null) {\n const subPath = `${base}/${name}`\n if (!fs.existsSync(subPath)) {\n fs.mkdirSync(subPath)\n }\n for (const [subName, subContent] of Object.entries(content)) {\n if (typeof subContent === 'object') {\n makeFileTree(content, subPath)\n } else {\n fs.writeFileSync(`${subPath}/${subName}`, subContent)\n }\n }\n } else {\n const filePath = `${base}/${name}`\n const dirname = path.dirname(filePath)\n if (!fs.existsSync(dirname)) {\n fs.mkdirSync(dirname)\n }\n fs.writeFileSync(filePath, content)\n }\n }\n}\n\nfunction required<T extends string | undefined | null | Array<string | undefined | null>>(value: T): T {\n if (Array.isArray(value) ? !value.length : !value) {\n console.error('目标值不能为空')\n process.exit(1)\n }\n\n return value\n}\n"],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_package = require('./package-
|
|
1
|
+
const require_package = require('./package-DtVmw4Ds.cjs');
|
|
2
2
|
let node_fs = require("node:fs");
|
|
3
3
|
node_fs = require_package.__toESM(node_fs);
|
|
4
4
|
let node_util = require("node:util");
|
|
@@ -68,7 +68,7 @@ var utils_exports = /* @__PURE__ */ require_package.__export({
|
|
|
68
68
|
getQQAvatarLink: () => getQQAvatarLink,
|
|
69
69
|
getQuoteImage: () => getQuoteImage,
|
|
70
70
|
getQuoteImageUrl: () => getQuoteImageUrl,
|
|
71
|
-
|
|
71
|
+
getQuoteMsg: () => getQuoteMsg,
|
|
72
72
|
getQuoteText: () => getQuoteText,
|
|
73
73
|
getTerminalInput: () => getTerminalInput,
|
|
74
74
|
isBoolean: () => isBoolean,
|
|
@@ -453,7 +453,7 @@ function getGroupAvatarLink(group, size = 640) {
|
|
|
453
453
|
}
|
|
454
454
|
const messageCacheMap = /* @__PURE__ */ new Map();
|
|
455
455
|
/** 获取引用回复的消息 */
|
|
456
|
-
async function
|
|
456
|
+
async function getQuoteMsg(event, timeout = 3e3) {
|
|
457
457
|
if (!event.quote_id) return null;
|
|
458
458
|
const quote_id = event.quote_id;
|
|
459
459
|
const key = isGroupMsg(event) ? `${event.group_id}_${quote_id}` : `${event.sender.user_id}_${quote_id}`;
|
|
@@ -476,7 +476,7 @@ async function getQuoteMessage(event, timeout = 3e3) {
|
|
|
476
476
|
});
|
|
477
477
|
}
|
|
478
478
|
messageCacheMap.set(key, "loading");
|
|
479
|
-
const msg = await event.
|
|
479
|
+
const msg = await event.getQuoteMsg();
|
|
480
480
|
if (messageCacheMap.size > 100) messageCacheMap.clear();
|
|
481
481
|
messageCacheMap.set(key, msg);
|
|
482
482
|
return msg;
|
|
@@ -510,7 +510,7 @@ async function getImageUrl(event) {
|
|
|
510
510
|
* 获取引用回复的消息中的图片链接
|
|
511
511
|
*/
|
|
512
512
|
async function getQuoteImageUrl(event) {
|
|
513
|
-
const quoteMsg = await
|
|
513
|
+
const quoteMsg = await getQuoteMsg(event);
|
|
514
514
|
if (!quoteMsg) return "";
|
|
515
515
|
return await getImageUrl(quoteMsg);
|
|
516
516
|
}
|
|
@@ -530,7 +530,7 @@ function getImage(event) {
|
|
|
530
530
|
* 获取引用回复的图片消息
|
|
531
531
|
*/
|
|
532
532
|
async function getQuoteImage(event) {
|
|
533
|
-
const quoteMsg = await
|
|
533
|
+
const quoteMsg = await getQuoteMsg(event);
|
|
534
534
|
if (quoteMsg) return find(quoteMsg.message, "image") || null;
|
|
535
535
|
return null;
|
|
536
536
|
}
|
|
@@ -560,7 +560,7 @@ function text(event, options = {}) {
|
|
|
560
560
|
* 获取回复的消息中的文本内容
|
|
561
561
|
*/
|
|
562
562
|
async function getQuoteText(event) {
|
|
563
|
-
const msg = await
|
|
563
|
+
const msg = await getQuoteMsg(event);
|
|
564
564
|
if (!msg) return "";
|
|
565
565
|
return text(msg);
|
|
566
566
|
}
|
|
@@ -568,7 +568,7 @@ async function getQuoteText(event) {
|
|
|
568
568
|
* 获取提到的用户 QQ 号,可以通过 if(!qq) 判断是否提到了用户,返回 0 代表没有提到用户
|
|
569
569
|
*/
|
|
570
570
|
async function getMentionedUserId(event) {
|
|
571
|
-
const quoteId = (await
|
|
571
|
+
const quoteId = (await getQuoteMsg(event))?.sender.user_id || 0;
|
|
572
572
|
const msgAtId = +(find(event.message, "at")?.qq || 0);
|
|
573
573
|
return Number.isNaN(msgAtId) || !msgAtId ? quoteId : msgAtId;
|
|
574
574
|
}
|
|
@@ -1916,7 +1916,7 @@ exports.getMiokiLogger = getMiokiLogger;
|
|
|
1916
1916
|
exports.getQQAvatarLink = getQQAvatarLink;
|
|
1917
1917
|
exports.getQuoteImage = getQuoteImage;
|
|
1918
1918
|
exports.getQuoteImageUrl = getQuoteImageUrl;
|
|
1919
|
-
exports.
|
|
1919
|
+
exports.getQuoteMsg = getQuoteMsg;
|
|
1920
1920
|
exports.getQuoteText = getQuoteText;
|
|
1921
1921
|
exports.getTerminalInput = getTerminalInput;
|
|
1922
1922
|
exports.getViolationRecords = getViolationRecords;
|