ios: automatic message deletion (#1160)

This commit is contained in:
JRoberts
2022-10-03 16:42:43 +04:00
committed by GitHub
parent 575706c7c7
commit 6e9e6057af
8 changed files with 167 additions and 30 deletions

View File

@@ -15,14 +15,14 @@ let jsonEncoder = getJSONEncoder()
public enum ChatCommand {
case showActiveUser
case createActiveUser(profile: Profile)
case startChat(subscribe: Bool)
case startChat(subscribe: Bool, expire: Bool)
case apiStopChat
case apiActivateChat
case apiSuspendChat(timeoutMicroseconds: Int)
case setFilesFolder(filesFolder: String)
case setIncognito(incognito: Bool)
case apiExportArchive(config: ArchiveConfig)
case apiImportArchive(config: ArchiveConfig)
case apiImportArchive(config: ArchiveConfig)
case apiDeleteStorage
case apiStorageEncryption(config: DBEncryptionConfig)
case apiGetChats
@@ -45,6 +45,8 @@ public enum ChatCommand {
case apiUpdateGroupProfile(groupId: Int64, groupProfile: GroupProfile)
case getUserSMPServers
case setUserSMPServers(smpServers: [String])
case apiSetChatItemTTL(seconds: Int64?)
case apiGetChatItemTTL
case apiSetNetworkConfig(networkConfig: NetCfg)
case apiGetNetworkConfig
case apiSetChatSettings(type: ChatType, id: Int64, chatSettings: ChatSettings)
@@ -81,12 +83,12 @@ public enum ChatCommand {
switch self {
case .showActiveUser: return "/u"
case let .createActiveUser(profile): return "/u \(profile.displayName) \(profile.fullName)"
case let .startChat(subscribe): return "/_start subscribe=\(subscribe ? "on" : "off") expire=off"
case let .startChat(subscribe, expire): return "/_start subscribe=\(onOff(subscribe)) expire=\(onOff(expire))"
case .apiStopChat: return "/_stop"
case .apiActivateChat: return "/_app activate"
case let .apiSuspendChat(timeoutMicroseconds): return "/_app suspend \(timeoutMicroseconds)"
case let .setFilesFolder(filesFolder): return "/_files_folder \(filesFolder)"
case let .setIncognito(incognito): return "/incognito \(incognito ? "on" : "off")"
case let .setIncognito(incognito): return "/incognito \(onOff(incognito))"
case let .apiExportArchive(cfg): return "/_db export \(encodeJSON(cfg))"
case let .apiImportArchive(cfg): return "/_db import \(encodeJSON(cfg))"
case .apiDeleteStorage: return "/_db delete"
@@ -113,6 +115,8 @@ public enum ChatCommand {
case let .apiUpdateGroupProfile(groupId, groupProfile): return "/_group_profile #\(groupId) \(encodeJSON(groupProfile))"
case .getUserSMPServers: return "/smp_servers"
case let .setUserSMPServers(smpServers): return "/smp_servers \(smpServersStr(smpServers: smpServers))"
case let .apiSetChatItemTTL(seconds): return "/_ttl \(chatItemTTLStr(seconds: seconds))"
case .apiGetChatItemTTL: return "/ttl"
case let .apiSetNetworkConfig(networkConfig): return "/_network \(encodeJSON(networkConfig))"
case .apiGetNetworkConfig: return "/network"
case let .apiSetChatSettings(type, id, chatSettings): return "/_settings \(ref(type, id)) \(encodeJSON(chatSettings))"
@@ -180,6 +184,8 @@ public enum ChatCommand {
case .apiUpdateGroupProfile: return "apiUpdateGroupProfile"
case .getUserSMPServers: return "getUserSMPServers"
case .setUserSMPServers: return "setUserSMPServers"
case .apiSetChatItemTTL: return "apiSetChatItemTTL"
case .apiGetChatItemTTL: return "apiGetChatItemTTL"
case .apiSetNetworkConfig: return "apiSetNetworkConfig"
case .apiGetNetworkConfig: return "apiGetNetworkConfig"
case .apiSetChatSettings: return "apiSetChatSettings"
@@ -221,6 +227,14 @@ public enum ChatCommand {
smpServers.isEmpty ? "default" : smpServers.joined(separator: ",")
}
func chatItemTTLStr(seconds: Int64?) -> String {
if let seconds = seconds {
return String(seconds)
} else {
return "none"
}
}
public var obfuscated: ChatCommand {
switch self {
case let .apiStorageEncryption(cfg):
@@ -232,6 +246,10 @@ public enum ChatCommand {
private func obfuscate(_ s: String) -> String {
s == "" ? "" : "***"
}
private func onOff(_ b: Bool) -> String {
b ? "on" : "off"
}
}
struct APIResponse: Decodable {
@@ -248,6 +266,7 @@ public enum ChatResponse: Decodable, Error {
case apiChats(chats: [ChatData])
case apiChat(chat: ChatData)
case userSMPServers(smpServers: [String])
case chatItemTTL(chatItemTTL: Int64?)
case networkConfig(networkConfig: NetCfg)
case contactInfo(contact: Contact, connectionStats: ConnectionStats, customUserProfile: Profile?)
case groupMemberInfo(groupInfo: GroupInfo, member: GroupMember, connectionStats_: ConnectionStats?)
@@ -342,6 +361,7 @@ public enum ChatResponse: Decodable, Error {
case .apiChats: return "apiChats"
case .apiChat: return "apiChat"
case .userSMPServers: return "userSMPServers"
case .chatItemTTL: return "chatItemTTL"
case .networkConfig: return "networkConfig"
case .contactInfo: return "contactInfo"
case .groupMemberInfo: return "groupMemberInfo"
@@ -436,6 +456,7 @@ public enum ChatResponse: Decodable, Error {
case let .apiChats(chats): return String(describing: chats)
case let .apiChat(chat): return String(describing: chat)
case let .userSMPServers(smpServers): return String(describing: smpServers)
case let .chatItemTTL(chatItemTTL): return String(describing: chatItemTTL)
case let .networkConfig(networkConfig): return String(describing: networkConfig)
case let .contactInfo(contact, connectionStats, customUserProfile): return "contact: \(String(describing: contact))\nconnectionStats: \(String(describing: connectionStats))\ncustomUserProfile: \(String(describing: customUserProfile))"
case let .groupMemberInfo(groupInfo, member, connectionStats_): return "groupInfo: \(String(describing: groupInfo))\nmember: \(String(describing: member))\nconnectionStats_: \(String(describing: connectionStats_)))"

View File

@@ -1464,3 +1464,51 @@ public enum SndGroupEvent: Decodable {
}
}
}
public enum ChatItemTTL: Hashable, Identifiable, Comparable {
case day
case week
case month
case seconds(_ seconds: Int64)
case none
public var id: Self { self }
public init(_ seconds: Int64?) {
switch seconds {
case 86400: self = .day
case 7 * 86400: self = .week
case 30 * 86400: self = .month
case let .some(n): self = .seconds(n)
case .none: self = .none
}
}
public var deleteAfterText: LocalizedStringKey {
switch self {
case .day: return "1 day"
case .week: return "1 week"
case .month: return "1 month"
case let .seconds(seconds): return "\(seconds) second(s)"
case .none: return "no"
}
}
public var seconds: Int64? {
switch self {
case .day: return 86400
case .week: return 7 * 86400
case .month: return 30 * 86400
case let .seconds(seconds): return seconds
case .none: return nil
}
}
private var comparisonValue: Int64 {
self.seconds ?? Int64.max
}
public static func < (lhs: Self, rhs: Self) -> Bool {
return lhs.comparisonValue < rhs.comparisonValue
}
}