11package 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.*
74import net.lz1998.mirai.alias.BFrame
85import net.lz1998.mirai.alias.BFrameType
96import net.lz1998.mirai.ext.*
@@ -18,6 +15,7 @@ import net.mamoe.mirai.event.events.NewFriendRequestEvent
1815import net.mamoe.mirai.event.subscribeAlways
1916import net.mamoe.mirai.message.MessageEvent
2017import okhttp3.*
18+ import okhttp3.internal.ws.WebSocketProtocol
2119import okio.ByteString
2220import okio.ByteString.Companion.toByteString
2321import 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