Skip to content

koishi-plugin-word-core-grammar-basic
[词库引擎,基础语法扩展]

简介

词库语法是指在 回复句触发句 中的特殊字符串

触发句 中,语法格式暂未固定,而在 回复句 中,词库语法的规则是这样的:

有参语法:
(语法名称:参数1:参数2:参数3:......:参数n)

无参语法:
(语法名称)

其中具体参数个数取决于各个语法

TIP

当参数中必须出现英文括号(或者)与冒号:时,在这些符号前加上\可以使得词库不将它作为语法符号处理

使用方法

基础部分

物品处理

比如一个人有`小鱼干` `10`条。

小鱼干就是物品的名称

10就是物品的数量

INFO

物品用于存储数字格式的信息。

1. 添加物品到背包
  • 语法:
作用语法格式返回值
添加任意数量的物品到玩家背包(+:<物品名称>:<数量>:<用户id>?)操作的数量
添加随机数量的物品到玩家背包(+:<物品名称>:<数量~数量>:<用户id>?)操作的数量
添加以背包内原数量百分之x的物品到玩家背包(+:<物品名称>:<数量%>:<用户id?>)操作的数量

用户idthat时,代表为在触发时,被at用户的id

用户id项可不填,此时此项前的:也不需要填写,这种情况下,为触发者自身添加物品

  • 举例:
作用语法返回值
添加1条小鱼干到背包(+:小鱼干:1)1
添加1~100随机条小鱼干到背包(+:小鱼干:1~100)18
添加30%背包内小鱼干的数量到背包(如果背包内有100条鱼)(+:小鱼干:30%)30
添加1条小鱼干到被at的人的背包(+:小鱼干:1:that)1
2. 从背包内减少物品
  • 语法:
作用语法格式返回值
从玩家背包减少任意数量的物品(-:<物品名称>:<数量>:<用户id>?)操作的数量
从玩家背包减少随机数量的物品(-:<物品名称>:<数量~数量>:<用户id>?)操作的数量
从玩家背包减少以背包内原数量百分之x的物品(-:<物品名称>:<数量%>:<用户id>?)操作的数量

用户idthat时,代表为在触发时,被at用户的id

用户id项可不填,此时此项前的:也不需要填写,这种情况下,为触发者自身减少物品

  • 举例:
作用语法返回值
减少1条小鱼干(-:小鱼干:1)1
减少1~100随机条小鱼干(-:小鱼干:1~100)18
减少30%背包内的小鱼干(如果背包内有100条鱼)(-:小鱼干:30%)30
被at的人减少1条小鱼干背包(-:小鱼干:1:that)1
3. 判断句式
  • 语法:
作用语法格式
当背包内物品的数量满足要求则显示信息,否则不显示(?:<物品名称>:<关系>:<数量>:<信息>?:<用户id>?)

关系项可以填写如下符号:

关系项符号
大于>
小于<
等于==
不等于!=
大于等于>=
小于等于<=

用户idthat时,代表为在触发时,被at用户的id

用户id项可不填,此时此项前的:也不需要填写,这种情况下,为判断触发者自身的物品是否满足条件

信息项可不填或为空,当不填时此项前的:也不需要填写,这种情况下:

  1. 当物品数量满足要求时,继续执行本条语句
  2. 当物品数量不满足要求时,结束当前语句的执行,重新从触发句的回复句中随机挑选一个回复句,重新解析直到无可执行的语句或语句成功输出时结束
  • 举例:
作用语法返回值
如果自身小鱼干>10,则显示你的小鱼干满足要求!(?:小鱼干:>:10:你的鱼干满足要求啦!)你的鱼干满足要求啦!
如果自身小鱼干>10,则继续执行本条解析(?:小鱼干:>:10)<语句继续运行>
如果对方的小鱼干>10,则提示你的也满足啦(?:小鱼干:>:10:你的鱼干满足要求啦!:that)你的鱼干满足要求啦!
如果对方的小鱼干>10,则继续执行本条语句(?:小鱼干:>:10::that)<语句继续运行>
4. 查看背包某物品数量
  • 语法:
作用语法格式返回值
查看背包内小鱼干的数量(#:<物品名称>:<用户id>?)执行此语句时,背包内物品数量

用户idthat时,代表为在触发时,被at用户的id

用户id项可不填,此时此项前的:也不需要填写,这种情况下,为查询触发者自身物品数量

  • 举例:
作用语法返回值
查看自己的小鱼干数量(#:小鱼干)114
查看被at者的小鱼干数量(#:小鱼干:that)514
5. 物品排行榜
  • 语法:
作用语法格式返回值
获取某物品的数量排行榜(排行榜:<物品名称>)某物品的排行榜

列表处理

比如一个人有`成就列表`,成就列表内包含
1. `成就A`
2. `成就B`
3. `成就C`

成就列表是列表的名称。

成就A是列表的内容。

1,2,3这些是列表的内容的序号。

INFO

列表用于存储文本格式的信息。

1. 添加内容到列表中
  • 语法:
作用语法格式返回值
添加一个内容到列表中(a+:<列表名称>:<列表内容>:<用户id>?)添加的内容

用户idthat时,代表为在触发时,被at用户的id

用户id项可不填,此时此项前的:也不需要填写,这种情况下,为触发者自身添加物品

  • 举例:
作用语法返回值
添加成就A成就列表(a+:成就列表:成就A)成就A
添加成就A到被at的人的背包内的成就列表(a+:成就列表:成就A:that)成就A
2. 从列表中删除内容
  • 语法:
作用语法格式返回值
从列表中删除内容(a-:<列表名称>:<列表内容>:<用户id>?)删除的内容

删除失败时,提示不存在此列表项然后词库立刻终止继续解析本条回复。

用户idthat时,代表为在触发时,被at用户的id

用户id项可不填,此时此项前的:也不需要填写,这种情况下,为触发者自身添加物品

  • 举例:
作用语法返回值
成就列表中删除添加成就A(a-:成就列表:成就A)成就A
从被at的人的背包内的成就列表中,删除成就A(a-:成就列表:成就A:that)成就A
3. 获取列表中内容的数量
  • 语法:
作用语法格式返回值
获取列表中内容的数量(al:<列表名称>:<用户id>?)列表中内容的数量

用户idthat时,代表为在触发时,被at用户的id

用户id项可不填,此时此项前的:也不需要填写,这种情况下,为触发者自身添加物品

  • 举例:

如果用户与被at的用户都有成就列表这个列表,内容都为3个,分别为成就A成就B成就C

作用语法返回值
查询成就列表中内容的数量(al:成就列表)3
从被at的人的背包内的成就列表中,查询数量(al:成就列表:that)3
4. 获取列表中的某一项的内容
  • 语法:
作用语法格式返回值
获取列表中的第x项的内容(a#:<列表名称>:<序号>?:<用户id>?)列表中指定项的内容

用户idthat时,代表为在触发时,被at用户的id

用户id项可不填,此时此项前的:也不需要填写,这种情况下,为触发者自身添加物品

  • 举例:

如果用户与被at的用户都有成就列表这个列表,内容都为3个,分别为成就A成就B成就C

作用语法返回值
查询成就列表中第2项的内容(a#:成就列表:2)成就B
从被at的人的背包内的成就列表中,查询第2项的内容(a#:成就列表:2:that)成就B
5. 获取列表中的随机一项的内容
  • 语法:
作用语法格式返回值
获取列表中随机一项的内容(ar:<列表名称>:``<用户id>?`)列表中随机一项内容

用户idthat时,代表为在触发时,被at用户的id

用户id项可不填,此时此项前的:也不需要填写,这种情况下,为触发者自身添加物品

  • 举例:

如果用户与被at的用户都有成就列表这个列表,内容都为3个,分别为成就A成就B成就C

作用语法返回值
获取成就列表中随机一项的内容(ar:成就列表)成就A
从被at的人的背包内的成就列表中,获取随机一项内容(ar:成就列表:that)成就C
6. 获取列表中某内容的序号
  • 语法:
作用语法格式返回值
获取列表中某内容的序号(a?:<列表名称>:列表内容:``<用户id>?`)内容所在的序号

当不存在此内容时,返回值为-1。

用户idthat时,代表为在触发时,被at用户的id

用户id项可不填,此时此项前的:也不需要填写,这种情况下,为触发者自身添加物品

  • 举例:

如果用户与被at的用户都有成就列表这个列表,内容都为3个,分别为成就A成就B成就C

作用语法返回值
获取成就列表成就B的序号(a?:成就列表:成就B)2
从被at的人的背包内的成就列表中,成就B的序号(a?:成就列表:成就B:that)2
7. 设置列表中第x个内容的值
  • 语法:
作用语法格式返回值
设置列表中第x个内容的值(as:<列表名称>:序号:列表内容:``<用户id>?`)设置的内容

用户idthat时,代表为在触发时,被at用户的id

用户id项可不填,此时此项前的:也不需要填写,这种情况下,为触发者自身添加物品

  • 举例:

如果用户与被at的用户都有成就列表这个列表,内容都为3个,分别为成就A成就B成就C

作用语法返回值
设置成就列表中的成就B成就E(as:成就列表:2:成就E)2
将被at的人的背包内的成就列表中,设置成就B成就E(a?:成就列表:2:成就E:that)2
8. 展示列表中所有的内容
  • 语法:
作用语法格式返回值
展示列表中所有的内容(aa:<列表名称>:<用户id>?)列表的内容

用户idthat时,代表为在触发时,被at用户的id

用户id项可不填,此时此项前的:也不需要填写,这种情况下,为触发者自身添加物品

  • 举例:

如果用户与被at的用户都有成就列表这个列表,内容都为3个,分别为成就A成就B成就C

作用语法返回值
展示成就列表中的所有内容(aa:成就列表)
展示被at的人的背包内的成就列表中的所有内容(aa:成就列表:that)

返回值为

  1. 成就A
  2. 成就B
  3. 成就C
9. 删除列表中重复的内容
  • 语法:
作用语法格式返回值
删除列表中重复的内容(ac:<列表名称>:<用户id>?)

用户idthat时,代表为在触发时,被at用户的id

用户id项可不填,此时此项前的:也不需要填写,这种情况下,为触发者自身添加物品

  • 举例:

如果用户与被at的用户都有成就列表这个列表,内容都为3个,分别为成就A成就B成就A

作用语法返回值
删除成就列表中的重复内容(ac:成就列表)
从被at的人的背包内的成就列表中,删除重复内容(ac:成就列表:that)

在执行后,用户与被at的用户的成就列表列表,会变为成就A成就B

10. 合并输出列表内所有的内容
  • 语法:
作用语法格式返回值
合并输出列表内所有的内容(am:<列表名称>:<用户id>?)列表内每个内容合并起来后的东东

用户idthat时,代表为在触发时,被at用户的id

用户id项可不填,此时此项前的:也不需要填写,这种情况下,为触发者自身添加物品

  • 举例:

如果用户与被at的用户都有成就列表这个列表,内容都为3个,分别为成就A成就B成就嗷嗷

作用语法返回值
合并输出成就列表中的内容(am:成就列表)成就A成就B成就嗷嗷
将被at的人的背包内的成就列表中的内容,合并输出(am:成就列表:that)成就A成就B成就嗷嗷
11. 删除整个列表
  • 语法:
作用语法格式返回值
删除整个列表(ak:<列表名称>:<用户id?>)

用户idthat时,代表为在触发时,被at用户的id

用户id项可不填,此时此项前的:也不需要填写,这种情况下,为触发者自身删除列表

  • 举例:

如果用户与被at的用户都有成就列表这个列表,内容都为3个,分别为成就A成就B成就C

作用语法返回值
删除成就列表(ak:成就列表)
将被at的人的背包内的成就列表删除(ak:成就列表:that)
12. 交换列表中的两个项
  • 语法:
作用语法格式返回值
交换列表中的两个项(ah:<列表名称>:<序号1>:<序号2>:<用户id?>)

用户idthat时,代表为在触发时,被at用户的id

用户id项可不填,此时此项前的:也不需要填写,这种情况下,为触发者自身删除列表

  • 举例:

如果用户与被at的用户都有成就列表这个列表,内容都为3个,分别为成就A成就B成就C

作用语法返回值
成就列表成就A成就C互换(ah:成就列表:1:3)
将被at的人的背包内的成就列表中的成就A成就C互换(ah:成就列表:1:3:that)

信息处理

1. 延迟发送
  • 语法:
作用语法格式返回值
延迟发送一句话或者一段话(&:<时间>:<消息>?)信息项

时间项为纯数字,单位是秒(s)

信息项可不填或为空,当不填时此项前的:也不需要填写,这种情况下:

延迟一定时间后发送此段回复句
  • 举例:
作用语法返回值
延迟10秒发送哼哼a(&:10:哼哼a)哼哼a
2. 查看触发者及被at人信息
  • 语法:
作用语法格式返回值
查看触发者的名字(@this)触发者用户名
查看触发者的id(#this)触发者id
查看被at方的用户名(@that)在触发句中被at的人的用户名
查看被at方的id(#that)在触发句中被at的人的id
3. at句式
  • 语法:
作用语法格式返回值
at一个昵称(@:name:<对方昵称>)at一个人
at一个唯一标识(@:id:<对方id>)at一个人
4. CD句式
  • 语法:
作用语法格式返回值
提示某段文本后,开始cd一定的秒数(cd:<事件名称>:<cd时间(格式为s)>:<信息>?)信息项

信息项可不填或为空,当不填时此项前的:也不需要填写,这种情况下:

  1. 当第一次触发时,继续运行,创建一个名“事件名称”的计时器
  2. 在计时器未记完时,结束当前语句的执行,重新从触发句的回复句中随机挑选一个回复句,重新解析直到无可执行的语句或语句成功输出时结束计时器记完后触发,视为第一条

cd语句造成的cd是以事件名称来区分的。

比如(cd:钓鱼:10:钓鱼成功),触发此语句后,钓鱼这个事件开始cd。

如果a回复cd语句的事件写的是钓鱼,且b回复cd语句的事件也写的是钓鱼。此时这两个cd语句会共享cd的起止时间

  • 举例:
作用语法返回值
发送你好后,10秒后触发才可以继续发送你好(cd:测试:10:你好)你好
5. 分段回复
  • 语法:
作用语法格式返回值
分为两个气泡发送(换)多个气泡
  • 举例:
作用语法返回值
aaabbb分为两段话aaa(换)bbb第一个气泡:aaa,第二个气泡:bbb
6. 弹出提示,获取输入
  • 语法:
作用语法格式返回值
弹出气泡,等待用户输入(wi:<输入的值的备注>?)输入提示

(wi:输入的值的备注):输入的值的备注可不写,此时,弹出的提示消息会不包含 xxx参数的值字样

当输入超时时(5秒内未输入),输入的数值则为空

(作者:在想要不要加个参数项,可以进行正则校验输入的文字格式)

  • 举例:
作用语法返回值
需要输入数量你输入了:(wi:<数量>)请输入数量参数的值:
获取一个输入你输入了:(wi)请输入:
7. 概率句式
  • 语法:
作用语法格式返回值
有0%~100%的概率会输出信息(%:<概率(0~100)>:消息?)信息

信息项可不填或为空,当不填时此项前的:也不需要填写,这种情况下:

当物品数量满足要求时,继续执行本条语句
当物品数量不满足要求时,终止执行
  • 举例:
作用语法返回值
30%的可能输出赢啦(%:30:赢啦)赢啦
8. 多重概率判定
  • 语法:
作用语法格式返回值
多重概率判断(%%:<概率权重1>:<成功后的文本1>:<概率权重2>:<成功后的文本2>:<概率权重3>:<成功后的文本3>:.........:<概率权重n>:<成功后的文本n>)<成功后的文本>项目
  • 举例:

word.add test (%%:1:a:2:aa:3:aaa)

INFO

上述这样的情况下我们发送test后,bot返回a的几率是1/(1+2+3)aa的概率是2/(1+2+3)aaa的概率是3/(1+2+3)...以此类推

9. 调用触发句
  • 语法:
作用语法格式返回值
同步调用触发句(调:<触发句>)触发句的一个回复句
异步调用触发句(异调:<触发句>)触发句的一个回复句

使词库触发一个触发句,并将此触发句的随机一个回复句返回

  • 注意事项:

例:玩家初始时拥有3条鱼

word.add 钓鱼 你获得了(+:鱼:1)条鱼,(调:test)
word.add test 你有(#:鱼)条鱼

此时 原回复句 正在解析,而词库是在每次解析完成后才会将此回复句产生的添加物品的数据写入背包中

所以在调用新语句的时候,背包状态是调用所在语句未开始时的状态!

触发钓鱼时,你会获得一条鱼,但此时它并未写入到背包中,而是存储在缓存中

调用test触发词的结果是:你有3条鱼。但在调用后,钓鱼触发句的此回复被成功解析,缓存的数据被写入到背包中,此时你已经有4条鱼了,但调用的结果是你获得了1条鱼,你有3条鱼

同步调用和异步调用的区别:

同步调用被执行后会等待调用结果的返回,而异步调用被执行后不等待,结果会通过新的气泡来发送出来

10. 调用koishi命令
  • 语法:
作用语法格式返回值
调用一个koishi命令后立刻发送(指令:<koishi指令>:1)指令的内容
调用一个koishi命令后等待其他语法执行后,与其他语法一起发送(指令:<koishi指令>:0)指令的内容

使词库触发一个koishi指令,并将此koishi指令执行结果返回

11. 隐藏输出
  • 语法:
作用语法格式返回值
隐藏xxx(!:xxx)

数字处理

1. 四则运算
  • 语法:
作用语法格式返回值
进行四则运算(算:<第一个数>:<算术符号>:<第二个数>)第一个数第二个数进行四则运算

TIP

算数符号有以下四种:

加:+
减:-
乘:*
除:/
  • 举例:
作用语法返回值
运算3+1(算:3:+:1)4
2. 生成随机数
  • 语法:
作用语法格式返回值
生成一个随机数(~:<下限>:<上限>)生成一个在下限上限之间的一个随机数
  • 举例:
作用语法返回值
生成一个0~100的随机数(~:0:100)35
3. 获取时间
  • 语法:
作用语法格式返回值
获取年/月/星期/日/时/分/秒(time:<模式选择>:[汉字输出项])年/月/星期/日/时/分/秒

TIP

模式选择项有如下值:

获取年:1
获取月:2
获取星期:3
获取日:4
获取时:5
获取分:6
获取秒:7
获取时间戳:8
获取完整时间:9

汉字输出项有如下值:

数字输出:0
汉字输出:1
  • 举例:
作用语法返回值
获取现在是一周的星期几(time:3)2
4. 数字取整
  • 语法:
作用语法格式返回值
数值取整(向下取整)(整:<数值>)数值项的向下取整
  • 举例:
作用语法返回值
取2.2这个数字为2(整:2.2)2
5. 获取触发时所输入的数
  • 语法:
作用语法格式返回值
获取触发句中(数)所代表的数字(数:<第几个输入的数>)触发句中(数)所代表的数字
  • 举例:
作用语法返回值
获取用户输入的第一团数(数:1)第一团数

设定一个这样的问答:

问:你好(数)
答:(数:1)

此时,你发送:你好12345,机器人会回复:12345

媒体处理

1. 音频点播
  • 语法:
作用语法格式返回值
发送一段音频(歌曲:<歌曲url直链>)一段音乐~
2. 视频点播
  • 语法:
作用语法格式返回值
发送一段视频(视频:<视频url直链>)一段音乐~

其他

1. 权限验证
  • 语法:
作用语法格式返回值
判断触发者是否拥有某权限(p:<权限名>:<消息>?)消息

信息项可不填或为空,当不填时此项前的:也不需要填写,这种情况下:

  • 当权限满足要求时,继续执行本条语句
  • 当权限不满足要求时,结束当前语句的执行,重新从触发句的回复句中随机挑选一个回复句重新解析直到无可执行的语句或语句成功输出时结束
2. 禁言
  • 语法:
作用语法格式返回值
禁言触发者(禁言:<时间>)禁言触发者
禁言指定人员(禁言:<时间>:<用户id>)禁言指定的人
禁言时附带理由(禁言:<时间>:<用户id>:<理由>)禁言指定的人并且附带理由

备注: 时间单位是秒(s),为0时则解禁

3. 请出房间
  • 语法:
作用语法格式返回值
踢掉触发者(踢)触发者被踢了
踢掉指定的人(踢:<用户id>:0)指定的人被踢了
永久踢出(踢:<用户id>:1)指定的人被永久踢出了
4. 发送http(s)的post/get请求
  • 语法:
作用语法格式返回值
发送http post请求(post:<接口链接>:<headersJson>:<bodyJson>:<需要的返回值>)请求一个post接口,并且获取它的返回
发送https post请求(posts:<接口链接>:<headersJson>:<bodyJson>:<需要的返回值>)请求一个post接口,并且获取它的返回
发送http get请求(get:<接口链接>:<headersJson>:<bodyJson>:<需要的返回值>)请求一个get接口,并且获取它的返回
发送https get请求(gets:<接口链接>:<headersJson>:<bodyJson>:<需要的返回值>)请求一个get接口,并且获取它的返回

使词库请求一个http接口,并且获取它的返回值

  • 参数详解:

以请求这个获取天气情况的接口为例

感谢韩小韩接口!

参数格式说明示例
接口链接http接口的地址https://api.vvhan.com/api/weather
headersJson接口要求的头数据,是类似http的get请求的格式:键1=值1&键2=值2Authorization=hdbjsdkadv&Content-Type=application/json(韩小韩dalao的接口木这个参数哈)
bodyJson接口要求的body数据,格式也是键1=值1&键2=值2city=北京
需要的返回值接口返回的数据,可以是纯文本或者为返回值中的项(需要写成类似这样的格式:data.xxx),同时,可以获取多个返回的值,最终语法的返回值会将所有结果拼接起来。data.data.high 最高气温
需要注意

在请求的内容中包含:时,需要输入在前方输入一个\,变成\:来防止被词库处理为参数分隔符。

需要的返回值这项如果结果是数组(比如{data:["123","234"]}),并且需要选中data的第一项时,需要使用data.0来选中

以上述描述,使用韩小韩接口获取北京的天气情况的语法是这样的:

javascript
第一种写法:
(gets:api.vvhan.com/api/weather::city=北京:\n最高温度:data.data.high:\n最低温度:data.data.low:\n小贴士提醒你!:data.tip)" 

第二种写法
(gets:api.vvhan.com/api/weather::city=北京:
最高温度:data.data.high:
最低温度:data.data.low:
小贴士提醒你\::data.tip)"

// ps:这两种写法其实是一样的,因为\n是指回车一次

它最终的返回值是:

最高温度24°C
最低温度16°C
小贴士提醒你:现在的温度比较舒适~

进阶部分

语法嵌套

  • 说明:

词库在解析每个语法的时候,检测到参数的值是一个语法或者包含语法的时候,会将参数内的语法执行后,将返回值返回

  • 举例:

获取当前是本月第几号的语法:(time:4)

它的返回值是一个数字,这就意味着它能够使用在任何需要数字的地方:

(+:鱼:(time:4))

例:你获得了(+:鱼:(time:4))条鱼,词库进行解析的时候是这样的:

json
你获得了(+:鱼:(time:4))  

检测到词库语法(+:鱼:(time:4))  

开始抽取物品名称:鱼  
开始抽取物品数量:(time:4)  

发现物品数量为词库语法  

开始执行词库语法:(time:4)  

当前是26号,(time:4)执行结果是26

释放结果:26

(+:鱼:26)  
执行语句  

各参数无词库语法,执行  

添加26条鱼,释放结果  

你获得了26条鱼  

这就意味着你甚至可以如下方式拼接判断物品数量的语法和随机数的语法:

(?:鱼:>:(~:1:100))