Skip to content

Commit

Permalink
Merge pull request #2 from XZhouQD/1.0
Browse files Browse the repository at this point in the history
Pure 1.0-M4, New Config API
  • Loading branch information
Xiaowei Zhou authored Sep 17, 2020
2 parents 3b73534 + 3b372ba commit f1f128f
Show file tree
Hide file tree
Showing 14 changed files with 222 additions and 747 deletions.
169 changes: 79 additions & 90 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,115 +9,104 @@ __CQHTTP runs on Mirai__
## 开始使用
0. 请首先运行[Mirai-console](https://github.com/mamoe/mirai-console)相关客户端生成plugins文件夹
1.`cqhttp-mirai`生成的`jar包文件`放入`plugins`文件夹中
2. 编辑`plugins/CQHTTPMirai/setting.yml`配置文件, 将以下给出配置复制并修改
3. 再次启动[Mirai-console](https://github.com/mamoe/mirai-console)相关客户端
2. 再次启动[Mirai-console](https://github.com/mamoe/mirai-console)相关客户端,配置文件会自动生成
3. 编辑`config/CQHTTP-Mirai/tech.mihoyo.mirai.Settings.yml`配置文件, 按下放给出配置的注释参考修改
4. 再次启动[Mirai-console](https://github.com/mamoe/mirai-console)相关客户端

## 为什么会有这个Repo,为什么只有1个Release
## 为什么会有这个Repo
0. 自Mirai-Console更新到1.0-M4版本后,由于启动机制的变更,cqhttp-mirai无法在1.0-M4启动了
1. 此外,截止本日(2020.09.17),cqhttp-mirai依赖的console仍为0.5.2版本
2. 这个repo对cqhttp-mirai进行了无比难受的调整,勉强让cqhttp-mirai能在1.0-M4启动使用了
3. 实现方式:启动类改为1.0-M4写法,被移除的API(集中在Config部分)从Console-0.5.2获取并直接加入包内
4. 总之看起来能用了,但是真正的稳定版,一定是原作者将Config部分完全改为1.0写法的版本,因此此Repo的版本只视为SNAPSHOT,不提供任何保证
5. 我只测试了最基础的ws-reverse连接和基础的对话,是否有API失效我也不知道
6. 测试使用环境:MiraiOK, Mirai-Core-QQAndroid 1.2.3, Mirai-Console 1.0-M4
1. 截止本日(2020.09.17),cqhttp-mirai依赖的console仍为0.5.2版本
2. 这个repo对cqhttp-mirai进行了调整,让cqhttp-mirai能在1.0-M4启动使用了
3. Embedded版本这里没有发布
4. 此Repo的版本只视为SNAPSHOT,不提供任何保证
5. 我只测试了ws-reverse连接和基础的对话,是否有API失效我也不知道
6. 测试使用环境:MiraiOK, Mirai-Core-QQAndroid 1.2.3, Mirai-Console 1.0-M4, Nonebot 1.7.0

——XZhouQD

## 改动似乎不只是上面那些?
0. 是的,最初尝试setup就遇到了很多麻烦,因此移除了一个总是导致我编译失败的gradle task
1. 原repo没有带着gradle/wrapper,导致很可能需要自己拿一份gradle 6.5的gradle-wrapper.jar,这里直接加上
2. 由于我用idea而且还用的不熟练,因此多了全局的.gitignore
3. 由于我本人几乎不懂kotlin,代码全靠脑补,因此配置文件位置变化,也互不兼容了,支持的功能也变少了

——XZhouQD

## 配置相关
重点:本Repo发布的0.2.4-SNAPSHOT-dev版配置文件(纯Mirai-Console 1.0-M4版本)不与之前版本(0.2.4-SNAPSHOT, 0.2.3及以下)兼容,配置文件位置也不同,敬请留意!

```yaml
# Debug日志输出选项
debug: false
# 下载图片/语音时使用的Proxy, 配置后, 发送图片/语音时指定`proxy=1`以通过Proxy下载, 如[CQ:image,proxy=1,url=http://***]
# 支持HTTP及Sock两种Proxy, 设置举例 proxy: "http=http://127.0.0.1:8888", proxy : "sock=127.0.0.1:1088"
proxy: ""
# 要进行配置的QQ号 (Mirai支持多帐号登录, 故需要对每个帐号进行单独设置)
'1234567890':
# 是否缓存所有收到的图片, 默认为否 (仅包含图片信息, 不包含图片本身, < 0.5KB)
cacheImage: false
# 是否缓存所有收到的语音, 默认为否 (将下载完整语音进行保存)
cacheRecord: false
# 心跳包相关配置
heartbeat:
# 是否发送心跳包, 默认为否
enable: false
# 心跳包发送间隔, 默认为 15000毫秒
interval: 15000
# HTTP 相关配置
http:
# 可选,是否启用HTTP API服务器, 默认为不启用, 此项开始与否跟postUrl无关
enable: true
# 可选,HTTP API服务器监听地址, 默认为0.0.0.0
host: 0.0.0.0
# 可选,HTTP API服务器监听端口, 5700
port: 5700
# 可选,访问口令, 默认为空, 即不设置Token
accessToken: ""
# 可选,事件及数据上报URL, 默认为空, 即不上报
postUrl: ""
# 可选,上报消息格式,string 为字符串格式,array 为数组格式, 默认为string
postMessageFormat: string
# 可选,上报数据签名密钥, 默认为空
secret: ""
# 可选,反向客户端服务
ws_reverse:
# 可选,是否启用反向客户端,默认不启用
- enable: true
# 上报消息格式,string 为字符串格式,array 为数组格式
postMessageFormat: string
# 反向Websocket主机
reverseHost: 127.0.0.1
# 反向Websocket端口
reversePort: 8080
# 访问口令, 默认为空, 即不设置Token
accessToken: ""
# 反向Websocket路径
reversePath: /ws
# 可选, 反向Websocket Api路径, 默认为reversePath
reverseApiPath: /api
# 可选, 反向Websocket Event路径, 默认为reversePath
reverseEventPath: /event
# 是否使用Universal客户端 默认为true
useUniversal: true
# 可选, 是否通过HTTPS连接, 默认为false
useTLS: false
# 反向 WebSocket 客户端断线重连间隔,单位毫秒
reconnectInterval: 3000
- enable: true # 这里是第二个连接, 相当于CQHTTP分身版
postMessageFormat: string
reverseHost: 127.0.0.1
reversePort: 9222
reversePath: /ws
useUniversal: false
reconnectInterval: 3000
# 正向Websocket服务器
ws:
# 可选,是否启用正向Websocket服务器,默认不启用
enable: true
# 可选,上报消息格式,string 为字符串格式,array 为数组格式, 默认为string
postMessageFormat: string
# 可选,访问口令, 默认为空, 即不设置Token
accessToken: ""
# 监听主机
wsHost: "0.0.0.0"
# 监听端口
wsPort: 8080

'0987654321': # 这里是第二个QQ Bot的配置
ws_reverse:
- enable: true
postMessageFormat: string
reverseHost:
reversePort:
reversePath: /ws
reconnectInterval: 3000
proxy: ''
# 要进行配置的QQ号 (此版本由于个人修改水平问题不支持多账号)
user: 111111111
# 是否缓存所有收到的图片, 默认为否 (仅包含图片信息, 不包含图片本身, < 0.5KB)
cacheImage: false
# 是否缓存所有收到的语音, 默认为否 (将下载完整语音进行保存)
cacheRecord: false
# 心跳包相关配置
heartbeat:
# 是否发送心跳包, 默认为否
enable: true
# 心跳包发送间隔, 默认为 15000毫秒
interval: 15000
# HTTP 相关配置
http:
# 可选,是否启用HTTP API服务器, 默认为不启用, 此项开始与否跟postUrl无关
enable: false
# 可选,HTTP API服务器监听地址, 默认为0.0.0.0
host: 0.0.0.0
# 可选,HTTP API服务器监听端口, 5700
port: 5700
# 可选,访问口令, 默认为空, 即不设置Token
accessToken: ''
# 可选,事件及数据上报URL, 默认为空, 即不上报
postUrl: ''
# 可选,上报消息格式,string 为字符串格式,array 为数组格式, 默认为string
postMessageFormat: string
# 可选,上报数据签名密钥, 默认为空
secret: ''
# 可选,反向客户端服务
ws_reverse:
# 可选,是否启用反向客户端,默认启用(自行修改的私心 - Nonebot)
enable: true
# 上报消息格式,string 为字符串格式,array 为数组格式
postMessageFormat: string
# 反向Websocket主机
reverseHost: 127.0.0.1
# 反向Websocket端口
reversePort: 10676
# 访问口令, 默认为空, 即不设置Token
accessToken: ''
# 反向Websocket路径
reversePath: /ws
# 可选, 反向Websocket Api路径, 默认为reversePath
reverseApiPath: /api
# 可选, 反向Websocket Event路径, 默认为reversePath
reverseEventPath: /event
# 是否使用Universal客户端 默认为true
useUniversal: true
# 可选, 是否通过HTTPS连接, 默认为false
useTLS: false
# 反向 WebSocket 客户端断线重连间隔,单位毫秒
reconnectInterval: 3000
# 由于个人修改水平,分身版无了
# 正向Websocket服务器
ws:
# 可选,是否启用正向Websocket服务器,默认不启用
enable: false
# 可选,上报消息格式,string 为字符串格式,array 为数组格式, 默认为string
postMessageFormat: string
# 可选,访问口令, 默认为空, 即不设置Token
accessToken: ''
# 监听主机
wsHost: 0.0.0.0
# 监听端口
wsPort: 8080
# 由于个人修改水平,多Bot配置也无了
```

## 计划
Expand Down
4 changes: 1 addition & 3 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ plugins {
id("com.github.gmazzo.buildconfig") version "2.0.2"
}

val projectVersion = "0.2.4-SNAPSHOT-1.0-M4"
val projectVersion = "0.2.4-SNAPSHOT-1.0-M4-dev"
version = projectVersion
group = "yyuueexxiinngg"

Expand All @@ -24,7 +24,6 @@ val miraiConsoleVersion = "1.0-M4"
val ktorVersion = "1.4.0"
val kotlinVersion = "1.4.0"
val kotlinSerializationVersion = "1.0.0-RC"
val snakeyamlVersion = "1.26"

fun ktor(id: String, version: String = this@Build_gradle.ktorVersion) = "io.ktor:ktor-$id:$version"
fun kotlinx(id: String, version: String) = "org.jetbrains.kotlinx:kotlinx-$id:$version"
Expand All @@ -50,7 +49,6 @@ dependencies {
compileOnly("net.mamoe:mirai-core:$miraiCoreVersion")
compileOnly("net.mamoe:mirai-console:$miraiConsoleVersion")
compileOnly(kotlin("serialization", kotlinVersion))
compile("org.yaml:snakeyaml:$snakeyamlVersion")

implementation(kotlinx("serialization-cbor", kotlinSerializationVersion))
implementation("ch.qos.logback:logback-classic:1.2.3")
Expand Down
87 changes: 73 additions & 14 deletions src/main/kotlin/tech/mihoyo/mirai/PluginBase.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ import com.google.auto.service.AutoService
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.withContext
import kotlinx.serialization.Serializable
import net.mamoe.mirai.Bot
import net.mamoe.mirai.LowLevelAPI
import net.mamoe.mirai.console.command.CommandOwner
import net.mamoe.mirai.console.data.AutoSavePluginConfig
import net.mamoe.mirai.console.data.value
import net.mamoe.mirai.console.plugin.jvm.JvmPlugin
import tech.mihoyo.mirai.util.Config
import net.mamoe.mirai.console.plugin.jvm.JvmPluginDescription
import net.mamoe.mirai.console.plugin.jvm.KotlinPlugin
import net.mamoe.mirai.console.plugin.loader.PluginLoader
import net.mamoe.mirai.contact.Friend
import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.contact.Member
Expand All @@ -40,18 +40,17 @@ import tech.mihoyo.mirai.util.toUHexString
import java.io.File
import kotlin.reflect.jvm.isAccessible
import yyuueexxiinngg.cqhttp_mirai.BuildConfig
import tech.mihoyo.mirai.util.loadAsConfig

@AutoService(JvmPlugin::class)
object PluginBase : KotlinPlugin(
JvmPluginDescription(
"yyuueexxiinngg.cqhttp-mirai",
"0.2.4-SNAPSHOT-1.0-M4"
"0.2.4-SNAPSHOT-1.0-M4-dev"
) {
name("CQHTTP-Mirai")
}
) {
private lateinit var config: Config
// private lateinit var config: Config
var debug = false
var initialSubscription: Listener<BotEvent>? = null
var proxy = ""
Expand All @@ -61,18 +60,24 @@ object PluginBase : KotlinPlugin(
}

@OptIn(LowLevelAPI::class)
@kotlin.ExperimentalUnsignedTypes
override fun onEnable() {
config = File("plugins/CQHTTPMirai/setting.yml").loadAsConfig()
debug = if (config.exist("debug")) config.getBoolean("debug") else false
proxy = if (config.exist("proxy")) config.getString("proxy") else ""
Settings.reload()

//config = File("plugins/CQHTTPMirai/setting.yml").loadAsConfig()
//debug = if (config.exist("debug")) config.getBoolean("debug") else false
debug = Settings.debug
//proxy = if (config.exist("proxy")) config.getString("proxy") else ""
proxy = Settings.proxy
logger.info("Plugin loaded! ${BuildConfig.VERSION}")
logger.info("插件当前Commit 版本: ${BuildConfig.COMMIT_HASH}")
if (debug) logger.debug("开发交流群: 1143274864")
initHTTPClientProxy()
Bot.forEachInstance {
if (!allSession.containsKey(it.id)) {
if (config.exist(it.id.toString())) {
SessionManager.createBotSession(it, config.getConfigSection(it.id.toString()))
//if (config.exist(it.id.toString())) {
if (it.id == Settings.user.toLong()) {
SessionManager.createBotSession(it, Settings)
} else {
logger.debug("${it.id}未对CQHTTPMirai进行配置")
}
Expand All @@ -85,8 +90,8 @@ object PluginBase : KotlinPlugin(
when (this) {
is BotOnlineEvent -> {
if (!allSession.containsKey(bot.id)) {
if (config.exist(bot.id.toString())) {
SessionManager.createBotSession(bot, config.getConfigSection(bot.id.toString()))
if (Settings.user.toLong() == bot.id) {
SessionManager.createBotSession(bot, Settings)
} else {
logger.debug("${bot.id}未对CQHTTPMirai进行配置")
}
Expand Down Expand Up @@ -205,4 +210,58 @@ object PluginBase : KotlinPlugin(
async {
image(name).apply { writeText(data) }
}
}
}

// Plugin Config Object - 1.0-M4
object Settings : AutoSavePluginConfig() {
val debug: Boolean by value(false)
val proxy: String by value()
val user: Int by value(111111111)
val cacheImage: Boolean by value(false)
val cacheRecord: Boolean by value(false)
val heartbeat: HeartBeatConfig by value()
val http: HttpConfig by value()
val ws_reverse: WsReverseConfig by value()
val ws: WsConfig by value()
}

@Serializable
data class HeartBeatConfig(
val enable: Boolean = true,
val interval: Int = 15000
)

@Serializable
data class HttpConfig(
val enable: Boolean = false,
val host: String = "0.0.0.0",
val port: Int = 5700,
val accessToken: String = "",
val postUrl: String = "",
val postMessageFormat: String = "string",
val secret: String = ""
)

@Serializable
data class WsReverseConfig(
val enable: Boolean = true,
val postMessageFormat: String = "string",
val reverseHost: String = "127.0.0.1",
val reversePort: Int = 10676,
val accessToken: String = "",
val reversePath: String = "/ws",
val reverseApiPath: String = "/api",
val reverseEventPath: String = "/event",
val useUniversal: Boolean = true,
val useTLS: Boolean = false,
val reconnectInterval: Int = 3000
)

@Serializable
data class WsConfig(
val enable: Boolean = false,
val postMessageFormat: String = "string",
val accessToken: String = "",
val wsHost: String = "0.0.0.0",
val wsPort: Int = 8080
)
Loading

0 comments on commit f1f128f

Please sign in to comment.