Skip to content

Commit 042b1e0

Browse files
authored
Merge pull request #43 from eric2788/develop
ready to v0.1.13
2 parents d33910b + c08736e commit 042b1e0

File tree

6 files changed

+85
-29
lines changed

6 files changed

+85
-29
lines changed

README.md

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
# Vup Monitors
22

3-
基于 go-cqhttp 和 nodejs 的 Vups 直播間監控機器人,支援多群使用和私人广播
3+
基于 go-cqhttp 和 nodejs 的 Vups 直播间监控机器人,支持多群使用和私人广播
44

55
![showcase](/assets/dd_showcase.png)
66

7-
#### 目前支援监控的DD行为
7+
#### 目前支持监控的DD行为
88

99
- 进入直播间
1010
- 发送SC
@@ -26,7 +26,7 @@
2626

2727
- 运行 `go-cqhttp`, 根据提示填写 QQ 号和密码等信息, 参考文档 https://docs.go-cqhttp.org/guide/quick_start.html
2828

29-
- 啟用正向 Websocket (这点很重要,不然之后无法连接到 go-cqhttp)
29+
- 启用正向 Websocket (这点很重要,不然之后无法连接到 go-cqhttp)
3030

3131
### biligo-live-ws
3232

@@ -49,18 +49,18 @@
4949

5050
-`data/settings.json` 填入设定,包括
5151
- 设定数据源 `source``websocket`
52-
- websocket 中 填入你自架的 biligo-live-ws 或使用 公共API地址 (如果使用公共API,則需要 `use-tls: true`)
52+
- websocket 中 填入你自架的 biligo-live-ws 或使用 公共API地址 (如果使用公共API,则需要 `use-tls: true`)
5353
- 在管理员 `owners` 的设定中添加你的 QQ 号
5454
- 填入你在 go-cqhttp 中启用正向 Websocket 的端口 (如非6700)
5555

5656
- 再运行程序
5757

58-
- 开始透过指令设定监控和高亮
58+
- 开始通过指令设定监控和高亮
5959

6060

6161
#### 除了 biligo-live-ws 以外的运行方式
6262

63-
- [blive-redis-server](https://github.com/eric2788/blive-redis-server) + [redis](https://www.redis.com.cn/redis-installation.html) 伺服器 (比较麻烦)
63+
- [blive-redis-server](https://github.com/eric2788/blive-redis-server) + [redis](https://www.redis.com.cn/redis-installation.html) 服务器 (比较麻烦)
6464

6565
运行 blive-redis-server 和 redis,然后在 `data/settings.json` 设定数据源为 `redis` 即可
6666

@@ -107,11 +107,11 @@ B站直播WS讯息监控指令
107107

108108
### !注视名单
109109

110-
透过设置群注视名单,可以在广播时限制仅限在注视用户的直播间内/注视用户本人的所有DD行为。
110+
通过设置群注视名单,可以在广播时限制仅限在注视用户的直播间内/注视用户本人的所有DD行为。
111111

112112
```log
113-
- 由于注视用户不支援私聊,因此在私聊使用此指令时必须添加群id
114-
- 如果在群添加注视用户,则无需填入群id,並以该群作为添加/删除对象
113+
- 由于注视用户不支持私聊,因此在私聊使用此指令时必须添加群id
114+
- 如果在群添加注视用户,则无需填入群id,并以该群作为添加/删除对象
115115
```
116116

117117
- `!注视 新增 <用户id> <群id(如私聊)>` - 新增该群注视用户
@@ -153,20 +153,21 @@ B站直播WS讯息监控指令
153153
// websocket 数据源
154154
// 使用 blive.ericlamm.xyz 可贡献统计数据
155155
"websocket": {
156-
"id": "vup_monitors", // 支持不同ID以支援多个实例
156+
"id": "vup_monitors", // 辨识ID,详见下面“多实例使用”部分
157157
"host": "blive.ericlamm.xyz",
158158
"use-tls": true
159159
},
160160
"source": "websocket", // 数据源选择 websocket, redis
161-
"owners": [], // 管理员 QQ 号,列表内的 qq 号可绕过房管限制
161+
"owners": [], // 管理员QQ号,列表内的QQ号可绕过房管限制
162+
"identifier": "", // 多实例识别符,详见下面“多实例使用”部分
162163
"accept_gadmin_command": true, // 是否接受群管使用指令
163164
"enable_live_broadcast": false, // 启用开播通知
164165
"show_cover": true, // 开播通知时是否显示封面
165166
"show_gift_danmu": false, // 是否显示礼物弹幕
166167
"show_image_danmu": true, // 是否显示表情包弹幕
167168
"auto_check_update": true, // 是否自动每天检查更新
168169
"show_detail_list": true, // 显示高亮/直播/注视列表时是否顺带显示用户名称(需要更多时间刷取)
169-
"debug_mode": false, // 是否啟用 debug 模式
170+
"debug_mode": false, // 是否启用 debug 模式
170171
"disabled_commands": [ // 禁用的广播
171172
// "DANMU_MSG", // 弹幕消息
172173
// "SEND_GIFT", // 赠送礼物
@@ -179,6 +180,31 @@ B站直播WS讯息监控指令
179180
}
180181
```
181182

183+
### 多实例使用
184+
185+
分为两种场景:多实例共用同一个biligo-live-ws实例,以及多实例共用同一个go-cqhttp
186+
187+
#### 共用同一个biligo-live-ws
188+
根据 [biligo-live-ws的说明](https://github.com/eric2788/biligo-live-ws#使用方式) ,同一IP下的实例需要配置不同的辨识ID以避免混淆
189+
190+
因此如果要在同一IP下部署多个实例同时使用同一个biligo-live-ws作为数据源,则应在设置中为每个实例指定不同的辨识ID(不指定时默认为vup_monitors)
191+
192+
#### 共用同一个go-cqhttp
193+
多个实例共用同一个go-cqhttp时,因为前端的QQ号码是同一个,因此会同时响应命令,造成使用上的困难
194+
195+
此时应在设置中为每个实例指定不同的多实例识别符,配置后bot将只响应以``#[多实例识别符]``结尾的命令,以此达到准确控制特定实例的效果
196+
197+
此时命令形式将变为形如`!B站直播 监听中 #abc`的格式,具体逻辑如下
198+
199+
| 多实例识别符 | 命令 | 响应 |
200+
| ------- | ----- | ----- |
201+
| 未配置 | 不带# ||
202+
| 未配置 | 带有# ||
203+
| 配置为abc | 不带# ||
204+
| 配置为abc | 以#abc结束 ||
205+
| 配置为abc | 以#xyz结束 ||
206+
207+
182208
## 统计数据
183209

184210
使用了 ``https://blive.ericlamm.xyz`` 作为 公共API地址 的机器人都可以贡献统计数据。

src/command_listener.js

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,20 @@ const { commands } = require('./config')
55
module.exports = async({data, ws, http}) => {
66
if (!data.message) return
77
if (data.message[0] !== '!') return // 指令用 ! 开头
8+
let sharpPos = data.message.indexOf('#')
9+
if (settings.identifier && settings.identifier.length > 0) { // 如果配置了identifier
10+
if (sharpPos == -1) { // 此时如果没有#则忽略
11+
return
12+
} else { // 有#则检查identifier是否一致
13+
if (data.message.substring(sharpPos+1).trim() != settings.identifier) {
14+
return // 不一致则忽略
15+
}
16+
}
17+
} else { // 如果没有配置identifier
18+
if (sharpPos != -1) { // 此时如果有#则忽略
19+
return
20+
}
21+
}
822

923
const is_group = data.message_type === 'group'
1024

@@ -17,7 +31,7 @@ module.exports = async({data, ws, http}) => {
1731
return // no permission
1832
}
1933

20-
const msg = data.message.substring(1).trim()
34+
const msg = data.message.substring(1, sharpPos == -1 ? 5000 : sharpPos).trim() // QQ消息长度不会超过4500,偷懒了
2135
const command = msg.split(' ')
2236
const [cmd, ...args] = command
2337

src/commands/focus.js

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ const storer = require('../el/data-storer')
33
const { validUser } = require('../el/utils');
44
const level = require('../el/cachedb')
55

6+
const GROUP_REGEXP = new RegExp(/\d+[-]?\d+$/)
7+
68
class AddFocus extends CommandExecutor {
79

810
async execute({ send, data }, args) {
@@ -23,9 +25,9 @@ class AddFocus extends CommandExecutor {
2325
}
2426

2527
if (!isGroup) {
26-
const group_id = Number.parseInt(args[1])
27-
if (!group_id) {
28-
await send('不是一个有效的群ID')
28+
const group_id = String(args[1])
29+
if (!GROUP_REGEXP.test(group_id)) {
30+
await send(`${group_id} 不是一个有效的群ID`)
2931
return
3032
}
3133
data.group_id = group_id
@@ -84,9 +86,9 @@ class RemoveFocus extends CommandExecutor {
8486
}
8587

8688
if (!isGroup) {
87-
const group_id = Number.parseInt(args[1])
88-
if (!group_id) {
89-
await send('不是一个有效的群ID')
89+
const group_id = String(args[1])
90+
if (!GROUP_REGEXP.test(group_id)) {
91+
await send(`${group_id} 不是一个有效的群ID`)
9092
return
9193
}
9294
data.group_id = group_id
@@ -129,9 +131,9 @@ class Focusing extends CommandExecutor {
129131
const focus_users = json?.blive?.focus_users ?? {}
130132

131133
if (data.message_type !== 'group') {
132-
const group_id = Number.parseInt(args[0])
133-
if (!group_id) {
134-
await send('不是一个有效的群ID')
134+
const group_id = String(args[0])
135+
if (!GROUP_REGEXP.test(group_id)) {
136+
await send(`${group_id} 不是一个有效的群ID`)
135137
return
136138
}
137139
data.group_id = group_id

src/commands/highlights.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const level = require('../el/cachedb')
55

66
const KEY_GROUP = 'highlight'
77
const KEY_PRIVATE = 'highlight_private'
8+
const GROUP_REGEXP = new RegExp(/\d+[-]?\d+$/)
89

910
class AddUser extends CommandExecutor {
1011

@@ -32,7 +33,11 @@ class AddUser extends CommandExecutor {
3233
}
3334

3435
if (!is_group && args[1]) { // 不是群聊發送,但是有輸入 [群 id]
35-
data.group_id = Number.parseInt(args[1])
36+
data.group_id = String(args[1])
37+
if (!GROUP_REGEXP.test(data.group_id)) {
38+
await send(`${data.group_id} 不是一个有效的群ID`)
39+
return
40+
}
3641
}
3742

3843
const group_id = data.group_id
@@ -94,7 +99,11 @@ class RemoveUser extends CommandExecutor {
9499
}
95100

96101
if (!is_group && args[1]) { // 不是群聊發送,但是有輸入 [群 id]
97-
data.group_id = Number.parseInt(args[1])
102+
data.group_id = String(args[1])
103+
if (!GROUP_REGEXP.test(data.group_id)) {
104+
await send(`${data.group_id} 不是一个有效的群ID`)
105+
return
106+
}
98107
}
99108

100109
const group_id = data.group_id
@@ -154,7 +163,11 @@ class HighLighting extends CommandExecutor {
154163
const is_group = data.message_type === 'group'
155164

156165
if (!is_group && args[0]) {
157-
data.group_id = Number.parseInt(args[0])
166+
data.group_id = String(args[0])
167+
if (!GROUP_REGEXP.test(data.group_id)) {
168+
await send(`${data.group_id} 不是一个有效的群ID`)
169+
return
170+
}
158171
}
159172

160173
const json = await storer.read()

src/el/data-storer.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ const DEFAULT_CONFIG = {
2626
},
2727
"source": "websocket",
2828
"owners": [],
29+
"identifier": "",
2930
"accept_gadmin_command": true,
3031
"enable_live_broadcast": false,
3132
"show_cover": true,
@@ -82,7 +83,7 @@ const actions = {
8283

8384
save: (data) => {
8485
try {
85-
writeFileSync(PATH, JSON.stringify(data))
86+
writeFileSync(PATH, JSON.stringify(data, null, 4))
8687
actions.clearCache()
8788
console.log(`离线数据储存已更新。`)
8889
}catch(err){

src/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ async function executeCommands(data) {
1818
}
1919

2020
const { owners, accept_gadmin_command, auto_check_update } = require('./el/data-storer').settings
21-
console.log(`已设置管理员QQ号: ${owners}。`)
21+
console.log(`已设置Bot管理员QQ号: ${owners}。`)
2222
if (accept_gadmin_command) {
23-
console.log(`群管和管理员都可使用指令。`)
23+
console.log(`群管理和Bot管理员都可以使用指令。`)
2424
} else {
25-
console.log(`仅管理员可使用指令。`)
25+
console.log(`仅Bot管理员可以使用指令。`)
2626
}
2727

2828
// 同时启动 Redis 和 WS 监控

0 commit comments

Comments
 (0)