// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. import Foundation extension OpenGroupAPI { public struct SendMessageRequest: Codable { enum CodingKeys: String, CodingKey { case data case signature case whisperTo = "whisper_to" case whisperMods = "whisper_mods" case fileIds = "files" } /// The serialized message body (encoded in base64 when encoding) let data: Data /// A 64-byte Ed25519 signature of the message body, signed by the current user's keys (encoded in base64 when /// encoding - ie. 88 base64 chars) let signature: Data /// If present this indicates that this message is a whisper that should only be shown to the given user (via their sessionId) let whisperTo: String? /// If `true`, then this message will be visible to moderators but not ordinary users /// /// If this and `whisper_to` are used together then the message will be visible to the given user and any room /// moderators (this can be used, for instance, to issue a warning to a user that only the user and other mods can see) /// /// **Note:** Only moderators may set this flag let whisperMods: Bool? /// Array of file IDs of new files uploaded as attachments of this post /// /// This is required to preserve uploads for the default expiry period (15 days, unless otherwise configured by the SOGS /// administrator); uploaded files that are not attached to a post will be deleted much sooner /// /// If any of the given file ids are already associated with another message then the association is ignored (i.e. the files remain /// associated with the original message) /// /// When submitting a message edit this field must contain the IDs of any newly uploaded files that are part of the edit; existing /// attachment IDs may also be included, but are not required /// /// **Note:** The SOGS API actually expects an array of Int64 (ie. what is returned when uploading a file to SOGS) but /// when uploading direct to the FileServer we get a string id back. In order to avoid supporting both cases we convert /// the id returned by SOGS to a string and send those through - luckily SOGS converts the values to ints so supports /// receipving an array of String values let fileIds: [String]? // MARK: - Initialization init( data: Data, signature: Data, whisperTo: String? = nil, whisperMods: Bool? = nil, fileIds: [String]? = nil ) { self.data = data self.signature = signature self.whisperTo = whisperTo self.whisperMods = whisperMods self.fileIds = fileIds } // MARK: - Encodable public func encode(to encoder: Encoder) throws { var container: KeyedEncodingContainer = encoder.container(keyedBy: CodingKeys.self) try container.encode(data.base64EncodedString(), forKey: .data) try container.encode(signature.base64EncodedString(), forKey: .signature) try container.encodeIfPresent(whisperTo, forKey: .whisperTo) try container.encodeIfPresent(whisperMods, forKey: .whisperMods) try container.encodeIfPresent(fileIds, forKey: .fileIds) } } }