Skip to content

Commit 06ecb94

Browse files
authored
Merge pull request #15 from lz1998/master
update
2 parents 8bacece + 1d81322 commit 06ecb94

File tree

1 file changed

+87
-42
lines changed

1 file changed

+87
-42
lines changed

src/main/kotlin/net/lz1998/mirai/entity/WebSocketBotClient.kt

Lines changed: 87 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package net.lz1998.mirai.entity
22

3-
import kotlinx.coroutines.Dispatchers
4-
import kotlinx.coroutines.GlobalScope
5-
import kotlinx.coroutines.launch
6-
import kotlinx.coroutines.withContext
3+
import kotlinx.coroutines.*
74
import net.lz1998.mirai.alias.BFrame
85
import net.lz1998.mirai.alias.BFrameType
96
import net.lz1998.mirai.ext.*
@@ -18,6 +15,7 @@ import net.mamoe.mirai.event.events.NewFriendRequestEvent
1815
import net.mamoe.mirai.event.subscribeAlways
1916
import net.mamoe.mirai.message.MessageEvent
2017
import okhttp3.*
18+
import okhttp3.internal.ws.WebSocketProtocol
2119
import okio.ByteString
2220
import okio.ByteString.Companion.toByteString
2321
import java.lang.Thread.sleep
@@ -27,7 +25,8 @@ class WebsocketBotClient(override var botId: Long, override var password: String
2725
override lateinit var bot: Bot
2826

2927

30-
// private var lastWsConnectTime: Long = 0
28+
private var lastWsConnectTime: Long = 0
29+
var connecting: Boolean = false
3130

3231
private var wsClient: WebSocket? = null
3332
private var httpClient: OkHttpClient = OkHttpClient.Builder()
@@ -49,7 +48,7 @@ class WebsocketBotClient(override var botId: Long, override var password: String
4948
val req = withContext(Dispatchers.IO) { BFrame.parseFrom(bytes.toByteArray()) }
5049
val resp = onRemoteApi(req)
5150
val ok = wsClient?.send(resp.toByteArray().toByteString())
52-
if (ok==null || !ok) {
51+
if (ok == null || !ok) {
5352
wsConnect()
5453
}
5554
}
@@ -77,30 +76,36 @@ class WebsocketBotClient(override var botId: Long, override var password: String
7776
println("websocket失败${t.message}")
7877
wsClient = null
7978
// t.printStackTrace()
80-
wsConnect()
79+
GlobalScope.launch {
80+
println("10秒后重连")
81+
delay(10000)
82+
wsConnect()
83+
}
8184
super.onFailure(webSocket, t, response)
8285
}
8386
}
8487

8588

8689
// @Synchronized
8790
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) {
9492
return
9593
}
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+
}
104109
}
105110

106111
override suspend fun initBot() {
@@ -138,26 +143,66 @@ class WebsocketBotClient(override var botId: Long, override var password: String
138143
respBuilder.botId = botId
139144
respBuilder.ok = true
140145
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+
}
161206
else -> respBuilder.ok = false
162207
}
163208
return respBuilder.build()
@@ -167,7 +212,7 @@ class WebsocketBotClient(override var botId: Long, override var password: String
167212
val eventFrame = botEvent.toFrame() ?: return
168213
// TODO 写二进制还是json?配置
169214
val ok = wsClient?.send(eventFrame.toByteArray().toByteString())
170-
if (ok==null || !ok) {
215+
if (ok == null || !ok) {
171216
wsConnect()
172217
}
173218
}

0 commit comments

Comments
 (0)