1
1
package net.lz1998.mirai.entity
2
2
3
- import kotlinx.coroutines.Dispatchers
4
- import kotlinx.coroutines.GlobalScope
5
- import kotlinx.coroutines.launch
6
- import kotlinx.coroutines.withContext
3
+ import kotlinx.coroutines.*
7
4
import net.lz1998.mirai.alias.BFrame
8
5
import net.lz1998.mirai.alias.BFrameType
9
6
import net.lz1998.mirai.ext.*
@@ -18,6 +15,7 @@ import net.mamoe.mirai.event.events.NewFriendRequestEvent
18
15
import net.mamoe.mirai.event.subscribeAlways
19
16
import net.mamoe.mirai.message.MessageEvent
20
17
import okhttp3.*
18
+ import okhttp3.internal.ws.WebSocketProtocol
21
19
import okio.ByteString
22
20
import okio.ByteString.Companion.toByteString
23
21
import java.lang.Thread.sleep
@@ -27,7 +25,8 @@ class WebsocketBotClient(override var botId: Long, override var password: String
27
25
override lateinit var bot: Bot
28
26
29
27
30
- // private var lastWsConnectTime: Long = 0
28
+ private var lastWsConnectTime: Long = 0
29
+ var connecting: Boolean = false
31
30
32
31
private var wsClient: WebSocket ? = null
33
32
private var httpClient: OkHttpClient = OkHttpClient .Builder ()
@@ -49,7 +48,7 @@ class WebsocketBotClient(override var botId: Long, override var password: String
49
48
val req = withContext(Dispatchers .IO ) { BFrame .parseFrom(bytes.toByteArray()) }
50
49
val resp = onRemoteApi(req)
51
50
val ok = wsClient?.send(resp.toByteArray().toByteString())
52
- if (ok== null || ! ok) {
51
+ if (ok == null || ! ok) {
53
52
wsConnect()
54
53
}
55
54
}
@@ -77,30 +76,36 @@ class WebsocketBotClient(override var botId: Long, override var password: String
77
76
println (" websocket失败${t.message} " )
78
77
wsClient = null
79
78
// t.printStackTrace()
80
- wsConnect()
79
+ GlobalScope .launch {
80
+ println (" 10秒后重连" )
81
+ delay(10000 )
82
+ wsConnect()
83
+ }
81
84
super .onFailure(webSocket, t, response)
82
85
}
83
86
}
84
87
85
88
86
89
// @Synchronized
87
90
fun wsConnect () {
88
- if (wsClient == null ) {
89
- println (" ws try connect" )
90
- synchronized(this ) {
91
- wsClient = httpClient.newWebSocket(wsRequest, wsListener)
92
- }
93
- } else {
91
+ if (connecting || wsClient != null ) {
94
92
return
95
93
}
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
- // }
94
+ val now = System .currentTimeMillis()
95
+ synchronized(connecting) {
96
+ if (connecting || now - lastWsConnectTime < 5000L ) {
97
+ return
98
+ }
99
+ connecting = true
100
+ lastWsConnectTime = now
101
+ }
102
+ wsClient?.close(1001 , " " )
103
+ wsClient = null
104
+ println (" websocket正在尝试连接" )
105
+ wsClient = httpClient.newWebSocket(wsRequest, wsListener)
106
+ synchronized(connecting) {
107
+ connecting = false
108
+ }
104
109
}
105
110
106
111
override suspend fun initBot () {
@@ -138,26 +143,66 @@ class WebsocketBotClient(override var botId: Long, override var password: String
138
143
respBuilder.botId = botId
139
144
respBuilder.ok = true
140
145
when (req.frameType) {
141
- BFrameType .TSendPrivateMsgReq -> {respBuilder.frameType = BFrameType .TSendPrivateMsgResp ; respBuilder.sendPrivateMsgResp = handleSendPrivateMsg(bot, req.sendPrivateMsgReq)}
142
- BFrameType .TSendGroupMsgReq -> {respBuilder.frameType = BFrameType .TSendGroupMsgResp ; respBuilder.sendGroupMsgResp = handleSendGroupMsg(bot, req.sendGroupMsgReq)}
143
- BFrameType .TSendMsgReq -> {respBuilder.frameType = BFrameType .TSendMsgResp ; respBuilder.sendMsgResp = handleSendMsgReq(bot, req.sendMsgReq)}
144
- BFrameType .TDeleteMsgReq -> {respBuilder.frameType = BFrameType .TDeleteMsgResp ; respBuilder.deleteMsgResp = handleDeleteMsg(bot, req.deleteMsgReq)}
145
- BFrameType .TGetMsgReq -> {respBuilder.frameType = BFrameType .TGetMsgResp ; respBuilder.getMsgResp = handleGetMsg(bot, req.getMsgReq)}
146
- BFrameType .TSetGroupKickReq -> {respBuilder.frameType = BFrameType .TSetGroupKickResp ; respBuilder.setGroupKickResp = handleSetGroupKick(bot, req.setGroupKickReq)}
147
- BFrameType .TSetGroupBanReq -> {respBuilder.frameType = BFrameType .TSetGroupBanResp ; respBuilder.setGroupBanResp = handleSetGroupBan(bot, req.setGroupBanReq)}
148
- BFrameType .TSetGroupWholeBanReq -> {respBuilder.frameType = BFrameType .TSetGroupWholeBanResp ; respBuilder.setGroupWholeBanResp = handleSetGroupWholeBan(bot, req.setGroupWholeBanReq)}
149
- BFrameType .TSetGroupCardReq -> {respBuilder.frameType = BFrameType .TSetGroupCardResp ; respBuilder.setGroupCardResp = handleSetGroupCard(bot, req.setGroupCardReq)}
150
- BFrameType .TSetGroupNameReq -> {respBuilder.frameType = BFrameType .TSetGroupNameResp ; respBuilder.setGroupNameResp = handleSetGroupName(bot, req.setGroupNameReq)}
151
- BFrameType .TSetGroupLeaveReq -> {respBuilder.frameType = BFrameType .TSetGroupLeaveResp ; respBuilder.setGroupLeaveResp = handleSetGroupLeave(bot, req.setGroupLeaveReq)}
152
- BFrameType .TSetGroupSpecialTitleReq -> {respBuilder.frameType = BFrameType .TSetGroupSpecialTitleResp ; respBuilder.setGroupSpecialTitleResp = handleSetGroupSpecialTitle(bot, req.setGroupSpecialTitleReq)}
153
- BFrameType .TSetFriendAddRequestReq -> {respBuilder.frameType = BFrameType .TSetFriendAddRequestResp ; respBuilder.setFriendAddRequestResp = handleSetFriendAddRequest(bot, req.setFriendAddRequestReq)}
154
- BFrameType .TSetGroupAddRequestReq -> {respBuilder.frameType = BFrameType .TSetGroupAddRequestResp ; respBuilder.setGroupAddRequestResp = handleSetGroupAddRequest(bot, req.setGroupAddRequestReq)}
155
- BFrameType .TGetLoginInfoReq -> {respBuilder.frameType = BFrameType .TGetLoginInfoResp ; respBuilder.getLoginInfoResp = handleGetLoginInfo(bot, req.getLoginInfoReq)}
156
- BFrameType .TGetFriendListReq -> {respBuilder.frameType = BFrameType .TGetFriendListResp ; respBuilder.getFriendListResp = handleGetFriendList(bot, req.getFriendListReq)}
157
- BFrameType .TGetGroupInfoReq -> {respBuilder.frameType = BFrameType .TGetGroupInfoResp ; respBuilder.getGroupInfoResp = handleGetGroupInfo(bot, req.getGroupInfoReq)}
158
- BFrameType .TGetGroupListReq -> {respBuilder.frameType = BFrameType .TGetGroupListResp ; respBuilder.getGroupListResp = handleGetGroupList(bot, req.getGroupListReq)}
159
- BFrameType .TGetGroupMemberInfoReq -> {respBuilder.frameType = BFrameType .TGetGroupMemberInfoResp ; respBuilder.getGroupMemberInfoResp = handleGetGroupMemberInfo(bot, req.getGroupMemberInfoReq)}
160
- BFrameType .TGetGroupMemberListReq -> {respBuilder.frameType = BFrameType .TGetGroupMemberListResp ; respBuilder.getGroupMemberListResp = handleGetGroupMemberList(bot, req.getGroupMemberListReq)}
146
+ BFrameType .TSendPrivateMsgReq -> {
147
+ respBuilder.frameType = BFrameType .TSendPrivateMsgResp ; respBuilder.sendPrivateMsgResp = handleSendPrivateMsg(bot, req.sendPrivateMsgReq)
148
+ }
149
+ BFrameType .TSendGroupMsgReq -> {
150
+ respBuilder.frameType = BFrameType .TSendGroupMsgResp ; respBuilder.sendGroupMsgResp = handleSendGroupMsg(bot, req.sendGroupMsgReq)
151
+ }
152
+ BFrameType .TSendMsgReq -> {
153
+ respBuilder.frameType = BFrameType .TSendMsgResp ; respBuilder.sendMsgResp = handleSendMsgReq(bot, req.sendMsgReq)
154
+ }
155
+ BFrameType .TDeleteMsgReq -> {
156
+ respBuilder.frameType = BFrameType .TDeleteMsgResp ; respBuilder.deleteMsgResp = handleDeleteMsg(bot, req.deleteMsgReq)
157
+ }
158
+ BFrameType .TGetMsgReq -> {
159
+ respBuilder.frameType = BFrameType .TGetMsgResp ; respBuilder.getMsgResp = handleGetMsg(bot, req.getMsgReq)
160
+ }
161
+ BFrameType .TSetGroupKickReq -> {
162
+ respBuilder.frameType = BFrameType .TSetGroupKickResp ; respBuilder.setGroupKickResp = handleSetGroupKick(bot, req.setGroupKickReq)
163
+ }
164
+ BFrameType .TSetGroupBanReq -> {
165
+ respBuilder.frameType = BFrameType .TSetGroupBanResp ; respBuilder.setGroupBanResp = handleSetGroupBan(bot, req.setGroupBanReq)
166
+ }
167
+ BFrameType .TSetGroupWholeBanReq -> {
168
+ respBuilder.frameType = BFrameType .TSetGroupWholeBanResp ; respBuilder.setGroupWholeBanResp = handleSetGroupWholeBan(bot, req.setGroupWholeBanReq)
169
+ }
170
+ BFrameType .TSetGroupCardReq -> {
171
+ respBuilder.frameType = BFrameType .TSetGroupCardResp ; respBuilder.setGroupCardResp = handleSetGroupCard(bot, req.setGroupCardReq)
172
+ }
173
+ BFrameType .TSetGroupNameReq -> {
174
+ respBuilder.frameType = BFrameType .TSetGroupNameResp ; respBuilder.setGroupNameResp = handleSetGroupName(bot, req.setGroupNameReq)
175
+ }
176
+ BFrameType .TSetGroupLeaveReq -> {
177
+ respBuilder.frameType = BFrameType .TSetGroupLeaveResp ; respBuilder.setGroupLeaveResp = handleSetGroupLeave(bot, req.setGroupLeaveReq)
178
+ }
179
+ BFrameType .TSetGroupSpecialTitleReq -> {
180
+ respBuilder.frameType = BFrameType .TSetGroupSpecialTitleResp ; respBuilder.setGroupSpecialTitleResp = handleSetGroupSpecialTitle(bot, req.setGroupSpecialTitleReq)
181
+ }
182
+ BFrameType .TSetFriendAddRequestReq -> {
183
+ respBuilder.frameType = BFrameType .TSetFriendAddRequestResp ; respBuilder.setFriendAddRequestResp = handleSetFriendAddRequest(bot, req.setFriendAddRequestReq)
184
+ }
185
+ BFrameType .TSetGroupAddRequestReq -> {
186
+ respBuilder.frameType = BFrameType .TSetGroupAddRequestResp ; respBuilder.setGroupAddRequestResp = handleSetGroupAddRequest(bot, req.setGroupAddRequestReq)
187
+ }
188
+ BFrameType .TGetLoginInfoReq -> {
189
+ respBuilder.frameType = BFrameType .TGetLoginInfoResp ; respBuilder.getLoginInfoResp = handleGetLoginInfo(bot, req.getLoginInfoReq)
190
+ }
191
+ BFrameType .TGetFriendListReq -> {
192
+ respBuilder.frameType = BFrameType .TGetFriendListResp ; respBuilder.getFriendListResp = handleGetFriendList(bot, req.getFriendListReq)
193
+ }
194
+ BFrameType .TGetGroupInfoReq -> {
195
+ respBuilder.frameType = BFrameType .TGetGroupInfoResp ; respBuilder.getGroupInfoResp = handleGetGroupInfo(bot, req.getGroupInfoReq)
196
+ }
197
+ BFrameType .TGetGroupListReq -> {
198
+ respBuilder.frameType = BFrameType .TGetGroupListResp ; respBuilder.getGroupListResp = handleGetGroupList(bot, req.getGroupListReq)
199
+ }
200
+ BFrameType .TGetGroupMemberInfoReq -> {
201
+ respBuilder.frameType = BFrameType .TGetGroupMemberInfoResp ; respBuilder.getGroupMemberInfoResp = handleGetGroupMemberInfo(bot, req.getGroupMemberInfoReq)
202
+ }
203
+ BFrameType .TGetGroupMemberListReq -> {
204
+ respBuilder.frameType = BFrameType .TGetGroupMemberListResp ; respBuilder.getGroupMemberListResp = handleGetGroupMemberList(bot, req.getGroupMemberListReq)
205
+ }
161
206
else -> respBuilder.ok = false
162
207
}
163
208
return respBuilder.build()
@@ -167,7 +212,7 @@ class WebsocketBotClient(override var botId: Long, override var password: String
167
212
val eventFrame = botEvent.toFrame() ? : return
168
213
// TODO 写二进制还是json?配置
169
214
val ok = wsClient?.send(eventFrame.toByteArray().toByteString())
170
- if (ok== null || ! ok) {
215
+ if (ok == null || ! ok) {
171
216
wsConnect()
172
217
}
173
218
}
0 commit comments