Chuck
Chuck

Reputation: 4902

Duplicate Firing of `active chat message received` handler

While Manu G E asked a similar question twice, neither got an adequate answer, and I'm hoping I'll have better luck.

I'm writing an AppleScript to execute a handler when Messages.app receives a message. The script is being saved to ~/Library/Application\ Scripts/com.apple.iChat and is set in the Messages preferences to be the AppleScript handler.

When Messages is the frontmost application and a message is received, the active chat message received handler is fired twice. This doesn't seem to be a problem when Messages is in the background (received messages then fire message received, and that handler only once). I know which handler is fired because the portion that deals with the handlers looks like this:

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

I set a DEBUG property to true and can see which handler gets fired.

I've tried working around this by writing a temporary file (using the UUID of the _sender). The message_received handler checks for the existence of the file and is supposed to do nothing if it's present. But this hasn't worked, even with random delays. I tried extending the length of the random delays, but this brings up errors about the AppleScript running for more than 10 seconds, even when enclosing the code within a with timeout of block.

Regardless of Apple's apparent support for executing AppleScripts in response to Messages events, perhaps I should look at some other mechanism to support this request from the client. I'm open to ideas.

Upvotes: 1

Views: 185

Answers (1)

Max
Max

Reputation: 999

Somehow I managed to find a simple but (very) dirty hack that seems to work for me, but I can't say if it will work on any machine. So "active chat message received" seems to be called twice at the same time, but I noticed something like do shell script "php -r 'echo microtime() >> file.txt'" sometimes reveals slightly different values. I also use a property as a flag and try to take advantage of that shell execution tiny interval by writing to a file:

echo 0 > ~/Documents/flag.txt

then:

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

And voilà. Again I cannot say if that solution works everytime, and explaining why it actually works in my case is way beyond my capabilities right now. Still, I hope it will be useful. Cheers

Upvotes: 1

Related Questions