@@ -51,14 +51,12 @@ public struct MessageSender {
5151
5252 public func send( _ options: MessageSendOptions ) throws {
5353 var resolved = options
54- let chatTarget = resolved. chatIdentifier . isEmpty ? resolved . chatGUID : resolved . chatIdentifier
54+ let chatTarget = resolveChatTarget ( & resolved)
5555 let useChat = !chatTarget. isEmpty
5656 if useChat == false {
5757 if resolved. region. isEmpty { resolved. region = " US " }
5858 resolved. recipient = normalizer. normalize ( resolved. recipient, region: resolved. region)
5959 if resolved. service == . auto { resolved. service = . imessage }
60- } else if chatTarget. isEmpty {
61- throw IMsgError . invalidChatTarget ( " Missing chat identifier or guid " )
6260 }
6361
6462 try sendViaAppleScript ( resolved, chatTarget: chatTarget, useChat: useChat)
@@ -124,6 +122,36 @@ public struct MessageSender {
124122 """
125123 }
126124
125+ private func resolveChatTarget( _ options: inout MessageSendOptions ) -> String {
126+ let guid = options. chatGUID. trimmingCharacters ( in: . whitespacesAndNewlines)
127+ if !guid. isEmpty {
128+ return guid
129+ }
130+ let identifier = options. chatIdentifier. trimmingCharacters ( in: . whitespacesAndNewlines)
131+ if identifier. isEmpty {
132+ return " "
133+ }
134+ if looksLikeHandle ( identifier) {
135+ if options. recipient. isEmpty {
136+ options. recipient = identifier
137+ }
138+ return " "
139+ }
140+ return identifier
141+ }
142+
143+ private func looksLikeHandle( _ value: String ) -> Bool {
144+ let trimmed = value. trimmingCharacters ( in: . whitespacesAndNewlines)
145+ if trimmed. isEmpty { return false }
146+ let lower = trimmed. lowercased ( )
147+ if lower. hasPrefix ( " imessage: " ) || lower. hasPrefix ( " sms: " ) || lower. hasPrefix ( " auto: " ) {
148+ return true
149+ }
150+ if trimmed. contains ( " @ " ) { return true }
151+ let allowed = CharacterSet ( charactersIn: " +0123456789 ()- " )
152+ return trimmed. rangeOfCharacter ( from: allowed. inverted) == nil
153+ }
154+
127155 private static func runAppleScript( source: String , arguments: [ String ] ) throws {
128156 guard let script = NSAppleScript ( source: source) else {
129157 throw IMsgError . appleScriptFailure ( " Unable to compile AppleScript " )
0 commit comments