mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 14:20:20 +00:00
Refactoring
This commit is contained in:
@@ -4,14 +4,77 @@ import SwiftSignalKit
|
||||
import TelegramApi
|
||||
import MtProtoKit
|
||||
|
||||
|
||||
private enum AccountKind {
|
||||
case authorized
|
||||
case unauthorized
|
||||
}
|
||||
|
||||
public enum TelegramAccountRecordAttribute: AccountRecordAttribute, Equatable {
|
||||
enum CodingKeys: String, CodingKey {
|
||||
case backupData
|
||||
case environment
|
||||
case sortOrder
|
||||
case loggedOut
|
||||
case legacyRootObject = "_"
|
||||
}
|
||||
|
||||
case backupData(AccountBackupDataAttribute)
|
||||
case environment(AccountEnvironmentAttribute)
|
||||
case sortOrder(AccountSortOrderAttribute)
|
||||
case loggedOut(LoggedOutAccountAttribute)
|
||||
|
||||
public init(from decoder: Decoder) throws {
|
||||
let container = try decoder.container(keyedBy: CodingKeys.self)
|
||||
|
||||
if let backupData = try? container.decodeIfPresent(AccountBackupDataAttribute.self, forKey: .backupData) {
|
||||
self = .backupData(backupData)
|
||||
} else if let environment = try? container.decodeIfPresent(AccountEnvironmentAttribute.self, forKey: .environment) {
|
||||
self = .environment(environment)
|
||||
} else if let sortOrder = try? container.decodeIfPresent(AccountSortOrderAttribute.self, forKey: .sortOrder) {
|
||||
self = .sortOrder(sortOrder)
|
||||
} else if let loggedOut = try? container.decodeIfPresent(LoggedOutAccountAttribute.self, forKey: .loggedOut) {
|
||||
self = .loggedOut(loggedOut)
|
||||
} else {
|
||||
let legacyRootObjectData = try! container.decode(AdaptedPostboxDecoder.RawObjectData.self, forKey: .legacyRootObject)
|
||||
if legacyRootObjectData.typeHash == postboxEncodableTypeHash(AccountBackupDataAttribute.self) {
|
||||
self = .backupData(try! AdaptedPostboxDecoder().decode(AccountBackupDataAttribute.self, from: legacyRootObjectData.data))
|
||||
} else if legacyRootObjectData.typeHash == postboxEncodableTypeHash(AccountEnvironmentAttribute.self) {
|
||||
self = .environment(try! AdaptedPostboxDecoder().decode(AccountEnvironmentAttribute.self, from: legacyRootObjectData.data))
|
||||
} else if legacyRootObjectData.typeHash == postboxEncodableTypeHash(AccountSortOrderAttribute.self) {
|
||||
self = .sortOrder(try! AdaptedPostboxDecoder().decode(AccountSortOrderAttribute.self, from: legacyRootObjectData.data))
|
||||
} else if legacyRootObjectData.typeHash == postboxEncodableTypeHash(LoggedOutAccountAttribute.self) {
|
||||
self = .loggedOut(try! AdaptedPostboxDecoder().decode(LoggedOutAccountAttribute.self, from: legacyRootObjectData.data))
|
||||
} else {
|
||||
preconditionFailure()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public func encode(to encoder: Encoder) throws {
|
||||
var container = encoder.container(keyedBy: CodingKeys.self)
|
||||
|
||||
switch self {
|
||||
case let .backupData(backupData):
|
||||
try container.encode(backupData, forKey: .backupData)
|
||||
case let .environment(environment):
|
||||
try container.encode(environment, forKey: .environment)
|
||||
case let .sortOrder(sortOrder):
|
||||
try container.encode(sortOrder, forKey: .sortOrder)
|
||||
case let .loggedOut(loggedOut):
|
||||
try container.encode(loggedOut, forKey: .loggedOut)
|
||||
}
|
||||
}
|
||||
|
||||
public func isEqual(to: AccountRecordAttribute) -> Bool {
|
||||
return self == to as? TelegramAccountRecordAttribute
|
||||
}
|
||||
}
|
||||
|
||||
public final class TelegramAccountManagerTypes: AccountManagerTypes {
|
||||
public typealias Attribute = TelegramAccountRecordAttribute
|
||||
}
|
||||
|
||||
private var declaredEncodables: Void = {
|
||||
declareEncodable(AuthAccountRecord.self, f: { AuthAccountRecord(decoder: $0) })
|
||||
declareEncodable(UnauthorizedAccountState.self, f: { UnauthorizedAccountState(decoder: $0) })
|
||||
declareEncodable(AuthorizedAccountState.self, f: { AuthorizedAccountState(decoder: $0) })
|
||||
declareEncodable(TelegramUser.self, f: { TelegramUser(decoder: $0) })
|
||||
@@ -74,9 +137,6 @@ private var declaredEncodables: Void = {
|
||||
declareEncodable(RecentMediaItem.self, f: { RecentMediaItem(decoder: $0) })
|
||||
declareEncodable(RecentPeerItem.self, f: { RecentPeerItem(decoder: $0) })
|
||||
declareEncodable(RecentHashtagItem.self, f: { RecentHashtagItem(decoder: $0) })
|
||||
declareEncodable(LoggedOutAccountAttribute.self, f: { LoggedOutAccountAttribute(decoder: $0) })
|
||||
declareEncodable(AccountEnvironmentAttribute.self, f: { AccountEnvironmentAttribute(decoder: $0) })
|
||||
declareEncodable(AccountSortOrderAttribute.self, f: { AccountSortOrderAttribute(decoder: $0) })
|
||||
declareEncodable(CloudChatClearHistoryOperation.self, f: { CloudChatClearHistoryOperation(decoder: $0) })
|
||||
declareEncodable(OutgoingContentInfoMessageAttribute.self, f: { OutgoingContentInfoMessageAttribute(decoder: $0) })
|
||||
declareEncodable(ConsumableContentMessageAttribute.self, f: { ConsumableContentMessageAttribute(decoder: $0) })
|
||||
@@ -143,7 +203,6 @@ private var declaredEncodables: Void = {
|
||||
declareEncodable(CloudDocumentSizeMediaResource.self, f: { CloudDocumentSizeMediaResource(decoder: $0) })
|
||||
declareEncodable(CloudPeerPhotoSizeMediaResource.self, f: { CloudPeerPhotoSizeMediaResource(decoder: $0) })
|
||||
declareEncodable(CloudStickerPackThumbnailMediaResource.self, f: { CloudStickerPackThumbnailMediaResource(decoder: $0) })
|
||||
declareEncodable(AccountBackupDataAttribute.self, f: { AccountBackupDataAttribute(decoder: $0) })
|
||||
declareEncodable(ContentRequiresValidationMessageAttribute.self, f: { ContentRequiresValidationMessageAttribute(decoder: $0) })
|
||||
declareEncodable(WasScheduledMessageAttribute.self, f: { WasScheduledMessageAttribute(decoder: $0) })
|
||||
declareEncodable(OutgoingScheduleInfoMessageAttribute.self, f: { OutgoingScheduleInfoMessageAttribute(decoder: $0) })
|
||||
@@ -232,7 +291,7 @@ public final class TemporaryAccount {
|
||||
}
|
||||
}
|
||||
|
||||
public func temporaryAccount(manager: AccountManager, rootPath: String, encryptionParameters: ValueBoxEncryptionParameters) -> Signal<TemporaryAccount, NoError> {
|
||||
public func temporaryAccount(manager: AccountManager<TelegramAccountManagerTypes>, rootPath: String, encryptionParameters: ValueBoxEncryptionParameters) -> Signal<TemporaryAccount, NoError> {
|
||||
return manager.allocatedTemporaryAccountId()
|
||||
|> mapToSignal { id -> Signal<TemporaryAccount, NoError> in
|
||||
let path = "\(rootPath)/\(accountRecordIdPathName(id))"
|
||||
@@ -250,7 +309,7 @@ public func temporaryAccount(manager: AccountManager, rootPath: String, encrypti
|
||||
}
|
||||
}
|
||||
|
||||
public func currentAccount(allocateIfNotExists: Bool, networkArguments: NetworkInitializationArguments, supplementary: Bool, manager: AccountManager, rootPath: String, auxiliaryMethods: AccountAuxiliaryMethods, encryptionParameters: ValueBoxEncryptionParameters) -> Signal<AccountResult?, NoError> {
|
||||
public func currentAccount(allocateIfNotExists: Bool, networkArguments: NetworkInitializationArguments, supplementary: Bool, manager: AccountManager<TelegramAccountManagerTypes>, rootPath: String, auxiliaryMethods: AccountAuxiliaryMethods, encryptionParameters: ValueBoxEncryptionParameters) -> Signal<AccountResult?, NoError> {
|
||||
return manager.currentAccountRecord(allocateIfNotExists: allocateIfNotExists)
|
||||
|> distinctUntilChanged(isEqual: { lhs, rhs in
|
||||
return lhs?.0 == rhs?.0
|
||||
@@ -261,7 +320,7 @@ public func currentAccount(allocateIfNotExists: Bool, networkArguments: NetworkI
|
||||
return reload.get()
|
||||
|> mapToSignal { _ -> Signal<AccountResult?, NoError> in
|
||||
let beginWithTestingEnvironment = record.1.contains(where: { attribute in
|
||||
if let attribute = attribute as? AccountEnvironmentAttribute, case .test = attribute.environment {
|
||||
if case let .environment(environment) = attribute, case .test = environment.environment {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
@@ -314,7 +373,7 @@ public func currentAccount(allocateIfNotExists: Bool, networkArguments: NetworkI
|
||||
}
|
||||
}
|
||||
|
||||
public func logoutFromAccount(id: AccountRecordId, accountManager: AccountManager, alreadyLoggedOutRemotely: Bool) -> Signal<Void, NoError> {
|
||||
public func logoutFromAccount(id: AccountRecordId, accountManager: AccountManager<TelegramAccountManagerTypes>, alreadyLoggedOutRemotely: Bool) -> Signal<Void, NoError> {
|
||||
Logger.shared.log("AccountManager", "logoutFromAccount \(id)")
|
||||
return accountManager.transaction { transaction -> Void in
|
||||
transaction.updateRecord(id, { current in
|
||||
@@ -323,7 +382,7 @@ public func logoutFromAccount(id: AccountRecordId, accountManager: AccountManage
|
||||
} else if let current = current {
|
||||
var found = false
|
||||
for attribute in current.attributes {
|
||||
if attribute is LoggedOutAccountAttribute {
|
||||
if case .loggedOut = attribute {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
@@ -331,7 +390,7 @@ public func logoutFromAccount(id: AccountRecordId, accountManager: AccountManage
|
||||
if found {
|
||||
return current
|
||||
} else {
|
||||
return AccountRecord(id: current.id, attributes: current.attributes + [LoggedOutAccountAttribute()], temporarySessionId: nil)
|
||||
return AccountRecord(id: current.id, attributes: current.attributes + [.loggedOut(LoggedOutAccountAttribute())], temporarySessionId: nil)
|
||||
}
|
||||
} else {
|
||||
return nil
|
||||
@@ -340,7 +399,7 @@ public func logoutFromAccount(id: AccountRecordId, accountManager: AccountManage
|
||||
}
|
||||
}
|
||||
|
||||
public func managedCleanupAccounts(networkArguments: NetworkInitializationArguments, accountManager: AccountManager, rootPath: String, auxiliaryMethods: AccountAuxiliaryMethods, encryptionParameters: ValueBoxEncryptionParameters) -> Signal<Void, NoError> {
|
||||
public func managedCleanupAccounts(networkArguments: NetworkInitializationArguments, accountManager: AccountManager<TelegramAccountManagerTypes>, rootPath: String, auxiliaryMethods: AccountAuxiliaryMethods, encryptionParameters: ValueBoxEncryptionParameters) -> Signal<Void, NoError> {
|
||||
let currentTemporarySessionId = accountManager.temporarySessionId
|
||||
return Signal { subscriber in
|
||||
let loggedOutAccounts = Atomic<[AccountRecordId: MetaDisposable]>(value: [:])
|
||||
@@ -355,12 +414,12 @@ public func managedCleanupAccounts(networkArguments: NetworkInitializationArgume
|
||||
}).start()
|
||||
let disposable = accountManager.accountRecords().start(next: { view in
|
||||
var disposeList: [(AccountRecordId, MetaDisposable)] = []
|
||||
var beginList: [(AccountRecordId, [AccountRecordAttribute], MetaDisposable)] = []
|
||||
var beginList: [(AccountRecordId, [TelegramAccountManagerTypes.Attribute], MetaDisposable)] = []
|
||||
let _ = loggedOutAccounts.modify { disposables in
|
||||
var validIds: [AccountRecordId: [AccountRecordAttribute]] = [:]
|
||||
var validIds: [AccountRecordId: [TelegramAccountManagerTypes.Attribute]] = [:]
|
||||
outer: for record in view.records {
|
||||
for attribute in record.attributes {
|
||||
if attribute is LoggedOutAccountAttribute {
|
||||
if case .loggedOut = attribute {
|
||||
validIds[record.id] = record.attributes
|
||||
continue outer
|
||||
}
|
||||
@@ -425,9 +484,9 @@ public func managedCleanupAccounts(networkArguments: NetworkInitializationArgume
|
||||
}
|
||||
}
|
||||
|
||||
private func cleanupAccount(networkArguments: NetworkInitializationArguments, accountManager: AccountManager, id: AccountRecordId, encryptionParameters: ValueBoxEncryptionParameters, attributes: [AccountRecordAttribute], rootPath: String, auxiliaryMethods: AccountAuxiliaryMethods) -> Signal<Void, NoError> {
|
||||
private func cleanupAccount(networkArguments: NetworkInitializationArguments, accountManager: AccountManager<TelegramAccountManagerTypes>, id: AccountRecordId, encryptionParameters: ValueBoxEncryptionParameters, attributes: [TelegramAccountManagerTypes.Attribute], rootPath: String, auxiliaryMethods: AccountAuxiliaryMethods) -> Signal<Void, NoError> {
|
||||
let beginWithTestingEnvironment = attributes.contains(where: { attribute in
|
||||
if let attribute = attribute as? AccountEnvironmentAttribute, case .test = attribute.environment {
|
||||
if case let .environment(accountEnvironment) = attribute, case .test = accountEnvironment.environment {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
|
||||
Reference in New Issue
Block a user