# irc bot



## noch nicht geregt (7. Jul 2006)

```
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("<a href=\"$1\">$1</a>");
        
                
        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 = "<span class=\"irc-date\">[" + time + "]</span> <span class=\"" + color + "\">" + line + "</span>
";
            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);
    }
    
    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;
    
}
```



```
package org.jibble.logbot;

import java.io.*;
import java.util.*;

public class LogBotMain {
    
    public static void main(String[] args) throws Exception {
        
        Properties p = new Properties();
        p.load(new FileInputStream(new File("./config.ini")));
        
        String server = p.getProperty("Server", "localhost");
        String channel = p.getProperty("Channel", "#test");
        String nick = p.getProperty("Nick", "LogBot");
        String joinMessage = p.getProperty("JoinMessage", "This channel is logged.");
        
        File outDir = new File(p.getProperty("OutputDir", "./output/"));
        outDir.mkdirs();
        if (!outDir.isDirectory()) {
            System.out.println("Cannot make output directory (" + outDir + ")");
            System.exit(1);
        }

        LogBot.copy(new File("html/header.inc.php"), new File(outDir, "header.inc.php"));
        LogBot.copy(new File("html/footer.inc.php"), new File(outDir, "footer.inc.php"));
        LogBot.copy(new File("html/index.php"), new File(outDir, "index.php"));
        
        BufferedWriter writer = new BufferedWriter(new FileWriter(new File(outDir, "config.inc.php")));
        writer.write("<?php");
        writer.newLine();
        writer.write("    $server = \"" + server + "\";");
        writer.newLine();
        writer.write("    $channel = \"" + channel + "\";");
        writer.newLine();
        writer.write("    $nick = \"" + nick + "\";");
        writer.newLine();
        writer.write("?>");
        writer.flush();
        writer.close();
        
        LogBot bot = new LogBot(nick, outDir, joinMessage);
        bot.connect(server);
        bot.joinChannel(channel);
    }
    
}
```

ja und da ist noch die config ini aber dfie is ja nicht wichtig!
wie die profies unte euch erkennen ist das denn bot in java ich habe schon bots in python geschieben.
ich würde nun gern ein java schreiben und wollte fragen ob jemand lust hat mir den code zu erklären ich versteh wenn dazu neimand lsut hat wär blos echt net! 

mfg


blade


----------



## foobar (7. Jul 2006)

Was genau verstehst du denn nicht?


----------



## noch nicht geregt (7. Jul 2006)

ich wollte allgemein wissen wie so ein bot in java abläuft


----------



## moormaster (8. Jul 2006)

noch nicht geregt hat gesagt.:
			
		

> ich wollte allgemein wissen wie so ein bot in java abläuft



Prinzipiell sollte er ersteinmal das IRC Protokoll implementieren... Wenn man so eine Implementierung hat, ist es fast völlig offen, wie man dann weiter macht. Das hängt ja ganz davon ab, was der bot eigentlich können soll.

Der Quelltext, den du da gepostet hast, scheint ja bereits so ein IRC Framework zu sein, so dass man sich um den Netzwerk-Teil nicht mehr kümmern muss, sondern direkt auf gewisse Ereignisse reagieren kann; z.B. wenn jmd den Channel joined oder irgendwas schreibt. Da musst du dir dann die Dokumentation zu diesem Framework durchlesen, wenn du schon vorgefertigte Klassen benutzt. Da wird dann auch genau beschrieben sein, welche Möglichkeiten bereitgestellt werden, auf Ereignisse zu reagieren bzw. welche Ereignisse auftreten können und wie man diese abfängt.


----------



## Einwegdose (8. Jul 2006)

noch nicht geregt hat gesagt.:
			
		

> ich wollte allgemein wissen wie so ein bot in java abläuft



Die Frage ist wohl etwas zu allgemein formuliert  :autsch: 

Ganz allgemein musst du über einen Socket eine Verbindung zum IRC-Server aufbauen und dann nach dem RFC 1459 (HIER) standardisierten Verfahren mit dem Server kommunizieren.


----------



## moormaster (8. Jul 2006)

Einwegdose hat gesagt.:
			
		

> noch nicht geregt hat gesagt.:
> 
> 
> 
> ...



Hab ich das nicht auch gesagt?


----------



## Einwegdose (8. Jul 2006)

Eigentlich nicht, oder 
Außerdem habe ich deine Antwort auch erst später gesehen weil ich kurz weg musste und dann erst geantwortet habe ^^


----------



## moormaster (8. Jul 2006)

Einwegdose hat gesagt.:
			
		

> Eigentlich nicht, oder
> Außerdem habe ich deine Antwort auch erst später gesehen weil ich kurz weg musste und dann erst geantwortet habe ^^



Naja im großen und ganzen müsste man sich wohl allgemein erstmal mit Netzwerkprogrammierung befassen, bevor man sich an so einen Bot wagt... Wenn man diese vorgefertigten Klassen benutzt, dann kann man eigentlich auch gleich ein Script für nen eggdrop schreiben; dann muss das nicht zwingeng in Java geschehen; es sei denn man möchte den Bot über eine GUI bedienen und überwachen können ^^


----------



## Einwegdose (8. Jul 2006)

Klar, wenn man noch nichts in Richtung Netzwerkprogrammierung gemacht hat sollte man nicht gleich nen IRC-Bot schreiben. 
Allerdings ist es aber auch nicht soo schwer, da das Protokoll recht einfach zu handhaben ist (finde ich).


----------



## moormaster (8. Jul 2006)

Einwegdose hat gesagt.:
			
		

> Klar, wenn man noch nichts in Richtung Netzwerkprogrammierung gemacht hat sollte man nicht gleich nen IRC-Bot schreiben.
> Allerdings ist es aber auch nicht soo schwer, da das Protokoll recht einfach zu handhaben ist (finde ich).



Naja man kann recht schnell ein Programm schreiben, was mit dem IRC Protokoll erstmal irgendwie zusammen funktioniert. Aber wenn man das IRC Protokoll nach dem kompletten Standard definiert, hat man ne ganze Menge Arbeit. Vor allem mit dem Parsing der Server Nachrichten. Von denen fangen einige mit einem Prefix an, welcher mit : am Anfang der Zeile steht. Dieser : muss dann gesondert behandelt werden, da ansonsten der : dafür verwendet wird, zu signalisieren, dass Leerzeichen im folgenden Parameter auftreten.

Abgesehen davon gibt es nicht unbedingt wenig Messages, die der Server senden kann. Wenn man sich ein Framework für IRC baut, dann sollte man auch den Anspruch haben, dass es mit all diesen Messages etwas anfangen und eine Anwendung, die das Framework benutzt dann für nicht implementierte Messages keine Umwege gehen muss.

Es ist vielleicht nicht sonderlich schwer; aber trivial ist es auch nicht


----------

