Java and IRC
Making a Java IRC Bot With
The PircBot Framework
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 1
What Is IRC?
IRC stands for “Internet Relay Chat”
Created by Jarkko Oikarinen in 1988
and still growing in popularity
An IRC server allows people to chat in
channels (rooms or groups), or
privately
People from all over the world can use
it
IRC servers can be joined together to
provide vast networks with thousands
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 2
Using IRC
A user runs a client program to
connect to the IRC server
The client program allows you to send
and receive messages to and from
other users
Some popular IRC clients are: -
mIRC
BitchX
xchat
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 3
Nicks, Channels and
Operators
Each user must have a unique
nickname
Commonly referred to as a “nick”
Must not contain certain characters, e.g.
spaces
Channel names must start with # or &
Some users may be channel operators
Can kick other users out of their channel
Can “op” and “deop” other users in the
channel Copyright Paul Mutton, http://www.jibble.org/pircbot.php 4
IRC Protocol
The IRC protocol is text-based
RFC 1459 defines how messages are
sent from client to server and server to
client
TCP sockets are used for connecting
Some IRC servers will support extra
commands that are not in RFC 1459
The protocol is asynchronous in nature
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 5
What Is an IRC Bot?
Bot is short for “robot”
An IRC Bot is a special type of IRC client
Does not require a human user
Often responds automatically to certain
events
One analogy is to think of an IRC Bot as
a normal IRC client, but where the
human user has been replaced by a
program!
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 6
What Can IRC Bots Do?
Tell people what the time is
Pass messages on to other users
Display information from TV listings
Perform simple mathematics
Send and receive files
Monitor channels to generate statistics
... anything you want!
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 7
Using Bots Sensibly
Never annoy other users with your Bot
Only place your Bot in channels where
it may be of use or amusement
Bots should only speak when spoken
to!
Make the purpose of your Bot clear
Make it clear that you own your Bot
Never try to pretend that it’s not a Bot!
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 8
What is PircBot?
A framework for writing IRC Bots with
Java
Simplifies the task of writing an IRC Bot
No need to worry about the underlying
protocol
Very simple Bots can be written within
minutes!
Event-driven architecture
Can make a Bot that responds to certain
events
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 9
Where Can I Download
PircBot?
The PircBot homepage
http://www.jibble.org/pircbot.php
• Documentation
• changelog
• PircBot FAQ
• Examples of some Bots that use PircBot
Download the zip file
Contains a file named pircbot.jar
Also contains a directory full of
documentation
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 10
Extending PircBot
To use PircBot, you must import its
package
import org.jibble.pircbot.*;
PircBot is an abstract class
You cannot instantiate it
You must extend it and inherit its
functionality
You can override some of the methods in
the PircBot class to respond to certain
events
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 11
An Example: SimpleBot
import org.jibble.pircbot.*;
public class SimpleBot extends PircBot {
public SimpleBot() {
setName(“SimpleBot”);
}
}
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 12
Connecting To an IRC Server
public static void main(String[] args) {
SimpleBot bot = new SimpleBot();
bot.setVerbose(true);
try {
bot.connect(“compsoc1.ukc.ac.uk”);
}
catch (Exception e) {
System.out.println(“Can’t connect: ” + e);
return;
}
bot.joinChannel(“#bots”);
}
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 13
Some Notes About SimpleBot
SimpleBot.java
The setName method is inherited from the
PircBot class and sets the nick that will be
used when the Bot joins an IRC server
Connecting to an IRC server
setVerbose(true) causes everything to be
printed out as it arrives from the IRC server
Each method in the PircBot class is fully
described in the provided API
documentation
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 14
Making SimpleBot Tell the
Time
In your SimpleBot class, override the
onMessage method: -
public void onMessage(String channel, String sender,
String login, String hostname,
String message) {
if (message.equalsIgnoreCase(“time”)) {
String time = new java.util.Date().toString();
sendMessage(channel, sender + “: ” + time);
}
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 15
Running Your IRC Bot
pircbot.jar contains the classes for
PircBot
Add this file to your classpath when you
compile or run your IRC Bot manually,
e.g.
javac –classpath pircbot.jar;. *.java
java –classpath pircbot.jar;. SimpleBot
Note: Unix users should use “:” instead16
Copyright Paul Mutton, http://www.jibble.org/pircbot.php
Other Built-in PircBot
Features
DCC send/receive files
DCC chat
Coloured messages
Maintain lists of joined channels and
users
List all channels on a server
Many event-driven methods that may
be overridden
onConnect, onDisconnect, onJoin, onOp,
etc. Copyright Paul Mutton, http://www.jibble.org/pircbot.php 17
Rejoining a Channel When
Kicked
public void onKick(String channel, String kickerNick,
String login, String hostname,
String recipientNick, String reason) {
if (recipientNick.equalsIgnoreCase(getNick())) {
joinChannel(channel);
}
}
Note that we only attempt to rejoin the
channel if it was us that was kicked
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 18
Reconnecting to an IRC
Server
public void onDisconnect() {
while (!isConnected()) {
try {
reconnect();
}
catch (Exception e) {
// Couldn’t reconnect.
// Pause for a short while before retrying?
}
}
}
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 19
PircBot Ident Server
Some IRC servers require you to
connect from a machine that runs an
Ident Server
PircBot can emulate the functionality of
an Ident Server if you do not already
run one
Provides the IRC server with your Bot’s
login when it asks for it
bot.startIdentServer();
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 20
PircBot Flood Protection
Some IRC servers disconnect clients
that send too many messages too
quickly.
PircBot queues most outgoing
messages.
Queued messages are sent with a small
delay between them to prevent
“flooding”
You can get the current size of this
queue by calling the 21
Copyright Paul Mutton, http://www.jibble.org/pircbot.php
Colors and Formatting
Examples
String chan = “#bots”;
sendMessage(chan, Colors.BOLD + “Hello!”);
Hello!
sendMessage(chan, Colors.RED + “Red text”);
Red text
sendMessage(chan, Colors.BLUE + “Blue text”);
Blue text
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 22
Further Text Formatting
sendMessage(chan, Colors.BOLD + Colors.RED +
“Bold and red”);
Bold and red
sendMessage(chan, Colors.BLUE + “Blue “ +
Colors.NORMAL + “normal”);
Blue normal
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 23
DCC Send File
File file = new File(“c:/stuff/elvis.mp3”);
String nick = “Dave”;
int timeout = 120000;
dccSendFile(file, nick, timeout);
Target client must be able to establish
a TCP connection to your Bot to receive
the file
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 24
User List Example
onUserList is called after we join a
channel
This example overrides the onUserList
method and simply prints out each nick
public void onUserList(String channel, User[] users) {
for (int i = 0; i < users.length; i++) {
User user = users[i];
String nick = user.getNick();
System.out.println(nick);
}
} Copyright Paul Mutton, http://www.jibble.org/pircbot.php 25
Multiple Server Support in
PircBot
An individual instance of a subclass of
PircBot can only join one IRC server at a
time
Multiple server support can be achieved
by creating multiple instances
Create a class to control a Collection of
PircBot objects and allow them to interact
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 26
IRC Bots Based On PircBot (1)
ComicBot
Creates comic strips out of things that
people say
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 27
IRC Bots Based On PircBot (2)
Monty
The first ever PircBot!
‘Learns’ from what it sees other people
saying
Dictionary and thesaurus lookup feature
Can remind people to do things after a set
time
Shows TV schedule listings
Performs google searches
Calculates results of mathematical
28
expressions
Copyright Paul Mutton, http://www.jibble.org/pircbot.php
IRC Bots Based On PircBot (3)
SocialNetworkBot
Attempts to produce graphical
representations of “who talks to who” on
IRC channels
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 29
An IRC Client Based On
PircBot
ScreenIRC
IRC client with a Swing GUI
Can be ‘detached’ from a server and
reconnected without appearing to have
ever left
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 30
Final Words...
If you want to make your own IRC Bot
that uses PircBot, then remember that
these slides only provide a briefest
glimpse into what you may need to
know
Refer to the API documentation that is
included inside the zip file
A good starting place is to read the
documentation for the PircBot class
Copyright Paul Mutton, http://www.jibble.org/pircbot.php 31