core, ios: send_v2 api to send messages as JSON (to support filenames with spaces) (#604)

This commit is contained in:
Evgeny Poberezkin
2022-05-05 14:04:03 +01:00
committed by GitHub
parent 7928cdbfb8
commit e80f617840
4 changed files with 54 additions and 16 deletions
@@ -50,6 +50,7 @@ enum ChatCommand {
case let .setFilesFolder(filesFolder): return "/_files_folder \(filesFolder)"
case .apiGetChats: return "/_get chats pcc=on"
case let .apiGetChat(type, id): return "/_get chat \(ref(type, id)) count=100"
// TODO replace with /_send_v2
case let .apiSendMessage(type, id, file, quotedItemId, mc):
switch (file, quotedItemId) {
case (nil, nil): return "/_send \(ref(type, id)) \(mc.cmdString)"
@@ -57,6 +58,8 @@ enum ChatCommand {
case let (nil, .some(quotedItemId)): return "/_send \(ref(type, id)) quoted \(quotedItemId) \(mc.cmdString)"
case let (.some(file), .some(quotedItemId)): return "/_send \(ref(type, id)) file \(file) quoted \(quotedItemId) \(mc.cmdString)"
}
// case let .apiSendMessage(type, id, file, quotedItemId, mc):
// return "/_send_v2 \(ref(type, id)) \(try! jsonEncoder.encode(ComposedMessage(filePath: file, quotedItemId: quotedItemId, msgContent: mc)))"
case let .apiUpdateChatItem(type, id, itemId, mc): return "/_update item \(ref(type, id)) \(itemId) \(mc.cmdString)"
case let .apiDeleteChatItem(type, id, itemId, mode): return "/_delete item \(ref(type, id)) \(itemId) \(mode.rawValue)"
case let .apiRegisterToken(token): return "/_ntf register apns \(token)"
@@ -301,6 +304,12 @@ enum ChatResponse: Decodable, Error {
private var noDetails: String { get { "\(responseType): no details" } }
}
struct ComposedMessage: Encodable {
var filePath: String?
var quotedItemId: Int64?
var msgContent: MsgContent
}
private func decodeCJSON<T: Decodable>(_ cjson: UnsafePointer<CChar>) -> T? {
let s = String.init(cString: cjson)
let d = s.data(using: .utf8)!
+27 -7
View File
@@ -689,12 +689,7 @@ enum MsgContent {
get {
switch self {
case let .text(text): return "text \(text)"
case let .link(text: text, preview: preview):
return "json {\"type\":\"link\",\"text\":\(encodeJSON(text)),\"preview\":\(encodeJSON(preview))}"
case let .image(text: text, image: image):
return "json {\"type\":\"image\",\"text\":\(encodeJSON(text)),\"image\":\(encodeJSON(image))}"
case let .file(text): return "json {\"type\":\"file\",\"text\":\(encodeJSON(text))}"
default: return ""
default: return "json \(encodeJSON(self))"
}
}
}
@@ -704,7 +699,6 @@ enum MsgContent {
case text
case preview
case image
case file
}
}
@@ -739,6 +733,32 @@ extension MsgContent: Decodable {
}
}
extension MsgContent: Encodable {
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
switch self {
case let .text(text):
try container.encode("text", forKey: .type)
try container.encode(text, forKey: .text)
case let .link(text, preview):
try container.encode("link", forKey: .type)
try container.encode(text, forKey: .text)
try container.encode(preview, forKey: .preview)
case let .image(text, image):
try container.encode("image", forKey: .type)
try container.encode(text, forKey: .text)
try container.encode(image, forKey: .image)
case let .file(text):
try container.encode("file", forKey: .type)
try container.encode(text, forKey: .text)
// TODO use original JSON and type
case let .unknown(_, text):
try container.encode("text", forKey: .type)
try container.encode(text, forKey: .text)
}
}
}
struct FormattedText: Decodable {
var text: String
var format: Format?