重复触发“收到的活动聊天消息”处理程序

时间:2016-01-14 22:18:05

标签: macos applescript

虽然Manu G E两次问similar question,但没有得到足够的答案,我希望我能有更好的运气。

我正在写一个AppleScript来在Messages.app收到消息时执行处理程序。该脚本将保存到~/Library/Application\ Scripts/com.apple.iChat,并在“消息”首选项中设置为AppleScript处理程序。

当Messages是最前面的应用程序并收到消息时,active chat message received处理程序将被触发两次。当消息在后台时(接收消息然后触发message received,并且该处理程序只有一次),这似乎不是问题。我知道触发了哪个处理程序,因为处理处理程序的部分如下所示:

using terms from application "Messages"

    on message received _msg from _sender for _chat with _text_desc
        if DEBUG then display dialog "message received"
        message_received(_sender)
    end message received

    on chat room message received _msg from _sender for _chat with _text_desc
        if DEBUG then display dialog "chat room message received"
        message_received(_sender)
    end chat room message received

    on active chat message received _msg from _sender for _chat with _text_desc
        if DEBUG then display dialog "active chat message received"
        message_received(_sender)
    end active chat message received

    -- More handlers below, mostly like the above or empty

end using terms from

我将DEBUG属性设置为true,可以查看哪个处理程序被触发。

我尝试过写一个临时文件(使用_sender的UUID)来解决这个问题。 message_received处理程序检查文件是否存在,如果存在则不应该执行任何操作。但即使随机延迟,这也没有奏效。我尝试延长随机延迟的长度,但这会导致AppleScript运行超过10秒的错误,即使将代码封装在with timeout of块中也是如此。

尽管Apple明显支持执行AppleScripts以响应Messages事件,但也许我应该考虑一些其他机制来支持来自客户端的请求。我对这些想法持开放态度。

1 个答案:

答案 0 :(得分:1)

不知何故,我设法找到了一个简单但非常(非常)脏的黑客,似乎对我有用,但我不能说它是否可以在任何机器上运行。因此,“收到的主动聊天消息”似乎同时被调用了两次,但我注意到do shell script "php -r 'echo microtime() >> file.txt'"之类的内容有时会显示略有不同的值。 我还使用属性作为标志,并尝试通过写入文件来利用shell执行的小间隔:

echo 0 > ~/Documents/flag.txt

然后:

property flag : 0
using terms from application "Messages"
    #...
    on active chat message received theMessage from theBuddy

        set response to false
        set the_script to "cat ~/Documents/flag.txt"
        set flag to do shell script the_script
        do shell script "echo 1 > ~/Documents/flag.txt" 
        if flag is "0" then
            set response to true
        else
            do shell script "echo 0 > ~/Documents/flag.txt"
        end if

        if response then
            #this should be executed only once
        end if    

    end active chat message received
    #...
end using terms from

瞧瞧。我再也不能说这个解决方案是否每次都有效,并解释为什么它在我的情况下实际工作现在超出了我的能力范围。不过,我希望它会有用。干杯