XuqmGroup-AndroidSDK/sdk-im/src/main/java/com/xuqm/sdk/im/ImSDK.kt

113 行
4.5 KiB
Kotlin

2026-04-21 22:07:29 +08:00
package com.xuqm.sdk.im
import com.xuqm.sdk.XuqmSDK
import com.xuqm.sdk.core.WS_URL
import com.xuqm.sdk.im.api.AddMemberRequest
import com.xuqm.sdk.im.api.CreateGroupRequest
2026-04-21 22:07:29 +08:00
import com.xuqm.sdk.im.api.ImApi
import com.xuqm.sdk.im.api.LoginRequest
import com.xuqm.sdk.im.api.SetMutedRequest
import com.xuqm.sdk.im.api.SetPinnedRequest
import com.xuqm.sdk.im.api.UpdateGroupRequest
2026-04-21 22:07:29 +08:00
import com.xuqm.sdk.im.listener.ImEventListener
import com.xuqm.sdk.im.model.ConversationData
import com.xuqm.sdk.im.model.ImGroup
import com.xuqm.sdk.im.model.ImMessage
import com.xuqm.sdk.im.model.UserProfile
2026-04-21 22:07:29 +08:00
import com.xuqm.sdk.network.ApiClient
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
2026-04-21 22:07:29 +08:00
object ImSDK {
private var client: ImClient? = null
private val api: ImApi by lazy { ApiClient.create() }
var currentUserId: String = ""
private set
suspend fun login(userId: String, nickname: String? = null, avatar: String? = null) =
withContext(Dispatchers.IO) {
XuqmSDK.requireInit()
val res = api.login(LoginRequest(XuqmSDK.appId, userId, nickname, avatar))
val token = requireNotNull(res.data?.token) { "IM login failed: ${res.message}" }
XuqmSDK.tokenStore.saveToken(token)
currentUserId = userId
client = ImClient(WS_URL, token, XuqmSDK.appId)
client?.connect()
2026-04-21 22:07:29 +08:00
}
fun sendMessage(toId: String, chatType: String, msgType: String, content: String) {
2026-04-21 22:07:29 +08:00
client?.sendMessage(toId, chatType, msgType, content)
}
suspend fun fetchHistory(toId: String, page: Int = 0, size: Int = 20): List<ImMessage> =
withContext(Dispatchers.IO) {
api.fetchHistory(toId, "SINGLE", page, size).data ?: emptyList()
}
suspend fun fetchGroupHistory(groupId: String, page: Int = 0, size: Int = 20): List<ImMessage> =
withContext(Dispatchers.IO) {
api.fetchGroupHistory(groupId, page, size).data ?: emptyList()
}
suspend fun listGroups(): List<ImGroup> =
withContext(Dispatchers.IO) { api.listGroups().data ?: emptyList() }
suspend fun createGroup(name: String, memberIds: List<String>): ImGroup? =
withContext(Dispatchers.IO) { api.createGroup(CreateGroupRequest(name, memberIds)).data }
suspend fun getGroupInfo(groupId: String): ImGroup? =
withContext(Dispatchers.IO) { api.getGroupInfo(groupId).data }
suspend fun updateGroupInfo(groupId: String, name: String? = null, announcement: String? = null) =
withContext(Dispatchers.IO) { api.updateGroupInfo(groupId, UpdateGroupRequest(name, announcement)) }
suspend fun addGroupMember(groupId: String, userId: String) =
withContext(Dispatchers.IO) { api.addGroupMember(groupId, AddMemberRequest(userId)) }
suspend fun removeGroupMember(groupId: String, userId: String) =
withContext(Dispatchers.IO) { api.removeGroupMember(groupId, userId) }
suspend fun leaveGroup(groupId: String) =
withContext(Dispatchers.IO) { api.leaveGroup(groupId) }
suspend fun listFriends(): List<UserProfile> =
withContext(Dispatchers.IO) { api.listFriends().data ?: emptyList() }
suspend fun addFriend(friendId: String) =
withContext(Dispatchers.IO) { api.addFriend(friendId) }
suspend fun removeFriend(friendId: String) =
withContext(Dispatchers.IO) { api.removeFriend(friendId) }
suspend fun listConversations(): List<ConversationData> =
withContext(Dispatchers.IO) { api.listConversations().data ?: emptyList() }
suspend fun setConversationPinned(targetId: String, chatType: String, pinned: Boolean) =
withContext(Dispatchers.IO) {
api.setConversationPinned(targetId, chatType, SetPinnedRequest(pinned))
}
suspend fun setConversationMuted(targetId: String, chatType: String, muted: Boolean) =
withContext(Dispatchers.IO) {
api.setConversationMuted(targetId, chatType, SetMutedRequest(muted))
}
suspend fun markRead(targetId: String, chatType: String = "SINGLE") =
withContext(Dispatchers.IO) { api.markRead(targetId, chatType) }
suspend fun getUserProfile(userId: String): UserProfile? =
withContext(Dispatchers.IO) { api.getUserProfile(userId).data }
2026-04-21 22:07:29 +08:00
fun addListener(listener: ImEventListener) = client?.addListener(listener)
fun removeListener(listener: ImEventListener) = client?.removeListener(listener)
fun disconnect() {
client?.disconnect()
client = null
currentUserId = ""
XuqmSDK.tokenStore.clear()
}
2026-04-21 22:07:29 +08:00
}