Hack 42 Blog from IRC


people. Publish the thoughts of this community by using an IRC bot to
place them on a group web log. Blogging has taken the Internet by storm in
recent years, and why should your IRC channel be left out? Most
channels see people regularly paste URLs for the entertainment and
information of those present, so why not collect them and stick them
on a web site for future reference? Here's a
flexible and easily extensible way to do it using a bot. The bot
stores any incoming message that contains a URL in a
MySQL
database. A separate PHP script is used to display all blog entries
made in the last seven days.You will need:A MySQL database (http://www.mysql.com)Java SDK 1.4+ (http://java.sun.com/j2se)MySQL Connector/J (http://www.mysql.com/products/connector/j)PircBot (http://www.jibble.org/pircbot.php)A suitable web servere.g.,
Apache and
PHP 4 with
MySQL support compiled in (http://www.apache.org and http://www.php.net)
For the sake of
simplicity, it will be assumed here that
everything's running on the same computer.First, set up your
database according to the following
scheme:
CREATE TABLE weblog (Next, create a user with permissions to access that table:
commenter TINYTEXT NOT NULL,
comment MEDIUMTEXT NOT NULL,
timestamp TIMESTAMP NOT NULL,
PRIMARY KEY (timestamp)
);
GRANT SELECT, INSERT ON database.weblog TO weblogbot@localhostReplace database with the name of your
IDENTIFIED BY 'password';
MySQL database and password with a
password of your choice.
6.4.1 The Code
Now let's write the
code for the bot. The
Weblog class inherits functionality
from the PircBot class to allow it to connect to IRC, so you will
also need to ensure that you have pircbot.jar at
hand.Create a file called Weblog.java:
import org.jibble.pircbot.*;Finally, we'll need some code to create the
import java.text.*;
import java.sql.*;
import java.util.regex.*;
public class Weblog extends PircBot {
private String dbHost = "localhost";
private String dbName = "database";
private String dbUserName = "weblogbot";
private String dbPassword = "password";
private Pattern urlRegEx;
private Matcher urlMatcher;
public Weblog (String botName) {
this.setName(botName);
this.setLogin(botName);
// Precompile the URL-matching regular expression.
urlRegEx = Pattern.compile("^.*(((http|https|ftp)://|www.)" +
"[a-z.0-9/A-Z~_+-&?=,:;#@%!]*).*$");
}
public void onMessage (String channel, String sender,
String login, String hostname, String message) {
urlMatcher = urlRegEx.matcher(message);
if (urlMatcher.matches( )) {
try {
// Connect to the MySQL database.
Class.forName("com.mysql.jdbc.Driver").newInstance( );
Connection conn = DriverManager.getConnection(
"jdbc:mysql://" + dbHost + "/" + dbName +
"?user=" + dbUserName +
"&password=" + dbPassword);
// Prepare and execute the database query.
PreparedStatement pstmt = conn.prepareStatement(
"INSERT INTO weblog (comment, commenter) VALUES(?, ?);");
pstmt.setString(1, message);
pstmt.setString(2, sender);
pstmt.executeUpdate( );
}
catch (Exception e) {
// Something went wrong...
}
}
}
}
blog from the
database. The following bit of
PHPsaved on the web server as
weblog.phpdoes the trick. It executes an
SQL query to get all
the entries out of the database that are less than seven days old.
These are then displayed in a table.
<html>Finally, you
<head>
<title>IRC Hacks weblog example</title>
</head>
<body>
<table>
<tr>
<td>when</td><td>who</td><td>what</td>
</tr>
<?php
// Set up the SQL query.
$earliest = mktime(0, 0, 0, date("m"), (date("d") - 7), date("Y"));
$querytext = "SELECT UNIX_TIMESTAMP(timestamp), commenter, comment " .
"FROM weblog WHERE UNIX_TIMESTAMP(timestamp) > $earliest " .
"ORDER BY timestamp DESC LIMIT 200";
// Connect to the database.
$link = @mysql_connect("localhost", "weblogbot", "password")
or die("Could not connect to database server");
mysql_select_db("database")
or die("Could not select the database");
// Execute the SQL query.
$result = mysql_query($querytext)
or die("database query failed");
// Format the blog entries.
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)){
$comment = strip_tags($row[comment]);
// Turn URLs into hyperlinks.
$comment = preg_replace("((((http|https|ftp)://|www.)" .
"[a-z.0-9/A-Z~_+-&?=,:;#@%!]*))",
"<a href="1">1</a> ", $comment);
$time = date("r", $row["UNIX_TIMESTAMP(timestamp)"]);
print "<tr><td>" . $time . "</td><td>" . $row[commenter] .
"</td><td>" . $comment . "</td></tr>n";
}
?>
</table>
</body>
</html>
just need a main method to tell
the bot which server to connect to and which channels to join. Save
the following as WeblogMain.java:
public class WeblogMain {
public static void main(String[] args) throws Exception {
Weblog bot = new Weblog("blogger");
bot.setVerbose(true);
bot.connect("irc.freenode.net");
bot.joinChannel("#irchacks");
}
}
6.4.2 Running the Hack
When you first visit weblog.php with your
web browser, the page will obviously be empty. To populate the
database, you must make the IRC bot join a channel and send it some
URLs.Compile the bot like so:
C:javaWeblog> javac -classpath .;pircbot.jar;mysql-connector.jar *.javaThen run the bot:
C:javaWeblog> java -classpath .;pircbot.jar;mysql-connector.jar WeblogMainOnce the bot is running, it will add all messages containing URLs to
the database, ready to appear on the web page.
6.4.3 The Results
As you can see from the rather plain output in Figure 6-2, you could easily spice up the appearance with
a few images and other HTML hacks. Other possibilities are to allow
searching of the database for entries that are older than seven days
or to provide alternative output formats such as RSS.
Figure 6-2. Output from the simple Weblog bot

scot is available from Steve
Jolly's web site at http://www.elvum.net/scot. Steve Jolly