@@ -38,11 +38,20 @@ export type MsgHandler = Partial<
38
38
& GiftHandler
39
39
& SuperChatHandler
40
40
& WatchedChangeHandler
41
+ & {
42
+ /** 原始消息 */
43
+ raw : Record < string , ( msg : any ) => void >
44
+ }
41
45
>
42
46
43
47
export const listenAll = ( instance : KeepLiveTCP | KeepLiveWS , roomId : number , handler ?: MsgHandler ) => {
44
48
if ( ! handler ) return
45
49
50
+ // Raw message handler
51
+ const rawHandler = handler . raw || { }
52
+ const rawHandlerNames = new Set ( Object . keys ( rawHandler ) )
53
+ const isHandleRaw = rawHandlerNames . size > 0
54
+
46
55
// Common
47
56
if ( handler . onOpen ) {
48
57
instance . on ( 'open' , ( ) => {
@@ -61,106 +70,146 @@ export const listenAll = (instance: KeepLiveTCP | KeepLiveWS, roomId: number, ha
61
70
}
62
71
63
72
// HEARTBEAT
64
- if ( handler [ HEARTBEAT . handlerName ] ) {
73
+ if ( handler [ HEARTBEAT . handlerName ] || rawHandlerNames . has ( HEARTBEAT . eventName ) ) {
74
+ rawHandlerNames . delete ( HEARTBEAT . eventName )
65
75
instance . on ( HEARTBEAT . eventName , ( data : WSMessage < any > ) => {
76
+ isHandleRaw && rawHandler [ HEARTBEAT . eventName ] ?.( data . data )
66
77
const parsedData = HEARTBEAT . parser ( data . data )
67
78
handler [ HEARTBEAT . handlerName ] ?.( normalizeDanmu ( HEARTBEAT . eventName , parsedData , data . data ) )
68
79
} )
69
80
}
70
81
71
82
// LIVE
72
- if ( handler [ LIVE . handlerName ] ) {
83
+ if ( handler [ LIVE . handlerName ] || rawHandlerNames . has ( LIVE . eventName ) ) {
84
+ rawHandlerNames . delete ( LIVE . eventName )
73
85
instance . on ( LIVE . eventName , ( data : WSMessage < any > ) => {
86
+ isHandleRaw && rawHandler [ LIVE . eventName ] ?.( data . data )
74
87
const parsedData = LIVE . parser ( data . data )
75
88
handler [ LIVE . handlerName ] ?.( normalizeDanmu ( LIVE . eventName , parsedData , data . data ) )
76
89
} )
77
90
}
78
91
79
92
// PREPARING
80
- if ( handler [ PREPARING . handlerName ] ) {
93
+ if ( handler [ PREPARING . handlerName ] || rawHandlerNames . has ( PREPARING . eventName ) ) {
94
+ rawHandlerNames . delete ( LIVE . eventName )
81
95
instance . on ( PREPARING . eventName , ( data : WSMessage < any > ) => {
96
+ isHandleRaw && rawHandler [ PREPARING . eventName ] ?.( data . data )
82
97
const parsedData = PREPARING . parser ( data . data )
83
98
handler [ PREPARING . handlerName ] ?.( normalizeDanmu ( PREPARING . eventName , parsedData , data . data ) )
84
99
} )
85
100
}
86
101
87
102
// 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 )
89
106
const msgCallback = handler [ DANMU_MSG . handlerName ] !
90
107
const handleDanmuMsg = ( data : WSMessage < any > ) => {
91
108
const parsedData = DANMU_MSG . parser ( data . data , roomId )
92
109
if ( checkIsDuplicateDanmuMsg ( parsedData ) ) return
93
110
msgCallback ( normalizeDanmu ( DANMU_MSG . eventName , parsedData , data . data ) )
94
111
}
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
+ } )
97
120
}
98
121
99
122
// 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 )
101
125
instance . on ( GUARD_BUY . eventName , ( data : WSMessage < any > ) => {
126
+ isHandleRaw && rawHandler [ GUARD_BUY . eventName ] ?.( data . data )
102
127
const parsedData = GUARD_BUY . parser ( data . data )
103
128
handler [ GUARD_BUY . handlerName ] ?.( normalizeDanmu ( GUARD_BUY . eventName , parsedData , data . data ) )
104
129
} )
105
130
}
106
131
107
132
// 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 )
109
136
instance . on ( INTERACT_WORD . eventName , ( data : WSMessage < any > ) => {
137
+ isHandleRaw && rawHandler [ INTERACT_WORD . eventName ] ?.( data . data )
110
138
const parsedData = INTERACT_WORD . parser ( data . data , roomId )
111
139
handler [ INTERACT_WORD . handlerName ] ?.( normalizeDanmu ( INTERACT_WORD . eventName , parsedData , data . data ) )
112
140
} )
113
141
instance . on ( ENTRY_EFFECT . eventName , ( data : WSMessage < any > ) => {
142
+ isHandleRaw && rawHandler [ ENTRY_EFFECT . eventName ] ?.( data . data )
114
143
const parsedData = ENTRY_EFFECT . parser ( data . data , roomId )
115
144
handler [ ENTRY_EFFECT . handlerName ] ?.( normalizeDanmu ( ENTRY_EFFECT . eventName , parsedData , data . data ) )
116
145
} )
117
146
}
118
147
119
148
// 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 )
121
151
instance . on ( LIKE_INFO_V3_UPDATE . eventName , ( data : WSMessage < any > ) => {
152
+ isHandleRaw && rawHandler [ LIKE_INFO_V3_UPDATE . eventName ] ?.( data . data )
122
153
const parsedData = LIKE_INFO_V3_UPDATE . parser ( data . data )
123
154
handler [ LIKE_INFO_V3_UPDATE . handlerName ] ?.( normalizeDanmu ( LIKE_INFO_V3_UPDATE . eventName , parsedData , data . data ) )
124
155
} )
125
156
}
126
157
127
158
// 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 )
129
161
instance . on ( ONLINE_RANK_COUNT . eventName , ( data : WSMessage < any > ) => {
162
+ isHandleRaw && rawHandler [ ONLINE_RANK_COUNT . eventName ] ?.( data . data )
130
163
const parsedData = ONLINE_RANK_COUNT . parser ( data . data )
131
164
handler [ ONLINE_RANK_COUNT . handlerName ] ?.( normalizeDanmu ( ONLINE_RANK_COUNT . eventName , parsedData , data . data ) )
132
165
} )
133
166
}
134
167
135
168
// 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 )
137
171
instance . on ( ROOM_CHANGE . eventName , ( data : WSMessage < any > ) => {
172
+ isHandleRaw && rawHandler [ ROOM_CHANGE . eventName ] ?.( data . data )
138
173
const parsedData = ROOM_CHANGE . parser ( data . data )
139
174
handler [ ROOM_CHANGE . handlerName ] ?.( normalizeDanmu ( ROOM_CHANGE . eventName , parsedData , data . data ) )
140
175
} )
141
176
}
142
177
143
178
// 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 )
145
181
instance . on ( SEND_GIFT . eventName , ( data : WSMessage < any > ) => {
182
+ isHandleRaw && rawHandler [ SEND_GIFT . eventName ] ?.( data . data )
146
183
const parsedData = SEND_GIFT . parser ( data . data )
147
184
handler [ SEND_GIFT . handlerName ] ?.( normalizeDanmu ( SEND_GIFT . eventName , parsedData , data . data ) )
148
185
} )
149
186
}
150
187
151
188
// 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 )
153
191
instance . on ( SUPER_CHAT_MESSAGE . eventName , ( data : WSMessage < any > ) => {
192
+ isHandleRaw && rawHandler [ SUPER_CHAT_MESSAGE . eventName ] ?.( data . data )
154
193
const parsedData = SUPER_CHAT_MESSAGE . parser ( data . data , roomId )
155
194
handler [ SUPER_CHAT_MESSAGE . handlerName ] ?.( normalizeDanmu ( SUPER_CHAT_MESSAGE . eventName , parsedData , data . data ) )
156
195
} )
157
196
}
158
197
159
198
// 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 )
161
201
instance . on ( WATCHED_CHANGE . eventName , ( data : WSMessage < any > ) => {
202
+ isHandleRaw && rawHandler [ WATCHED_CHANGE . eventName ] ?.( data . data )
162
203
const parsedData = WATCHED_CHANGE . parser ( data . data )
163
204
handler [ WATCHED_CHANGE . handlerName ] ?.( normalizeDanmu ( WATCHED_CHANGE . eventName , parsedData , data . data ) )
164
205
} )
165
206
}
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
+ } )
166
215
}
0 commit comments