XuqmGroup-iOSSDK/Sources/XuqmImSDK/ImTypes.swift

339 行
9.0 KiB
Swift

2026-04-21 22:07:29 +08:00
import Foundation
import XuqmCoreSDK
2026-04-21 22:07:29 +08:00
public enum ImConnectionState: String, Sendable {
case connected
case disconnected
case connecting
}
2026-04-21 22:07:29 +08:00
public enum ChatType: String, Codable, Sendable {
case single = "SINGLE"
case group = "GROUP"
}
public enum MsgType: String, Codable, Sendable {
case text = "TEXT"
case image = "IMAGE"
case video = "VIDEO"
case audio = "AUDIO"
case file = "FILE"
case custom = "CUSTOM"
case location = "LOCATION"
case notify = "NOTIFY"
case richText = "RICH_TEXT"
case callAudio = "CALL_AUDIO"
case callVideo = "CALL_VIDEO"
case quote = "QUOTE"
case merge = "MERGE"
2026-04-21 22:07:29 +08:00
case forward = "FORWARD"
case revoked = "REVOKED"
2026-04-21 22:07:29 +08:00
}
public enum MsgStatus: String, Codable, Sendable {
case sending = "SENDING"
2026-04-21 22:07:29 +08:00
case sent = "SENT"
case delivered = "DELIVERED"
case read = "READ"
case failed = "FAILED"
2026-04-21 22:07:29 +08:00
case revoked = "REVOKED"
}
public struct ImMessage: Codable, Sendable {
public let id: String
2026-05-07 19:39:48 +08:00
public let appKey: String
2026-04-21 22:07:29 +08:00
public let fromUserId: String
public let fromId: String?
2026-04-21 22:07:29 +08:00
public let toId: String
public let chatType: ChatType
public let msgType: MsgType
public let content: String
public let status: MsgStatus
public let mentionedUserIds: String?
public let groupReadCount: Int?
public let revoked: Bool?
public let createdAt: Int64
public let editedAt: Int64?
public init(
id: String,
appKey: String,
fromUserId: String,
fromId: String?,
toId: String,
chatType: ChatType,
msgType: MsgType,
content: String,
status: MsgStatus,
mentionedUserIds: String?,
groupReadCount: Int?,
revoked: Bool?,
createdAt: Int64,
editedAt: Int64?
) {
self.id = id
self.appKey = appKey
self.fromUserId = fromUserId
self.fromId = fromId
self.toId = toId
self.chatType = chatType
self.msgType = msgType
self.content = content
self.status = status
self.mentionedUserIds = mentionedUserIds
self.groupReadCount = groupReadCount
self.revoked = revoked
self.createdAt = createdAt
self.editedAt = editedAt
}
2026-04-21 22:07:29 +08:00
}
public struct PageResult<T: Decodable & Sendable>: Decodable, Sendable {
public let content: [T]
public let totalElements: Int64
public let totalPages: Int
public let size: Int
public let number: Int
public let numberOfElements: Int
public let first: Bool
public let last: Bool
public let empty: Bool
}
2026-04-21 22:07:29 +08:00
public protocol ImEventDelegate: AnyObject {
func imClientDidConnect()
func imClientDidDisconnect(reason: String?)
func imClientDidReceiveMessage(_ message: ImMessage)
func imClientDidReceiveGroupMessage(_ message: ImMessage)
func imClientDidReadMessage(_ message: ImMessage)
func imClientDidReceiveRevokedMessage(_ message: ImMessage)
2026-04-21 22:07:29 +08:00
func imClientDidError(_ error: String)
}
public extension ImEventDelegate {
func imClientDidReadMessage(_ message: ImMessage) {}
func imClientDidReceiveRevokedMessage(_ message: ImMessage) {}
}
public struct ImGroup: Codable, Sendable {
public let id: String
2026-05-07 19:39:48 +08:00
public let appKey: String
public let name: String
public let groupType: String?
public let creatorId: String
public let memberIds: String
public let adminIds: String
public let announcement: String?
public let memberInfo: String?
public let extAttributes: String?
public let createdAt: Int64
}
public struct ConversationData: Codable, Sendable {
public let targetId: String
public let chatType: ChatType
public let conversationGroup: String?
public let lastMsgContent: String?
public let lastMsgType: String?
public let lastMsgTime: Int64
public let unreadCount: Int
public let isMuted: Bool
public let isPinned: Bool
}
public struct ConversationGroupItem: Codable, Sendable {
public let targetId: String
public let chatType: ChatType
public let groupName: String
}
public struct FriendRequest: Codable, Sendable {
public let id: String
2026-05-07 19:39:48 +08:00
public let appKey: String
public let fromUserId: String
public let toUserId: String
public let remark: String?
public let status: String
public let createdAt: Int64
public let reviewedAt: Int64?
}
public struct GroupJoinRequest: Codable, Sendable {
public let id: String
2026-05-07 19:39:48 +08:00
public let appKey: String
public let groupId: String
public let requesterId: String
public let remark: String?
public let status: String
public let createdAt: Int64
public let reviewedAt: Int64?
}
public struct BlacklistEntry: Codable, Sendable {
public let id: String
2026-05-07 19:39:48 +08:00
public let appKey: String
public let userId: String
public let blockedUserId: String
public let createdAt: Int64
}
public struct BlacklistCheckResult: Codable, Sendable {
public let targetUserId: String
public let blockedByMe: Bool
public let blockedByTarget: Bool
public let eitherBlocked: Bool
}
public struct GroupReadReceiptSummary: Codable, Sendable {
public let messageId: String
public let groupId: String
public let memberCount: Int
public let readCount: Int
public let unreadCount: Int
}
public struct UserProfile: Codable, Sendable {
public let id: String?
2026-05-07 19:39:48 +08:00
public let appKey: String?
public let userId: String
public let nickname: String?
public let avatar: String?
public let gender: String?
public let status: String?
public let createdAt: Int64?
}
public struct ImSendMessageRequest: Encodable, Sendable {
public let messageId: String
public let toId: String
public let chatType: ChatType
public let msgType: MsgType
public let content: String
public let mentionedUserIds: String?
}
public struct EditMessageRequest: Encodable, Sendable {
public let content: String
}
public struct ImLoginResponse: Decodable, Sendable {
public let token: String
}
public struct ImCreateGroupRequest: Encodable, Sendable {
public let name: String
public let memberIds: [String]
public let groupType: String?
}
public struct ImUpdateGroupRequest: Encodable, Sendable {
public let name: String?
public let announcement: String?
}
public struct ImMemberRequest: Encodable, Sendable {
public let userId: String
}
public struct ImSetRoleRequest: Encodable, Sendable {
public let userId: String
public let role: String
}
public struct ImMuteMemberRequest: Encodable, Sendable {
public let userId: String
public let minutes: Int64
}
public struct ImTransferOwnerRequest: Encodable, Sendable {
public let newOwnerId: String
}
public struct ImAttributeKeysRequest: Encodable, Sendable {
public let keys: [String]
}
public struct ImGroupReadReceiptRequest: Encodable, Sendable {
public let messageIds: [String]
}
public struct BatchFriendIdsRequest: Encodable, Sendable {
public let friendIds: [String]
}
public struct BatchRequestIdsRequest: Encodable, Sendable {
public let requestIds: [String]
}
public struct BatchUserIdsRequest: Encodable, Sendable {
public let userIds: [String]
}
public struct ModifyMemberInfoRequest: Encodable, Sendable {
public let nickname: String?
public let role: String?
}
public enum ImAttributeValue: Codable, Sendable {
case string(String)
case int(Int)
case double(Double)
case bool(Bool)
case null
public init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
if container.decodeNil() {
self = .null
} else if let value = try? container.decode(Bool.self) {
self = .bool(value)
} else if let value = try? container.decode(Int.self) {
self = .int(value)
} else if let value = try? container.decode(Double.self) {
self = .double(value)
} else {
self = .string(try container.decode(String.self))
}
}
public func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
switch self {
case .string(let value):
try container.encode(value)
case .int(let value):
try container.encode(value)
case .double(let value):
try container.encode(value)
case .bool(let value):
try container.encode(value)
case .null:
try container.encodeNil()
}
}
}
extension ImAttributeValue: ExpressibleByStringLiteral {
public init(stringLiteral value: String) {
self = .string(value)
}
}
extension ImAttributeValue: ExpressibleByIntegerLiteral {
public init(integerLiteral value: Int) {
self = .int(value)
}
}
extension ImAttributeValue: ExpressibleByFloatLiteral {
public init(floatLiteral value: Double) {
self = .double(value)
}
}
extension ImAttributeValue: ExpressibleByBooleanLiteral {
public init(booleanLiteral value: Bool) {
self = .bool(value)
}
}