diff --git a/gradle.properties b/gradle.properties index ecdb879..b3c760d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ kotlin.code.style=official -libVersion=1.2.8 \ No newline at end of file +libVersion=1.2.9 \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/rob/entity/GroupArrayMessage.kt b/src/main/kotlin/cn/rtast/rob/entity/GroupArrayMessage.kt new file mode 100644 index 0000000..f33f1cf --- /dev/null +++ b/src/main/kotlin/cn/rtast/rob/entity/GroupArrayMessage.kt @@ -0,0 +1,26 @@ +/* + * Copyright © 2024 RTAkland + * Author: RTAkland + * Date: 2024/8/31 + */ + + +package cn.rtast.rob.entity + +import com.google.gson.annotations.SerializedName + +data class GroupArrayMessage( + @SerializedName("sub_type") + val subType: String, + @SerializedName("message_id") + val messageId: Long, + @SerializedName("user_id") + val userId: Long, + @SerializedName("group_id") + val groupId: Long, + val message: List, + @SerializedName("raw_message") + val rawMessage: String, + val sender: Sender, + val time: Long, +) \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/rob/entity/GroupMessage.kt b/src/main/kotlin/cn/rtast/rob/entity/GroupMessage.kt index 30962ce..e922cd2 100644 --- a/src/main/kotlin/cn/rtast/rob/entity/GroupMessage.kt +++ b/src/main/kotlin/cn/rtast/rob/entity/GroupMessage.kt @@ -18,7 +18,7 @@ data class GroupMessage( val userId: Long, @SerializedName("group_id") val groupId: Long, - val message: Array, + val message: Any, @SerializedName("raw_message") val rawMessage: String, val sender: Sender, diff --git a/src/main/kotlin/cn/rtast/rob/util/Json.kt b/src/main/kotlin/cn/rtast/rob/util/Json.kt index 6db2036..da2866d 100644 --- a/src/main/kotlin/cn/rtast/rob/util/Json.kt +++ b/src/main/kotlin/cn/rtast/rob/util/Json.kt @@ -8,6 +8,8 @@ package cn.rtast.rob.util import cn.rtast.rob.gson +import com.google.gson.JsonParser +import com.google.gson.JsonSyntaxException internal fun Any.toJson(): String { return gson.toJson(this) @@ -16,3 +18,13 @@ internal fun Any.toJson(): String { internal inline fun String.fromJson(): T { return gson.fromJson(this, T::class.java) } + + +fun Any.isJsonArray(): Boolean { + return try { + val jsonElement = JsonParser.parseString(this.toJson()) + jsonElement.isJsonArray + } catch (_: JsonSyntaxException) { + false + } +} \ No newline at end of file diff --git a/src/main/kotlin/cn/rtast/rob/util/ob/MessageHandler.kt b/src/main/kotlin/cn/rtast/rob/util/ob/MessageHandler.kt index 70c6e96..6bbb9a5 100644 --- a/src/main/kotlin/cn/rtast/rob/util/ob/MessageHandler.kt +++ b/src/main/kotlin/cn/rtast/rob/util/ob/MessageHandler.kt @@ -9,10 +9,12 @@ package cn.rtast.rob.util.ob import cn.rtast.rob.ROneBotFactory import cn.rtast.rob.ROneBotFactory.commandManager +import cn.rtast.rob.entity.ArrayMessage import cn.rtast.rob.entity.BaseMessage import cn.rtast.rob.entity.CanSend import cn.rtast.rob.entity.ConnectEvent import cn.rtast.rob.entity.FriendList +import cn.rtast.rob.entity.GroupArrayMessage import cn.rtast.rob.entity.GroupInfo import cn.rtast.rob.entity.GroupList import cn.rtast.rob.entity.GroupMemberInfo @@ -32,6 +34,8 @@ import cn.rtast.rob.enums.MetaEventType import cn.rtast.rob.enums.PostType import cn.rtast.rob.enums.SubType import cn.rtast.rob.util.fromJson +import cn.rtast.rob.util.isJsonArray +import cn.rtast.rob.util.toJson import org.java_websocket.WebSocket object MessageHandler { @@ -58,18 +62,22 @@ object MessageHandler { when (serializedMessage.messageType) { MessageType.group -> { val msg = message.fromJson() - if (msg.groupId !in listeningGroups && listeningGroups.isNotEmpty()) return - msg.message.distinctBy { it.type }.forEach { - if (it.type == ArrayMessageType.reply) { - listener.onBeRepliedInGroup(websocket, msg) - return@forEach - } - if (it.type == ArrayMessageType.at) { - listener.onBeAt(websocket, msg) - return@forEach + if (msg.message.isJsonArray()) { + val arrayMessage = message.fromJson() + if (msg.groupId !in listeningGroups && listeningGroups.isNotEmpty()) return + arrayMessage.message.distinctBy { it.type }.forEach { + if (it.type == ArrayMessageType.reply) { + listener.onBeRepliedInGroup(websocket, msg) + return@forEach + } + if (it.type == ArrayMessageType.at) { + listener.onBeAt(websocket, msg) + return@forEach + } } + commandManager.handleGroup(listener, msg) } - commandManager.handleGroup(listener, msg) + listener.onGroupMessage(websocket, msg, message) }