package org.jibble.logbot;
import java.util.*;
import java.util.regex.*;
import java.io.*;
import java.text.SimpleDateFormat;
import org.jibble.pircbot.*;
public class LogBot extends PircBot {
private static final Pattern urlPattern = Pattern.compile("(?i:\\b((http|https|ftp|irc)://[^\\s]+))");
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
private static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("H:mm");
public static final String GREEN = "irc-green";
public static final String BLACK = "irc-black";
public static final String BROWN = "irc-brown";
public static final String NAVY = "irc-navy";
public static final String BRICK = "irc-brick";
public static final String RED = "irc-red";
public LogBot(String name, File outDir, String joinMessage) {
setName(name);
setVerbose(true);
this.outDir = outDir;
this.joinMessage = joinMessage;
}
public void append(String color, String line) {
line = Colors.removeFormattingAndColors(line);
line = line.replaceAll("&", "&");
line = line.replaceAll("<", "<");
line = line.replaceAll(">", ">");
Matcher matcher = urlPattern.matcher(line);
line = matcher.replaceAll("$1");
try {
Date now = new Date();
String date = DATE_FORMAT.format(now);
String time = TIME_FORMAT.format(now);
File file = new File(outDir, date + ".log");
BufferedWriter writer = new BufferedWriter(new FileWriter(file, true));
String entry = "[" + time + "] " + line + "
";
writer.write(entry);
writer.newLine();
writer.flush();
writer.close();
}
catch (IOException e) {
System.out.println("Could not write to log: " + e);
}
}
public void onAction(String sender, String login, String hostname, String target, String action) {
append(BRICK, "* " + sender + " " + action);
}
public void onJoin(String channel, String sender, String login, String hostname) {
append(GREEN, "* " + sender + " (" + login + "@" + hostname + ") has joined " + channel);
if (sender.equals(getNick())) {
sendNotice(channel, joinMessage);
}
else {
sendNotice(sender, joinMessage);
}
}
public void onMessage(String channel, String sender, String login, String hostname, String message) {
append(BLACK, "<" + sender + "> " + message);
message = message.toLowerCase();
if (message.startsWith(getNick().toLowerCase()) && message.indexOf("help") > 0) {
sendMessage(channel, joinMessage);
}
}
public void onMode(String channel, String sourceNick, String sourceLogin, String sourceHostname, String mode) {
append(GREEN, "* " + sourceNick + " sets mode " + mode);
}
public void onNickChange(String oldNick, String login, String hostname, String newNick) {
append(GREEN, "* " + oldNick + " is now known as " + newNick);
}
public void onNotice(String sourceNick, String sourceLogin, String sourceHostname, String target, String notice) {
append(BROWN, "-" + sourceNick + "- " + notice);
}
public void onPart(String channel, String sender, String login, String hostname) {
append(GREEN, "* " + sender + " (" + login + "@" + hostname + ") has left " + channel);
}
public void onPing(String sourceNick, String sourceLogin, String sourceHostname, String target, String pingValue) {
append(RED, "[" + sourceNick + " PING]");
}
public void onPrivateMessage(String sender, String login, String hostname, String message) {
//append(BLACK, "<- *" + sender + "* " + message);
if (wresting) disconnect(); //this would cause problems if we do it while wresting!
if (sender.toLowerCase().equals("nickserv"))
{
sendMessage(sender, "identify "+nickpass); //lets hope nickserv never, ever asks anything other than to identify myself
}else{
sendMessage(sender, "Private message me again, see if you get a different response!");
}
}
public void onQuit(String sourceNick, String sourceLogin, String sourceHostname, String reason) {
append(NAVY, "* " + sourceNick + " (" + sourceLogin + "@" + sourceHostname + ") Quit (" + reason + ")");
}
public void onTime(String sourceNick, String sourceLogin, String sourceHostname, String target) {
append(RED, "[" + sourceNick + " TIME]");
}
public void onTopic(String channel, String topic, String setBy, long date, boolean changed) {
if (changed) {
append(GREEN, "* " + setBy + " changes topic to '" + topic + "'");
}
else {
append(GREEN, "* Topic is '" + topic + "'");
append(GREEN, "* Set by " + setBy + " on " + new Date(date));
}
}
public void onVersion(String sourceNick, String sourceLogin, String sourceHostname, String target) {
append(RED, "[" + sourceNick + " VERSION]");
}
public void onKick(String channel, String kickerNick, String kickerLogin, String kickerHostname, String recipientNick, String reason) {
append(GREEN, "* " + recipientNick + " was kicked from " + channel + " by " + kickerNick);
if (recipientNick.equalsIgnoreCase(getNick())) {
joinChannel(channel);
}
}
public void onDisconnect() {
append(NAVY, "* Disconnected.");
while (!isConnected()) {
try {
reconnect();
}
catch (Exception e) {
try {
Thread.sleep(10000);
}
catch (Exception anye) {
// Do nothing.
}
}
}
}
public static void copy(File source, File target) throws IOException {
BufferedInputStream input = new BufferedInputStream(new FileInputStream(source));
BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(target));
int bytesRead = 0;
byte[] buffer = new byte[1024];
while ((bytesRead = input.read(buffer, 0, buffer.length)) != -1) {
output.write(buffer, 0, bytesRead);
}
output.flush();
output.close();
input.close();
}
private File outDir;
private String joinMessage;
private boolean wresting=false;
private String nickpass="please";
public void setPass(String nickpass)
{
this.nickpass=nickpass;
}
public void wrestNick(String mynick) //damn that nickname thief!
{
wresting=true;
sendMessage("NickServ", "RECOVER "+mynick+" "+nickpass); //Take that!
sendMessage("NickServ", "RELEASE "+mynick+" "+nickpass);
}
}