Using the Send Calendar Feature in RX-Plugin

April 28th, 2008

Thanks for all the feedback on this new feature. The /cal (send calendar) command accepts optional numeric parameters for month [1-12] and year. To send a calendar for another month of the current year, just add the month’s number after “/cal ”. Here are some examples:

/cal 7

Sends the July calendar of the current year.

/cal 7 2009

Sends the July 2009 calendar. You must specify the month if you want to specify the year.

Can you say Hotkeys?

April 23rd, 2008

For the second post of the night, I am announcing the release of an update to Gus Verdun’s IM Tweaks. This version adds a new feature called Hotkeys which lets you define keyboard shortcuts to the IM and Buddy List windows that you can use within any other application.

Just press the hotkey for the IM windows (defaults to WIN+CTRL+SHIFT+UP ARROW) to set focus to the last IM window. Press it again, and it will close all IM windows. You can also press the hotkey for the Buddy List window (WIN+CTRL+SHIFT+DOWN ARROW) to switch focus to that window.

See the IM Tweaks page for more details.

Enjoy.

“Talk Dates” with your Buddies using the latest RX-Plugin (1.0.11)

April 23rd, 2008

I just released an update of Gus Verdun’s RX-Plugin. This version fixes a number of bugs and also adds a new feature that lets you send a calendar:

/cal command

Give it a try.

Enjoy.

Open AIM Signon Problem

March 11th, 2008

As noted here, you need to make sure your system clock is fairly accurate when using the Open AIM SDK 1.6.7 in a client. This will be fixed in the next release.

Incidentally, the APIs we use for signon are clientLogin and startOSCARSession which are documented in the OSCAR protocol specifications.

AIM SDK 1.6.7 Q&A Volume I

March 10th, 2008

A number of you are trying out the recently released AIM SDK 1.6.7. I thought it would be a good idea to answer some of the early questions. So here they are in my usual Q&A style…

Q: What SDK files do I need to run an Open AIM client or bot?
A: You need to copy some of the DLL files from the dist\release folder into your application’s folder. You can omit the jg*.dll files if you don’t need to support talk (aka voice) sessions with legacy AIM clients like AOL 9.x and AIM 5.9. You can also omit the sipxtapi.dll if you don’t need to support the newer SIP based Audio/Video sessions in AIM 6.x. You only need the accjwrap.dll and the accjwrap.jar files if your bot or client is written in Java. All other DLLs are required.

Q: What are all these new DLLs for?
A: We added support for SSL based encryption to Open AIM clients, which is based on NSS and NSPR from Mozilla. We also updated the audio/video stacks for full multimedia support in Open AIM.

Q: How do I enable SSL based encryption in my bot or client?
A: You can enable this via the boolean preference named “aimcc.connect.secure”. The default is false.

Q: What does SSL based encryption protect?
A: This encrypts all regular IM traffic between the client and the AIM host. It will not encrypt direct IMs, picture sharing sessions, A/V sessions, file transfers, buddy art retrievals and uploads, or alerts. Note: for end to end security your buddy also needs to be running a client that uses SSL encryption, like AIM 6.5.9.1.

If I did not answer your question, feel free to ask in a comment or post it in one of the forums.

Open AIM 2.0

March 6th, 2008

Open AIMWith AOL’s recent announcement on Open AIM 2.0 now live and getting lots of great attention, I thought I should write a quick post on it. This is truly exciting news. We are dramatically expanding our community when we open things up like this. So with that, I want to say “Welcome” to all the great developers out there. Here is this incredible AIM network that you can now use and build on.

I have actually been a part of the AIM core team for a number of months now, so I am available to help answer questions on Open AIM. I can now claim to have written code in imapp.dll, acccore.dll, coolcoreXX.dll, and xprtX.dll. Lastly, this guy sits next to me.

There are more great things to come.

Share and discuss your RX-Plugin Rules and more

December 30th, 2007

A fellow “RXer” has been kind enough to create a forum for the sharing and discussion of RX-Plugin rules. You can access it here.

There is also another forum for the discussion of my IM Tweaks plugin which can be accessed here.

So far there is not much information but that should change soon. I will do my best to add to the discussions from time to time.

Open AIM: Modeless Window Support for Plugins

December 30th, 2007

Have you ever wondered why tab and other navigation keys don’t work in some of the modeless dialog windows created by plugins? The reason for this is because Windows requires applications to call IsDialogMessage() for the currently active modeless window in order to translate the keyboard messages into dialog navigation commands.

This is relatively easy to implement in a standalone application since the code is all compiled and built together. However, in a plugin world you have to create an API to support this since it requires the cooperation between the hosting application, that owns the message pump, and the plugins, that know which modeless window is currently active.

The Open AIM SDK added support for registering the active dialog back in version 1.3 via a property called IAccPluginInfoProp_Windows. This property accepts an array of UINTs that are the window references. In the Windows environment you only have to provide a one-element array with the window handle of the currently active modeless dialog window or an empty array.

Open AIM clients need to listen for changes to IAccPluginInfoProp_Windows and keep track of the currently active dialog window in any plugin. On every window message, Open AIM clients should call IsDialogMessage() if it has at least one active modeless dialog window registered. If the message is handled, then the client is done otherwise the client can continue on with its own processing of the message. If all plugins are working correctly, there should only be one active modeless dialog window at a time even if there is more than one open.

I created a handy little class that you can use to make this easy to manage in your plugins. Here is a part of the header (Download the full source here):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class COpenAIMPluginWindowReg
{
public:
    // Call this once from the first instance of your plugin and
    // a second time, with a null pointer, when the last instance is shutdown.
    static void SetPluginInfoPtr(IAccPluginInfo *pPluginInfo);
 
    // Call this from WM_ACTIVATE
    static void OnActivate(HWND hWnd, WPARAM wParam);
 
private:
    static CComPtr<IAccPluginInfo>  s_spPluginInfo;
 
};

As you can see, this class has just two static methods and thus very simply to use. You call COpenAIMPluginWindowReg::SetPluginInfoPtr(pPluginInfo); from the first instance of your plugin. I typically call this from the IAccPlugin::Init() method and keep track if the number of instances of my plugin that are running. You must also call COpenAIMPluginWindowReg::SetPluginInfoPtr(NULL); when the last instance of your plugin is shutdown.

Then, in every modeless dialog window you create, add a handler for the WM_ACTIVATE message and call:

    COpenAIMPluginWindowReg::OnActivate(hWnd, wParam);

The OnActivate static method takes care of maintaining the IAccPluginInfoProp_Windows property for your plugin as the window is activated and deactivated.

I have released this source under an MIT style license. See the source files for more information. Again you can download the full source here.

Questions? Comments?

Open AIM: How to register a plugin command

December 17th, 2007

Hello again. I am back. Today I am starting a new series of posts on Open AIM. For this first post, I will start by introducing a handy little function similar to the one I wrote for my plug-ins that makes it easy to register commands that your plug-in will handle.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// The following code is public domain. Written by Gus Verdun
static void RegisterPluginCommand(IAccPluginInfo * pluginInfo, 
                                               int id, UINT flags, 
                                               LPCWSTR pCommand)
{
    CComPtr <IAccCommand> spCommand;
    pluginInfo->AddCommand(id, &spCommand);
    if (spCommand)
    {
        CComBSTR str(pCommand);
        put_Text(spCommand, str);
        put_Flags(spCommand, (AccCommandFlags)flags);
    }
}

I normally call this function from the IAccPlugin::Init method, but you can call it at any time you want to add a command. The first parameter is the IAccPluginInfo interface pointer that is passed to you on the Init() call. The second parameter is the command identifier that is assigned by you and handled in your plugin’s IAccCommandTarget methods. The third parameter, flags, are the AccCommandFlags that let you indicate where you want this command to appear in the UI. Finally, the fourth parameter is the actual text that will be displayed in the client’s UI.

Here is a simple example to define a command that will show only in the plug-in settings page.

RegisterPluginCommand(pPluginInfo, -1, 
     AccCommandFlags_PreferencesUi, 
     OLESTR("Settings...") );

For localization purposes, you can easily change this function to load the command string from a resource. I will leave that as an exercise for you to try.

Hope this helps. Comments? Questions?

IM Tweaks 0.8.1

October 13th, 2007

I updated this plug-in yesterday. This version fixes the problem with AIM 6.5 where invisibility was not being set properly at first sign in. I also added a new about window that you can access from AIM 6.5’s Help menu. The about window has a way to send feedback.

Be sure you sign-out and exit from your IM client before installing this plug-in.

Let me know if you have any questions. I will post my answers in the comments.