@@ -9,7 +9,6 @@ import net.lz1998.mirai.alias.BFrameType
9
9
import net.lz1998.mirai.ext.*
10
10
import net.lz1998.mirai.service.MyLoginSolver
11
11
import net.lz1998.mirai.utils.*
12
- import net.lz1998.mirai.utils.toFrame
13
12
import net.mamoe.mirai.Bot
14
13
import net.mamoe.mirai.alsoLogin
15
14
import net.mamoe.mirai.event.events.BotEvent
@@ -21,14 +20,16 @@ import net.mamoe.mirai.message.MessageEvent
21
20
import okhttp3.*
22
21
import okio.ByteString
23
22
import okio.ByteString.Companion.toByteString
23
+ import java.lang.Thread.sleep
24
24
import java.util.concurrent.TimeUnit
25
25
26
26
class WebsocketBotClient (override var botId : Long , override var password : String , wsUrl : String ) : RemoteBot {
27
27
override lateinit var bot: Bot
28
28
29
29
30
- private var lastWsConnectTime: Long = 0
31
- private lateinit var wsClient: WebSocket
30
+ // private var lastWsConnectTime: Long = 0
31
+
32
+ private var wsClient: WebSocket ? = null
32
33
private var httpClient: OkHttpClient = OkHttpClient .Builder ()
33
34
.callTimeout(20 , TimeUnit .SECONDS )
34
35
.connectTimeout(20 , TimeUnit .SECONDS )
@@ -47,11 +48,10 @@ class WebsocketBotClient(override var botId: Long, override var password: String
47
48
GlobalScope .launch {
48
49
val req = withContext(Dispatchers .IO ) { BFrame .parseFrom(bytes.toByteArray()) }
49
50
val resp = onRemoteApi(req)
50
- val ok = wsClient.send(resp.toByteArray().toByteString())
51
- if (! ok) {
51
+ val ok = wsClient? .send(resp.toByteArray().toByteString())
52
+ if (ok == null || ! ok) {
52
53
wsConnect()
53
54
}
54
-
55
55
}
56
56
super .onMessage(webSocket, bytes)
57
57
}
@@ -63,36 +63,46 @@ class WebsocketBotClient(override var botId: Long, override var password: String
63
63
64
64
override fun onClosed (webSocket : WebSocket , code : Int , reason : String ) {
65
65
println (" websocket 已关闭" )
66
+ wsClient = null
66
67
super .onClosed(webSocket, code, reason)
67
68
}
68
69
69
70
override fun onClosing (webSocket : WebSocket , code : Int , reason : String ) {
70
71
println (" websocket正在关闭 $reason " )
72
+ wsClient = null
71
73
super .onClosing(webSocket, code, reason)
72
74
}
73
75
74
76
override fun onFailure (webSocket : WebSocket , t : Throwable , response : Response ? ) {
75
77
println (" websocket失败${t.message} " )
76
- t.printStackTrace()
78
+ wsClient = null
79
+ // t.printStackTrace()
77
80
wsConnect()
78
81
super .onFailure(webSocket, t, response)
79
82
}
80
83
}
81
84
82
85
83
- @Synchronized
86
+ // @Synchronized
84
87
fun wsConnect () {
85
- val now = System .currentTimeMillis()
86
- if (now - lastWsConnectTime > 5000L ) {
88
+ if (wsClient == null ) {
87
89
println (" ws try connect" )
88
- wsClient = httpClient.newWebSocket(wsRequest, wsListener)
89
- lastWsConnectTime = now
90
+ synchronized(this ) {
91
+ wsClient = httpClient.newWebSocket(wsRequest, wsListener)
92
+ }
90
93
} else {
91
- println ( " wait ws reconnect interval 5s " )
94
+ return
92
95
}
96
+ sleep(5000 )
97
+ // val now = System.currentTimeMillis()
98
+ // if (now - lastWsConnectTime > 5000L) {
99
+
100
+ // lastWsConnectTime = now
101
+ // } else {
102
+ // println("wait ws reconnect interval 5s")
103
+ // }
93
104
}
94
105
95
-
96
106
override suspend fun initBot () {
97
107
wsClient = httpClient.newWebSocket(wsRequest, wsListener)
98
108
bot = Bot (botId, password) {
@@ -156,10 +166,10 @@ class WebsocketBotClient(override var botId: Long, override var password: String
156
166
override suspend fun onBotEvent (botEvent : BotEvent ) {
157
167
val eventFrame = botEvent.toFrame() ? : return
158
168
// TODO 写二进制还是json?配置
159
- val ok = wsClient.send(eventFrame.toByteArray().toByteString())
160
- if (! ok) {
169
+ val ok = wsClient? .send(eventFrame.toByteArray().toByteString())
170
+ if (ok == null || ! ok) {
161
171
wsConnect()
162
172
}
163
173
}
164
174
165
- }
175
+ }
0 commit comments