I have at long last gotten off my lazy tuchis and updated iCAR to be compatible with Tiger and iChat 3.0. I would like to take this opportunity to apologize publicly to the world as a whole for taking as long as I did. Please do not eat my brains.
Of most pressing note, of course, is that iCAR has suddenly become much less useful. iChat 3.0 now incorporates rudimentary auto-reply functionality. In some respects, you might say that iCAR has gone the way of the Watson, but in truth, this story is not nearly as dramatic as Watson’s or Konfabulator’s. There is, namely, zero lost revenue here. I have decided, however quixotically, that I will continue to maintain and add features to iCAR despite its semi-uselessness because it can do some pretty neat stuff and also out of pride.
Changes
Essentially, release 0.8 of iCAR really only does one thing: it is the Tiger version of iCAR. Under the hood, however, some positively riveting things happened to the code:
- The preference pane was widened to match iChat 3’s panes.
- iChat.h was updated to match iChat 3 and the new InstantMessage.framework.
-
I refactored message-capturing to match iChat 3’s new structure.
- Instead of IMService, I now interface with the new Service class.
- Chats are no longer automatically accepted because they don’t have to be (see “Observations”, below).
- I removed unnecessary mechanism for delaying past chat acceptance (again, see “Observations”).
- Another unneccesary mechanism, this one for accessing status, was removed (the curious, repetitive, and truly nerdy would benefit from another glance below at “Observations”).
Observations
- iChat 3 removes a long-standing annoyance. Previous versions could not send messages if chats were not yet accepted (or, even more infuriatingly, if they were in the process of animating their acceptance). This means that replies are now sent faster, iCAR’s code is much less complex and much prettier, and the software will probably break for fewer people.
- All of the IMService code I patched was apparently moved into the Service class (even the method signatures I hijack are identical). IMService still exists, but it seems to be greatly simplified, presumably because InstantMessage.framework is now a public framework. It provides a nominal interface for interacting with the status values and messages of iChat (really, iChatAgent.app, the protocol daemon). I initially had trouble patching Service using
poseAsClass:, so I eventually elected to use the method swizzling technique well-documented by Mike Solomon of PithHelmet (Greasemonkey for Safari, sort of) fame. - I don’t know if this appeared in IMService at any point in the past, but Service has the class methods
+myStatusand+myStatusMessagefor obtaining global settings about status. Previously, I was hacking a method into the buddy list window controller to get the status. With iCAR 0.8, I had the satisfaction of deleting that pair of files.
Questions
Because iChat 3.0 incorporates basic auto-reply functionality, a iCAR is having a bit of an identity crisis. I’m fairly certain it should stick around, but I am wondering a bit about its role.
- Should it still be called the iChat Auto-Reply? It’s definitely no longer the…
- I should probably stop calling it a “simple” auto-reply feature. (Apologies; that was actually not a question.)
- Should the preference pane and “Enable…” check box continue to use the name “auto-reply”? Now that there are two auto-reply functions in iChat (with iCAR installed), perhaps the term is too generic.
The future
It seems that I will never be short of new features to implement into the next next version of iCAR.
- Demand has increased recently for iCAR to play nicer with the style settings in iChat. That will be Real Soon Now.
- Also sorely lacking is the passage of variables to AppleScripts (variables are currently only passed to shell scripts using environment variables). This needs to happen right-quick.
- Does iChat’s built-in auto-reply functionality set the “this is an auto-reply” flag when it sends its message to the AIM server? If so, can I hijack that in the name of nearly-worthless iCAR progress?



