Slang DSL 完整参考手册
Slang 是一种基于中文关键字的文本处理 DSL(领域特定语言),运行于 NapCatBot 框架的 Slang 插件中。
代码由 【函数名 参数1>=<参数2>=<...】 包围的调用块组成,支持嵌套、控制流和 30+ 内置函数。
目录
语法基础
调用格式
【函数名 参数1>=<参数2>=<参数3>=<...】- 函数名和参数之间用空格分隔
- 参数之间用
>=<分隔 - 整个调用用
【和】包围 - 所有参数求值后都是字符串类型
【】之外的纯文本原样输出
嵌套调用
参数可以是另一个函数调用,返回值会作为外层参数:
【回复【变量消息内容】】真值 / 假值
| 真 | 假 |
|---|---|
True true 真 1 | False false 假 0 |
排版自由
换行和缩进不影响语义——Slang 引擎会先合并所有行为一行再解析。
变量系统
Slang 有两套独立的变量空间:
| 变量空间 | 作用域 | 操作函数 |
|---|---|---|
| 全局变量 | 跨消息、跨规则共享 | 修改变量 / 获取变量 / 删除变量 |
局部变量(_dict) | 仅限于当前一次 Slang 执行 | 赋值变量 / 变量 / 置变量 |
消息上下文变量 是由插件在每次执行前自动注入到局部变量空间的只读变量,详见消息上下文变量。
变量操作速查
【修改变量cnt>=<3】 全局变量 cnt ← 3
【获取变量cnt】 读取全局变量 cnt → 返回 "3"
【赋值变量name>=<小明】 局部变量 name ← "小明"
【变量name】 读取局部变量 name → 返回 "小明"
【转全局变量name>=<g_name】 将局部变量 name 的值复制到全局变量 g_name
【删除变量cnt】 删除全局变量 cnt控制流
控制流函数不走常规函数路由,由 AST 求值器直接处理,参数短路求值。
判断
【判断条件>=<真分支>=<假分支】示例:
【判断【比较-等于>=<【变量msg】>=<你好】>=<【回复你好呀】>=<【回复未知消息】】等价于 if msg == "你好": 回复("你好呀") else: 回复("未知消息")比较-
【比较-操作符>=<左值>=<右值>=<真分支>=<假分支】支持的操作符:
| 操作符 | 含义 |
|---|---|
大于 | > |
小于 | < |
等于 | == |
大于等于 | >= |
小于等于 | <= |
不等于 | != |
比较是字符串比较(字典序),如需数值比较请先用计算或置变量转换。
示例:
【比较-大于>=<【获取变量count】>=<5>=<【回复count大于5】>=<【回复count不大于5】】循环-
【循环-条件>=<循环体】循环体在条件为真时反复执行。每次迭代的返回值会被拼接在一起,循环结束返回全部迭代结果的拼接。
⚠️ 条件需要在循环体中被修改为假值,否则死循环。
示例:
【修改变量i>=<0】
【循环-【比较-小于>=<【获取变量i】>=<3】
>=<
【回复第【获取变量i】次】
【修改变量i>=<【计算【获取变量i】+1】】
】函数速查表
| 类别 | 函数 | 参数 | 说明 |
|---|---|---|---|
| 输出 | 换行 | 0 | 输出换行符 \n |
| 输出 | 调试输出 | 1 | 打印到服务端控制台 |
| 输出 | 回复 | 1 | 发送消息到当前会话 |
| 输出 | 回复私聊 | 2 | 私聊指定 QQ |
| 输出 | 回复群 | 2 | 发送到指定群 |
| 变量 | 修改变量 | 2 | 修改全局变量 |
| 变量 | 获取变量 | 1 | 读取全局变量 → 返回字符串 |
| 变量 | 删除变量 | 1 | 删除全局变量 |
| 变量 | 赋值变量 | 2 | 设置局部变量 |
| 变量 | 变量 | 1 | 读取局部变量 → 返回字符串 |
| 变量 | 转全局变量 | 2 | 局部变量值 → 全局变量 |
| 变量 | 置变量 | 2 | 将 Python 对象赋给局部变量 |
| 文本 | 取出一行 | 2 | 取文本第 N 行 |
| 文本 | 删除一行 | 2 | 删除文本第 N 行 |
| 文本 | 取出行数 | 1–2 | 取文本行数 / 查找行号 |
| 数学 | 计算 | 1 | 计算 Python 表达式 |
| 数学 | 取反 | 1 | 布尔取反 |
| 逻辑 | 判断 | 3 | if / else |
| 逻辑 | 比较- | 4–5 | 比较运算 + 分支 |
| 逻辑 | 循环- | 2 | while 循环 |
| 网络 | 网页-访问 | 3 | HTTP GET / POST |
| 网络 | 网页-下载 | 4 | 下载文件到本地 |
| 数据库 | SQL-连接 | 2 | 连接 SQLite 数据库 |
| 数据库 | SQL-执行 | 2 | 执行写 SQL |
| 数据库 | SQL-读取 | 3 | 查询 SQL,结果存变量 |
| 系统 | cmd | 1 | 执行 shell 命令 |
| 系统 | 延迟 | 1 | 睡眠 N 秒 |
| 系统 | 线程执行 | 2 | 新线程执行 Slang 代码 |
| 系统 | 现行时间戳 | 0 | Unix 时间戳 |
| 系统 | uuid | 0 | 随机 UUID |
| 文件 | 读配置 | 4 | 读 INI 配置项 |
| 文件 | 写配置 | 4 | 写 INI 配置项 |
| 数据 | Json解析 | 2 | JSON 反序列化 → 变量 |
| 数据 | 置数组 | 2+ | 创建数组 → 局部变量 |
| 数据 | 置字典 | 2+ | 创建字典 → 局部变量 |
| 数据 | 数组-取值 | 3 | 列表索引取值 → 局部变量 |
| 数据 | 字典-取值 | 3 | 字典键取值 → 局部变量 |
| 数据 | 数组-取内容 | 2 | 列表索引取值 → 返回 |
| 数据 | 字典-取内容 | 2 | 字典键取值 → 返回 |
| 高级 | 测试 | 2 | 执行一段 Python 代码 |
函数详解
输出与调试
换行
【换行】返回字符串 "\n"。通常用于拼接多行输出:
【回复第一行【换行】第二行】调试输出
【调试输出要打印的文本】输出到服务端控制台(NapCatBot 的终端窗口),QuQ 用户看不到。
回复
【回复消息内容】向触发当前规则的消息来源(群聊→群,私聊→私聊)发送一条消息。
回复私聊
【回复私聊消息内容>=<目标QQ号】向指定 QQ 发送私聊消息。
回复群
【回复群消息内容>=<目标群号】向指定群发送消息。
变量操作
修改变量 / 获取变量 / 删除变量(全局变量)
全局变量跨消息、跨规则共享,存储在服务端内存中,重启后丢失。
【修改变量count>=<0】 设置
【获取变量count】 读取 → "0"
【删除变量count】 删除带保护的变量名:debug 不可删除。赋值变量 / 变量(局部变量)
局部变量只在当前一次 Slang 执行期间存活。
【赋值变量name>=<小明】
【变量name】 → "小明"转全局变量
【转全局变量local_name>=<global_name】将局部变量 local_name 的值复制到全局变量 global_name。
置变量
【置变量my_obj>=<[1, 2, 3]】执行一段 Python 表达式,将结果对象赋给局部变量。能力等同于 测试,应谨慎使用。
文本处理
取出一行
【取出一行行号(0起始)>=<源文本】示例:
【取出一行2>=<【变量text】】删除一行
【删除一行行号(1起始)>=<源文本】返回删除指定行后的文本。
取出行数
【取出行数文本>=<查找词】 查找词所在行号(1起始),未找到返回 -1
【取出行数文本】 总行数数学与逻辑
计算
【计算3 + 5 * 2】 → "13"
【计算int(【变量x】) > 5】 → "True" 或 "False"执行一段 Python 表达式并返回字符串结果。可用于数值比较。
取反
【取反真】 → "假"
【取反0】 → "真"网络请求
网页-访问
【网页-访问URL>=<方法(get/post)>=<POST数据(get时可为空)】返回响应正文。
示例:
【网页-访问https://api.example.com/data>=<get>=<】
【网页-访问https://api.example.com/submit>=<post>=<{"key":"value"}】网页-下载
【网页-下载URL>=<方法>=<POST数据>=<保存路径】将响应内容写入本地文件。
SQLite 数据库
Slang 插件自身也使用 SQLite 存储规则(db/rules.db),可以在 Slang 代码中连接任意 SQLite 数据库。
SQL-连接
【SQL-连接数据库路径>=<连接名变量】将数据库连接对象存入局部变量。
SQL-执行
【SQL-执行连接变量名>=<SQL语句】执行 INSERT / UPDATE / DELETE / CREATE 等写操作。
SQL-读取
【SQL-读取连接变量名>=<SQL查询语句>=<结果变量名】执行 SELECT 查询,结果存入局部变量(列表形式)。
完整示例:
【SQL-连接./plugins/slang/db/rules.db>=<db】
【SQL-读取db>=<SELECT id, description FROM rules WHERE enabled=1>=<rows】
【赋值变量count>=<0】
【修改变量i>=<0】
【循环-【比较-小于>=<【获取变量i】>=<【计算len(【变量rows】)】】
>=<
【数组-取值【获取变量i】>=<【变量rows】>=<row】
【回复规则#【字典-取内容row>=<id】:【字典-取内容row>=<description】】
【修改变量i>=<【计算【获取变量i】+1】】
】系统与文件
cmd
【cmd命令文本】执行 shell 命令。
延迟
【延迟秒数】阻塞当前执行 N 秒。参数为整数。
线程执行
【线程执行JSON格式的局部变量字典>=<Slang代码】在新线程中执行一段 Slang 代码。第一个参数是 JSON 序列化的局部变量字典。
现行时间戳
【现行时间戳】返回当前 Unix 时间戳(整数秒)。
uuid
【uuid】返回随机 UUID 字符串。
数据结构
置数组 / 置字典
【置数组arr>=<a>=<b>=<c】 arr ← ["a", "b", "c"]
【置字典obj>=<key1>=<val1>=<key2>=<val2】 obj ← {"key1": "val1", "key2": "val2"}数组-取值 / 字典-取值
【数组-取值索引>=<列表变量名>=<结果变量名】
【字典-取值键名变量>=<字典变量名>=<结果变量名】将结果存入局部变量。
数组-取内容 / 字典-取内容
【数组-取内容列表变量名>=<索引】
【字典-取内容字典变量名>=<键名】直接返回对应值,不存入变量。
消息上下文变量
每次规则命中执行 Slang 代码时,以下变量自动注入到局部变量空间:
| 变量名 | 类型 | 说明 |
|---|---|---|
消息内容 | str | 触发规则的消息文本 |
发送者QQ | str | 发送者的 QQ 号 |
发送者昵称 | str | 发送者的昵称 |
消息类型 | str | "group" 或 "private" |
群号 | str | 群号(私聊时为空字符串) |
消息ID | str | 消息 ID |
代码示例集
示例 1:回声机器人
匹配方式:fuzzy,匹配内容:echo
【回复【变量消息内容】】示例 2:欢迎新成员
匹配方式:regex,匹配内容:入群|加群|新人
【回复欢迎【变量发送者昵称】!👋】示例 3:条件回复
完全匹配 你好 时回复问候,否则回复默认文案:
【判断【比较-等于>=<【变量消息内容】>=<你好】
>=<
【回复你好呀,【变量发送者昵称】!】
>=<
【回复收到你的消息了~】
】示例 4:计数器
每条匹配的消息计数并返回:
【修改变量cnt>=<【计算int(【获取变量cnt】or '0') + 1】】
【回复你是第【获取变量cnt】位访客!】示例 5:联网查天气
匹配 天气:
【赋值变量city>=<【取出一行1>=<【变量消息内容】】】
【赋值变量resp>=<【网页-访问https://wttr.in/【变量city】?format=3>=<get>=<】】
【回复【变量resp】】示例 6:多行拼接回复
【回复📊 消息详情:【换行】
━━━━━━━━━━【换行】
发送者:【变量发送者昵称】(【变量发送者QQ】)【换行】
类型:【变量消息类型】【换行】
内容:【变量消息内容】】示例 7:延迟自动回复
【回复请稍等3秒...】
【延迟3】
【回复好了,这是你要的结果】示例 8:读写 SQLite
【SQL-连接./data/mydb.db>=<db】
【SQL-执行db>=<CREATE TABLE IF NOT EXISTS log (msg TEXT, time INTEGER)】
【SQL-执行db>=<INSERT INTO log VALUES ('【变量消息内容】', 【现行时间戳】)】
【SQL-读取db>=<SELECT COUNT(*) FROM log>=<result】
【数组-取值0>=<【变量result】>=<row】
【回复已记录,共【字典-取内容row>=<0】条日志】示例 9:比较大小
匹配 数字,要求 消息内容 第二行是一个数字:
【赋值变量num>=<【取出一行1>=<【变量消息内容】】】
【判断【比较-大于>=<【计算int(【变量num】)】>=<100】
>=<
【回复【变量num】大于100】
>=<
【回复【变量num】不大于100】
】示例 10:循环输出九九乘法表
匹配 乘法表:
【修改变量i>=<1】
【循环-【比较-小于等于>=<【获取变量i】>=<9】
>=<
【赋值变量line>=<】
【修改变量j>=<1】
【循环-【比较-小于等于>=<【获取变量j】>=<【获取变量i】】
>=<
【赋值变量line>=<【变量line】【获取变量j】×【获取变量i】=【计算int(【获取变量j】) * int(【获取变量i】)】 】
【修改变量j>=<【计算int(【获取变量j】) + 1】】
】
【回复【变量line】】
【修改变量i>=<【计算int(【获取变量i】) + 1】】
】示例 11:正则提取并处理
匹配方式:regex,匹配内容:计算\s+(\d+)\s*([+\-*/])\s*(\d+)
【赋值变量a>=<1】
【回复结果:【计算int(【变量a】)】】正则中的捕获组目前不会自动注入变量。建议配合测试或置变量用 Python 的re模块处理。
示例 12:私聊通知
群消息匹配特定关键词时,私聊通知管理员:
【回复私聊检测到关键词:\【变量消息内容\】>=<123456789】
【回复群已通知管理员>=<【变量群号】】
评论0
暂时没有评论