JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=5e8dcd28534de4b5d52e9f4d37baad12Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Herbert

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Projekte
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 11.09.2006, 14:20    Titel: Herbert Antworten mit Zitat

Servus allerseits,

nachdem sich alle bei uns im IRC beschwert haben dass wir keine IRC-Services haben habe ich angefangen einen feinen Java Bot zu programmieren. Dieser hört auf den modernen, wundervollen Namen: Herbert!

Der Bot selbst kann nicht viel. Er stellt nur die Interfaces für Kommandos bereit, welche man zur Laufzeit einfügen/entfernen kann. An für sich ist der Code relativ simpel (Wenn man das Arbeiten mit inversion of control containern gewohnt ist).
Wird im Channel eine Zeile mit ! begonnen so wird das von Herbert als Kommando aufgefasst. Er schaut nach ob im channel-container ein Kommando mit dem Namen vorhanden ist und ruft es auf. So eine Kommando klasse schaut dann in etwa so aus:
Code:
package net.devarea.bot;

import java.util.Date;

public class TimeCommand implements Command
{
   private Herbert herbert;

   public TimeCommand(Herbert herbert)
   {
      this.herbert = herbert;
   }

   public void process(String sender, String channel, String text)
   {
      herbert.sendMessage(channel, "The current time is: "+new Date());
   }
}

Sieht im IRC dann so aus:
Zitat:
(04:21:46 PM) xardias: !time
(04:21:46 PM) Herbert: The current time is: Mon Sep 11 16:21:46 CEST 2006


Diese Klasse wird vom Bot instanziiert und wann immer die Worte "!time" im Channel fallen so wird TimeCommand.process() aufgerufen. Der Rest ist denke ich selbsterklärend, herbert ist ein Object, welches zugriff auf den Bot selbst erlaubt um mit ihm Nachrichten zu verschicken.

Das ganze Funktioniert auch schon soweit dass Kommandos instanziiert und aufgerufen werden, jedoch fehlt noch eine nette Configurationsdaten in der man neue Kommandos registrieren kann.

Erste Servicefunktionen hat der Bot auch schon. Die Kommandos !register, !login und !op dienen dazu neue Benutzer zu registrieren, sich einzuloggen und sich mit dem op Status zu versehen, sofern man dazu berechtigt ist (Doch das muss noch stark ausgeweitet werden).

Den Bot selbst werde ich auch noch etwas erweitern, so dass man extra Container für jeden Channel hat um Channel abhängige Daten zu verarbeiten (Sicher praktisch falls man mal eine Art Spieleerweiterung schreibt damit der Bot da nicht durcheinander kommt wenn er in mehreren Channels ist. Wink )

Wer Spass daran hätte mal ein paar Funktionen für den Bot zu schreiben der kann sich ja melden. So ein Quiz Spielchen wäre doch sicher ne nette Sache ;D

regards
xardie Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 11.09.2006, 15:55    Titel: Antworten mit Zitat

Sieht wundervoll aus, aber ähhh wo bei deinem Beispiel sagst du, dass das zauberwort !time ist?

Wird das direkt aus der Klasse gelesen, welches Methode denn nun Befeh+"Command" heisst? Interessant Smile
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 11.09.2006, 19:03    Titel: Antworten mit Zitat

Fallen hat Folgendes geschrieben:
Sieht wundervoll aus, aber ähhh wo bei deinem Beispiel sagst du, dass das zauberwort !time ist?

Wird das direkt aus der Klasse gelesen, welches Methode denn nun Befeh+"Command" heisst? Interessant Smile

Wäre sicher auch eine Möglichkeit (In Java kein Problem). Momentan geschieht das in der Bootstrap Klasse:
Code:

commands.registerComponentImplementation("time", TimeCommand.class);

Aber das wird alsbald durch eine simple XML config ersetzt. So dass man zur Laufzeit die Kommandos neu einlesen lassen kann.[/code]

PS: Es ist übrigends auch möglich spezielle Hooks zu implementieren, um auf mehr Ereignisse als nur das Kommando selbst zu reagieren.
Beispiel:
Code:
public class LoginCommand implements Command, QuitHook
{
   private Herbert herbert;
   private UserDatabase database;
   
   public LoginCommand(Herbert herbert, UserDatabase database)
   {
      this.herbert = herbert;
      this.database = database;
   }

   public void process(String sender, String channel, String text)
   {
      if(database.login(sender, text))
      {
         herbert.sendMessage(channel, "ok");
      }
      else
      {
         if(database.isRegistered(sender))
         {
            herbert.sendMessage(channel, "wrong password");
         }
         else
         {
            herbert.sendMessage(channel, "you are not registered");
         }
      }
   }

   public void onQuit(String user)
   {
      database.logout(user);
   }
}

UserDatabase ist eine Klasse welche ebenfalls im Container registriert wurde (Also später dann in der XML Config). Jedes Command kann darauf zugreifen indem es einfach die Klasse als Parameter in den Konstruktor packt, dass der Konstruktor richtig aufgerufen wird erledigt schon der Container.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 12.09.2006, 20:01    Titel: Antworten mit Zitat

Sorry, dass ich hier nen doppelpost mache Wink

Ich habe Herbert ein bischen erweitert.
Er ist jetzt 100% Plugin basiert, welche sich zur laufzeit neu laden lassen. So muss der Bot nicht neu starten wenn man die Funktionen erweitert.
Jedes plugin muss einfach als .jar datei in den ordner plugins verfrachtet werden, dann kann der Bot diese laden. Um dem Bot mitzuteilen welche Befehle verfügbar sind und weitere Informationen hinzuzufügen wie Hilfe Texte etc. Schaut dann so aus:

Code:
<plugin name="Core Plugin" version="0.1.1" package="net.devarea.bot.plugins.core">

   <component class="UserDatabase">
      <scope>static</scope>
   </component>
   
   <command name="help" class="HelpCommand">
      <description>Display this help text.</description>
      <help>Use "!help command" to display detailed informations about the specified command</help>
   </command>
   
   <command name="login" class="LoginCommand">
      <name>login</name>
      <description>Login to the user system.</description>
      <help>!login password</help>
   </command>
   
   <command name="register" class="RegisterCommand">
      <name>register</name>
      <description>Register to the user system.</description>
      <help>!register password</help>
   </command>
   
   <command name="op" class="OpCommand">
      <name>op</name>
      <description>Gain op in the selected channel.</description>
      <help>!op</help>
   </command>

</plugin>

Diese Daten werden automatisch vom !help kommando angezeigt:
Zitat:
(09:58:38 PM) xardias: help
(09:58:39 PM) Bert: I know the following commands:
(09:58:40 PM) Bert: Core Plugin - version 0.1.1
(09:58:41 PM) Bert: !help Display this help text.
(09:58:42 PM) Bert: !login Login to the user system.
(09:58:43 PM) Bert: !register Register to the user system.
(09:58:44 PM) Bert: !op Gain op in the selected channel.
(09:58:45 PM) Bert: Use "!help command_name" to get more help about the selected command
(09:58:53 PM) xardias: help login
(09:58:53 PM) Bert: login Login to the user system.
(09:58:54 PM) Bert: !login password


Zusätzlich werde ich dann noch eine Funktion einbauen die es erlaubt beliebige parameter in xml zu definieren, so dass man die Kommandos auch noch ein bischen konfigurieren kann (Zugriffsrechte etc).
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
KI
JLI Master


Alter: 39
Anmeldedatum: 04.07.2003
Beiträge: 965
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 12.09.2006, 21:16    Titel: Antworten mit Zitat

Schöner Bot. Gefällt mir.

Toll wäre auch, wenn man Befehle registrieren könnte, die nicht mit einem ! beginnen.

z.B. könnte man den Bot dann auf "Gute Nacht" mit "Schlaf gut [username]" reagieren lassen.
Ich hab auch mal einen Bot gesehen, der interaktiv während des chattens Sachen gelernt hat.

Zum Beispiel konnt man sagen.
"The lesson is never to try"

Und wenn man in den Raum fragt.
"lesson?"

sagt der Bot
"I heard the lesson is never to try" (oder sowas ähnliches)

Ein anderes Beispiel
"hol den vorschlaghammer is <reply> Sie haben uns ein Denkmal gebaut!"

Auf den Satz
"Hol den Vorschalghammer" (case insensitive)
folgt die Antwort "Sie haben uns ein Denkmal gebaut!"

Auch eine Quizbot-Implemenattion müsste auf Befehle ohne führendes ! reagieren können.

edit: Vielleicht kennst du ihn auch. er heißt einfach infobot: http://www.infobot.org/


Zuletzt bearbeitet von KI am 12.09.2006, 21:18, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
PeaceKiller
JLI Master


Alter: 35
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 12.09.2006, 21:16    Titel: Antworten mit Zitat

Viel Spaß, xardias!

Hört sich gut an.
_________________
»If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 13.09.2006, 06:25    Titel: Antworten mit Zitat

Kling auf jeden Fall interessant, jedoch weiß ich momentan nicht ob der Bot das überhaupt können soll Wink.
Sagen wir mal so, ich werde die Möglichkeit dafür einbauen, aber dass alle Befehle mit ! anfangen habe ich eigentlich aus reinen Performancegründen gemacht so dass der Bot nur das erste Zeichen prüfen muss (Und dafür dass Befehle nicht unabsichtlich ausgeführt werden).
Diese infobot sache ist sicher auch ganz nett, aber ich kann mir vorstellen dass sie irgendwann ziemlich nervt Wink Wobei ich auch einen channel gesehen habe in dem die über die user infos da drin gespeichert haben. und der Bot hat per "Who is xardias" infos drüber runtergerattert.

Aber das mit dem antworten auf Gute Nacht/Morgen/etc werde ich machen Very Happy
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
magynhard
Super JLI'ler



Anmeldedatum: 26.04.2003
Beiträge: 461
Wohnort: Wild durch die Welt ;-)
Medaillen: Keine

BeitragVerfasst am: 13.09.2006, 09:59    Titel: Antworten mit Zitat

Fein, fein...
wie kommst Du denn auf den Namen Herbert?
Nicht doch wegen ]HERBI[ ? Wink
_________________
Niemand ist hoffnungsloser versklavt als der, der fälschlich glaubt frei zu sein. [J. W. Goethe]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
xardias
JLI Master


Alter: 38
Anmeldedatum: 28.12.2003
Beiträge: 804
Wohnort: Palo Alto, CA
Medaillen: Keine

BeitragVerfasst am: 13.09.2006, 14:21    Titel: Antworten mit Zitat

Wer ist denn ]HERBI[? Auf Herbert bin ich einfach aus Zufall gekommen ich habe beim basteln eines ersten Prototyps einfach einen dummen Namen genommen der mir in den Sinn gekommen ist. Hätte auch Dietmar oder so sein können ;D (Sorry, falls sich jetzt irgendwer beleidigt fühlt, ist nicht so gemeint)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Dragon
Super JLI'ler


Alter: 38
Anmeldedatum: 24.05.2004
Beiträge: 340
Wohnort: Sachsen
Medaillen: Keine

BeitragVerfasst am: 13.09.2006, 14:49    Titel: Antworten mit Zitat

Er meint sicherlich Herbie aus "Herbie fully loaded: Ein toller Käfer startet durch"
Sollte man eigentlich kennen Wink
_________________
Nur wenn man ein Ziel sieht, kann man es auch treffen.
___________
Mein Leben, Freunde und die Spieleentwicklung
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 13.09.2006, 15:54    Titel: Antworten mit Zitat

wir ham grad nochn paar Probleme gesehen: Razz
Zitat:

[17:48:05] <DXer> !help
[17:48:05] <Bert> I dont know the command "!help"
-> er reagiert net auf private Mitteilungen

Des Weiteren stimmt die Codierung net so... also auf jeden Fall sind die Tab zeichen nach den Commands bei !help usw. falsch angezeigt (kann aber auch an der Zeichenerkennung von MIRC liegen); die sind dann in ausgefüllten Kästchen dargestellt
Zitat:
[17:49:11] <DXer> !help op
[17:49:12] <Bert> op Gain op in the selected channel.
[17:49:13] <Bert> !op

bei der 2. Nachricht steht nach dem "op" nicht das Leerzeichen sondern eben die 2 Kästchen.

Aber ansonsten schon gut Smile

Gruß DXer
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
foreach
ehem. hanse



Anmeldedatum: 08.05.2004
Beiträge: 183

Medaillen: Keine

BeitragVerfasst am: 13.09.2006, 17:25    Titel: Antworten mit Zitat

Afaik musst du privat das ! weg lassen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jones
Senior JLI'ler


Alter: 33
Anmeldedatum: 03.03.2005
Beiträge: 208
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 13.09.2006, 18:23    Titel: Antworten mit Zitat

Warum kann man nicht mehr nach der Uhrzeit fragen? Nur wegen dem doofen FH, oder wie? Sad
edit: Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Projekte Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum