mastodon-app-ufficiale-ipho.../MastodonSDK/Sources/MastodonSDK/Entity/Mastodon+Entity+Account.swift

139 lines
3.8 KiB
Swift

//
// Mastodon+Entity+Account.swift
//
//
// Created by MainasuK Cirno on 2021/1/27.
//
import Foundation
import MastodonCommon
extension Mastodon.Entity {
/// Account
///
/// - Since: 0.1.0
/// - Version: 3.3.0
/// # Last Update
/// 2021/1/28
/// # Reference
/// [Document](https://docs.joinmastodon.org/entities/account/)
public final class Account: Codable, Sendable {
public typealias ID = String
// Base
public let id: ID
public let username: String
public let acct: String
public let url: String
// Display
public let displayName: String
public let note: String
public let avatar: String
public let avatarStatic: String?
public let header: String
public let headerStatic: String?
public let locked: Bool
public let emojis: [Emoji]?
public let discoverable: Bool?
// Statistical
public let createdAt: Date
public let lastStatusAt: Date?
public let statusesCount: Int
public let followersCount: Int
public let followingCount: Int
public let moved: Account?
public let fields: [Field]?
public let bot: Bool?
public let source: Source?
public let suspended: Bool?
public let muteExpiresAt: Date?
enum CodingKeys: String, CodingKey {
case id
case username
case acct
case url
case displayName = "display_name"
case note
case avatar
case avatarStatic = "avatar_static"
case header
case headerStatic = "header_static"
case locked
case emojis
case discoverable
case createdAt = "created_at"
case lastStatusAt = "last_status_at"
case statusesCount = "statuses_count"
case followersCount = "followers_count"
case followingCount = "following_count"
case moved
case fields
case bot
case source
case suspended
case muteExpiresAt = "mute_expires_at"
}
}
}
//MARK: - Hashable
extension Mastodon.Entity.Account: Hashable {
public func hash(into hasher: inout Hasher) {
// The URL seems to be the only thing that doesn't change across instances.
hasher.combine(url)
}
}
//MARK: - Equatable
extension Mastodon.Entity.Account: Equatable {
public static func == (lhs: Mastodon.Entity.Account, rhs: Mastodon.Entity.Account) -> Bool {
// The URL seems to be the only thing that doesn't change across instances.
return lhs.url == rhs.url
}
}
//MARK: - Convenience
extension Mastodon.Entity.Account {
public func acctWithDomainIfMissing(_ localDomain: String) -> String {
guard acct.contains("@") else {
return "\(acct)@\(localDomain)"
}
return acct
}
public var verifiedLink: Mastodon.Entity.Field? {
let firstVerified = fields?.first(where: { $0.verifiedAt != nil })
return firstVerified
}
public var domain: String? {
guard let components = URLComponents(string: url) else { return nil }
return components.host
}
public func avatarImageURL() -> URL? {
let string = UserDefaults.shared.preferredStaticAvatar ? avatarStatic ?? avatar : avatar
return URL(string: string)
}
public func avatarImageURLWithFallback(domain: String) -> URL {
return avatarImageURL() ?? URL(string: "https://\(domain)/avatars/original/missing.png")!
}
public var displayNameWithFallback: String {
return !displayName.isEmpty ? displayName : username
}
}