import Foundation import XuqmCoreSDK public enum ImConnectionState: String, Sendable { case connected case disconnected case connecting } 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" case forward = "FORWARD" case revoked = "REVOKED" } public enum MsgStatus: String, Codable, Sendable { case sending = "SENDING" case sent = "SENT" case delivered = "DELIVERED" case read = "READ" case failed = "FAILED" case revoked = "REVOKED" } public struct ImMessage: Codable, Sendable { public let id: String public let appKey: String public let fromUserId: String public let fromId: String? 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 } } public struct PageResult: 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 } 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) func imClientDidError(_ error: String) } public extension ImEventDelegate { func imClientDidReadMessage(_ message: ImMessage) {} func imClientDidReceiveRevokedMessage(_ message: ImMessage) {} } public struct ImGroup: Codable, Sendable { public let id: String 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 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 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 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? 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) } }