Skip to content

Commit 7cbc8e6

Browse files
committed
Merge branch 'master' into dev
# Conflicts: # mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/reverse/client/WsClient.kt
2 parents 301725e + 87ad11f commit 7cbc8e6

File tree

9 files changed

+57
-18
lines changed

9 files changed

+57
-18
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Mirai 是一个在全平台下运行,提供 QQ Android 和 TIM PC 协议支持
1919
# mirai-api-http
2020
Mirai HTTP API (console) plugin
2121

22-
<b>Mirai-API-http插件 提供HTTP API供所有语言使用mirai</b>
22+
<b>mirai-api-http插件 提供HTTP API供所有语言使用mirai</b>
2323

2424
## 安装`mirai-api-http`
2525

@@ -56,13 +56,13 @@ adapters:
5656
enableVerify: true
5757
verifyKey: 1234567890
5858

59-
## 开启一些调式信息
59+
## 开启一些调试信息
6060
debug: false
6161

6262
## 是否开启单 session 模式, 若为 true,则自动创建 session 绑定 console 中登录的 bot
6363
## 开启后,接口中任何 sessionKey 不需要传递参数
6464
## 若 console 中有多个 bot 登录,则行为未定义
65-
## 确保 console 中只有一个 bot 登陆时启用
65+
## 确保 console 中只有一个 bot 登录时启用
6666
singleMode: false
6767

6868
## 历史消息的缓存大小

docs/adapter/HttpAdapter.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ adapterSettings:
370370
此方法通过 `messageId` 获取历史消息, 历史消息的缓存有容量大小, 在配置文件中设置
371371

372372
```
373-
[GET] /messageFromId?sessionKey=YourSessionKey&id=1234567890
373+
[GET] /messageFromId?sessionKey=YourSessionKey&messageId=1234567890&target=123456789
374374
```
375375

376376
**本接口为[GET]请求, 参数格式为url参数**

docs/adapter/ReverseWebsocketAdapter.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ adapterSettings:
2525
## 额外请求头,该连接有效
2626
extraHeaders:
2727
q: 1
28+
## 重试连接的间隔(以毫秒计)
29+
reconnectInterval: 5000
2830

2931
## 同上
3032
- host: localhost2

docs/api/API.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@
147147
| 名字 | 类型 | 可选 | 举例 | 说明 |
148148
|------------|--------| ----- | -------------- |----------------|
149149
| sessionKey | String | true | YourSessionKey | 你的session key |
150-
| id | Int | false | 1234567890 | 获取消息的messageId |
150+
| messageId | Int | false | 1234567890 | 获取消息的messageId |
151151
| target | Long | false | 1234567890 | 好友id或群id |
152152

153153
#### 响应:

mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/MahAdapterFactory.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
package net.mamoe.mirai.api.http.adapter
1111

1212
import net.mamoe.mirai.api.http.adapter.http.HttpAdapter
13-
import net.mamoe.mirai.api.http.adapter.reverse.ReverseWebsocketAdaptor
13+
import net.mamoe.mirai.api.http.adapter.reverse.ReverseWebsocketAdapter
1414
import net.mamoe.mirai.api.http.adapter.webhook.WebhookAdapter
1515
import net.mamoe.mirai.api.http.adapter.ws.WebsocketAdapter
1616
import net.mamoe.mirai.utils.MiraiLogger
@@ -31,7 +31,7 @@ object MahAdapterFactory {
3131
*/
3232
register("http", HttpAdapter::class.java)
3333
register("ws", WebsocketAdapter::class.java)
34-
register("reverse-ws", ReverseWebsocketAdaptor::class.java)
34+
register("reverse-ws", ReverseWebsocketAdapter::class.java)
3535
register("webhook", WebhookAdapter::class.java)
3636
}
3737

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import net.mamoe.mirai.api.http.context.MahContextHolder
2121
import net.mamoe.mirai.api.http.context.session.Session
2222
import net.mamoe.mirai.event.events.BotEvent
2323

24-
class ReverseWebsocketAdaptor : MahAdapter("reverse-ws") {
24+
class ReverseWebsocketAdapter : MahAdapter("reverse-ws") {
2525

2626
private val clients = mutableListOf<WsClient>()
2727

@@ -38,7 +38,7 @@ class ReverseWebsocketAdaptor : MahAdapter("reverse-ws") {
3838

3939
// 启动 websocket client 监听 destinations
4040
setting.destinations.forEach { dest ->
41-
val client = WsClient()
41+
val client = WsClient(log)
4242
clients += client
4343

4444
client.listen(dest, setting)

mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/reverse/ReverseWebsocketAdapterSetting.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,9 @@ data class Destination(
7373
* 额外请求头
7474
*/
7575
val extraHeaders: Map<String, String> = emptyMap(),
76+
77+
/**
78+
* 重试连接的间隔 (按毫秒计)
79+
*/
80+
val reconnectInterval: Long = 5000,
7681
)

mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/reverse/client/WsClient.kt

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,20 @@ import io.ktor.client.request.*
1515
import io.ktor.http.*
1616
import io.ktor.websocket.*
1717
import kotlinx.coroutines.CoroutineScope
18+
import kotlinx.coroutines.delay
1819
import kotlinx.coroutines.isActive
1920
import kotlinx.coroutines.launch
2021
import net.mamoe.mirai.api.http.adapter.reverse.Destination
2122
import net.mamoe.mirai.api.http.adapter.reverse.ReverseWebsocketAdapterSetting
2223
import net.mamoe.mirai.api.http.adapter.reverse.handleReverseWs
24+
import net.mamoe.mirai.utils.MiraiLogger
25+
import net.mamoe.mirai.utils.warning
2326
import kotlin.coroutines.CoroutineContext
2427
import kotlin.coroutines.EmptyCoroutineContext
28+
import java.net.ConnectException
29+
import java.net.SocketException
2530

26-
class WsClient : CoroutineScope {
31+
class WsClient(private var log: MiraiLogger) : CoroutineScope {
2732

2833
override val coroutineContext: CoroutineContext = EmptyCoroutineContext
2934

@@ -33,14 +38,24 @@ class WsClient : CoroutineScope {
3338
install(WebSockets)
3439
}
3540

36-
private lateinit var webSocketSession: DefaultClientWebSocketSession
41+
private var webSocketSession: DefaultClientWebSocketSession? = null
3742

3843
fun listen(destination: Destination, setting: ReverseWebsocketAdapterSetting) {
3944
launch {
40-
client.ws(buildWsRequest(destination, setting)) {
41-
webSocketSession = this
45+
while (client.isActive) {
46+
try {
47+
client.ws(buildWsRequest(destination, setting)) {
48+
webSocketSession = this
4249

43-
handleReverseWs(this@WsClient)
50+
handleReverseWs(this@WsClient)
51+
}
52+
} catch (_: ConnectException) { // ignored
53+
} catch (e: SocketException) { // log
54+
log.error("[reverse-ws] SocketException occurred: ${e.localizedMessage}")
55+
}
56+
webSocketSession = null
57+
log.warning { "[reverse-ws] Connection to ${destination.host + ":" + destination.port + destination.path } interrupted. Trying reconnect in ${destination.reconnectInterval} ms." }
58+
delay(destination.reconnectInterval)
4459
}
4560
}
4661
}
@@ -51,7 +66,8 @@ class WsClient : CoroutineScope {
5166

5267
suspend fun send(content: String) {
5368
if (client.isActive) {
54-
webSocketSession.outgoing.send(Frame.Text(content))
69+
webSocketSession?.also { it.outgoing.send(Frame.Text(content)) }
70+
?: log.warning { "[reverse-ws] Dropped content $content while waiting for reconnect." }
5571
}
5672
}
5773

mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/spi/persistence/builtinPersistence.kt

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package net.mamoe.mirai.api.http.spi.persistence
22

33
import net.mamoe.mirai.Bot
4+
import net.mamoe.mirai.console.plugin.PluginManager
5+
import net.mamoe.mirai.console.plugin.dependencies
6+
import net.mamoe.mirai.console.plugin.jvm.JvmPlugin
47
import net.mamoe.mirai.message.data.MessageSource
58
import net.mamoe.mirai.message.data.OnlineMessageSource
69
import java.util.ServiceLoader
@@ -13,9 +16,22 @@ import java.util.concurrent.ConcurrentLinkedQueue
1316
class PersistenceManager(private val serviceName: String) {
1417

1518
fun loadFactory(): PersistenceFactory {
16-
return ServiceLoader.load(PersistenceFactory::class.java)
17-
.firstOrNull { it.getName() == serviceName }
18-
?: BuiltinPersistenceFactory()
19+
val oc = Thread.currentThread().contextClassLoader
20+
try {
21+
for (plugin in PluginManager.plugins) {
22+
if (plugin !is JvmPlugin) continue
23+
if (plugin.dependencies.none { it.id == "net.mamoe.mirai-api-http" }) continue
24+
val classLoader = plugin::class.java.classLoader
25+
Thread.currentThread().contextClassLoader = classLoader
26+
for (factory in ServiceLoader.load(PersistenceFactory::class.java, classLoader)) {
27+
if (factory.getName() == serviceName) return factory
28+
}
29+
}
30+
} finally {
31+
Thread.currentThread().contextClassLoader = oc
32+
}
33+
34+
return BuiltinPersistenceFactory()
1935
}
2036
}
2137

0 commit comments

Comments
 (0)