Chat2QQ+
基于 MiraiMC 更好的, 带有复杂字符串处理功能的聊天转发插件
Chat2QQ+
Chat2QQ+
这个插件专注于实现更好的消息显示, 并以模块的方式集成了一些其他的功能
- 🚧 说明 - 🚧 说明 是包含 %%MD1%% 几乎所有功能的插件, 经过重写并添加了许多功能. - 如果你有任何想法请点击 %%MD2%%, 打开一个功能请求. 如果我能做到就会去实现出来. - 如果您使用默认配置, 那么还需要开启 MiraiMC 插件配置中的 `bot.contact-cache.enable-group-member-list-cache`, 才能保证软件正常运行. <p></p>
- 📦 下载 - 在 📦 下载 中下载最新的jar文件. - 如果需要开发版本, 可以点击 %%MD1%%, 打开第一个, 找到最下面的jar文件. <p></p>
- 📄 其他 - 订阅更新: 点击右上角 `Watch` 按钮, 选择 `Custom` 中的 `Releases` ! - 使用量统计: 📄 其他 <p></p>
<a href="https://bstats.org/plugin/bukkit/ApliNi-Chat2QQ/17587"></a>
<br />
更新计划
- [x] 聊天消息转发 - [x] 格式化 - [x] 多群组支持 - [x] 消息预处理功能 - [x] 多行文本和长文本显示优化 - [x] 引用回复显示优化 - [x] 群名片过滤 - [x] 艾特显示优化 - [x] 用户黑名单
- [x] 事件处理 - [x] 玩家加入退出
--- 这些功能在可配置的模块中
- [x] 运行指令 - [x] 返回指令输出消息 - [x] 更好的等待指令返回 - [x] 权限管理 - [x] 继承 - [x] 指令黑名单
- [x] 从群名片中匹配游戏名称
- [x] 消息预处理 - [x] 匹配方式: 前缀 / 包含 / 相等 / 正则 - [x] 支持让匹配到的消息完全不发送
- [x] 按行预处理指令的返回消息 - [x] 支持(匹配方式)
- [x] 按合并后的完整消息预处理指令返回消息 - [x] 支持(匹配方式) - [x] 添加一些特殊的占位符
- [x] 预设的格式调整功能 - [x] 删除消息中的格式化字符 - [x] 删除消息前后空格和空行 - [x] 删除群名片中的格式化代码 - [x] 将长文本转换为鼠标悬浮显示文本 - [x] 更好的多行消息 - [x] 将聊天消息转发到控制台
- [x] 引用回复优化 - [x] 格式化 - [x] 删除重复的艾特
- [x] `/qchat` - [x] 区分玩家运行指令和控制台运行指令
- [x] 群成员信息缓存 [前置] - [x] 自动更新数据 - [x] 支持使用外部 Mirai 的缓存文件
- [x] 艾特显示优化
- [x] 事件任务 - [x] 群成员加入 - [x] 群成员退出
- [x] 自动回复 - [x] 支持(匹配方式) - [x] 支持 PAPI
<br />
✨ 图片
运行指令

群名片过滤


特殊消息预处理


多行文本和长文本显示优化




引用回复显示优化






更好的名称显示


自动回复

完整配置和功能
```yaml
游戏内配置
QQ -> MC 的消息
general:
转发哪些QQ群的消息
group-ids: - 1000000 - 1000001
群聊天前缀 (聊天需要带有指定前缀才能发送到服务器)
requite-special-word-prefix: enabled: false prefix: - '#'
当群名片不存在时是否尝试获取昵称
use-nick-if-namecard-null: true
QQ群消息广播到游戏内聊天的格式 格式化代码: §
%groupname% - 群名称
%groupid% - 群号
%nick% - 发送者群名片
%regex_nick% - 使用正则匹配到的名称, 需要开启 aplini.cleanup-name 模块
%qq% - 发送者QQ号
%message% - 消息内容, 支持预处理模块 aplini.pretreatment
%reply% - 如果是回复消息..., 配置在 aplini.reply-message 模块
in-game-chat-format: '§f[§7%nick%§r§f] %reply%§7%message%'
为每个群使用不同的格式, 如果没有则使用上方的 in-game-chat-format
special: 1000000: '§f[§7主群 %nick%§r§f] %reply%§7%message%' 1000001: '§7[外群 %nick%] %reply%%message%'
启用 MiraiMC 内置的QQ绑定
use-miraimc-bind: false
已绑定玩家的广播消息格式
bind-chat-format: '§f[§7%nick%§r§f] %reply%§7%message%'
为每个群使用不同的格式, 如果没有则使用上方的 bind-chat-format
special-bind: 1000000: '§f[§7主群 %nick%§r§f] %reply%§7%message%'
机器人配置
MC -> QQ 的消息
bot:
使用哪些QQ号处理消息
只能添加一个
bot-accounts: - 2000000
将消息转发到那些QQ群
group-ids: - 1000000
玩家在以下世界中聊天才会被转发
available-worlds: #- world
将以上配置作为黑名单, 玩家不在以上世界中聊天才会被转发
available-worlds-use-as-blacklist: true
游戏聊天前缀 (聊天需要带有指定前缀才能发送到QQ群)
requite-special-word-prefix: enabled: true prefix: - '#'
是否转发被其他插件取消过的聊天消息事件, 用于修复一些兼容性问题
ignoreCancelled: false
服务器消息发送到QQ群的格式
%player% - 玩家名称
%message% - 消息内容
group-chat-format: '[%player%] %message%'
是否发送玩家进出服务器的消息
%player% - 玩家显示昵称
send-player-join-quit-message: false
加入
player-join-message: '%player% 进入服务器'
退出
player-quit-message: '%player% 离开服务器'
防刷屏, 在此时间内多次进出服务器不会发送消息
player-join-quit-message-interval: 0
黑名单, 可用于添加其他QQ机器人
优先级大于上方配置
blacklist:
不转发以下QQ号的聊天消息
qq: #- 2000001
不转发以下玩家名的聊天消息
player: #- playerName
############### #
以下为功能模块配置 #
############### #
aplini:
1
在QQ群中运行指令 [需要单独添加QQ群]
此模块不处理黑名单 blacklist
run-command: enabled: false
启用的 QQ群
qq-group: - 1000001
指令前缀, 可以是多个字符, 比如 "~$"
command-prefix: '/'
指令最大长度 (不包括指令前缀)
command-max-length: 255
获取指令的正则表达式, 当第一个捕获组的内容与指令白名单中的匹配时则允许运行 (不带斜杠或前缀)
regex-command-main: '^([^ ]+)'
判断指令返回为空的正则, 匹配多行文本. (经过 pretreatment-command-message 处理后)
return-isNull: '^s*$'
是否将主命令转换为小写再执行
always-lowercase: false
是否发送指令的输出, 关闭可提高性能或解决一些兼容性问题
return: true
等待指令运行多长时间再将结果发送到QQ群 (毫秒), 需要开启 run-command.return
如果你遇到了一些提前输出类似 "正在运行...请稍等" 消息的插件, 可以在 pretreatment-command-message 中配置完全删除这条消息. 然后 return-sleep-min 保持不变 :)
return-sleep-min: 14 # 最小等待时间 return-sleep-max: 5346 # 最大等待时间, 如果一些长耗时指令没有输出请增大此值 return-sleep-sampling-interval: 172 # 输出内容检查间隔, 如果经常执行长耗时指令可以增大此值
是否将指令的输出打印到控制台和日志
return-log: true
执行不在白名单中的指令时发送返回消息
message-miss: '未命中的指令'
运行无返回指令的消息
message-no-out: '运行无返回指令'
设置各组可执行的主命令白名单 (不带斜杠或前缀)
权限更高的用户将可以使用更低的用户的指令
如果添加一条 ___ALL_COMMAND___ 作为指令, 则表示此组可以使用所有指令, 此功能请勿随意使用 !
group:
permission_<int> 是 MiraiMC 获取到的权限数字, 以后更新了其他权限只需要以此格式添加即可使用
permission_2: # 群主 #- chat2qq permission_1: # 管理员 #- spark permission_0: # 成员 #- list #- tps
特殊指令配置
special: no-return: # 这些指令始终不输出消息 #- plugins #- version
2
从 群名片(%nick%) 中匹配 MC 可用的游戏名称
添加变量: %regex_nick% - 使用正则匹配到的名称, 需要开启 cleanup-name 功能
cleanup-name: enabled: false
程序取第一个捕获组的结果
regex: '([a-zA-Z0-9_]{3,16})'
如果匹配不到, 则使用以下字符串
%nick% - 群名片
%qq% - qq号
not-captured: '%nick%'
3
预处理 %message% 中的消息
pretreatment: enabled: true
使用方法
list:
- 匹配方式: prefix (前缀匹配), 处理方式: to_all, to_replace
contain (包含), 处理方式: to_all, to_replace
equal (完全相等), 处理方式: to_all
regular (正则匹配), 处理方式: to_all, to_regular
#
处理方式: to_all (替换整条消息)
to_replace (替换匹配到的部分)
to_regular (使用正则替换, 可使用正则变量)
#
是否发送: send (填写 send 配置将取消转发送匹配到的消息, 不需要时请忽略)
示例配置, 默认配置了一些可能有用的功能:
list:
群公告, JSON
- prefix: '{"app":"com.tencent.mannounce"' to_all: '[群公告]'
视频, 字符串
- prefix: '你的QQ暂不支持查看视频短片' to_all: '[视频]'
使中括号与文本的前后始终有空格
- regular: '[([^]]+)]([^s])' to_regular: '[$1] $2' - regular: '([^s])[([^]]+)]' to_regular: '$1 [$2]'
转发消息使用前缀, 在群中使用 # 前缀将改变消息格式
- regular: '^s*(?:#|#)' to_regular: '§7> §f'
示例: 取消发送包含此内容的消息
#- contain: '此内容'
send: false
3.1
按行预处理指令返回消息, 用于处理返回到QQ群的消息
pretreatment-command-message: enabled: true
使用方法: 如上
list:
删除格式化字符
- regular: '§[a-z0-9]' to_regular: ''
示例: co插件翻页消息处理
#- regular: '◀? ?第 (.*) 页 ▶? ?((.*))'
to_regular: '第 $1 页, 使用 /co page <页码> 翻页'
3.2
按多行文本预处理指令返回消息
可使用占位符:
- %command% :: 用户运行的指令原文(不带斜杠/前缀)
- %time% :: 指令运行耗时
- %qq% :: 执行指令的qq号
- %group% :: 执行指令的群号
pretreatment-command-message-all: enabled: false enabled-placeholder: false # 关闭占位符可提高性能
使用方法: 如上
list:
示例: 显示指令运行时间, 需要开启占位符
#- regular: '([sS]+)'
to_regular: '$1n - 运行耗时: %time%ms'
4
预设的格式调整功能
other-format-presets:
是否删除 %message% 消息 中的格式化字符
render-message_format-code: false
删除 %message% 消息 前后的空格和空行
message-trim: true
是否删除 %nick% 群名片 中的格式化字符
render-nick_format-code: true
聊天消息过长时转换为悬浮文本
long-message: enabled: true
以下任意一个条件成立时被判定为长消息, 若需取消一个, 请改为很大的数
条件1: 消息长度达到此值
condition-length: 210
条件2: 换行数量达到此值, 在 message-trim 之后运行
condition-line_num: 6
显示为
message: '§f[§7长消息§f]'
是否启用 "更好的多行消息"
multiline-message: enabled: true line-0: '' # [多行消息] line-prefix: ' '
是否将聊天消息转发到控制台/日志
message-to-log: true
5
引用回复
添加变量: %reply%
如果是回复消息, 则为变量赋值并为消息添加悬浮文本框用于显示内容. 可以将鼠标悬停在消息上查看回复的内容
reply-message:
可用变量:
%qq% - 被回复的消息的发送者QQ号
%c_name% - 群名片 - 需要开启 aplini.format-qq-id
var: '§f[§7回复 @%c_name%§f] '
可用变量:
%/n% - 换行
%qq% - 被回复的消息的发送者QQ号
%c_name% - 群名片 - 需要开启 aplini.format-qq-id
%message% - 回复内容
%main_message% - 当前消息内容
message: '§f[§7引用 @%c_name%§f]%/n%§7%message%§r%/n%%/n%§f——%main_message%'
删除重复@ :: 如果引用回复对象等于消息开头的@对象, 则删除消息开头的 @
del-duplicates-at: true
6
发送消息的指令
/qchat <消息> - 使用此指令
qchat:
使用上方 general.group-ids 中配置的群
use-general-group-ids: true
消息转发到哪些群, 需要 use-general-group-ids: false
group-ids: - 1000000
如果是玩家使用指令
player:
转发到QQ群的格式
%name% - 玩家名称
%message% - 消息
qq-format: '[%name%] %message%'
是否同时将消息广播到MC服务器
mc-broadcast: true
广播到MC服务器的
mc-format: '§f[§7%name%§f] §7%message%'
如果是控制台或插件使用指令, 同时绕过关键词和玩家黑名单
console:
%message% - 消息
qq-format: '%message%'
7
[前置] 群成员信息缓存
! 需要开启 MiraiMC 配置中的 bot.contact-cache.enable-group-member-list-cache
player-cache:
在机器人登录和服务器启动时运行此程序
enabled: true
在玩家群名片修改时更新缓存
auto-update: true
在玩家发送消息时更新缓存
auto-update-form-msg: true
群名片修改时发出日志
auto-update-log: true
使用上方 general.group-ids 中配置的群
use-general-group-ids: true
缓存哪些群, 需要 use-general-group-ids: false
group-ids: - 1000000
8
将 %message% 中的 @qqID 替换为 @名称
需要开启前置: aplini.player-cache
format-qq-id: enabled: true
用于匹配 @qqID 的正则
regular: '(@[0-9]{5,11})'
格式
%qq% - qq号
%name% - 名称
format: '§f[§7@%name%§f]§7'
一条消息最多匹配几次, 防止刷屏浪费性能
max-cycles-num: 10
9
事件任务
event-func:
enable 修改后需要重启服务器
enable: false
使用上方 general.group-ids 中配置的群
use-general-group-ids: true
启用在哪些群, 需要 use-general-group-ids: false
group-ids: - 1000000
每个事件可用的任务不同, 这里列出了所有任务的使用方法:
- command: 'command' - 发送指令
- message-text: '消息' - 向事件来源发送消息, 群 或 好友/私聊
- message-group: 1000000 - 向指定群发送消息
message-text: '消息'
- message-friend: 2000003 - 向指定好友发送消息
message-text: '消息'
MiraiMemberJoinEvent: # 群成员加入
可使用: command, message-text, message-group
一个事件中可添加多个相同或不相同的任务, 就像这样:
#- message-text: '欢迎' #- command: 'tps' #- command: 'mspt' #- message-group: 1000000
message-text: '消息'
MiraiMemberLeaveEvent: # 成员退出
可使用: command, message-text, message-group
10
自动回复
当QQ群中的消息匹配时发送自定义消息
auto-response: enable: true
使用上方 general.group-ids 中配置的群
use-general-group-ids: true
回复哪些群的消息, 需要 use-general-group-ids: false
group-ids: - 1000000
为此功能启用PAPI, 需要安装PAPI插件
enable-papi: false
使用方法
list:
- 匹配方式: prefix (前缀匹配)
contain (包含)
equal (完全相等)
regular (正则匹配, send 中可使用正则变量)
send (发送的消息内容)
#
> 正则的性能较差, 请尽量避免使用很多正则
!! 请小心使用正则拼接PAPI变量, 如果正则设计有问题则可能出现注入漏洞 !!
- 提示: 应指定匹配的字符范围和最小最大次数, 要绝对的防止输入PAPI变量的保留符号: %
- 比如: - regular: '^#ping ([a-zA-Z0-9_]{3,16})$'
send: '$1 的延迟为: %player_ping_$1%ms'
示例配置, 默认配置了一些可能有用的功能:
list:
使用PAPI获取在线玩家数量, 需要启用 aplini.auto-response.enable-papi
PlayerList: /papi ecloud download playerlist
- equal: '#list' send: '在线玩家: [%playerlist_online,normal,yes,amount%] n%playerlist_online,normal,yes,list%'
使用PAPI获取服务器TPS, 需要启用 aplini.auto-response.enable-papi
Server: /papi ecloud download Server
- equal: '#tps' send: 'TPS [1m, 5m, 15m]: %server_tps_1% / %server_tps_5% / %server_tps_15%'
指令列表
- equal: '#help' send: '指令列表: n - #list - 显示在线玩家列表 n - #tps - 显示服务器TPS'
@一个QQ号时发送消息
- contain: '@2000000' send: 'OwO'
<- 至此, 您已经完成了所有配置, 部分功能使用 /chat2qq reload 重载插件即可应用 uwu
```
指令和权限
- `qchat <消息>` - 发送消息到群, 详细配置在 `aplini.qchat` - `chat2qq` - 插件主命令 & 帮助信息 - `chat2qq outgroupcacheall` - 打印群成员缓存数据
plugin.yml ```yaml commands: qchat: description: 发送聊天消息到QQ群 permission: chat2qq.command.qchat
chat2qq: description: Chat2QQ 插件主命令
permissions: chat2qq.qq.receive: description: 允许收到来自QQ群的消息 default: true
chat2qq.chat.requite: description: 允许使用前缀符号转发消息到QQ群 default: true
chat2qq.join.silent: description: 允许悄悄加入服务器 default: false
chat2qq.quit.silent: description: 允许悄悄离开服务器 default: false
chat2qq.command.qchat: description: 允许使用 /qchat default: op
chat2qq.command.chat2qq: description: 允许使用 /chat2qq default: op ```