Web DevCenter
oreilly.comSafari Books Online.Conferences.
MySQL Conference and Expo April 14-17, 2008, Santa Clara, CA

Sponsored Developer Resources

Web Columns
Adobe GoLive
Essential JavaScript
Megnut

Web Topics
All Articles
Browsers
ColdFusion
CSS
Database
Flash
Graphics
HTML/XHTML/DHTML
Scripting Languages
Tools
Weblogs

Atom 1.0 Feed RSS 1.0 Feed RSS 2.0 Feed

Learning Lab






Hacking IRC
Pages: 1, 2

Moderate Hack #50Pass Notes to Other Users


Author's note: Whether you're using IRC at work or for chatting to friends, it's always useful to run an IRC bot that can pass on short messages to other users. This article shows you how to make your own IRC bot that does just that.

For many people, IRC is more than just a place to chat. Social groups form quite easily in channels; after all, you all share the same interest, right? IRC therefore becomes the natural place to talk to this social group. You may not even know the email addresses of the people you talk to, simply because you don't need to. IRC lets you chat in real time, which is often more convenient than waiting for a response to an email. IRC also lets you transfer files directly from one client to another.

Such dependence on IRC sometimes makes people forget that there are alternative communication mediums. Indeed, some people even become frustrated when they have to resort to alternatives! If the person you want to talk to has left the server for a while (perhaps has gone to bed or to the shops) and you don't know his email address, you could use an IRC bot to pass on your message when he comes back.

A bot that passes on messages doesn't have to be too complicated. All it has to do is allow users to give it new messages, store them, and then pass them on when appropriate:

<Jibbler> tell DeadEd to look at http://www.jibble.org/comicbot/
<TellBot> Okay, Jibbler

The next time DeadEd joins the channel, the bot should pass the message to DeadEd:

* DeadEd has joined #irchacks
<TellBot> DeadEd, Jibbler asked me to tell you to look at
    http://www.jibble.org/comicbot/

The Code

We can use a HashMap to store a list of messages to pass on, allowing more than one message to be sent to any one user. The HashMap will be indexed by nickname, and each entry will point to an ArrayList that contains messages for that user.

Create a file called TellBot.java:
import org.jibble.pircbot.*;
import java.util.*;

public class TellBot extends PircBot {
    
    // A map of String (nickname) to ArrayList (message Strings).
    private HashMap messages = new HashMap( );
    
    public TellBot(String name) {
        setName(name);
    }
    
    public void onMessage(String channel, String sender, String login,
            String hostname, String message) {
        
        String[] tokens = message.split("\\s+");

        // Check for the "tell" command.
        if (tokens.length > 2 && tokens[0].equalsIgnoreCase("tell")) {
            String nick = tokens[1];
            message = message.substring(message.indexOf(nick) + nick.length( ) + 1);
            
            // Convert the nickname to lowercase for use in the HashMap.
            String key = nick.toLowerCase( );
            ArrayList list = (ArrayList) messages.get(key);
            if (list == null) {
                // Create a new ArrayList if the HashMap entry is empty.
                list = new ArrayList( );
                messages.put(key, list);
            }
            
            // Add the message to the list for the target nickname.
            list.add(sender + " asked me to tell you " + message);
            sendMessage(channel, "Okay, " + sender);
        }
        
    }
    
    public void onJoin(String channel, String sender,
            String login, String hostname) {
        
        // Convert the nickname to lowercase to get the HashMap key.
        String key = sender.toLowerCase( );
        ArrayList list = (ArrayList) messages.get(key);
        if (list != null) {
            // Send all messages to the user.
            for (int i = 0; i < list.size( ); i++) {
                String message = (String) list.get(i);
                sendMessage(channel, sender + ", " + message);
            }
            // Now erase all messages for this user.
            messages.put(key, null);
        }
    }
    
}

Notice that the HashMap keys must be converted to lowercase. This effectively makes the nicknames case insensitive, so a message that is left for "Paul" can also be received by "paul."

The onMessage method is invoked whenever someone sends a message to the channel. This method checks to see if a user has entered the "tell" command—if so, it adds the message to the HashMap.

When a user joins the channel, the onJoin method is invoked. If there are any messages for this user, they are sent to the channel and then removed from the HashMap.

To instantiate the bot, you will need a main method. Create this in TellBotMain.java:

public class TellBotMain {
    
    public static void main(String[] args) throws Exception {
        TellBot bot = new TellBot("TellBot");
        bot.setVerbose(true);
        bot.connect("irc.freenode.net");
        bot.joinChannel("#irchacks");
    }
    
}

You can also tell the bot to join more than one channel—simply modify the joinChannel method call so it contains a comma-separated list, for example:

bot.joinChannel("#irchacks,#jibble,#pircbot");

Messages will be accepted from all channels and delivered to the first one the recipient joins.

Check back to this space next week for more excerpts from IRC Hacks. You'll learn how to perform feats of math; how to announce newsgroup posts; and how to use IRC within a screen.

Paul Mutton is the author of the PircBot IRC framework and several other Java programs that can be found on his web site.


View catalog information for IRC Hacks

Return to Web DevCenter.