@@ -13,15 +13,19 @@ import SwiftyJSON
13
13
14
14
class LiveDanMuProvider : DanmuProviderProtocol {
15
15
let observerPlayerTime = false
16
+ let enableDanmuRemoveDup : Bool
16
17
var onSendTextModel = PassthroughSubject < DanmakuTextCellModel , Never > ( )
17
18
18
19
private var websocket : WebSocketRequest ?
19
20
private var heartBeatTimer : Timer ?
20
21
private let roomID : Int
21
22
private var token = " "
23
+ private var danmuSet = Set < String > ( )
24
+ private var danmuSetClearTimer : Timer ?
22
25
23
- init ( roomID: Int ) {
26
+ init ( roomID: Int , removeDup : Bool ) {
24
27
self . roomID = roomID
28
+ enableDanmuRemoveDup = removeDup
25
29
}
26
30
27
31
deinit {
@@ -31,6 +35,7 @@ class LiveDanMuProvider: DanmuProviderProtocol {
31
35
func playerTimeChange( time: TimeInterval ) { }
32
36
33
37
func start( ) async throws {
38
+ stop ( )
34
39
let info = try await WebRequest . requestDanmuServerInfo ( roomID: roomID)
35
40
guard let server = info. host_list. first else {
36
41
Logger . info ( " Get room server info Fail " )
@@ -45,11 +50,20 @@ class LiveDanMuProvider: DanmuProviderProtocol {
45
50
websocket = AF . webSocketRequest ( to: " wss:// \( server. host) : \( server. wss_port) /sub " , headers: afheaders) . streamMessageEvents { [ weak self] event in
46
51
self ? . handleWebsocketEvent ( event: event)
47
52
}
53
+
54
+ if enableDanmuRemoveDup {
55
+ danmuSetClearTimer = Timer . scheduledTimer ( withTimeInterval: 60 , repeats: true ) {
56
+ [ weak self] _ in
57
+ self ? . danmuSet. removeAll ( keepingCapacity: true )
58
+ }
59
+ }
48
60
}
49
61
50
62
func stop( ) {
51
63
websocket? . close ( sending: . normalClosure)
52
64
heartBeatTimer? . invalidate ( )
65
+ danmuSet. removeAll ( )
66
+ danmuSetClearTimer? . invalidate ( )
53
67
}
54
68
55
69
private func setupHeartBeat( ) {
@@ -122,35 +136,38 @@ extension LiveDanMuProvider {
122
136
case " DANMU_MSG " :
123
137
if let str = json [ " info " ] [ 1 ] . string {
124
138
let model = DanmakuTextCellModel ( str: str)
125
- onSendTextModel . send ( model)
139
+ sentDanmuModel ( model)
126
140
}
127
141
case " DM_INTERACTION " :
128
142
guard let data = json [ " data " ] [ " data " ] . string else { return }
129
143
let comboArr = JSON ( parseJSON: data) [ " combo " ]
130
144
for combo in comboArr. arrayValue {
131
145
if let str = combo [ " content " ] . string {
132
146
let model = DanmakuTextCellModel ( str: str)
133
- onSendTextModel . send ( model)
147
+ sentDanmuModel ( model)
134
148
}
135
149
}
136
150
case " SUPER_CHAT_MESSAGE " :
137
151
if let str = json [ " data " ] [ " message " ] . string {
138
152
let model = DanmakuTextCellModel ( str: str)
139
153
model. type = . top
140
154
model. displayTime = 60
155
+ sentDanmuModel ( model)
141
156
}
142
157
default :
143
158
break
144
159
}
145
160
}
146
161
}
147
162
148
- private func getDanMu( data: [ JSON ] ) -> [ String ] {
149
- return data. filter {
150
- $0 [ " cmd " ] . stringValue == " DANMU_MSG "
151
- } . compactMap { json in
152
- json [ " info " ] [ 1 ] . string
163
+ private func sentDanmuModel( _ model: DanmakuTextCellModel ) {
164
+ if enableDanmuRemoveDup {
165
+ if danmuSet. contains ( model. text) {
166
+ return
167
+ }
168
+ danmuSet. insert ( model. text)
153
169
}
170
+ onSendTextModel. send ( model)
154
171
}
155
172
}
156
173
0 commit comments