// // MastodonController.swift // Tusker // // Created by Shadowfacts on 8/15/18. // Copyright © 2018 Shadowfacts. All rights reserved. // import Foundation import MastodonKit class MastodonController { static let shared = MastodonController() var userDefaults = UserDefaults() var client: Client! lazy var clientID: String? = self.userDefaults.string(forKey: "clientID") lazy var clientSecret: String? = self.userDefaults.string(forKey: "clientSecret") lazy var accessToken: String? = self.userDefaults.string(forKey: "accessToken") private init() { } func connect() { let url = ProcessInfo.processInfo.environment["mastodon_url"]! if let accessToken = accessToken { client = Client(baseURL: url, accessToken: accessToken) } else { client = Client(baseURL: url) login() } client.run(Accounts.currentUser()) { result in guard case let .success(account, _) = result else { fatalError() } print(account.acct) } } private func register(completion: @escaping () -> Void) { if clientID != nil, clientSecret != nil { completion() } else { let registerRequest = Clients.register(clientName: "Tusker", scopes: [.read, .write, .follow]) client.run(registerRequest) { result in guard case let .success(application, _) = result else { fatalError() } self.clientID = application.clientID self.clientSecret = application.clientSecret self.userDefaults.set(self.clientID, forKey: "clientID") self.userDefaults.set(self.clientSecret, forKey: "clientSecret") completion() } } } private func login() { // TODO: OAuth let username = ProcessInfo.processInfo.environment["mastodon_username"]! let password = ProcessInfo.processInfo.environment["mastodon_password"]! register() { let loginReq = Login.silent(clientID: self.clientID!, clientSecret: self.clientSecret!, scopes: [.read, .write, .follow], username: username, password: password) self.client.run(loginReq) { result in guard case let .success(loginSettings, _) = result else { fatalError() } self.accessToken = loginSettings.accessToken self.userDefaults.set(self.accessToken, forKey: "accessToken") } } } }