[koishi-plugin-word-core] 小型文字游戏引擎/对话插件(正在开发!)

词库引擎

小型文字游戏引擎/对话插件

快速使用

简介

word-core是一款设置对话的插件,类似于dialogue插件,可以通过设置触发词以及回答来让机器人与你对话

你编写的问答会存储在中,默认为default库,当你进入一个不存在的库并且编辑它的时候,会自动新建一个库,库作者是你自己

每个都有作者,非作者无法修改库的内容,库的作者可以添加别的用户词库作者而进行一起编写

你设定的触发词可以拥有多个回答,当你触发触发词的时候,会从回答中随机输出一条回答

在你添加或删除问答的时候,默认会被添加或删除到 default这个 词库,你可以通过指令修改你想要编辑的词库

另外在本文档中,<>代表的是可不填选项,代表的是必填选项

修改编辑的库

格式:word.setedit <库名>

例子:word.setedit 测试

例子:word.setedit

修改你正在编辑的库,如果不写后面的库名,则代表恢复到编辑 default默认库

添加问答

格式:word.add [触发词] [回复]

例子:word.add 你好 你也好哦~

一个触发词可以拥有多个回答,每个回答会有自己的 序号,每次触发时随机回复一个回答

删除问答

格式:word.rm [触发词] [序号]

例子:word.rm 你好 1

使用序号删除回答

进阶使用

设置权限

须知:

词库编辑需要拥有词库的编辑权限:word.edit.[词库名]

词库管理员或者拥有word.admin.add/rm可以修改别人的权限(词库管理员则需要将自己的id填写在插件配置处)

这里所用的id是指koishi的 session.uid

查看自己的id

格式:word.id

添加权限

格式:word.addp [用户id] [权限节点]

例子:word.addp 6503fb7b50308 word.edit.*

删除权限

格式:word.rmp [用户id] [权限节点]

例子:word.rmp 6503fb7b50308 word.edit.*

编写词库

在一开始的快速入门处,词库核心还做了一些其他的事情。在这个章节我们需要了解它。


每个词库都有作者,所以每个词库都有 作者属性,词库可能会产生数据,所以每个词库都有自己的 存储格属性。

作者属性

这个属性是一个数组,当你创建一个词库的时候,词库会将你设置为数组内的一员。作者可以添加或删除其他人为本词库的作者。非作者无法修改词库,即使你拥有此词库的修改权限。

添加作者

格式:word.addauthor [新作者uid]

例子:word.addauthor 6503fb7b50308

取消作者

格式:word.rmauthor [需要删除的作者id]

例子:word.rmauthor 6503fb7b50308

存储格

这个属性是一个字符串,这意味着,每个词库只能设置一个存储格。本词库的词库语句产生的数据,会添加到此存储格。它默认为”default“。多个词库设置的存储格为同一个的时候,意味着这些词库的物品是 通用的。

设置存储格

格式:word.setsave [存储格]

例子:word.setsave 存储1

恢复到默认存储格

格式:word.resetsave
查看当前词库的存储格子是哪个

格式:word.getsave

寻找某个触发句在哪个词库

格式:word.find [触发句]

例子:word.find 你好

查看当前词库某触发句的所有回答

格式:word.get [触发句]

例子:word.get 你好

开发简介

基础介绍

词库核心是一个对话插件,但是它在基础的对话插件的基础上,增加了一些东西:

当对话的回复内包含 (aaa:xxxx:xx...)的词库 语法结构的时候,会 由内而外,由前到后地将每个 语法结构解析,然后去调用词库核心的 规则包

规则包就像这个:


statementexport const statement: statementType = {
  '+': async (inData: chatFunctionType, ctx: Context): Promise<string | void> => {
    return inData.args[1];
  }
};

// inData内包含

// args: string[] 此属性的值是当前(aaa:xxx:xxxxx:xx...)词库语法结构的第一个":"后的内容,分割成的数组:[xxx,xxxxx,xx....]

// matchs:在问问题时的匹配到的值(后续章节会详细说明)

规则包内的函数的返回值会替换掉语法结构!

大胆设想:

我们可以设计一些规则包来做出以下的效果!

问:钓鱼

答:你钓到了(+:鱼:1:100)条鱼

问:查看我的鱼娄

答:你拥有(#:鱼)条鱼

这么建议的搭建一个钓鱼小游戏~

可扩展词库语法规则

词库核心将:

  • 用户管理
  • 权限管理
  • 编辑词库
  • 语法包

等内容都封装到了word服务,上面说明的statement规则可以使用:

  • ctx.word.addStatement
  • ctx.word.rmStatement

进行添加

提问正则替换

在问答时我们不免需要遇到一些情况,比如查询天气

问:查询xxx的天气

通过设置固定的问答可能并不能匹配这样的情况,于是我在问题匹配处设置了 允许匹配正则,并且将正则匹配到的内容,送入 规则包的inData属性下的matchs,比如如下的情况

需要获取输入的数字并且在回答中显示:

设定这样的问答:

问:我输入的第一个数(数),输入的第二个数(数)

答:(输入数:1),(输入数:2)

有人这么触发了:

我输入的数111,输入的数222


// 定义一个输入trigger:
ctx.word.addTrigger('inputNumber', '(数)', '[\d]+?');
// 定义一个语法包
ctx.word.addStatement('输入数', (inData, ctx)=>{
  // 获取(输入数字:xx)的xx
  const inputNumber1 = inData.args[0];
  // 此时的inData.matchs的内容是:
  // {
  //  inputNumber: [111,222]
  // }
  return inData.matchs[inputNumber1];
})

反馈&回复

请在评论区告诉我大概看不懂的地方,我会进行修改

球球恰饭!

正在制作

  • 完善开发文档,包括word的各个api
  • 编写词库规则:添加物品到背包
  • 编写词库规则:从背包减少物品
  • 编写词库规则:根据物品数量回复不同的话
  • 编写词库规则:延迟显示
  • 编写词库规则:添加物品到他人背包
  • 编写词库规则:减少物品从他人背包
  • 编写词库规则:根据他人物品数量不同回复不同的话
  • 编写词库规则:词库商城
  • 编写词库规则:为每个群组设置可使用的词库
  • 编写词库规则:增加事件触发器,作为一种在语言触发词库之外的方式
  • 编写词库规则:查看当前编辑的词库的触发词
  • 编写词库规则:未完待续
9 个赞

呜呜呜有人一起帮忙开发木木!!

6 个赞

有点像 dialogue

4 个赞

嗯嗯!不过它的语法支持嵌套

如果有如此的两个语法
(测试1:x)返回为x+1
(测试2:x)返回为x+2

(测试1:(测试2:8473))
会先变为(测试1:8475)
而后变为8476

4 个赞

拿词库去实现游戏上的功能我觉得实际上是不太合适的。又要高性能,又要高拓展性…

最后就剩四不像了

要么,就做游戏上的积分插件 (monetary),要么就做 database 的拓展插件;

我给你一个思路,通过 userId 获取对应的存储在数据库里的配置对象。

例如:

// 初始化本地对应的用户信息
storeData.init('myData',{prop:object,state:object})  // {prop:{},state:{}}

// 获取存储在本地对应的用户信息
storeData.get('myData','userId')  // {prop:{'小鱼干':12},state:{hp:100,pp:100}}

// 修改存储在本地对应的用户信息
storeData.set('myData','userId',{state:{hp:80,pp:100}})  // {prop:{'小鱼干':12},state:{hp:80,pp:100}}

或者,可以做类似 vue3 的 Pinia

1 个赞

ah!其实词库的这个core主插件我开放了一个word服务,word服务下包括很多东东,比如介个word.user,它包含读写物品,和直接读取和修改某个玩家的数据等函数!

然后也提供了
word.permission权限管理,提供word.*类似这样的权限节点式的授权和鉴权(?)
word.editor词库库读写器(包括对每个库读写作者,读写存储格,读写词库等内容)
word.tools好像是一些常用的功能
word.addTrigger是类似输入替换的功能
word.addStatement是添加语法包

其实词库本体仅仅只是用来做词库编辑和解析
,剩下的,各种词库语法我打算以语法包插件(类似隔壁那个)的形式推出

(对应的文档正在编写)

1 个赞

也可以单纯使用词库的word.user等东东单独起插件来扩展它!或开发以此为依赖的插件!如果它能给开发插件带来一点点便利就太好啦!

1 个赞

(不过我尽力以我的码力做了些优化,比如每次词库开启的时候会先形成一个数据库缓存,每次删除或者添加的时候也会编辑缓存内容什么的…

这个其实是我写过的第三个版本的词库,我希望以后最终可以实现以文字编写的词库最终输出结果是.js文件…(嘶…这不就和blocky一样目的了嘶…)

1 个赞

v0.0.12

在检测信息时会忽略自身发送的信息(当session.userId == session.bot.user.id时不从词库中选取回复来回复)

v0.0.14

修复了next方法循环调用但是在完整循环后未跳出的问题
修复了不存在的物品获取时获得的数量为null的问题
修复了next,end,kill等方法的输出数据未成功抛出的问题

v0.0.15

修复了next方法无法正确锁定下一条的问题

v0.0.16~v0.0.18

意识到了一些事情,当在%概率判断的语法内编写增加减少物品时,会因为词库解析器由前到后,由内而外的递归解析逻辑而导致即使概率判断失败,但是物品依旧增加/减少的问题。经过几天修复,尝试每次修改物品的时候建立缓存,在外层语法判断失败时,会丢弃内部语法的执行缓存

2 个赞

点赞~

3 个赞

写了不算是语法解释器的东东后…大概感受到了一点真正的语言解释器的恐怖…

2 个赞