Skip to content

Commit 25e0c91

Browse files
committed
feat: 监听原始消息
1 parent 4cf2ac1 commit 25e0c91

File tree

3 files changed

+98
-14
lines changed

3 files changed

+98
-14
lines changed

README.md

+30
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,36 @@ export interface GuardBuyMsg {
499499
}
500500
```
501501

502+
#### 监听原始消息
503+
504+
```ts
505+
export type Handler = {
506+
/** 原始消息 */
507+
raw: Record<string, (msg: any) => void>
508+
}
509+
```
510+
511+
可在 `raw` 中监听任意原始消息。
512+
513+
example:
514+
515+
```ts
516+
const handler: MsgHandler = {
517+
raw: {
518+
'msg': (msg) => {
519+
// 监听所有 cmd 消息
520+
console.log(msg)
521+
},
522+
'INTERACT_WORD': (msg) => {
523+
// 监听特定的 cmd
524+
console.log(msg)
525+
},
526+
}
527+
}
528+
529+
startListen(652581, handler)
530+
```
531+
502532
## Credits
503533

504534
- Based on [tiny-bilibili-ws](https://github.com/starknt/tiny-bilibili-ws)

src/listener/index.ts

+63-14
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,20 @@ export type MsgHandler = Partial<
3838
& GiftHandler
3939
& SuperChatHandler
4040
& WatchedChangeHandler
41+
& {
42+
/** 原始消息 */
43+
raw: Record<string, (msg: any) => void>
44+
}
4145
>
4246

4347
export const listenAll = (instance: KeepLiveTCP | KeepLiveWS, roomId: number, handler?: MsgHandler) => {
4448
if (!handler) return
4549

50+
// Raw message handler
51+
const rawHandler = handler.raw || {}
52+
const rawHandlerNames = new Set(Object.keys(rawHandler))
53+
const isHandleRaw = rawHandlerNames.size > 0
54+
4655
// Common
4756
if (handler.onOpen) {
4857
instance.on('open', () => {
@@ -61,106 +70,146 @@ export const listenAll = (instance: KeepLiveTCP | KeepLiveWS, roomId: number, ha
6170
}
6271

6372
// HEARTBEAT
64-
if (handler[HEARTBEAT.handlerName]) {
73+
if (handler[HEARTBEAT.handlerName] || rawHandlerNames.has(HEARTBEAT.eventName)) {
74+
rawHandlerNames.delete(HEARTBEAT.eventName)
6575
instance.on(HEARTBEAT.eventName, (data: WSMessage<any>) => {
76+
isHandleRaw && rawHandler[HEARTBEAT.eventName]?.(data.data)
6677
const parsedData = HEARTBEAT.parser(data.data)
6778
handler[HEARTBEAT.handlerName]?.(normalizeDanmu(HEARTBEAT.eventName, parsedData, data.data))
6879
})
6980
}
7081

7182
// LIVE
72-
if (handler[LIVE.handlerName]) {
83+
if (handler[LIVE.handlerName] || rawHandlerNames.has(LIVE.eventName)) {
84+
rawHandlerNames.delete(LIVE.eventName)
7385
instance.on(LIVE.eventName, (data: WSMessage<any>) => {
86+
isHandleRaw && rawHandler[LIVE.eventName]?.(data.data)
7487
const parsedData = LIVE.parser(data.data)
7588
handler[LIVE.handlerName]?.(normalizeDanmu(LIVE.eventName, parsedData, data.data))
7689
})
7790
}
7891

7992
// PREPARING
80-
if (handler[PREPARING.handlerName]) {
93+
if (handler[PREPARING.handlerName] || rawHandlerNames.has(PREPARING.eventName)) {
94+
rawHandlerNames.delete(LIVE.eventName)
8195
instance.on(PREPARING.eventName, (data: WSMessage<any>) => {
96+
isHandleRaw && rawHandler[PREPARING.eventName]?.(data.data)
8297
const parsedData = PREPARING.parser(data.data)
8398
handler[PREPARING.handlerName]?.(normalizeDanmu(PREPARING.eventName, parsedData, data.data))
8499
})
85100
}
86101

87102
// DANMU_MSG
88-
if (handler[DANMU_MSG.handlerName] || handler[DANMU_MSG_402220.handlerName]) {
103+
if (handler[DANMU_MSG.handlerName] || rawHandlerNames.has(DANMU_MSG.eventName) || rawHandlerNames.has(DANMU_MSG_402220.eventName)) {
104+
rawHandlerNames.delete(DANMU_MSG.eventName)
105+
rawHandlerNames.delete(DANMU_MSG_402220.eventName)
89106
const msgCallback = handler[DANMU_MSG.handlerName]!
90107
const handleDanmuMsg = (data: WSMessage<any>) => {
91108
const parsedData = DANMU_MSG.parser(data.data, roomId)
92109
if (checkIsDuplicateDanmuMsg(parsedData)) return
93110
msgCallback(normalizeDanmu(DANMU_MSG.eventName, parsedData, data.data))
94111
}
95-
instance.on(DANMU_MSG.eventName, handleDanmuMsg)
96-
instance.on(DANMU_MSG_402220.eventName, handleDanmuMsg)
112+
instance.on(DANMU_MSG.eventName, (data: WSMessage<any>) => {
113+
isHandleRaw && rawHandler[DANMU_MSG.eventName]?.(data.data)
114+
handleDanmuMsg(data)
115+
})
116+
instance.on(DANMU_MSG_402220.eventName, (data: WSMessage<any>) => {
117+
isHandleRaw && rawHandler[DANMU_MSG_402220.eventName]?.(data.data)
118+
handleDanmuMsg(data)
119+
})
97120
}
98121

99122
// GUARD_BUY
100-
if (handler[GUARD_BUY.handlerName]) {
123+
if (handler[GUARD_BUY.handlerName] || rawHandlerNames.has(GUARD_BUY.eventName)) {
124+
rawHandlerNames.delete(GUARD_BUY.eventName)
101125
instance.on(GUARD_BUY.eventName, (data: WSMessage<any>) => {
126+
isHandleRaw && rawHandler[GUARD_BUY.eventName]?.(data.data)
102127
const parsedData = GUARD_BUY.parser(data.data)
103128
handler[GUARD_BUY.handlerName]?.(normalizeDanmu(GUARD_BUY.eventName, parsedData, data.data))
104129
})
105130
}
106131

107132
// INTERACT_WORD, ENTRY_EFFECT
108-
if (handler[INTERACT_WORD.handlerName] || handler[ENTRY_EFFECT.handlerName]) {
133+
if (handler[INTERACT_WORD.handlerName] || handler[ENTRY_EFFECT.handlerName] || rawHandlerNames.has(INTERACT_WORD.eventName) || rawHandlerNames.has(ENTRY_EFFECT.eventName)) {
134+
rawHandlerNames.delete(INTERACT_WORD.eventName)
135+
rawHandlerNames.delete(ENTRY_EFFECT.eventName)
109136
instance.on(INTERACT_WORD.eventName, (data: WSMessage<any>) => {
137+
isHandleRaw && rawHandler[INTERACT_WORD.eventName]?.(data.data)
110138
const parsedData = INTERACT_WORD.parser(data.data, roomId)
111139
handler[INTERACT_WORD.handlerName]?.(normalizeDanmu(INTERACT_WORD.eventName, parsedData, data.data))
112140
})
113141
instance.on(ENTRY_EFFECT.eventName, (data: WSMessage<any>) => {
142+
isHandleRaw && rawHandler[ENTRY_EFFECT.eventName]?.(data.data)
114143
const parsedData = ENTRY_EFFECT.parser(data.data, roomId)
115144
handler[ENTRY_EFFECT.handlerName]?.(normalizeDanmu(ENTRY_EFFECT.eventName, parsedData, data.data))
116145
})
117146
}
118147

119148
// LIKE_INFO_V3_UPDATE
120-
if (handler[LIKE_INFO_V3_UPDATE.handlerName]) {
149+
if (handler[LIKE_INFO_V3_UPDATE.handlerName] || rawHandlerNames.has(LIKE_INFO_V3_UPDATE.eventName)) {
150+
rawHandlerNames.delete(LIKE_INFO_V3_UPDATE.eventName)
121151
instance.on(LIKE_INFO_V3_UPDATE.eventName, (data: WSMessage<any>) => {
152+
isHandleRaw && rawHandler[LIKE_INFO_V3_UPDATE.eventName]?.(data.data)
122153
const parsedData = LIKE_INFO_V3_UPDATE.parser(data.data)
123154
handler[LIKE_INFO_V3_UPDATE.handlerName]?.(normalizeDanmu(LIKE_INFO_V3_UPDATE.eventName, parsedData, data.data))
124155
})
125156
}
126157

127158
// ONLINE_RANK_COUNT
128-
if (handler[ONLINE_RANK_COUNT.handlerName]) {
159+
if (handler[ONLINE_RANK_COUNT.handlerName] || rawHandlerNames.has(ONLINE_RANK_COUNT.eventName)) {
160+
rawHandlerNames.delete(ONLINE_RANK_COUNT.eventName)
129161
instance.on(ONLINE_RANK_COUNT.eventName, (data: WSMessage<any>) => {
162+
isHandleRaw && rawHandler[ONLINE_RANK_COUNT.eventName]?.(data.data)
130163
const parsedData = ONLINE_RANK_COUNT.parser(data.data)
131164
handler[ONLINE_RANK_COUNT.handlerName]?.(normalizeDanmu(ONLINE_RANK_COUNT.eventName, parsedData, data.data))
132165
})
133166
}
134167

135168
// ROOM_CHANGE
136-
if (handler[ROOM_CHANGE.handlerName]) {
169+
if (handler[ROOM_CHANGE.handlerName] || rawHandlerNames.has(ROOM_CHANGE.eventName)) {
170+
rawHandlerNames.delete(ROOM_CHANGE.eventName)
137171
instance.on(ROOM_CHANGE.eventName, (data: WSMessage<any>) => {
172+
isHandleRaw && rawHandler[ROOM_CHANGE.eventName]?.(data.data)
138173
const parsedData = ROOM_CHANGE.parser(data.data)
139174
handler[ROOM_CHANGE.handlerName]?.(normalizeDanmu(ROOM_CHANGE.eventName, parsedData, data.data))
140175
})
141176
}
142177

143178
// SEND_GIFT
144-
if (handler[SEND_GIFT.handlerName]) {
179+
if (handler[SEND_GIFT.handlerName] || rawHandlerNames.has(SEND_GIFT.eventName)) {
180+
rawHandlerNames.delete(SEND_GIFT.eventName)
145181
instance.on(SEND_GIFT.eventName, (data: WSMessage<any>) => {
182+
isHandleRaw && rawHandler[SEND_GIFT.eventName]?.(data.data)
146183
const parsedData = SEND_GIFT.parser(data.data)
147184
handler[SEND_GIFT.handlerName]?.(normalizeDanmu(SEND_GIFT.eventName, parsedData, data.data))
148185
})
149186
}
150187

151188
// SUPER_CHAT_MESSAGE
152-
if (handler[SUPER_CHAT_MESSAGE.handlerName]) {
189+
if (handler[SUPER_CHAT_MESSAGE.handlerName] || rawHandlerNames.has(SUPER_CHAT_MESSAGE.eventName)) {
190+
rawHandlerNames.delete(SUPER_CHAT_MESSAGE.eventName)
153191
instance.on(SUPER_CHAT_MESSAGE.eventName, (data: WSMessage<any>) => {
192+
isHandleRaw && rawHandler[SUPER_CHAT_MESSAGE.eventName]?.(data.data)
154193
const parsedData = SUPER_CHAT_MESSAGE.parser(data.data, roomId)
155194
handler[SUPER_CHAT_MESSAGE.handlerName]?.(normalizeDanmu(SUPER_CHAT_MESSAGE.eventName, parsedData, data.data))
156195
})
157196
}
158197

159198
// WATCHED_CHANGE
160-
if (handler[WATCHED_CHANGE.handlerName]) {
199+
if (handler[WATCHED_CHANGE.handlerName] || rawHandlerNames.has(WATCHED_CHANGE.eventName)) {
200+
rawHandlerNames.delete(WATCHED_CHANGE.eventName)
161201
instance.on(WATCHED_CHANGE.eventName, (data: WSMessage<any>) => {
202+
isHandleRaw && rawHandler[WATCHED_CHANGE.eventName]?.(data.data)
162203
const parsedData = WATCHED_CHANGE.parser(data.data)
163204
handler[WATCHED_CHANGE.handlerName]?.(normalizeDanmu(WATCHED_CHANGE.eventName, parsedData, data.data))
164205
})
165206
}
207+
208+
// Rest raw events
209+
rawHandlerNames.forEach((eventName) => {
210+
console.log('rest', eventName)
211+
instance.on(eventName, (data: WSMessage<any>) => {
212+
rawHandler[eventName](data.data)
213+
})
214+
})
166215
}

test/index.ts

+5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ const handler: MsgHandler = {
77
onIncomeDanmu: (msg) => {
88
console.log(msg)
99
},
10+
raw: {
11+
'INTERACT_WORD': (msg) => {
12+
console.log(msg)
13+
},
14+
}
1015
}
1116

1217
startListen(652581, handler)

0 commit comments

Comments
 (0)