diff options
| author | Dustin Mierau <dustin@mierau.me> | 2023-12-22 17:37:13 -0800 |
|---|---|---|
| committer | Dustin Mierau <dustin@mierau.me> | 2023-12-22 17:37:13 -0800 |
| commit | 4ddc0699afedae39fa27e134bec05330426f2120 (patch) | |
| tree | ce0936e7c537ef527c6472b746b8ef16e471c912 /Hotline/Models | |
| parent | 3d26737cccd57fcbb5289874363f030ecef77573 (diff) | |
Some work to get banner images working. Some plumbing to get file transfers working though they don't yet. Moving some code away from async/await.
Diffstat (limited to 'Hotline/Models')
| -rw-r--r-- | Hotline/Models/Hotline.swift | 114 | ||||
| -rw-r--r-- | Hotline/Models/Server.swift | 2 |
2 files changed, 99 insertions, 17 deletions
diff --git a/Hotline/Models/Hotline.swift b/Hotline/Models/Hotline.swift index f9ae41d..fa0128c 100644 --- a/Hotline/Models/Hotline.swift +++ b/Hotline/Models/Hotline.swift @@ -25,6 +25,7 @@ import SwiftUI var username: String = "bolt" var iconID: UInt = 128 var access: HotlineUserAccessOptions? + var agreed: Bool = false var users: [User] = [] var chat: [ChatMessage] = [] @@ -35,6 +36,16 @@ import SwiftUI var news: [NewsInfo] = [] var newsLoaded: Bool = false + var downloads: [HotlineFileClient] = [] + + @ObservationIgnored var bannerClient: HotlineFileClient? + #if os(macOS) + var bannerImage: NSImage? = nil + #elseif os(iOS) + var bannerImage: UIImage? = nil + #endif + + // MARK: - init(trackerClient: HotlineTrackerClient, client: HotlineClient) { @@ -63,25 +74,44 @@ import SwiftUI self.trackerClient.disconnect() } - @MainActor func login(server: Server, login: String, password: String, username: String, iconID: UInt) async -> Bool { + @MainActor func login(server: Server, login: String, password: String, username: String, iconID: UInt, callback: ((Bool) -> Void)? = nil) { self.server = server self.serverName = server.name self.username = username self.iconID = iconID - return await withCheckedContinuation { [weak self] continuation in - let _ = self?.client.login(server.address, port: UInt16(server.port), login: login, password: password, username: username, iconID: UInt16(iconID)) { [weak self] err, serverName, serverVersion in - self?.serverVersion = serverVersion - if serverName != nil { - self?.serverName = serverName - } - continuation.resume(returning: (err != nil)) + self.client.login(server.address, port: UInt16(server.port), login: login, password: password, username: username, iconID: UInt16(iconID)) { [weak self] err, serverName, serverVersion in + self?.serverVersion = serverVersion + if serverName != nil { + self?.serverName = serverName } + + callback?(err == nil) + } + } + + @MainActor func sendUserInfo(username: String, iconID: UInt, options: HotlineUserOptions = [], autoresponse: String? = nil, callback: ((Bool) -> Void)? = nil) { + self.username = username + self.iconID = iconID + + self.client.sendSetClientUserInfo(username: username, iconID: UInt16(iconID), options: options, autoresponse: autoresponse) { success in + callback?(success) + } + } + + @MainActor func getUserList(callback: ((Bool) -> Void)? = nil) { + self.client.sendGetUserList() { success in + callback?(success) } } @MainActor func disconnect() { self.client.disconnect() + self.bannerClient?.disconnect() + } + + @MainActor func sendAgree() { + self.client.sendAgree(username: self.username, iconID: UInt16(self.iconID), options: .none) } @MainActor func sendChat(_ text: String) { @@ -288,15 +318,59 @@ import SwiftUI }) } } - -// @MainActor func updateUsers() async -> [User] { -// let userList = await self.client.sendGetUserList() -// var users = [] -//// self.client.sendChat(message: text) -// -// return users -// } + func downloadFile(path: [String], callback: ((Bool) -> Void)?) { + + } + + @MainActor func downloadBanner(force: Bool = false, callback: ((Bool) -> Void)?) { + if let b = self.bannerClient { + b.disconnect() + self.bannerClient = nil + } + + if force { + self.bannerImage = nil + } + + if self.bannerImage != nil { + callback?(true) + return + } + + self.client.sendDownloadBanner(sent: { success in + if !success { + print("FAIL BANNER") + callback?(false) + return + } + }, reply: { [weak self] downloadReferenceNumber, downloadTransferSize in + if + let self = self, + let address = self.server?.address, + let port = self.server?.port, + let referenceNumber = downloadReferenceNumber, + let transferSize = downloadTransferSize { + self.bannerClient = HotlineFileClient(address: address, port: UInt16(port), reference: referenceNumber, size: UInt32(transferSize), type: .banner) + self.bannerClient?.downloadToMemory({ [weak self] data in + if let b = self?.bannerClient { + b.disconnect() + self?.bannerClient = nil + } + + if data != nil { + #if os(macOS) + self?.bannerImage = NSImage(data: data!) + #elseif os(iOS) + self?.bannerImage = UIImage(data: data!) + #endif + } + + callback?(data != nil) + }) + } + }) + } // MARK: - Hotline Delegate @@ -307,6 +381,7 @@ import SwiftUI self.serverVersion = nil self.serverName = nil self.access = nil + self.users = [] self.chat = [] self.messageBoard = [] @@ -315,6 +390,13 @@ import SwiftUI self.filesLoaded = false self.news = [] self.newsLoaded = false + + self.bannerImage = nil + + if let b = self.bannerClient { + b.disconnect() + self.bannerClient = nil + } } self.status = status diff --git a/Hotline/Models/Server.swift b/Hotline/Models/Server.swift index 3d0569f..b39f1c4 100644 --- a/Hotline/Models/Server.swift +++ b/Hotline/Models/Server.swift @@ -1,6 +1,6 @@ import SwiftUI -@Observable final class Server: Identifiable, Equatable, Hashable, Codable { +struct Server: Identifiable, Equatable, Hashable, Codable { static let defaultPort: Int = 5500 let id: UUID |