aboutsummaryrefslogtreecommitdiff
path: root/Hotline/State
diff options
context:
space:
mode:
authorDustin Mierau <dustin@mierau.me>2025-11-14 09:56:46 -0800
committerDustin Mierau <dustin@mierau.me>2025-11-14 09:56:46 -0800
commitda1d7001f5132115bfdbe19cd95e73b04ba76c95 (patch)
treeba9b446db9a15e4b32d9101be518bdf65ac105a2 /Hotline/State
parent46384d99b78cca150aa720eb915d161b5be8c08d (diff)
Add kick and improve client info display. Also improve error messages when can't connect (server down) or can't login (show server message).
Diffstat (limited to 'Hotline/State')
-rw-r--r--Hotline/State/HotlineState.swift49
1 files changed, 43 insertions, 6 deletions
diff --git a/Hotline/State/HotlineState.swift b/Hotline/State/HotlineState.swift
index e78a780..7baa477 100644
--- a/Hotline/State/HotlineState.swift
+++ b/Hotline/State/HotlineState.swift
@@ -174,7 +174,7 @@ class HotlineState: Equatable {
self.updateServerTitle()
}
}
- var serverTitle: String = "Server"
+ var serverTitle: String = ""
var username: String = "guest"
var iconID: Int = 414
var access: HotlineUserAccessOptions?
@@ -361,18 +361,41 @@ class HotlineState: Equatable {
self.downloadBanner()
}
- } catch {
+ }
+ catch let clientError as HotlineClientError {
+ switch clientError {
+ case .connectionFailed(_):
+ self.displayError(clientError, message: "This server appears to be offline.")
+ case .loginFailed(let msg):
+ self.displayError(clientError, message: msg)
+ case .serverError(_, let msg):
+ self.displayError(clientError, message: msg)
+ default:
+ self.displayError(clientError)
+ }
+ if let client = self.client {
+ await client.disconnect()
+ self.client = nil
+ }
+ self.status = .disconnected
+ throw clientError
+ }
+ catch {
print("HotlineState.login(): Login failed with error: \(error)")
if let client = self.client {
await client.disconnect()
self.client = nil
}
- self.status = .disconnected // .failed(error.localizedDescription)
- self.errorDisplayed = true
- self.errorMessage = error.localizedDescription
+ self.status = .disconnected
+ self.displayError(error)
throw error
}
}
+
+ private func displayError(_ error: Error, message: String? = nil) {
+ self.errorDisplayed = true
+ self.errorMessage = message ?? error.localizedDescription
+ }
/// Disconnect from the server (user-initiated)
@MainActor
@@ -813,6 +836,20 @@ class HotlineState: Equatable {
return nil
}
+
+ func disconnectUser(id userID: UInt16, options: HotlineUserDisconnectOptions?) async throws {
+ guard let client = self.client else {
+ throw HotlineClientError.notConnected
+ }
+
+ do {
+ try await client.disconnectUser(userID: userID, options: options)
+ }
+ catch let error as HotlineClientError {
+ self.errorMessage = error.userMessage
+ self.errorDisplayed = true
+ }
+ }
// MARK: - Files
@@ -1948,7 +1985,7 @@ class HotlineState: Equatable {
// MARK: - Utilities
func updateServerTitle() {
- self.serverTitle = self.serverName ?? self.server?.name ?? self.server?.address ?? "Server"
+ self.serverTitle = self.serverName ?? self.server?.name ?? self.server?.address ?? "Hotline"
}
// News helpers