Page 1 of 1
AppleScript: Get the latest chat with multiple active chats?
Posted: Thu Aug 28, 2008 8:25 pm
by ultrus
When I receive a message in Adium, I can activate an applescipt = totally cool! When I'm away, I want to activate a script that tells people random jokes when they send me a message. If I have one chat or chat window, that's easy. If I have multiple chats going on at once, I start sending the wrong people replies.
Any thoughts on how I can target the last chat that I got a message from?
So far I can get info for every active chat this way:
Code: Select all
repeat with i in every chat
set userAccountService to title of service of account of i
set userAccountName to title of account of i
set chatAccountName to title of first contact of i
set chatDisplayName to display name of contact of i
set chatIndex to index of i
Thanks much in advance for the assist!
Re: AppleScript: Get the latest chat with multiple active chats?
Posted: Fri Aug 29, 2008 12:42 am
by mtimmsj
Here's how I handle this:
* I have a script that is triggered by a "Message Recieved (Initial)" event. So it will only run when someone sends me a message for the first time. This is configured in the "events" portion of Adium preferences.
* The script grabs all the dates opened values for all of the chats, saves them to a list and then sorts them saving the results to a different list. This puts the most recent date opened to the end of the sorted list.
* The script then finds the position of that date opened value in the original list. This position (just an index, i.e. a number) can be used to grab the chat you want.
Sample code (the simple_sort and list_position handlers came from Apple's Applescript website):
Code: Select all
on simple_sort(my_list)
set the index_list to {}
set the sorted_list to {}
repeat (the number of items in my_list) times
set the low_item to ""
repeat with i from 1 to (number of items in my_list)
if i is not in the index_list then
set this_item to item i of my_list
if the low_item is "" then
set the low_item to this_item
set the low_item_index to i
else if this_item is less than low_item then
set the low_item to this_item
set the low_item_index to i
end if
end if
end repeat
set the end of sorted_list to the low_item
set the end of the index_list to the low_item_index
end repeat
return the sorted_list
end simple_sort
on list_position(this_item, this_list)
repeat with i from 1 to the count of this_list
if (item i of this_list as string) is (this_item as string) then return i
end repeat
return 0
end list_position
try
tell application "Adium"
set theDates to the date opened of every chat
-- Now figure out which chat is the most recent
-- Sort the date to get the most recent one at the last place of the list
set theSortedDates to me's simple_sort(theDates)
-- Find the location in the original list the last item of the sorted list is at
set myItem to me's list_position((the last item of theSortedDates), theDates)
-- So no myItem is an index into the chats for the chat that is the one we want
set theChat to the chat myItem
-- And theChat now contains the most recent chat that was opened
end tell
on error
-- print debug message here
end try