# DDBOT 模板介绍
DDBOT的模板大致与GO标准库`text/template`与相同,想深入了解请参考[官方文档](https://pkg.go.dev/text/template) 。
**注:DDBOT模板从`v1.0.5`版本开始支持**
## 配置
DDBOT默认不启用自定义模板,当需要使用时,需要修改配置文件`application.yaml`,在其中增加一段配置,并且重启bot:
```yaml
template:
enable: true
```
如果配置成功,启动时将显示日志信息:`已启用模板`。
配置成功后,DDBOT将会自动创建一个`template`文件夹,用于存放所有的模板文件。
DDBOT会**监控**该文件夹目录,这意味着对模板的创建/修改/删除等操作,无需重启BOT即可生效,DDBOT会自动使用最新的模板。
## 认识模板
模板是`template`文件夹下的一个文件,后缀名为`.tmpl`。
它是一个文本文件,可以使用文本编辑器进行编辑,它的文件名即是模板的名字,它的内容即是模板的内容。
### 文字模板
*创建一个模板,编辑其内容为:*
```text
这是一段文字,也是一段模板
```
*该模板将发送为:*
### 模板的高级功能
在模板中,所有的`{{ ..... }}`都有特殊意义,例如:
- 使用`{{ pic "uri" }}`发送图片:
*创建一个模板,编辑其内容为:*
```text
发送一张图片 {{ pic "https://i2.hdslb.com/bfs/face/0bd7082c8c9a14ef460e64d5f74ee439c16c0e88.jpg" }}
```
*该模板将发送为:*
在这个例子中,使用了一个模板函数`pic`,它可以用来发送一张图片。
- 使用`{{ cut }}`发送分段消息:
*创建一个模板,编辑其内容为:*
```text
一、啦啦啦
{{- cut -}}
二、啦啦啦
```
*该模板将发送为:*
在这个例子中,使用了一个模板函数`cut`,它可以用来切分消息。
*请注意括号内的短横线`-`符号,它的作用是控制前后换行符*。
- 使用模板变量:
`.`符号表示引用一个模板变量,**根据模板应用的场合,能够使用的模板变量也不尽相同**。
例如:当自定义`/签到`命令模板时,能够使用`.score`变量与`.success`变量。
*创建一个模板,编辑其内容为:*
```text
{{- reply .msg -}}
{{ if .success -}}
签到大大大大大成功!获得1只萝莉,当前拥有{{.score}}只萝莉
{{- else -}}
明天再来吧,当前拥有{{.score}}只萝莉
{{- end }}
```
*该模板将发送为:*
这个例子还展示了**回复消息语法**:`{{- reply .msg -}}`以及模板的**条件控制语法**:`{{if}} {{else}} {{end}}`
## 通过模板创建自定义命令回复
得益于模板的高度定制化能力,DDBOT现在支持通过模板发送消息的自定义命令:
例如可以创建一个`/群主女装`命令,并让这个命令发送定义在模板内的群主女装照。
首先需要在配置文件`application.yaml`中定义命令:
```yaml
autoreply:
group:
command: [ "群命令1", "群命令2" ]
private:
command: [ "私聊命令1", "私聊命令2" ]
```
在上面这段配置中,自定义了两个群命令`/群命令1`和`/群命令2`,两个私聊命令`/私聊命令1`和`/私聊命令2`。
完成后需要创建对应的模板文件:
- `custom.command.group.群命令1.tmpl`
- `custom.command.group.群命令2.tmpl`
- `custom.command.private.私聊命令1.tmpl`
- `custom.command.private.私聊命令2.tmpl`
当触发`/群命令1`的时候,则会自动发送模板消息`custom.command.group.群命令1.tmpl`。
当触发`/私聊命令1`的时候,则会自动发送模板消息`custom.command.private.私聊命令1.tmpl`。
其他命令也遵守这个规则。
## 通过模板创建定时消息
DDBOT现在支持通过模板发送消息的定时命令:
首先需要在配置文件`application.yaml`中定义定时消息:
```yaml
cronjob:
- cron: "* * * * *"
templateName: "定时1"
target:
private: [ 123 ]
group: [ ]
- cron: "0 * * * *"
templateName: "定时2"
target:
private: [ ]
group: [ 456 ]
```
在上面这段配置中,自定义了两条定时消息,完成后需要创建对应的模板文件:
- `custom.cronjob.定时1.tmpl`
- `custom.cronjob.定时2.tmpl`
定时消息的定时条件使用`cron表达式`定义,可以在[工具网站](https://tool.lu/crontab/)上选择`类型:Linux`编辑和测试Cron表达式。
DDBOT使用五个字段的Cron表达式,这意味着最小的定时粒度为`1分钟`。
完成配置后,`定时1`会每分钟触发一次,触发时会私聊QQ号为123发送消息模板`custom.cronjob.定时1.tmpl`。
`定时2`会每小时触发一次,触发时会在QQ群456内发送消息模板`custom.cronjob.定时2.tmpl`。
## DDBOT新增的模板函数
- {{- cut -}}
用于发送分段消息,上面已介绍过
- {{ reply .msg }}
用于回复消息,上面已介绍过
- {{ prefix }}
引用配置中的command prefix,默认为`/`
- {{ pic "图片地址" }}
用于发送图片,支持`http/https`链接,以及本地路径。
图片格式支持 jpg / png / gif。
*如果路径是一个文件夹,则会在文件夹内随机选择一张图片。*
- {{ roll a b }}
在a ~ b范围内中随机一个数字,a b 返回值均为int64类型。
- {{ choose "a" "b" "c" }}
从传入的参数中随机返回一个,参数类型为string,支持变长参数。
*以下为v1.0.6新增*
- {{ at 123456 }}
发送@指定的qq号
- {{ icon 123456 }}
发送指定qq号的头像
*以下为v1.0.7新增*
- {{ hour }}
返回当前时间的小时数, 范围为[0, 23],类型为int
- {{ minute }}
返回当前时间的分钟数,范围为[0, 59],类型int
- {{ second }}
返回当前时间的秒数,范围为[0, 59],类型为int
- {{ month }}
返回当前时间的月份,范围为[1,12],类型为int
- {{ year }}
返回当前时间的年份,类型为int
- {{ day }}
返回当前时间为当月的第几天,类型为int
- {{ yearday }}
返回当前时间为当年的第几天,闰年范围为[1,366],非闰年范围为[1,365],类型为int
*以下为v1.0.8新增*
- {{ weekday }}
返回当前时间是本周的第几天,1~7分别表示周一至周日,范围为[1,7],类型为int
- 变量 `{{ .at_targets }}`
自定义命令现在支持@成员, 可以通过 {{ .at_targets }}来获取本次命令触发时@的成员的QQ号。
该变量为数组类型,可以搭配`len`和`index`等命令使用,例如:
```text
{{- if gt (len .at_targets) 0 -}}
你@了{{ index .at_targets 0}}
{{- else -}}
请@TA使用命令喵
{{- end -}}
```
- 获取群成员信息 `{{ member_info .group_code .member_code }}`
获取群成员信息,.at_targets中的qq号可以搭配这个命令来获取被@的成员的信息,例如:
```text
{{- if gt (len .at_targets) 0 -}}
{{- $t := index .at_targets 0 -}}
{{- $info := member_info .group_code $t -}}
你@了{{- $info.name }}
{{ $info.name }} 的性别是 {{ if eq $info.gender 2 }}男生{{ else if eq $info.gender 1 }}女生{{else}}秘密{{end}} 喵
{{- else -}}
请@TA使用命令喵
{{- end -}}
```
返回结果中可以使用的信息有:
`name`:成员的群聊名字,如果没有设置,就是QQ资料名字
`gender`:QQ资料性别,2表示男生,1表示女生,0表示未公开
`permission`:QQ群权限,10表示群主,5表示管理员,1表示普通成员
- 带权重的`choose`
现在`choose`的每个元素后面支持一个可选的权重参数(必须是大于0的整数,如果省略则默认为1),进行随机时,将尊重权重设置,例如:
```text
{{ choose "a" "b" 1 "c" 5 }}
```
在上面的结果中,结果是"c"的概率将是"a"和"b"的5倍,"a"和"b"的概率相同("a"的权重省略默认为1,b"的权重1也可以省略)。
数值上说,选中"c"的概率是 $\frac{5}{7}$,
选中"a"和"b"的概率分别是 $\frac{1}{7}$。
感觉上来说就像写了5次"c"。
- 完整文字参数 `{{ .full_args }}`
返回本次命令触发时附带的完整文字参数,与`{{.args}}`的区别是:它不是一个数组,而是包含文字和空格的完整参数。
例如,当触发命令`/test a b c`时:
`{{.args}}`的内容是一个数组`[]string{"a", "b", "c"}`,需要配合`index`等命令使用。
`{{ .full_args }}`的内容是"a b c",它是一个字符串而非数组。
- 一组类型转换函数
点击查看详情
- `{{ float64 123 }}`
转换参数为`float64`类型
- `{{ int 123 }}`
转换参数为`int`类型
*int在32位和64位下表现不一致*
- `{{ int64 123}}`
转换参数为`int64`类型
- `{{ toString 123 }}`
转换参数为`string`类型
- 一组数学函数
点击查看详情
函数名字末尾带**f**的表示它返回值是`float64`,不带**f**的返回值为`int64`
- add / addf
`{{ add 1 2}}` 计算加法
- sub / subf
`{{ sub 1 2}}` 计算减法
- mul / mulf
`{{ mul 2 2 }}` 计算乘法
- div / divf
`{{ div 10 5 }}` 计算除法
- mod / modf
`{{ mod 10 5 }}` 计算余数
- 一组最值函数
点击查看详情
函数名字末尾带**f**的表示它返回值是`float64`,不带**f**的返回值为`int64`
- max / maxf
`{{ max 1 2 3 4 5 }}` 返回最大值
- min / minf
`{{ min 1 2 3 4 5 }}` 返回最小值
- 一组哈希函数
点击查看详情
- base64encode
`{{ base64encode "hello world" }}` base64的加密
- base64decode
`{{ base64decode "aGVsbG8gd29ybGQ=" }}` base64的解密
- md5sum
`{{ md5sum "hello world" }}` md5加密
- sha1sum
`{{ sha1sum "hello world" }}` sha1加密
- sha256sum
`{{ sha256sum "hellow world" }}` sha256sum加密
- adler32sum
`{{ adler32sum "hellow world" }}` adler32sum加密
- uuid
{{ uuid }} 生成一个UUID
- 一组字符串函数
点击查看详情
- hasPrefix
`{{ hasPrefix "aaa" "aaabcd" }}` 检查字符串是否有指定前缀
- hasSuffix
`{{ hasSuffix "aaa" "bcdaaa" }}` 检查字符串是否有指定后缀
- contains
`{{ contains "aaa" "bcdaaabcd" }}` 检查字符串是否包含一个子字符串
- trim
`{{ trim " aaa " }}` 去掉字符串前后的空白字符
- trimSuffix
`{{ trimSuffix "aaa" "bcdaaa" }}` 去掉字符串的指定后缀,如果字符串没有指定后缀,则无效果
- trimPrefix
`{{ trimPrefix "aaa" "aaabcd" }}` 去掉字符串的指定前缀,如果字符串没有指定前缀,则无效果
- split
`{{ split " " "foo bar baz" }}` 按照指定字符串分割字符串,返回一个list
- join
`{{ join " " (list "foor" "bar" "baz") }}` 按照指定字符串拼接字符串,返回一个字符串
- trunc
`{{ trunc 2 "abcde" }}` 按照长度截取字符串,如果长度大于字符串,则返回整个字符串
- upper
`{{ upper "abc" }}` 把字符串中所有英文字母改成大写
- lower
`{{ lower "ABC" }}` 把字符串中所有英文字母改成小写
- title
`{{ title "hello world" }}` 把字符串中的英文单词改为首字母大写
- snakecase
`{{ snakecase "FirstName" }}` 把字符串中所有命名改成蛇形命名法
- camelcase
`{{ camelcase "first_name" }}` 把字符串中所有命名改成驼峰式命名法
- 一组默认值与空值函数
点击查看详情
- empty
`{{ if empty .args }}empty{{else}}not empty{{end}}` 检查变量是否是空值
- nonEmpty
`{{ if nonEmpty .args }}not empty{{else}}empty{{end}}` 检查变量是否不是空值
- coalesce
返回第一个非空的值,支持变长参数,常用于设置默认值
```
{{- $name := "" -}}
{{- $name = coalesce $name "没有名字" -}}
{{ $name }}
```
- ternary
三元运算符的语法糖,当第三个参数为true时返回第一个参数,否则返回第二个参数
`{{ ternary "有参数" "没有参数" (nonEmpty .args)}}`
- all
检查参数是否全部非空,支持变长参数
`{{ if all "" 0 1}}all is not empty{{end}}`
- any
检查参数是否有一个非空,支持变长参数
`{{ if any "" 0 1}}someone is not empty{{end}}`
- 一组list函数
点击查看详情
- list
`{{ list "a" "b" "c" }}` 创建一个list,返回创建的list
- append
向list末尾添加一个元素,返回新的list
```
{{ $old := list "a" "b" "c" }}
{{ $new := append $old "d" }}
```
- prepend
向list开头添加一个元素,返回新的list
```
{{ $old := list "a" "b" "c" }}
{{ $new := prepend $old "d" }}
```
- concat
连接一组list,支持变长参数,返回新的list
```
{{ $l1 := list "a" }}
{{ $l2 := list "b" }}
{{ $l3 := list "c" }}
{{ $new := concat $l1 $l2 $l3 }}
```
- 一组dict函数
点击查看详情
- dict
`{{ dict "a" 1 "b" 2 "c" 3 }}` 创建一个dict,其中key必须是字符串类型,返回创建的dict:
- get
从dict中获取值
```
{{ $d := dict "a" 1 "b" 2 "c" 3 }}
{{ $value := get $d "a" }}
```
- set
设置dict的值,其中key必须是字符串类型,返回dict
```
{{ $d := dict "a" 1 "b" 2 "c" 3 }}
{{ set $d "a" 100 }}
```
- unset
删除dict的值,返回dict
```
{{ $d := dict "a" 1 "b" 2 "c" 3 }}
{{ unset $d "a" }}
```
- hasKey
检查dict中是否有指定key
```
{{ $d := dict "a" 1 "b" 2 "c" 3 }}
{{ if hasKey $d "a" }}Yes.{{ end }}
```
- merge
合并dict,支持变长参数,不会覆盖已经存在的key,如果需要覆盖,请使用`mergeOverwrite`
返回合并后的dict
```
{{ $d1 := dict "a" 1 "b" 2 "c" 3 }}
{{ $d2 := dict "a" 2 "b" 3 "c" 4 }}
{{ $d3 := merge $d1 $d2 }}
```
- mergeOverwrite
合并dict,支持变长参数,会覆盖已经存在的key
返回合并后的dict
```
{{ $d1 := dict "a" 1 "b" 2 "c" 3 }}
{{ $d2 := dict "a" 2 "b" 3 "c" 4 }}
{{ $d3 := mergeOverwrite $d1 $d2 }}
```
- pick
从dict中取出指定的key创建新dict,支持变长参数,返回新创建的dict
```
{{ $d := dict "a" 1 "b" 2 "c" 3 }}
{{ $d2 := pick $d "a" "b" }}
```
- json处理
json处理使用 [gjson](https://github.com/tidwall/gjson) 库实现,请参考对应文档。
```
{{- $data := `{"name":{"first":"Janet","last":"Prichard"},"age":47}` -}}
{{- $j := toGJson $data -}}
{{- $name := ($j.Get "name.first").String -}}
{{- $age := ($j.Get "age").Int -}}
Name is {{ $name }}.
Age is {{ $age }}.
```
- http请求
目前仅支持get / post 请求。
`httpGet` 用于发送get请求。
`httpPostJson` 用于发送json格式的post请求
`httpPostForm` 用于发送表单格式的post请求
三个函数的用法相同:
支持两个参数,第一个参数为url,第二个参数为请求参数(可选),请求参数的格式为dict,可使用dict创建。
```
{{/* 不带参数的httpGet */}}
{{- $j := httpGet "https://httpbin.sora233.me/get" | toGJson -}}
机器人的IP是:{{ coalesce ($j.Get "origin").String "获取失败" }}
```
```
{{/* 带参数的httpGet */}}
{{- $name := (member_info .group_code .member_code).name -}}
{{- $j := httpGet "https://httpbin.sora233.me/get" (dict "name" $name) | toGJson -}}
你好,{{ ($j.Get "args.name.0").String }}!
```
**http请求的特殊参数**
http请求存在一些特殊的保留参数,用来控制http行为,这些参数不会真正发送出去,当前支持:
- DDBOT_REQ_DEBUG
会详细输出本次http请求的细节(可能含有隐私信息,请注意不要随便复制给别人),用于DEBUG
- DDBOT_REQ_USER_AGENT
设置本次http请求的user_agent字段,大部分情况下不用设置,使用默认设置即可,默认值为:
```text
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
```
- DDBOT_REQ_HEADER
设置http请求的header,可以设置为list,每一项的格式为"A=B",表示设置header名字为A,值为B
- DDBOT_REQ_COOKIE **(警告:不正确使用可能导致ccokie泄漏)**
设置http请求的cookie,可以设置为list,每一项的格式为"A=B",表示设置cookie名字为A,值为B
- DDBOT_REQ_PROXY
用于控制请求代理,可以是:
`prefer_mainland` 使用mainland代理(要求已经配置proxy_pool)
`prefer_oversea` 使用oversea代理(要求已经配置proxy_pool)
`prefer_none` 不使用代理
`prefer_any` 随机选择mainland/oversea
`直接的proxy地址(例如http://localhost:7890)` 直接使用指定的代理
特殊参数的例子:
```
{{- /* 特殊参数的httpGet */ -}}
{{- $d := dict -}}
{{- /* 设置DDBOT_REQ_DEBUG,展示http 详细信息*/ -}}
{{- $d = set $d "DDBOT_REQ_DEBUG" "1" -}}
{{- /* 设置DDBOT_REQ_USER_AGENT,自定义USER_AGENT */ -}}
{{- $d = set $d "DDBOT_REQ_USER_AGENT" "DDBOT TEMPLATE 100%" -}}
{{- /* 设置DDBOT_REQ_HEADER,添加http自定义header */ -}}
{{- $d = set $d "DDBOT_REQ_HEADER" (list "FROM_DDBOT=yes") -}}
{{- /* 设置DDBOT_REQ_COOKIE,添加http自定义cookie */ -}}
{{- $d = set $d "DDBOT_REQ_COOKIE" (list "DDBOT_COOKIE=cookie_value") -}}
{{- /* 设置DDBOT_REQ_PROXY,不使用代理 */ -}}
{{- $d = set $d "DDBOT_REQ_PROXY" "prefer_none" -}}
{{- $_ := httpGet "https://httpbin.sora233.me/get" $d -}}
请查看命令行内的详细输出
```
*以下为v1.0.9新增*
- 发送戳一戳消息(只支持群聊)
戳一戳QQ号123456的用户
```
{{ poke 123456 }}
```
- 获取bot的qq号码
```
{{ bot_uin }}
```
- 设置命令冷却时间cooldown
cooldown设置后,设定时间内只有第一次会返回true,后续函数将返回false。
cooldown函数可以跨模板设置。
cooldown函数第一个参数为时间单位,支持如下简写,数字可以自由更换:
- 500ms(表示500毫秒)
- 1s(表示1秒钟)
- 20m(表示20分钟)
- 1.5h(表示1.5小时)
- 2h45m(表示2小时45分钟)
**如果设置为0或者负数,将自动替换为5m(即5分钟)**
cooldown函数的后续参数为设置cooldown的关键字,不同关键字的cooldown无任何关联,相同关键字的cooldown在时间范围内只能触发一次。
例子:
使用模板名作为关键字,实现单个模板所有人共享cooldown,不同模板独立cooldown:
```
{{- if (cooldown "10s" .template_name) -}}
成功
{{- else -}}
失败,正在冷却
{{- end -}}
```
把`.member_code`加入关键字,实现每个人对每个模板有独立cooldown:
```
{{- if (cooldown "10s" .member_code .template_name) -}}
成功
{{- else -}}
失败,正在冷却
{{- end -}}
```
使用固定关键字,实现不同模板共享cooldown:
```
{{- if (cooldown "10s" "my_cooldown_keyword_1") -}}
成功
{{- else -}}
失败,正在冷却
{{- end -}}
```
- 读取本地文件`openFile`
**警告:该函数并不会对参数做安全检查,在任何情况下都绝对不要把用户输入作为函数参数。**
返回值为`[]byte` ,例子:
```
{{ $data := openFile "path/myfile" }}
```
- 强制退出当前模板`abort`
退出当前模板并且丢弃已经产生的内容,如果有参数,则会发送参数
例子:
```
{{- abort -}}
```
```
{{- abort "出现错误" -}}
```
```
{{- if eq 1 5 -}}
{{- abort (printf "出现错误: %v居然等于%v" 1 5) -}}
{{- end -}}
```
abort也支持图片参数
```
{{ abort (pic "https://i2.hdslb.com/bfs/face/0bd7082c8c9a14ef460e64d5f74ee439c16c0e88.jpg" ) }}
```
- 结束处理当前模板`fin`
退出当前模板并且发送已经产生的内容,未被处理的模板代码将被跳过
```
这句话会输出
{{- fin -}}
这句话不会输出
```
## 当前支持的命令模板
命令通用模板变量:
| 模板变量 | 类型 | 含义 | 备注 |
|---------------|----------|-----------------------|---------------|
| group_code | int | 本次命令触发的QQ群号码(私聊则为空) | |
| group_name | string | 本次命令触发的QQ群名称(私聊则为空) | |
| member_code | int | 本次命令触发的成员QQ号 | |
| member_name | string | 本次命令触发的成员QQ名称 | |
| cmd | string | 本次触发的命令名称 | 从v1.0.7版本开始支持 |
| args | []string | 本次命令触发时附带的参数数组(只支持文字) | 从v1.0.7版本开始支持 |
| at_targets | []int64 | 本次命令触发时附带的@成员的QQ号码 | 从v1.0.8版本开始支持 |
| full_args | string | 本次命令触发时附带的完整参数(只支持文字) | 从v1.0.8版本开始支持 |
| template_name | string | 本次命令触发时的模板名字 | 从v1.0.9版本开始支持 |
- /签到
模板名:`command.group.checkin.tmpl`
| 模板变量 | 类型 | 含义 |
|---------|------|--------------------------------|
| success | bool | 表示本次签到是否成功,一天内只有第一次签到成功,后续签到失败 |
| score | int | 表示目前拥有的签到分数 |
默认模板
```text
{{ reply .msg }}{{if .success}}签到成功!获得1积分,当前积分为{{.score}}{{else}}明天再来吧,当前积分为{{.score}}{{end}}
```
- /help (私聊版)
模板名:`command.private.help.tmpl`
| 模板变量 | 类型 | 含义 |
|------|-----|-----|
| 无 | ||
默认模板
```text
常见订阅用法:
以作者UID:97505为例
首先订阅直播信息:{{ prefix }}watch 97505
然后订阅动态信息:{{ prefix }}watch -t news 97505
由于通常动态内容较多,可以选择不推送转发的动态
{{ prefix }}config filter not_type 97505 转发
还可以选择开启直播推送时@全体成员:
{{ prefix }}config at_all 97505 on
以及开启下播推送:
{{ prefix }}config offline_notify 97505 on
BOT还支持更多功能,详细命令介绍请查看命令文档:
https://gitee.com/sora233/DDBOT/blob/master/EXAMPLE.md
使用时请把作者UID换成你需要的UID
当您完成所有配置后,可以使用{{ prefix }}silence命令,让bot专注于推送,在群内发言更少
{{- cut -}}
B站专栏介绍:https://www.bilibili.com/read/cv10602230
如果您有任何疑问或者建议,请反馈到唯一指定交流群:755612788
```
- /help (群聊版)
模板名:`command.group.help.tmpl`
| 模板变量 | 类型 | 含义 |
|------|-----|-----|
| 无 | ||
默认模板
```text
DDBOT是一个多功能单推专用推送机器人,支持b站、斗鱼、油管、虎牙推送
```
- /lsp
模板名:`command.group.lsp.tmpl`
| 模板变量 | 类型 | 含义 |
|------|-----|-----|
| 无 | ||
默认模板
```text
{{ reply .msg -}}
LSP竟然是你
```
- /ping(私聊)
模板名:`command.private.ping.tmpl`
| 模板变量 | 类型 | 含义 |
|------|-----|-----|
| 无 | ||
默认模板
```text
pong
```
## 当前支持的推送模板
- b站直播推送
模板名:`notify.group.bilibili.live.tmpl`
| 模板变量 | 类型 | 含义 |
|--------|--------|-------------|
| living | bool | 是否正在直播 |
| name | string | 主播昵称 |
| title | string | 直播标题 |
| url | string | 直播间链接 |
| cover | string | 直播间封面或者主播头像 |
默认模板
```text
{{ if .living -}}
{{ .name }}正在直播【{{ .title }}】
{{ .url -}}
{{ pic .cover "[封面]" }}
{{- else -}}
{{ .name }}直播结束了
{{ pic .cover "[封面]" }}
{{- end -}}
```
- ACFUN站直播推送
模板名:`notify.group.acfun.live.tmpl`
| 模板变量 | 类型 | 含义 |
|--------|--------|-------------|
| living | bool | 是否正在直播 |
| name | string | 主播昵称 |
| title | string | 直播标题 |
| url | string | 直播间链接 |
| cover | string | 直播间封面或者主播头像 |
默认模板
```text
{{ if .living -}}
ACFUN-{{ .name }}正在直播【{{ .title }}】
{{ .url -}}
{{ pic .cover "[封面]" }}
{{- else -}}
ACFUN-{{ .name }}直播结束了
{{ pic .cover "[封面]" }}
{{- end -}}
```
- 斗鱼直播推送
模板名:`notify.group.douyu.live.tmpl`
| 模板变量 | 类型 | 含义 |
|--------|--------|-------------|
| living | bool | 是否正在直播 |
| name | string | 主播昵称 |
| title | string | 直播标题 |
| url | string | 直播间链接 |
| cover | string | 直播间封面或者主播头像 |
默认模板
```text
{{ if .living -}}
斗鱼-{{ .name }}正在直播【{{ .title }}】
{{ .url -}}
{{ pic .cover "[封面]" }}
{{- else -}}
斗鱼-{{ .name }}直播结束了
{{ pic .cover "[封面]" }}
{{- end -}}
```
- 虎牙直播推送
模板名:`notify.group.huya.live.tmpl`
| 模板变量 | 类型 | 含义 |
|--------|--------|-------------|
| living | bool | 是否正在直播 |
| name | string | 主播昵称 |
| title | string | 直播标题 |
| url | string | 直播间链接 |
| cover | string | 直播间封面或者主播头像 |
默认模板
```text
{{ if .living -}}
虎牙-{{ .name }}正在直播【{{ .title }}】
{{ .url -}}
{{ pic .cover "[封面]" }}
{{- else -}}
虎牙-{{ .name }}直播结束了
{{ pic .cover "[封面]" }}
{{- end -}}
```
## 当前支持的事件模板
- 有新成员加入群
模板名:`trigger.group.member_in.tmpl`
| 模板变量 | 类型 | 含义 |
|-------------|--------|-----------|
| group_code | int64 | 群号码 |
| group_name | string | 群名称 |
| member_code | int64 | 新加入的成员QQ号 |
| member_name | string | 新加入的成员昵称 |
默认模板
*该模板默认为空,即不发送消息*
```text
```
- 有成员退出群
模板名:`trigger.group.member_out.tmpl`
| 模板变量 | 类型 | 含义 |
|-------------|--------|----------|
| group_code | int64 | 群号码 |
| group_name | string | 群名称 |
| member_code | int64 | 退出的成员QQ号 |
| member_name | string | 退出的成员昵称 |
默认模板
*该模板默认为空,即不发送消息*
```text
```
- bot添加新好友
模板名:`trigger.private.new_friend_added.tmpl`
| 模板变量 | 类型 | 含义 |
|----------------------|--------|------------------|
| member_code | int64 | 添加的好友QQ号 |
| member_name | string | 添加的好友QQ昵称 |
| .command.HelpCommand | string | 帮助命令名称,默认是`help` |
默认模板
```text
阁下的好友请求已通过,请使用<{{ prefix .command.HelpCommand }}>(不含括号)查看帮助,然后在群成员页面邀请bot加群(bot不会主动加群)。
```
- bot接受加群邀请
模板名:`trigger.private.group_invited.tmpl`
| 模板变量 | 类型 | 含义 |
|-------------|--------|----------|
| group_code | int64 | 邀请加入的群号码 |
| group_name | string | 邀请加入的群名称 |
| member_code | int64 | 邀请人的QQ号 |
| member_name | string | 邀请人的QQ昵称 |
默认模板
```text
阁下的群邀请已通过,基于对阁下的信任,阁下已获得本bot在群【{{ .group_name }}】的控制权限,相信阁下不会滥用本bot。
```
*以下为v1.0.9新增*
- bot收到群戳一戳
模板名:`trigger.group.poke.tmpl`
| 模板变量 | 类型 | 含义 |
|---------------|--------|--------------|
| group_code | int64 | 发生戳一戳的群号码 |
| group_name | string | 发生戳一戳的群名称 |
| member_code | int64 | 发送戳一戳的用户QQ号 |
| member_name | string | 发送戳一戳的用户QQ昵称 |
| receiver_code | int64 | 被戳的用户QQ号 |
| receiver_name | string | 被戳的用户QQ昵称 |
注意群内所有的戳一戳消息都会受到,如果只想处理bot被戳的消息,需要使用`receiver_code`进行判断
默认模板
*该模板默认为空,即不发送消息*
```text
```
- bot收到好友私聊戳一戳
模板名:`trigger.private.poke.tmpl`
| 模板变量 | 类型 | 含义 |
|-------------|--------|-------------|
| member_code | int64 | 发送戳一戳的用户QQ号 |
| member_name | string | 发送戳一戳的QQ昵称 |
默认模板
*该模板默认为空,即不发送消息*
```text
```