1
1
package net.lz1998.mirai.entity
2
2
3
- import com.google.protobuf.util.JsonFormat
3
+ import kotlinx.coroutines.Dispatchers
4
4
import kotlinx.coroutines.GlobalScope
5
5
import kotlinx.coroutines.launch
6
- import net.lz1998.mirai.utils.handleApiCall
6
+ import kotlinx.coroutines.withContext
7
+ import net.lz1998.mirai.utils.*
7
8
import net.lz1998.mirai.utils.toFrame
8
9
import net.mamoe.mirai.Bot
9
10
import net.mamoe.mirai.event.events.BotEvent
10
11
import okhttp3.*
11
12
import okio.ByteString
12
13
import okio.ByteString.Companion.toByteString
13
- import onebot.OnebotApi
14
14
import onebot.OnebotFrame
15
15
import java.util.concurrent.TimeUnit
16
16
17
17
class WebsocketBotClient (override var botId : Long , override var password : String , wsUrl : String ) : RemoteBot {
18
18
override lateinit var bot: Bot
19
19
20
- val jsonFormatParser: JsonFormat .Parser = JsonFormat .parser().ignoringUnknownFields()
21
- val jsonFormatPrinter: JsonFormat .Printer = JsonFormat .printer().preservingProtoFieldNames()
22
20
23
21
private var lastWsConnectTime: Long = 0
24
22
private lateinit var wsClient: WebSocket
@@ -35,24 +33,10 @@ class WebsocketBotClient(override var botId: Long, override var password: String
35
33
.url(wsUrl)
36
34
.build()
37
35
private var wsListener: WebSocketListener = object : WebSocketListener () {
38
- override fun onMessage (webSocket : WebSocket , text : String ) {
39
- GlobalScope .launch {
40
- val reqBuilder = OnebotFrame .Frame .newBuilder()
41
- jsonFormatParser.merge(text, reqBuilder)
42
- val req = reqBuilder.build()
43
- val resp = onRemoteApi(req)
44
- val respStr = jsonFormatPrinter.print (resp)
45
- val ok = wsClient.send(respStr)
46
- if (! ok) {
47
- wsConnect()
48
- }
49
-
50
- }
51
- }
52
36
53
37
override fun onMessage (webSocket : WebSocket , bytes : ByteString ) {
54
38
GlobalScope .launch {
55
- val req = OnebotFrame .Frame .parseFrom(bytes.toByteArray())
39
+ val req = withContext( Dispatchers . IO ) { OnebotFrame .Frame .parseFrom(bytes.toByteArray()) }
56
40
val resp = onRemoteApi(req)
57
41
val ok = wsClient.send(resp.toByteArray().toByteString())
58
42
if (! ok) {
@@ -106,150 +90,35 @@ class WebsocketBotClient(override var botId: Long, override var password: String
106
90
}
107
91
108
92
override suspend fun onRemoteApi (req : OnebotFrame .Frame ): OnebotFrame .Frame {
109
- val apiReq = when (req.messageType) {
110
- OnebotFrame .Frame .MessageType .PrivateMessageEvent -> req.privateMessageEvent
111
- OnebotFrame .Frame .MessageType .GroupMessageEvent -> req.groupMessageEvent
112
- OnebotFrame .Frame .MessageType .GroupUploadNoticeEvent -> req.groupUploadNoticeEvent
113
- OnebotFrame .Frame .MessageType .GroupAdminNoticeEvent -> req.groupAdminNoticeEvent
114
- OnebotFrame .Frame .MessageType .GroupDecreaseNoticeEvent -> req.groupDecreaseNoticeEvent
115
- OnebotFrame .Frame .MessageType .GroupIncreaseNoticeEvent -> req.groupIncreaseNoticeEvent
116
- OnebotFrame .Frame .MessageType .GroupBanNoticeEvent -> req.groupBanNoticeEvent
117
- OnebotFrame .Frame .MessageType .FriendAddNoticeEvent -> req.friendAddNoticeEvent
118
- OnebotFrame .Frame .MessageType .GroupRecallNoticeEvent -> req.groupRecallNoticeEvent
119
- OnebotFrame .Frame .MessageType .FriendRecallNoticeEvent -> req.friendRecallNoticeEvent
120
- OnebotFrame .Frame .MessageType .FriendRequestEvent -> req.friendRequestEvent
121
- OnebotFrame .Frame .MessageType .GroupRequestEvent -> req.groupRequestEvent
122
- OnebotFrame .Frame .MessageType .SendPrivateMsgReq -> req.sendPrivateMsgReq
123
- OnebotFrame .Frame .MessageType .SendGroupMsgReq -> req.sendGroupMsgReq
124
- OnebotFrame .Frame .MessageType .SendMsgReq -> req.sendMsgReq
125
- OnebotFrame .Frame .MessageType .DeleteMsgReq -> req.deleteMsgReq
126
- OnebotFrame .Frame .MessageType .GetMsgReq -> req.getMsgReq
127
- OnebotFrame .Frame .MessageType .GetForwardMsgReq -> req.getForwardMsgReq
128
- OnebotFrame .Frame .MessageType .SendLikeReq -> req.sendLikeReq
129
- OnebotFrame .Frame .MessageType .SetGroupKickReq -> req.setGroupKickReq
130
- OnebotFrame .Frame .MessageType .SetGroupBanReq -> req.setGroupBanReq
131
- OnebotFrame .Frame .MessageType .SetGroupAnonymousReq -> req.setGroupAnonymousReq
132
- OnebotFrame .Frame .MessageType .SetGroupWholeBanReq -> req.setGroupWholeBanReq
133
- OnebotFrame .Frame .MessageType .SetGroupAdminReq -> req.setGroupAdminReq
134
- OnebotFrame .Frame .MessageType .SetGroupAnonymousBanReq -> req.setGroupAnonymousBanReq
135
- OnebotFrame .Frame .MessageType .SetGroupCardReq -> req.setGroupCardReq
136
- OnebotFrame .Frame .MessageType .SetGroupNameReq -> req.setGroupNameReq
137
- OnebotFrame .Frame .MessageType .SetGroupLeaveReq -> req.setGroupLeaveReq
138
- OnebotFrame .Frame .MessageType .SetGroupSpecialTitleReq -> req.setGroupSpecialTitleReq
139
- OnebotFrame .Frame .MessageType .SetFriendAddRequestReq -> req.setFriendAddRequestReq
140
- OnebotFrame .Frame .MessageType .SetGroupAddRequestReq -> req.setGroupAddRequestReq
141
- OnebotFrame .Frame .MessageType .GetLoginInfoReq -> req.getLoginInfoReq
142
- OnebotFrame .Frame .MessageType .GetStrangerInfoReq -> req.getStrangerInfoReq
143
- OnebotFrame .Frame .MessageType .GetFriendListReq -> req.getFriendListReq
144
- OnebotFrame .Frame .MessageType .GetGroupInfoReq -> req.getGroupInfoReq
145
- OnebotFrame .Frame .MessageType .GetGroupListReq -> req.getGroupListReq
146
- OnebotFrame .Frame .MessageType .GetGroupMemberInfoReq -> req.getGroupMemberInfoReq
147
- OnebotFrame .Frame .MessageType .GetGroupMemberListReq -> req.getGroupMemberListReq
148
- OnebotFrame .Frame .MessageType .GetGroupHonorInfoReq -> req.getGroupHonorInfoReq
149
- OnebotFrame .Frame .MessageType .GetCookiesReq -> req.getCookiesReq
150
- OnebotFrame .Frame .MessageType .GetCsrfTokenReq -> req.getCsrfTokenReq
151
- OnebotFrame .Frame .MessageType .GetCredentialsReq -> req.getCredentialsReq
152
- OnebotFrame .Frame .MessageType .GetRecordReq -> req.getRecordReq
153
- OnebotFrame .Frame .MessageType .GetImageReq -> req.getImageReq
154
- OnebotFrame .Frame .MessageType .CanSendImageReq -> req.canSendImageReq
155
- OnebotFrame .Frame .MessageType .CanSendRecordReq -> req.canSendRecordReq
156
- OnebotFrame .Frame .MessageType .GetStatusReq -> req.getStatusReq
157
- OnebotFrame .Frame .MessageType .GetVersionInfoReq -> req.getVersionInfoReq
158
- OnebotFrame .Frame .MessageType .SetRestartReq -> req.setRestartReq
159
- OnebotFrame .Frame .MessageType .CleanCacheReq -> req.cleanCacheReq
160
-
161
- OnebotFrame .Frame .MessageType .SendPrivateMsgResp -> req.sendPrivateMsgResp
162
- OnebotFrame .Frame .MessageType .SendGroupMsgResp -> req.sendGroupMsgResp
163
- OnebotFrame .Frame .MessageType .SendMsgResp -> req.sendMsgResp
164
- OnebotFrame .Frame .MessageType .DeleteMsgResp -> req.deleteMsgResp
165
- OnebotFrame .Frame .MessageType .GetMsgResp -> req.getMsgResp
166
- OnebotFrame .Frame .MessageType .GetForwardMsgResp -> req.getForwardMsgResp
167
- OnebotFrame .Frame .MessageType .SendLikeResp -> req.sendLikeResp
168
- OnebotFrame .Frame .MessageType .SetGroupKickResp -> req.setGroupKickResp
169
- OnebotFrame .Frame .MessageType .SetGroupBanResp -> req.setGroupBanResp
170
- OnebotFrame .Frame .MessageType .SetGroupAnonymousResp -> req.setGroupAnonymousResp
171
- OnebotFrame .Frame .MessageType .SetGroupWholeBanResp -> req.setGroupWholeBanResp
172
- OnebotFrame .Frame .MessageType .SetGroupAdminResp -> req.setGroupAdminResp
173
- OnebotFrame .Frame .MessageType .SetGroupAnonymousBanResp -> req.setGroupAnonymousBanResp
174
- OnebotFrame .Frame .MessageType .SetGroupCardResp -> req.setGroupCardResp
175
- OnebotFrame .Frame .MessageType .SetGroupNameResp -> req.setGroupNameResp
176
- OnebotFrame .Frame .MessageType .SetGroupLeaveResp -> req.setGroupLeaveResp
177
- OnebotFrame .Frame .MessageType .SetGroupSpecialTitleResp -> req.setGroupSpecialTitleResp
178
- OnebotFrame .Frame .MessageType .SetFriendAddRequestResp -> req.setFriendAddRequestResp
179
- OnebotFrame .Frame .MessageType .SetGroupAddRequestResp -> req.setGroupAddRequestResp
180
- OnebotFrame .Frame .MessageType .GetLoginInfoResp -> req.getLoginInfoResp
181
- OnebotFrame .Frame .MessageType .GetStrangerInfoResp -> req.getStrangerInfoResp
182
- OnebotFrame .Frame .MessageType .GetFriendListResp -> req.getFriendListResp
183
- OnebotFrame .Frame .MessageType .GetGroupInfoResp -> req.getGroupInfoResp
184
- OnebotFrame .Frame .MessageType .GetGroupListResp -> req.getGroupListResp
185
- OnebotFrame .Frame .MessageType .GetGroupMemberInfoResp -> req.getGroupMemberInfoResp
186
- OnebotFrame .Frame .MessageType .GetGroupMemberListResp -> req.getGroupMemberListResp
187
- OnebotFrame .Frame .MessageType .GetGroupHonorInfoResp -> req.getGroupHonorInfoResp
188
- OnebotFrame .Frame .MessageType .GetCookiesResp -> req.getCookiesResp
189
- OnebotFrame .Frame .MessageType .GetCsrfTokenResp -> req.getCsrfTokenResp
190
- OnebotFrame .Frame .MessageType .GetCredentialsResp -> req.getCredentialsResp
191
- OnebotFrame .Frame .MessageType .GetRecordResp -> req.getRecordResp
192
- OnebotFrame .Frame .MessageType .GetImageResp -> req.getImageResp
193
- OnebotFrame .Frame .MessageType .CanSendImageResp -> req.canSendImageResp
194
- OnebotFrame .Frame .MessageType .CanSendRecordResp -> req.canSendRecordResp
195
- OnebotFrame .Frame .MessageType .GetStatusResp -> req.getStatusResp
196
- OnebotFrame .Frame .MessageType .GetVersionInfoResp -> req.getVersionInfoResp
197
- OnebotFrame .Frame .MessageType .SetRestartResp -> req.setRestartResp
198
- OnebotFrame .Frame .MessageType .CleanCacheResp -> req.cleanCacheResp
199
- else -> null
200
- }
201
- val apiResp = apiReq?.let { handleApiCall(bot, it) }
202
- val respFrameBuilder = OnebotFrame .Frame .newBuilder()
203
- respFrameBuilder.echo = req.echo
204
- respFrameBuilder.botId = botId
205
- when (apiResp) {
206
- is OnebotApi .SendPrivateMsgResp -> respFrameBuilder.sendPrivateMsgResp = apiResp
207
- is OnebotApi .SendGroupMsgResp -> respFrameBuilder.sendGroupMsgResp = apiResp
208
- is OnebotApi .SendMsgResp -> respFrameBuilder.sendMsgResp = apiResp
209
- is OnebotApi .DeleteMsgResp -> respFrameBuilder.deleteMsgResp = apiResp
210
- is OnebotApi .GetMsgResp -> respFrameBuilder.getMsgResp = apiResp
211
- is OnebotApi .GetForwardMsgResp -> respFrameBuilder.getForwardMsgResp = apiResp
212
- is OnebotApi .SendLikeResp -> respFrameBuilder.sendLikeResp = apiResp
213
- is OnebotApi .SetGroupKickResp -> respFrameBuilder.setGroupKickResp = apiResp
214
- is OnebotApi .SetGroupBanResp -> respFrameBuilder.setGroupBanResp = apiResp
215
- is OnebotApi .SetGroupAnonymousBanResp -> respFrameBuilder.setGroupAnonymousBanResp = apiResp
216
- is OnebotApi .SetGroupWholeBanResp -> respFrameBuilder.setGroupWholeBanResp = apiResp
217
- is OnebotApi .SetGroupAdminResp -> respFrameBuilder.setGroupAdminResp = apiResp
218
- is OnebotApi .SetGroupAnonymousResp -> respFrameBuilder.setGroupAnonymousResp = apiResp
219
- is OnebotApi .SetGroupCardResp -> respFrameBuilder.setGroupCardResp = apiResp
220
- is OnebotApi .SetGroupNameResp -> respFrameBuilder.setGroupNameResp = apiResp
221
- is OnebotApi .SetGroupLeaveResp -> respFrameBuilder.setGroupLeaveResp = apiResp
222
- is OnebotApi .SetGroupSpecialTitleResp -> respFrameBuilder.setGroupSpecialTitleResp = apiResp
223
- is OnebotApi .SetFriendAddRequestResp -> respFrameBuilder.setFriendAddRequestResp = apiResp
224
- is OnebotApi .SetGroupAddRequestResp -> respFrameBuilder.setGroupAddRequestResp = apiResp
225
- is OnebotApi .GetLoginInfoResp -> respFrameBuilder.getLoginInfoResp = apiResp
226
- is OnebotApi .GetStrangerInfoResp -> respFrameBuilder.getStrangerInfoResp = apiResp
227
- is OnebotApi .GetFriendListResp -> respFrameBuilder.getFriendListResp = apiResp
228
- is OnebotApi .GetGroupInfoResp -> respFrameBuilder.getGroupInfoResp = apiResp
229
- is OnebotApi .GetGroupListResp -> respFrameBuilder.getGroupListResp = apiResp
230
- is OnebotApi .GetGroupMemberInfoResp -> respFrameBuilder.getGroupMemberInfoResp = apiResp
231
- is OnebotApi .GetGroupMemberListResp -> respFrameBuilder.getGroupMemberListResp = apiResp
232
- is OnebotApi .GetGroupHonorInfoResp -> respFrameBuilder.getGroupHonorInfoResp = apiResp
233
- is OnebotApi .GetCookiesResp -> respFrameBuilder.getCookiesResp = apiResp
234
- is OnebotApi .GetCsrfTokenResp -> respFrameBuilder.getCsrfTokenResp = apiResp
235
- is OnebotApi .GetCredentialsResp -> respFrameBuilder.getCredentialsResp = apiResp
236
- is OnebotApi .GetRecordResp -> respFrameBuilder.getRecordResp = apiResp
237
- is OnebotApi .GetImageResp -> respFrameBuilder.getImageResp = apiResp
238
- is OnebotApi .CanSendImageResp -> respFrameBuilder.canSendImageResp = apiResp
239
- is OnebotApi .CanSendRecordResp -> respFrameBuilder.canSendRecordResp = apiResp
240
- is OnebotApi .GetStatusResp -> respFrameBuilder.getStatusResp = apiResp
241
- is OnebotApi .GetVersionInfoResp -> respFrameBuilder.getVersionInfoResp = apiResp
242
- is OnebotApi .SetRestartResp -> respFrameBuilder.setRestartResp = apiResp
243
- is OnebotApi .CleanCacheResp -> respFrameBuilder.cleanCacheResp = apiResp
93
+ val respBuilder = OnebotFrame .Frame .newBuilder()
94
+ respBuilder.echo = req.echo
95
+ respBuilder.botId = botId
96
+ when (req.messageType) {
97
+ OnebotFrame .Frame .MessageType .SendPrivateMsgReq -> respBuilder.sendPrivateMsgResp = handleSendPrivateMsg(bot, req.sendPrivateMsgReq)
98
+ OnebotFrame .Frame .MessageType .SendGroupMsgReq -> respBuilder.sendGroupMsgResp = handleSendGroupMsg(bot, req.sendGroupMsgReq)
99
+ OnebotFrame .Frame .MessageType .SendMsgReq -> respBuilder.sendMsgResp = handleSendMsgReq(bot, req.sendMsgReq)
100
+ OnebotFrame .Frame .MessageType .DeleteMsgReq -> respBuilder.deleteMsgResp = handleDeleteMsg(bot, req.deleteMsgReq)
101
+ OnebotFrame .Frame .MessageType .SetGroupKickReq -> respBuilder.setGroupKickResp = handleSetGroupKick(bot, req.setGroupKickReq)
102
+ OnebotFrame .Frame .MessageType .SetGroupBanReq -> respBuilder.setGroupBanResp = handleSetGroupBan(bot, req.setGroupBanReq)
103
+ OnebotFrame .Frame .MessageType .SetGroupWholeBanReq -> respBuilder.setGroupWholeBanResp = handleSetGroupWholeBan(bot, req.setGroupWholeBanReq)
104
+ OnebotFrame .Frame .MessageType .SetGroupCardReq -> respBuilder.setGroupCardResp = handleSetGroupCard(bot, req.setGroupCardReq)
105
+ OnebotFrame .Frame .MessageType .SetGroupNameReq -> respBuilder.setGroupNameResp = handleSetGroupName(bot, req.setGroupNameReq)
106
+ OnebotFrame .Frame .MessageType .SetGroupLeaveReq -> respBuilder.setGroupLeaveResp = handleSetGroupLeave(bot, req.setGroupLeaveReq)
107
+ OnebotFrame .Frame .MessageType .SetGroupSpecialTitleReq -> respBuilder.setGroupSpecialTitleResp = handleSetGroupSpecialTitle(bot, req.setGroupSpecialTitleReq)
108
+ OnebotFrame .Frame .MessageType .GetLoginInfoReq -> respBuilder.getLoginInfoResp = handleGetLoginInfo(bot, req.getLoginInfoReq)
109
+ OnebotFrame .Frame .MessageType .GetFriendListReq -> respBuilder.getFriendListResp = handleGetFriendList(bot, req.getFriendListReq)
110
+ OnebotFrame .Frame .MessageType .GetGroupInfoReq -> respBuilder.getGroupInfoResp = handleGetGroupInfo(bot, req.getGroupInfoReq)
111
+ OnebotFrame .Frame .MessageType .GetGroupListReq -> respBuilder.getGroupListResp = handleGetGroupList(bot, req.getGroupListReq)
112
+ OnebotFrame .Frame .MessageType .GetGroupMemberInfoReq -> respBuilder.getGroupMemberInfoResp = handleGetGroupMemberInfo(bot, req.getGroupMemberInfoReq)
113
+ OnebotFrame .Frame .MessageType .GetGroupMemberListReq -> respBuilder.getGroupMemberListResp = handleGetGroupMemberList(bot, req.getGroupMemberListReq)
244
114
}
245
- return respFrameBuilder .build()
115
+ return respBuilder .build()
246
116
}
247
117
248
118
override fun onBotEvent (botEvent : BotEvent ) {
249
119
val eventFrame = botEvent.toFrame() ? : return
250
120
// TODO 写二进制还是json?配置
251
- val eventStr = jsonFormatPrinter.print (eventFrame)
252
- val ok = wsClient.send(eventStr)
121
+ val ok = wsClient.send(eventFrame.toByteArray().toByteString())
253
122
if (! ok) {
254
123
wsConnect()
255
124
}
0 commit comments