Skip to content

Commit

Permalink
feat: 监听原始消息
Browse files Browse the repository at this point in the history
  • Loading branch information
ddiu8081 committed Dec 1, 2022
1 parent 4cf2ac1 commit 25e0c91
Show file tree
Hide file tree
Showing 3 changed files with 98 additions and 14 deletions.
30 changes: 30 additions & 0 deletions README.md
Expand Up @@ -499,6 +499,36 @@ export interface GuardBuyMsg {
}
```

#### 监听原始消息

```ts
export type Handler = {
/** 原始消息 */
raw: Record<string, (msg: any) => void>
}
```
可在 `raw` 中监听任意原始消息。
example:
```ts
const handler: MsgHandler = {
raw: {
'msg': (msg) => {
// 监听所有 cmd 消息
console.log(msg)
},
'INTERACT_WORD': (msg) => {
// 监听特定的 cmd
console.log(msg)
},
}
}

startListen(652581, handler)
```

## Credits

- Based on [tiny-bilibili-ws](https://github.com/starknt/tiny-bilibili-ws)
Expand Down
77 changes: 63 additions & 14 deletions src/listener/index.ts
Expand Up @@ -38,11 +38,20 @@ export type MsgHandler = Partial<
& GiftHandler
& SuperChatHandler
& WatchedChangeHandler
& {
/** 原始消息 */
raw: Record<string, (msg: any) => void>
}
>

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

// Raw message handler
const rawHandler = handler.raw || {}
const rawHandlerNames = new Set(Object.keys(rawHandler))
const isHandleRaw = rawHandlerNames.size > 0

// Common
if (handler.onOpen) {
instance.on('open', () => {
Expand All @@ -61,106 +70,146 @@ export const listenAll = (instance: KeepLiveTCP | KeepLiveWS, roomId: number, ha
}

// HEARTBEAT
if (handler[HEARTBEAT.handlerName]) {
if (handler[HEARTBEAT.handlerName] || rawHandlerNames.has(HEARTBEAT.eventName)) {
rawHandlerNames.delete(HEARTBEAT.eventName)
instance.on(HEARTBEAT.eventName, (data: WSMessage<any>) => {
isHandleRaw && rawHandler[HEARTBEAT.eventName]?.(data.data)
const parsedData = HEARTBEAT.parser(data.data)
handler[HEARTBEAT.handlerName]?.(normalizeDanmu(HEARTBEAT.eventName, parsedData, data.data))
})
}

// LIVE
if (handler[LIVE.handlerName]) {
if (handler[LIVE.handlerName] || rawHandlerNames.has(LIVE.eventName)) {
rawHandlerNames.delete(LIVE.eventName)
instance.on(LIVE.eventName, (data: WSMessage<any>) => {
isHandleRaw && rawHandler[LIVE.eventName]?.(data.data)
const parsedData = LIVE.parser(data.data)
handler[LIVE.handlerName]?.(normalizeDanmu(LIVE.eventName, parsedData, data.data))
})
}

// PREPARING
if (handler[PREPARING.handlerName]) {
if (handler[PREPARING.handlerName] || rawHandlerNames.has(PREPARING.eventName)) {
rawHandlerNames.delete(LIVE.eventName)
instance.on(PREPARING.eventName, (data: WSMessage<any>) => {
isHandleRaw && rawHandler[PREPARING.eventName]?.(data.data)
const parsedData = PREPARING.parser(data.data)
handler[PREPARING.handlerName]?.(normalizeDanmu(PREPARING.eventName, parsedData, data.data))
})
}

// DANMU_MSG
if (handler[DANMU_MSG.handlerName] || handler[DANMU_MSG_402220.handlerName]) {
if (handler[DANMU_MSG.handlerName] || rawHandlerNames.has(DANMU_MSG.eventName) || rawHandlerNames.has(DANMU_MSG_402220.eventName)) {
rawHandlerNames.delete(DANMU_MSG.eventName)
rawHandlerNames.delete(DANMU_MSG_402220.eventName)
const msgCallback = handler[DANMU_MSG.handlerName]!
const handleDanmuMsg = (data: WSMessage<any>) => {
const parsedData = DANMU_MSG.parser(data.data, roomId)
if (checkIsDuplicateDanmuMsg(parsedData)) return
msgCallback(normalizeDanmu(DANMU_MSG.eventName, parsedData, data.data))
}
instance.on(DANMU_MSG.eventName, handleDanmuMsg)
instance.on(DANMU_MSG_402220.eventName, handleDanmuMsg)
instance.on(DANMU_MSG.eventName, (data: WSMessage<any>) => {
isHandleRaw && rawHandler[DANMU_MSG.eventName]?.(data.data)
handleDanmuMsg(data)
})
instance.on(DANMU_MSG_402220.eventName, (data: WSMessage<any>) => {
isHandleRaw && rawHandler[DANMU_MSG_402220.eventName]?.(data.data)
handleDanmuMsg(data)
})
}

// GUARD_BUY
if (handler[GUARD_BUY.handlerName]) {
if (handler[GUARD_BUY.handlerName] || rawHandlerNames.has(GUARD_BUY.eventName)) {
rawHandlerNames.delete(GUARD_BUY.eventName)
instance.on(GUARD_BUY.eventName, (data: WSMessage<any>) => {
isHandleRaw && rawHandler[GUARD_BUY.eventName]?.(data.data)
const parsedData = GUARD_BUY.parser(data.data)
handler[GUARD_BUY.handlerName]?.(normalizeDanmu(GUARD_BUY.eventName, parsedData, data.data))
})
}

// INTERACT_WORD, ENTRY_EFFECT
if (handler[INTERACT_WORD.handlerName] || handler[ENTRY_EFFECT.handlerName]) {
if (handler[INTERACT_WORD.handlerName] || handler[ENTRY_EFFECT.handlerName] || rawHandlerNames.has(INTERACT_WORD.eventName) || rawHandlerNames.has(ENTRY_EFFECT.eventName)) {
rawHandlerNames.delete(INTERACT_WORD.eventName)
rawHandlerNames.delete(ENTRY_EFFECT.eventName)
instance.on(INTERACT_WORD.eventName, (data: WSMessage<any>) => {
isHandleRaw && rawHandler[INTERACT_WORD.eventName]?.(data.data)
const parsedData = INTERACT_WORD.parser(data.data, roomId)
handler[INTERACT_WORD.handlerName]?.(normalizeDanmu(INTERACT_WORD.eventName, parsedData, data.data))
})
instance.on(ENTRY_EFFECT.eventName, (data: WSMessage<any>) => {
isHandleRaw && rawHandler[ENTRY_EFFECT.eventName]?.(data.data)
const parsedData = ENTRY_EFFECT.parser(data.data, roomId)
handler[ENTRY_EFFECT.handlerName]?.(normalizeDanmu(ENTRY_EFFECT.eventName, parsedData, data.data))
})
}

// LIKE_INFO_V3_UPDATE
if (handler[LIKE_INFO_V3_UPDATE.handlerName]) {
if (handler[LIKE_INFO_V3_UPDATE.handlerName] || rawHandlerNames.has(LIKE_INFO_V3_UPDATE.eventName)) {
rawHandlerNames.delete(LIKE_INFO_V3_UPDATE.eventName)
instance.on(LIKE_INFO_V3_UPDATE.eventName, (data: WSMessage<any>) => {
isHandleRaw && rawHandler[LIKE_INFO_V3_UPDATE.eventName]?.(data.data)
const parsedData = LIKE_INFO_V3_UPDATE.parser(data.data)
handler[LIKE_INFO_V3_UPDATE.handlerName]?.(normalizeDanmu(LIKE_INFO_V3_UPDATE.eventName, parsedData, data.data))
})
}

// ONLINE_RANK_COUNT
if (handler[ONLINE_RANK_COUNT.handlerName]) {
if (handler[ONLINE_RANK_COUNT.handlerName] || rawHandlerNames.has(ONLINE_RANK_COUNT.eventName)) {
rawHandlerNames.delete(ONLINE_RANK_COUNT.eventName)
instance.on(ONLINE_RANK_COUNT.eventName, (data: WSMessage<any>) => {
isHandleRaw && rawHandler[ONLINE_RANK_COUNT.eventName]?.(data.data)
const parsedData = ONLINE_RANK_COUNT.parser(data.data)
handler[ONLINE_RANK_COUNT.handlerName]?.(normalizeDanmu(ONLINE_RANK_COUNT.eventName, parsedData, data.data))
})
}

// ROOM_CHANGE
if (handler[ROOM_CHANGE.handlerName]) {
if (handler[ROOM_CHANGE.handlerName] || rawHandlerNames.has(ROOM_CHANGE.eventName)) {
rawHandlerNames.delete(ROOM_CHANGE.eventName)
instance.on(ROOM_CHANGE.eventName, (data: WSMessage<any>) => {
isHandleRaw && rawHandler[ROOM_CHANGE.eventName]?.(data.data)
const parsedData = ROOM_CHANGE.parser(data.data)
handler[ROOM_CHANGE.handlerName]?.(normalizeDanmu(ROOM_CHANGE.eventName, parsedData, data.data))
})
}

// SEND_GIFT
if (handler[SEND_GIFT.handlerName]) {
if (handler[SEND_GIFT.handlerName] || rawHandlerNames.has(SEND_GIFT.eventName)) {
rawHandlerNames.delete(SEND_GIFT.eventName)
instance.on(SEND_GIFT.eventName, (data: WSMessage<any>) => {
isHandleRaw && rawHandler[SEND_GIFT.eventName]?.(data.data)
const parsedData = SEND_GIFT.parser(data.data)
handler[SEND_GIFT.handlerName]?.(normalizeDanmu(SEND_GIFT.eventName, parsedData, data.data))
})
}

// SUPER_CHAT_MESSAGE
if (handler[SUPER_CHAT_MESSAGE.handlerName]) {
if (handler[SUPER_CHAT_MESSAGE.handlerName] || rawHandlerNames.has(SUPER_CHAT_MESSAGE.eventName)) {
rawHandlerNames.delete(SUPER_CHAT_MESSAGE.eventName)
instance.on(SUPER_CHAT_MESSAGE.eventName, (data: WSMessage<any>) => {
isHandleRaw && rawHandler[SUPER_CHAT_MESSAGE.eventName]?.(data.data)
const parsedData = SUPER_CHAT_MESSAGE.parser(data.data, roomId)
handler[SUPER_CHAT_MESSAGE.handlerName]?.(normalizeDanmu(SUPER_CHAT_MESSAGE.eventName, parsedData, data.data))
})
}

// WATCHED_CHANGE
if (handler[WATCHED_CHANGE.handlerName]) {
if (handler[WATCHED_CHANGE.handlerName] || rawHandlerNames.has(WATCHED_CHANGE.eventName)) {
rawHandlerNames.delete(WATCHED_CHANGE.eventName)
instance.on(WATCHED_CHANGE.eventName, (data: WSMessage<any>) => {
isHandleRaw && rawHandler[WATCHED_CHANGE.eventName]?.(data.data)
const parsedData = WATCHED_CHANGE.parser(data.data)
handler[WATCHED_CHANGE.handlerName]?.(normalizeDanmu(WATCHED_CHANGE.eventName, parsedData, data.data))
})
}

// Rest raw events
rawHandlerNames.forEach((eventName) => {
console.log('rest', eventName)
instance.on(eventName, (data: WSMessage<any>) => {
rawHandler[eventName](data.data)
})
})
}
5 changes: 5 additions & 0 deletions test/index.ts
Expand Up @@ -7,6 +7,11 @@ const handler: MsgHandler = {
onIncomeDanmu: (msg) => {
console.log(msg)
},
raw: {
'INTERACT_WORD': (msg) => {
console.log(msg)
},
}
}

startListen(652581, handler)

0 comments on commit 25e0c91

Please sign in to comment.