Bladeren bron

Support member's active information, #588

ryoii 2 jaren geleden
bovenliggende
commit
320d9727a2

+ 6 - 0
docs/api/API.md

@@ -1214,6 +1214,12 @@
   "joinTimestamp":12345678,
   "lastSpeakTimestamp":8765432,
   "muteTimeRemaining":0,
+  "active": {
+    "rank": 6,            // 群活跃等级 1-6
+    "point": 100,         // 群活跃积分
+    "honors": ["群聊之火"],// 群荣誉表示
+    "temperature": 100    // 群荣誉等级 LV 1-100
+  },
   "group":{
     "id":12345,
     "name":"群名1",

+ 1 - 5
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/internal/action/group.kt

@@ -95,10 +95,6 @@ internal fun onUpdateGroupConfig(dto: GroupConfigDTO): StateCode {
     with(dto.config) {
         name?.let { group.name = it }
         allowMemberInvite?.let { group.settings.isAllowMemberInvite = it }
-        // TODO: 待core接口实现设置可改
-        //    confessTalk?.let { group.settings.isConfessTalkEnabled = it }
-        //    autoApprove?.let { group.autoApprove = it }
-        //    anonymousChat?.let { group.anonymousChat = it }
     }
     return StateCode.Success
 }
@@ -108,7 +104,7 @@ internal fun onUpdateGroupConfig(dto: GroupConfigDTO): StateCode {
  */
 internal fun onGetMemberInfo(dto: MemberTargetDTO): MemberDTO {
     val member = dto.session.bot.getGroupOrFail(dto.target).getOrFail(dto.memberId)
-    return MemberDTO(member)
+    return MemberDTO(member, withActiveInfo = true)
 }
 
 /**

+ 21 - 22
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/adapter/internal/dto/contact.kt

@@ -14,10 +14,11 @@ import kotlinx.serialization.SerialName
 import kotlinx.serialization.Serializable
 import kotlinx.serialization.json.JsonClassDiscriminator
 import net.mamoe.mirai.LowLevelApi
+import net.mamoe.mirai.api.http.util.GroupHonor
 import net.mamoe.mirai.contact.*
+import net.mamoe.mirai.contact.active.MemberActive
 import net.mamoe.mirai.data.MemberInfo
 import net.mamoe.mirai.data.UserProfile
-import net.mamoe.mirai.utils.MiraiExperimentalApi
 
 @OptIn(ExperimentalSerializationApi::class)
 @Serializable
@@ -68,23 +69,37 @@ internal data class MemberDTO(
     val joinTimestamp: Int,
     val lastSpeakTimestamp: Int,
     val muteTimeRemaining: Int,
-    val group: GroupDTO
+    val group: GroupDTO,
+    val active: MemberActiveDTO? = null,
 ) : ContactDTO() {
-    constructor(member: Member) : this(
+    constructor(member: Member, withActiveInfo: Boolean = false) : this(
         member.id, member.nameCardOrNick, member.specialTitle, member.permission,
         joinTimestamp = if (member is NormalMember) member.joinTimestamp else 0,
         lastSpeakTimestamp = if (member is NormalMember) member.lastSpeakTimestamp else 0,
         muteTimeRemaining = if (member is NormalMember) member.muteTimeRemaining else 0,
-        group = GroupDTO(member.group)
+        group = GroupDTO(member.group),
+        active = if (withActiveInfo) MemberActiveDTO(member.active) else null,
     )
 
-    @OptIn(LowLevelApi::class, MiraiExperimentalApi::class)
+    @OptIn(LowLevelApi::class)
     constructor(member: MemberInfo, group: Group): this(
         member.uin, member.nameCard.takeIf { it.isNotEmpty() } ?: member.nick, member.specialTitle, member.permission,
         joinTimestamp = member.joinTimestamp,
         lastSpeakTimestamp = member.joinTimestamp,
         muteTimeRemaining = if (member.muteTimestamp == 0 || member.muteTimestamp == 0xFFFFFFFF.toInt()) 0 else (member.muteTimestamp - System.currentTimeMillis()/1000).toInt().coerceAtLeast(0),
-        group = GroupDTO(group)
+        group = GroupDTO(group),
+    )
+}
+
+@Serializable
+internal data class MemberActiveDTO(
+    val rank: Int,
+    val point: Int,
+    val honors: List<String>,
+    val temperature: Int,
+) : DTO {
+    constructor(active: MemberActive) : this(
+        active.rank, active.point, active.honors.map(GroupHonor::get), active.temperature
     )
 }
 
@@ -107,22 +122,6 @@ internal data class OtherClientDTO(
     constructor(otherClient: OtherClient): this(otherClient.id, otherClient.platform?.name ?: "unknown")
 }
 
-//@Serializable
-//internal data class ComplexSubjectDTO(
-//    override val id: Long,
-//    val kind: String
-//) : ContactDTO() {
-//    constructor(contact: Contact) : this(
-//        contact.id, when (contact) {
-//            is Stranger -> "Stranger"
-//            is Friend -> "Friend"
-//            is Group -> "Group"
-//            is OtherClient -> "OtherClient"
-//            else -> error("Contact type ${contact::class.simpleName} not supported")
-//        }
-//    )
-//}
-
 @Serializable
 internal data class ProfileDTO(
     val nickname: String,

+ 0 - 2
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/util/GroupHonor.kt

@@ -10,7 +10,6 @@
 package net.mamoe.mirai.api.http.util
 
 import net.mamoe.mirai.data.GroupHonorType
-import net.mamoe.mirai.utils.MiraiExperimentalApi
 
 class GroupHonor {
     companion object {
@@ -27,7 +26,6 @@ class GroupHonor {
             11 to "善财福禄寿",
         )
 
-        @OptIn(MiraiExperimentalApi::class)
         operator fun get(honor: GroupHonorType): String {
             return value[honor.id] ?: "未知群荣誉"
         }

+ 14 - 0
mirai-api-http/src/test/kotlin/integration/action/GroupActionTest.kt

@@ -14,8 +14,10 @@ import net.mamoe.mirai.api.http.adapter.internal.dto.parameter.GroupDetailDTO
 import net.mamoe.mirai.api.http.adapter.internal.dto.parameter.KickDTO
 import net.mamoe.mirai.api.http.adapter.internal.dto.parameter.LongTargetDTO
 import net.mamoe.mirai.api.http.adapter.internal.dto.parameter.MuteDTO
+import net.mamoe.mirai.api.http.util.GroupHonor
 import net.mamoe.mirai.contact.MemberPermission
 import net.mamoe.mirai.contact.nameCardOrNick
+import net.mamoe.mirai.data.GroupHonorType
 import net.mamoe.mirai.utils.MiraiExperimentalApi
 import kotlin.test.*
 
@@ -154,6 +156,12 @@ class GroupActionTest {
         val bot = SetupMockBot.instance()
         val group = bot.addGroup(456, "test group")
         val member = group.addMember(456, "test member")
+        member.active.apply {
+            mockSetRank(1)
+            mockSetPoint(2)
+            mockSetTemperature(3)
+            mockSetHonors(setOf(GroupHonorType.BRONZE, GroupHonorType.GOLDEN))
+        }
 
         client.get(Paths.memberInfo) {
             parameter("target", group.id)
@@ -163,6 +171,12 @@ class GroupActionTest {
             assertEquals(member.nameCardOrNick, it.memberName)
             assertEquals(member.specialTitle, it.specialTitle)
             assertEquals(member.permission, it.permission)
+
+            assertNotNull(it.active)
+            assertEquals(1, it.active.rank)
+            assertEquals(2, it.active.point)
+            assertEquals(3, it.active.temperature)
+            assertTrue(listOf(GroupHonor[GroupHonorType.BRONZE], GroupHonor[GroupHonorType.GOLDEN]).containsAll(it.active.honors))
         }
 
         postJsonData<StateCode>(