84 lines
3.4 KiB
Swift
84 lines
3.4 KiB
Swift
//
|
|
// AccountServiceContacts.swift
|
|
// PayCash
|
|
//
|
|
// Created by Igor on 04.02.2021.
|
|
// Copyright © 2021 AM. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
extension Account.Service {
|
|
class Contacts: CommonMenuAutocompleteService {
|
|
|
|
private lazy var exclude: [String] = {
|
|
var exclude = [
|
|
"eosio.ram",
|
|
"eosio.ramfee",
|
|
"eosio.stake"
|
|
]
|
|
Network.servers.collection.forEach { exclude.append(contentsOf: $0.contracts.values) }
|
|
return exclude
|
|
}()
|
|
|
|
private var contactsList = [String: Int]()
|
|
private var tempCollection = [String: Int]()
|
|
var collection: [Common.Model.Menu] {
|
|
tempCollection.map({ Account.Model.Contact(account: $0.key, rating: $0.value) })
|
|
.sorted(by: { $0.rating > $1.rating })
|
|
.map({ $0.toMenu() })
|
|
}
|
|
var didUpdate: (() -> Void)?
|
|
private var filter: String?
|
|
|
|
func apply(filter: String?) {
|
|
self.filter = filter
|
|
reload(filter: filter)
|
|
if let filter = filter?.lowercased(), !filter.isEmpty {
|
|
Network.accounts.exists(account: filter) { (exists) in
|
|
if exists, self.filter == filter {
|
|
self.tempCollection[filter.lowercased(), default: 0] += 100000
|
|
}
|
|
self.didUpdate?()
|
|
}
|
|
} else {
|
|
didUpdate?()
|
|
}
|
|
}
|
|
|
|
private func preloadContactsList() {
|
|
guard contactsList.isEmpty else { return }
|
|
guard let receiver = Accounts().current?.username else { return }
|
|
Account.Service.History.shared.current?.actions
|
|
.filter("receiver = '\(receiver)'")
|
|
.filter("name = 'transfer' OR name = 'notify' OR name = 'retire'")
|
|
.forEach { (action) in
|
|
guard let from = action.dataAsDictionary["from"] ?? action.dataAsDictionary["owner"] else { return }
|
|
let to = action.dataAsDictionary["to"] ?? action.account
|
|
let account = from == Accounts().current?.username ? to : from
|
|
guard !exclude.contains(account) && !account.isEmpty else { return }
|
|
self.contactsList[account.lowercased(), default: 0] += 1
|
|
}
|
|
Account.Service.History.shared.current?.actions
|
|
.filter("receiver = '\(receiver)'")
|
|
.filter("account = '\(Network.servers.current.contract(.chat))'")
|
|
.filter("name = '\(Network.Model.Blockchain.Action.chatSendDm.rawValue)'")
|
|
.forEach { (action) in
|
|
guard let data = action.data(as: CryptoChat.Model.Msg.self) else { return }
|
|
let account = data.from == Accounts().current?.username ? data.to : data.from
|
|
guard !exclude.contains(account) && !account.isEmpty else { return }
|
|
self.contactsList[account, default: 0] += 1
|
|
}
|
|
}
|
|
|
|
private func reload(filter: String? = nil) {
|
|
preloadContactsList()
|
|
tempCollection = contactsList
|
|
if let filter = filter?.lowercased(), !filter.isEmpty {
|
|
tempCollection = tempCollection.filter({ $0.key.contains(filter) })
|
|
}
|
|
// collection.sort(by: { $0.rating > $1.rating })
|
|
}
|
|
}
|
|
}
|