So there you are doing your work and of course being the geeks that we all are you have about three hundred windows open, give or take a few hundred. Then the iChat icon starts bouncing…
Now you might be very organized and have the iChat window in a certain spot on the screen or even on a certain space in Spaces. You might be a whiz with Exposé and immediately find the right iChat window in the myriad of windows that are open. Or you might have one or two 27″ displays and not really care about this.
But for the rest us, wouldn’t it be nice if say a small window floated into the screen with a notification and the person who sent the message and maybe even the message? And it would have to be unobtrusive and float away just as quickly. You could glance at the notification and decide there and then wether it is necessary to dig out that iChat window.
Incidentally, this is what Growl really does well.
This window will float serenely in front of everything for a few seconds.
And with the scripting interface in iChat it is fairly simple to set up. After installing Growl, take this script:
property growlAppName : "Growl iChat"
property notificationNames : {"Buddy Became Available", ¬
"Buddy Became Unavailable", ¬
"Message Received", ¬
"Completed File Transfer"}
property defaultNotificationNames : {"Buddy Became Available", ¬
"Buddy Became Unavailable", ¬
"Message Received", ¬
"Completed File Transfer"}
using terms from application "iChat"
on buddy became available theBuddy
my registerWithGrowl()
tell application "iChat"
tell theBuddy
set theTitle to full name & " became available"
set theDesc to status message
set theIcon to image
end tell
end tell
my notify(theTitle, theDesc, theIcon, "Buddy Became Available")
end buddy became available
on buddy became unavailable theBuddy
my registerWithGrowl()
tell application "iChat"
tell theBuddy
set theTitle to full name & " went away"
set theDesc to status message
set theIcon to image
end tell
end tell
my notify(theTitle, theDesc, theIcon, "Buddy Became Unavailable")
end buddy became unavailable
on message received theText from theBuddy for theTextChat
my registerWithGrowl()
tell application "iChat"
set theIcon to image of theBuddy
set theTitle to full name of theBuddy
end tell
my notify(theTitle, theText, theIcon, "Message Received")
end message received
on completed file transfer theTransfer
my registerWithGrowl()
tell application "iChat"
tell theTransfer
if transfer status is finished then
if direction is incoming then
set theTitle to "Received File "
set theDesc to "from "
else
set theTitle to "Sent File "
set theDesc to "to "
end if
set theTitle to theTitle & (file as string)
set theDesc to theDesc & full name of buddy
end if
end tell
end tell
my notify(theTitle, theDesc, theIcon, "Message Received")
end completed file transfer
end using terms from
on registerWithGrowl()
tell application "GrowlHelperApp"
register as application growlAppName all notifications notificationNames default notifications notificationNames icon of application "iChat"
end tell
end registerWithGrowl
on notify(theTitle, desc, icondata, notificationName)
tell application "GrowlHelperApp"
if icondata is "" or icondata is missing value then
notify with name notificationName title theTitle description desc application name growlAppName icon of application "iChat"
else
notify with name notificationName title theTitle description desc application name growlAppName image icondata
end if
end tell
end notify
Copy the code into AppleScript Editor and save the file as “Growl iChat” (as a script file) in ~/Library/Scripts/iChat/
In iChat, go to Preferences -> Alerts and select the Event “Message Received”, check “Run Applescript” and choose “Growl iChat.scpt”
I also setup the script to react to “Buddy Becomes Available,” “Buddy Becomes Unavailable” and “File Transfer Completed.” The great thing is that you don’t have to enable all notifications. You can even set it up individually so that you get notifications for some buddies, but not others. It should be easy to adapt the script to more actions if you wanted to.