Hack 72 A File-Sharing Bot


of having to send anything manually? Use this IRC bot to tell people
what files you're sharing and automatically offer
them for download.
IRC provides a convenient way to distribute
your band's music, lyrics, videos, or whatever else
you may want to share with members of your channel. This hack will
show you how to make a simple IRC bot that will tell people what
files the bot has to offer, as well as letting them download any of
those files.This bot will respond to the commands !files and
!get. The !files command will
show a list of the files available in the current runtime directory.
The !get command will allow a user to download a
file using DCC send.
11.6.1 The Code
Save the
following as
FileBot.java:
import java.io.*;
import java.net.*;
import org.jibble.pircbot.PircBot;
public class FileBot extends PircBot {
private static final String COMMAND_files = "!files";
private static final String COMMAND_GET = "!get";
private static final int DCC_TIMEOUT = 120000;
public FileBot( ) {
this.setName("FileBot");
}
public void onMessage(String channel, String sender, String login,
String hostname, String message) {
if(message.equalsIgnoreCase(COMMAND_files)) {
// Get the current directory.
File dir = new File(".");
// Get all files (not directories) in the directory.
File[] fileList = dir.listFiles( );
if (fileList == null || fileList.length == 0) {
sendMessage(channel, "Sorry, no files available right now.");
} else {
// List the files.
for (int i = 0; i < fileList.length; i++) {
if(fileList[i].isFile( )) {
sendMessage(channel, fileList[i].getName( ));
}
}
}
} else if(message.toLowerCase( ).startsWith(COMMAND_GET + " ")) {
String fileToGet = message.substring(COMMAND_GET.length( )).trim( );
// Send the requested file over DCC.
dccSendFile(new File(fileToGet), sender, DCC_TIMEOUT);
}
}
}
Now you just need a main method to
tell the bot to connect to a server and join a channel. Save the
following as FileBotMain.java:
public class FileBotMain {
public static void main(String[] args) throws Exception {
FileBot fBot = new FileBot( );
fBot.setVerbose(true);
fBot.connect("irc.freenode.net");
fBot.joinChannel("#irchacks");
}
}
11.6.2 Running the Hack
Compile the bot with the following command:
C:\java\FileBot> javac -classpath pircbot.jar;. *.javaRun the bot like so:
C:\java\FileBot> java -classpath pircbot.jar;. FileBotMainThe bot will then start up and be ready to serve files.
11.6.3 Hacking the Hack
Sometimes people are unable to use
DCC. Firewalls are a common reason
for this, so an alternative method of transport must be found. This
can be achieved quite simply by incorporating a very basic
web server into the IRC bot, such as
the one found at http://www.jibble.org/miniwebserver.To use this, you must add the following import statement to
FileBot.java:
import org.jibble.simplewebserver.SimpleWebServer;To allow access to the new feature, you must provide another field to
store the command name:
private static final String COMMAND_GETHTTP = "!gethttp";In the constructor, you can create the web server instance:
try {In the onMessage method, you can now add handling
SimpleWebServer server = new SimpleWebServer(new File("./"), 80);
} catch (IOException e) {
e.printStackTrace( );
}
for the new command:
...
} else if(message.toLowerCase( ).startsWith(COMMAND_GETHTTP + " ")) {
String fileToGet = message.substring(COMMAND_GETHTTP.length( )).trim( );
try {
sendMessage(channel, "http://" +
InetAddress.getLocalHost( ).getHostAddress( ) + "/" + fileToGet);
} catch (UnknownHostException e) {
e.printStackTrace( );
}
}
11.6.4 The Results
When you send the !files command, the bot will
list all of the files in the current directory, for example:
<DeadEd> !filesIf you want one of these files, you can use the
<FileBot> Image1.gif
<FileBot> Snd2.wav
<FileBot> Report.doc
<FileBot> FileBot.txt
!get filename command,
for example:
<DeadEd> !get FileBot.txtFileBot will now try and send the file via DCC send. If this fails
for some reason, you can try the last resortdownload the file
over HTTP:
<DeadEd> !gethttp FileBot.txtFollow that link in your browser and the file should start
<FileBot> http://123.456.123.456/FileBot.txt
downloadingassuming, of course, that the web server on which
FileBot is running is accessible to you over the Web.Alex North