npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

koishi-plugin-ink

v0.3.0

Published

An inkjs application for Koishi.js

Readme

koishi-plugin-ink

npm npm-download

inkjsKoishi 的简易应用。

依赖插件

这个插件需要 Koishi v3 版本,同时需要 koishi-plugin-mysql 数据库支持。

ink 是什么?

ink 是一个由 inkle 开发的视觉小说类脚本语言,初衷在于将更多的精力放在视觉小说故事流上,而不是程序实现上。

inky 是 ink 的专用编辑器。当然,这不是说你不能用记事本写 ink,只是 inky 提供了很多方便的功能,比如即写即渲染。

inklecate 是将 ink 脚本转化为可供程序使用的 JSON 文档的编译器。它内置于 inky 中。

inkjs 则是 ink 的一个 JavaScript 运行时(Runtime)实现,它读取由 inky 或 inklecate 编译好的 JSON 文件,然后对其进行控制。

这个插件是什么?

这个插件是 inkjsKoishi 中的简易应用,实现了以下的基本功能:

  • 故事的进行
  • 跳转至下一个选项
  • 在调用指令时自动读档,在选项处自动存档
  • 硬重置
  • 进程锁,在同一个频道中最多1人进行1个故事

安装方法

npm i koishi-plugin-ink

然后,在 koishi.config.js 中:

module.exports = {
  plugins: [
    // your other plugins...
    'ink': {},
  ],
  // other configs...
]

或者在 index.js 中:

app.plugin(require('koishi-plugin-ink'))

在注册插件后,插件将自动在数据库中创建名为 ink_save 的表,存档将储存到此表中。

使用方法

ink <choice>

choice:在有选项的时候,选择此选项。

| 可选选项 | 说明 | | --- | --- | | -R, --hard-reset | 重置所有进度 | | -U, --hard-unlock | 强制解除进程所(需要2级权限) | | -s, --skip | 跳转至下一个选项 |

插件配置项

这个插件在无配置项的情况下将使用 The intercept 作为示例小说。

配置项的形式为:

{
  command:
  filePath:
  messageSpeed:
  files: [
    {
      command:
      filePath:
      messageSpeed:
    },
    {
      command:
      filePath:
      messageSpeed:
    }
    // if you have other ink files...
  ]
}

| 配置项 | 默认值 | 说明 | | --- | --- | --- | | command *1 | ink | 插件指令 *2 | | filePath | The intercept | 编译好的 (.ink).json 文件的相对路径 | | messageSpeed | app.options.delay.message *3 | 文字的显示速度(ms) |

*1 所有的 command 请确保各不相同。

*2 修改此配置项将将使上文中所有的 ink 替换为所配置的字符串。例如,配置 command: 'sample' 会导致指令变为 sample ,创建的表变为 sample_save ,注册的模板(后述)变为 sample.descriptionsample.example 等。

此配置项也支持设置为 Koishi 的链式子指令,但是请注意,由于使用了数据库,子指令的最后一项只能为层级式,且不能包含数据库表名不支持的字符。

例如,配置 command: 'lorem/ipsum' 会创建表 ipsum_save ,这是没有问题的;但是配置 command: 'lorem.ipsum' 则会出现在 lorem 库内创建 ipsum_save 表的情况,这在大多数情况下是不被期望的。

*3 这个值当在 App 中没有配置时的默认值为 100,即 0.1秒。

模板

这个插件在最初的几行定义了一些 模板

const templateNode = {
  'description': 'ink功能',
  'example': '查看当前剧情 / 选项',
  'example-choice': '选择第一个选项',
  'skip': '跳至下一个选项',
  'hard-reset': '重置(请谨慎使用)',
  'hard-unlock': '强制解除进程锁(需要 2 级权限,请谨慎使用)',
  'is-locking': ' 正处于剧情中,请等待其剧情结束。',
  'is-locking-self': '当前处于剧情中,请等待剧情结束。',
  'hard-reset-confirm': '这将重置你的所有进度与数据,且不可挽回。请于5秒内回复 是 或 y(es) 以确认。',
  'hard-reset-completed': '已重置。',
  'hard-reset-failed': '已取消重置。',
  'hard-unlock-unavail': '未处于剧情中,不需要解除进程锁。',
  'hard-unlock-completed': '已强制解除进程锁。',
  'choices': '选项:',
  'skip-to-choices': '已跳转至选项:',
  'the-end': '=== 故事结束 ===',
  'error': '出现了一点错误,请尝试重新开始剧情。'
}

你可以根据自己的喜好来覆盖它们,例如:

t.set('ink.error', '出了亿点点错误。')

推荐阅读

Writing With Ink - ink 脚本的语法参考文档。

Running Your Ink - ink 运行时的参考文档。虽然里面使用的是 C# 实现,但是 inkjs 的大部分 API 都与之相同。

已知问题

  • 有时候进程锁会由于未知原因锁死

暂不清楚导致的原因,现阶段暂时以强制解除进程锁的选项替代。

Q&A

  • 为什么在使用的时候会报“版本不对”?

当前(指在写这个 Readme 的时候)inkjs 的版本还处在 1.11.0,而对应的 ink 版本则是 0.9.0;但是最新的 ink 及 inky 版本已经到 1.0.0 了。请检查你有没有使用正确的版本进行 ink 的编译。

  • 为什么不支持 koishi-plugin-mongo?

因为我不会 MongoDB。

  • 这个插件和 koishi-plugin-adventure 有什么区别?

总地来说,koishi-plugin-adventure 会更加开箱即用且更加好用,因为你会想要的功能 adventure 基本都提供了。但是,如果你想尝试写长故事,或者你本来手头就有一个 ink 脚本,那么你可以试试这个。

  • 为什么不支持【某个功能】(比如节点跳转)

我一开始想做这些功能,但是首先靠 ink 的合理编写是能够实现这些功能的,其次 ink 这个脚本语言的可拓展性很强。在 Runtime 应用层中,它提供标签暴露、变量暴露与存取、节点跳转以及节点访问计数。换句话来说,这些功能十万个人有十万甚至九万个实现的需求和方法,而仅仅一种实现很难满足个性化的需求。

如果想要贴合自己需求的 ink 实现,那么推荐 Ctrl + C 这个仓库的代码(甚至用不着 git clone ,因为代码量很小)然后自己修改(参见推荐阅读)。

  • 发现了个bug

这很正常。