Skip to content

Commit

Permalink
Improve AppleScript init error reporting
Browse files Browse the repository at this point in the history
  • Loading branch information
tagavari committed Oct 15, 2022
1 parent d9443a9 commit 014e3e3
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 24 deletions.
42 changes: 24 additions & 18 deletions AirMessage/AppleScript/AppleScriptBridge.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,16 @@ class AppleScriptBridge {
exit(EXIT_FAILURE)
}

guard let appleScript = NSAppleScript(contentsOf: url, error: nil) else {
let message = "Failed to initialize AppleScript: \(resourceName)"
LogManager.log(message, level: .error)
SentrySDK.capture(message: message)
var loadError: NSDictionary? = nil
guard let appleScript = NSAppleScript(contentsOf: url, error: &loadError) else {
try! {
//Throw unchecked AppleScript error
if let loadError = loadError {
throw AppleScriptError(error: loadError, fileURL: url)
} else {
throw AppleScriptInitializationError(fileURL: url)
}
}()
exit(EXIT_FAILURE)
}

Expand Down Expand Up @@ -88,7 +94,7 @@ class AppleScriptBridge {
scriptCommonPressCommandReturn.executeAndReturnError(&scriptError)
if let error = scriptError {
LogManager.log("Failed to press command-return: \(error)", level: .debug)
throw AppleScriptExecutionError(error: error)
throw AppleScriptError(error: error)
}
}

Expand Down Expand Up @@ -130,7 +136,7 @@ class AppleScriptBridge {
let result = AppleScriptBridge.runScript(scriptMessagesCreateChat, params: params, error: &executeError)
if let error = executeError {
LogManager.log("Failed to create chat with \(addresses): \(error)", level: .error)
throw AppleScriptExecutionError(error: error)
throw AppleScriptError(error: error)
} else {
return result.forKeyword(AEKeyword(keyAEKeyData))!.stringValue!
}
Expand All @@ -149,7 +155,7 @@ class AppleScriptBridge {
AppleScriptBridge.runScript(scriptMessagesSendMessageExisting, params: params, error: &executeError)
if let error = executeError {
LogManager.log("Failed to send message to chat \(chatID): \(error)", level: .error)
throw AppleScriptExecutionError(error: error)
throw AppleScriptError(error: error)
}
}

Expand All @@ -167,7 +173,7 @@ class AppleScriptBridge {
AppleScriptBridge.runScript(scriptMessagesSendMessageDirect, params: params, error: &executeError)
if let error = executeError {
LogManager.log("Failed to send direct message to \(address): \(error)", level: .error)
throw AppleScriptExecutionError(error: error)
throw AppleScriptError(error: error)
}
}

Expand All @@ -190,7 +196,7 @@ class AppleScriptBridge {
AppleScriptBridge.runScript(scriptMessagesSendMessageNew, params: params, error: &executeError)
if let error = executeError {
LogManager.log("Failed to send message to new chat \(addresses): \(error)", level: .error)
throw AppleScriptExecutionError(error: error)
throw AppleScriptError(error: error)
}
}

Expand Down Expand Up @@ -218,7 +224,7 @@ class AppleScriptBridge {
var executeError: NSDictionary? = nil
let result = scriptFaceTimeCreateNewLink.executeAndReturnError(&executeError)
if let error = executeError {
throw AppleScriptExecutionError(error: error)
throw AppleScriptError(error: error)
} else {
return result.stringValue!
}
Expand All @@ -229,7 +235,7 @@ class AppleScriptBridge {
var executeError: NSDictionary? = nil
let result = scriptFaceTimeGetActiveLink.executeAndReturnError(&executeError)
if let error = executeError {
throw AppleScriptExecutionError(error: error)
throw AppleScriptError(error: error)
} else {
return result.stringValue!
}
Expand All @@ -240,7 +246,7 @@ class AppleScriptBridge {
var executeError: NSDictionary? = nil
scriptFaceTimeLeaveCall.executeAndReturnError(&executeError)
if let error = executeError {
throw AppleScriptExecutionError(error: error)
throw AppleScriptError(error: error)
}
}

Expand All @@ -249,7 +255,7 @@ class AppleScriptBridge {
var executeError: NSDictionary? = nil
let result = scriptFaceTimeAcceptPendingUser.executeAndReturnError(&executeError)
if let error = executeError {
throw AppleScriptExecutionError(error: error)
throw AppleScriptError(error: error)
} else {
return result.booleanValue
}
Expand All @@ -270,7 +276,7 @@ class AppleScriptBridge {
var executeError: NSDictionary? = nil
AppleScriptBridge.runScript(scriptFaceTimeCenterWindow, params: params, error: &executeError)
if let error = executeError {
throw AppleScriptExecutionError(error: error)
throw AppleScriptError(error: error)
}

//Move the cursor to the middle of the screen
Expand All @@ -283,7 +289,7 @@ class AppleScriptBridge {
let result = scriptFaceTimeQueryIncomingCall.executeAndReturnError(&executeError)

if let error = executeError {
let appleScriptError = AppleScriptExecutionError(error: error)
let appleScriptError = AppleScriptError(error: error)
//Ignore error -1719 (invalid index) errors, as these can be caused by changing UI while the script is executing
if appleScriptError.code != -1719 {
throw appleScriptError
Expand All @@ -309,7 +315,7 @@ class AppleScriptBridge {
var executeError: NSDictionary? = nil
let result = AppleScriptBridge.runScript(scriptFaceTimeHandleIncomingCall, params: params, error: &executeError)
if let error = executeError {
throw AppleScriptExecutionError(error: error)
throw AppleScriptError(error: error)
} else {
return result.booleanValue
}
Expand All @@ -323,7 +329,7 @@ class AppleScriptBridge {
var executeError: NSDictionary? = nil
let result = AppleScriptBridge.runScript(scriptFaceTimeInitiateOutgoingCall, params: params, error: &executeError)
if let error = executeError {
throw AppleScriptExecutionError(error: error)
throw AppleScriptError(error: error)
} else {
return result.booleanValue
}
Expand All @@ -335,7 +341,7 @@ class AppleScriptBridge {
let result = scriptFaceTimeQueryOutgoingCall.executeAndReturnError(&executeError)

if let error = executeError {
throw AppleScriptExecutionError(error: error)
throw AppleScriptError(error: error)
} else {
return OutgoingCallStatus(rawValue: result.stringValue!)!
}
Expand Down
4 changes: 2 additions & 2 deletions AirMessage/Connection/ConnectionManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -943,7 +943,7 @@ class ConnectionManager {
do {
chatID = try MessageManager.createChat(withAddresses: chatMembers, service: chatService)
} catch {
if let error = error as? AppleScriptExecutionError {
if let error = error as? AppleScriptError {
let nstCode: NSTCreateChat
switch error.code {
case AppleScriptCodes.errorUnauthorized:
Expand Down Expand Up @@ -972,7 +972,7 @@ class ConnectionManager {
do {
try action()
} catch {
if let error = error as? AppleScriptExecutionError {
if let error = error as? AppleScriptError {
let nstCode: NSTSendResult
switch error.code {
case AppleScriptCodes.errorUnauthorized:
Expand Down
2 changes: 1 addition & 1 deletion AirMessage/Helper/FaceTimeHelper.swift
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ class FaceTimeHelper {
LogManager.log("Failed to query incoming FaceTime call: \(error)", level: .error)

//Ignore -25211 (permission not granted)
if let error = error as? AppleScriptExecutionError, error.code != -25211 {
if let error = error as? AppleScriptError, error.code != -25211 {
SentrySDK.capture(error: error)
}
return
Expand Down
24 changes: 21 additions & 3 deletions AirMessage/MessageInterop/MessageError.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@ import Foundation
/**
An error that represents an AppleScript execution error
*/
struct AppleScriptExecutionError: Error, LocalizedError, CustomNSError {
struct AppleScriptError: Error, LocalizedError, CustomNSError {
let errorDict: [String: Any]
init(error: NSDictionary) {
let fileURL: URL?
init(error: NSDictionary, fileURL: URL? = nil) {
errorDict = error as! [String: Any]
self.fileURL = fileURL
}

var code: Int {
Expand All @@ -26,7 +28,11 @@ struct AppleScriptExecutionError: Error, LocalizedError, CustomNSError {
//LocalizedError

var errorDescription: String? {
"AppleScript error \(code): \(message)"
if let fileURL = fileURL {
return "AppleScript error \(code) for file \(fileURL): \(message)"
} else {
return "AppleScript error \(code): \(message)"
}
}

//CustomNSError
Expand All @@ -36,6 +42,18 @@ struct AppleScriptExecutionError: Error, LocalizedError, CustomNSError {
var errorUserInfo: [String: Any] { errorDict }
}

///An error that represents a failure to load an AppleScript file
struct AppleScriptInitializationError: Error, LocalizedError {
let fileURL: URL
init(fileURL: URL) {
self.fileURL = fileURL
}

public var errorDescription: String? {
"Failed to load AppleScript file \(fileURL)"
}
}

/**
An error that represents when functionality isn't available on a newer version of macOS
*/
Expand Down

0 comments on commit 014e3e3

Please sign in to comment.