Not logged in. · Lost password · Register
Forum: PHP4You :: Scripts Support und Fragen RSS
PHPIrc-bot, Rejoin und Chatlog.
Automatischer Rejoin und kleines Problem mit Chatlog.
mrdabolina #1
Member since Jun 2009 · 2 posts
Group memberships: Mitglieder
Show profile · Link to this post
Subject: PHPIrc-bot, Rejoin und Chatlog.
Guten Tag,

ich benutze momentan den PHPIrc-bot, und muss sagen, dass er wirklich sehr praktisch ist, und auch gut funktioniert.

Nur habe ich jetzt eine Frage zum Thema rejoin, da ich meinen Bot momentan auf einem Webspace benutze, und der Bot beim Server neustart des Webspaces vom IRC disconnectet.
Gibt es eine Möglichkeit den Bot dazu zu veranlassen, dass er automatisch wieder zu dem IRC Channel reconnectet? Ich stelle mir da als Möglichkeit vor, dass man es durch Skript realisiert, dass auf einem anderen Webspace läuft (2ter Webspace ist bereits vorhanden). Nur ist eben die frage wie man dass dann genau machen könnte. Oder existiert da auch eine andere Möglichkeit?

Dann hätte ich da noch eine Frage zum Chatlog. Der Log funktioniert bei mir recht gut, er speichert die Gespräche auf meinen Webspace. Mit der Ausnahme, dass er sämtlich joins und quits der User nicht einbezieht, und auch die ausgaben des Bots werden nicht mitgeloggt (z.B. der Befehl $coffee). Was muss man ändern, dass er diese Ereignisse auch in die Logfile schreibt?

Bin für jede Hilfe/Anregung Dankbar,

MFG
mrdabolina
Avatar
Janek (Administrator) #2
User title: Admin
Member since Aug 2006 · 125 posts · Location: Potsdam
Group memberships: Administratoren, Cehmes-Entwickler, Mitglieder
Show profile · Link to this post
Hallo mrdabolina,

bitte entschuldige die Verspätung. Ich habe im Moment nicht viel Zeit für die Pflege meiner Webprojekte daher dauert es immer ein wenig bis ich antworten kann. Dennoch herzlich willkommen im Forum!

Zu deiner ersten Frage:

Ich verstehe nicht genau was du damit meinst. Hast du nur normalen Webspace zur Verfügung? Wenn du möchtest, dass der Bot rund um die Uhr läuft kannst du das denke ich nicht zuverlässig mit normalem Webspace realisieren. Du könntest aber versuchen mit Hilfe eines kostenfreien Cron Dienstes alle paar Minuten den Bot starten zu lassen. Ich kann mir aber vorstellen, dass dies dazu führen wird, dass eine hohe Last auf dem Webserver des Webspaces entsteht, da schlimmstenfalls alle paar Minuten eine neue Verbindung zum IRC aufgebaut wird. Ich habe das aber in der Vergangenheit soweit ich  mich erinnern kann mal mit einer solchen Lösung ausprobiert und das ging erstaunlich gut.
Im Nachhinein denke ich, geht das nur sinnvoll wenn man vorher eine Abfrage im Bot einbaut, die prüft, ob bereits eine Instanz des Bots läuft. Wenn ja, wird abgebrochen, wenn nein wird der Bot gestartet. Das ist aber ziemlich schwierig da der Abbruch des Bots bei einem Webspace schwer abgefangen werden kann...

Alles in allem nicht ganz einfach - wenn ich deine Frage richtig verstanden habe. Grundsätzlich kann man den Bot zwar über einen Webspace starten, das funktioniert aber in der Regel relativ unzuverlässig und auch mit zwei "Webspaces" kann man daran nicht wirklich etwas verändern.


Zum Chatlog: Die Logs werden von dem Plugin "msglog.php" im Ordner "bot_functions" erstellt. Um neben den privaten Nachrichten "PRIVMSG" auch andere Dinge wie Joins, Parts oder Notices aufzuzeichnen kannst du den Inhalt der Datei durch folgenden ersetzen:

<?php
$bot->add_hook("PRIVMSG", "php4youBot_msglog");
$bot->add_hook("NOTICE", "php4youBot_msglog");
$bot->add_hook("JOIN", "php4youBot_otherlog");
$bot->add_hook("PART", "php4youBot_otherlog");

function php4youBot_msglog($object, $command, $params, $prefix) {
    global $log_format;
   
    $nick = IRC::get_nick($prefix);
    $dest = substr($params, 0, strpos($params, " "));
    $msg = substr($params, strpos($params, " :") + 2);
    $file = "logfile";
    file_put_contents($file, date($log_format) . " $dest <$nick> $msg\n", FILE_APPEND);
}

function php4youBot_otherlog($object, $command, $params, $prefix) {
    global $log_format;
   
    $nick = IRC::get_nick($prefix);
    $msg = substr($params, strpos($params, " :") + 2);
    $file = "logfile";
    file_put_contents($file, date($log_format) . " $nick $command $msg\n", FILE_APPEND);
}
?>

Was nicht ganz so einfach funktioniert ist die Ausgaben der Bots mit in die Logs einzubeziehen. Abgefangen werden können auf diese Art und Weise nur alle Nachrichten und Ausgaben die der Bot empfängt und nicht selber sendet. Ich schau aber mal ob sich da noch was machen lässt.

Gruß
foxx
>> PHP4You
>> Against ICQ
mrdabolina #3
Member since Jun 2009 · 2 posts
Group memberships: Mitglieder
Show profile · Link to this post
Vielen dank für die Antwort.

Das mit dem Cron Dienst könnte ich mal ausprobieren. Je nachdem, ob der Webspace regelmäßig zu einer gegebenen Uhrzeit neu startet, kann man den Cron Dienst ja entsprechend anpassen. Aber ich habe jetzt beobachtet, dass der Bot jetzt fast eine Woche lang online war, und ich bisher nur einen reconnect machen musste.
Wenn das weiterhin so bleibt, dann ist es gar nicht mehr so tragisch, ich habe bisher früh gemerkt, dass der Bot das Netzwerk verlassen hatte, und ich konnte ihn frühzeitig neu starten.

Das mit dem Chatlog werde ich mal probieren, nochmals vielen Dank für die Antwort, und den Code des Chatlogs.

MFG
mrdabolina

EDIT
Ich habe soeben das mit dem Chatlog getestet, und es funktioniert auch so, wie ich es mir vorgestellt habe.Ich habe auch noch den Code so ergänzt, dass er quit Meldungen loggt. Einen kleinen Detailfehler gibts dennoch:

13.06 10:01 #test-channel <MrDabolina> quit test
13.06 10:01 MrDabolina QUIT uit: message                   <-- "q" fehlt
13.06 10:01 MrDabolina JOIN test-channel
13.06 10:01 #test-channel <MrDabolina> ende quit test

13.06 10:02 #test-channel <MrDabolina> part test
13.06 10:02 MrDabolina PART est-channel                    <-- "t" fehlt
13.06 10:02 MrDabolina JOIN test-channel
13.06 10:02 #test-channel <MrDabolina> ende part test

Wobei dieser Fehler wirklich nicht tragisch ist, und ich da eventuell selber Hand anlegen könnte ;)

MFG
mrdabolina
This post was edited on 2009-06-13, 11:17 by mrdabolina.
Avatar
Janek (Administrator) #4
User title: Admin
Member since Aug 2006 · 125 posts · Location: Potsdam
Group memberships: Administratoren, Cehmes-Entwickler, Mitglieder
Show profile · Link to this post
Hi,

du könntest mal versuchen die folgende Zeile bei der Funktion "php4youBot_otherlog" anzupassen:

$msg = substr($params, strpos($params, " :") + 2);

zu

$msg = substr($params, strpos($params, " :") + 1);

Das ist jetzt ungetestet, müsste das Problem allerdings beheben.

Gruß
foxx
>> PHP4You
>> Against ICQ
kurtextrem #5
Member since Dec 2009 · 1 post
Group memberships: Mitglieder
Show profile · Link to this post
Hallo,
wie steht es mit dem loggen was der bot selber gesagt hat?

liebe Grüße,
Kurt
This post was edited on 2010-01-01, 21:12 by kurtextrem.
spacer #6
Member since Nov 2009 · 13 posts
Group memberships: Mitglieder
Show profile · Link to this post
In reply to post #2
Quote by foxx on 2009-06-12, 01:21:
Im Nachhinein denke ich, geht das nur sinnvoll wenn man vorher eine Abfrage im Bot einbaut, die prüft, ob bereits eine Instanz des Bots läuft. Wenn ja, wird abgebrochen, wenn nein wird der Bot gestartet. Das ist aber ziemlich schwierig da der Abbruch des Bots bei einem Webspace schwer abgefangen werden kann...

Hi,
ich bin gerade dabei, mir den Bot anzupassen bzw. teilweise umzuschreiben. Obwohl ich den Bot auf einem Root-server mit der Linux Shell starten will, halte ich es für sinnvoll, sicherzugehen, dass nicht mehrere Instanzen gleichzeitig gestartet werden können.
Ich habe mich schließlich entschieden, es über eine datei zu machen. Das hat den Vorteil, dass man den Bot auch durch löschen dieser Datei beenden kann. (ist bei mir nötig, da der Bot so einstellbar ist, dass er nicht auf PRIVMSGs der IRC User , also auch nicht auf $quit, reagiert.
In der Startdatei:
if(!file_exists("RUNNING") {
   $run = fopen("RUNNING", "w");  //zeigt an, dass der Bot läuft
   }
else{                            // Bot läuft bereits
   die($intance_error);
   exit;
   }
Bei jedem durchlauf wird abgefragt, ob die Datei existirt, existiert sie nicht mehr, wird der Bot beendet:
while (true) {
            if(file_exits("RUNNING") {
            $input = $irc->get();

            // ...
             else{
              end();
              }
    }
This post was edited on 2010-01-04, 14:49 by spacer.
Avatar
Janek (Administrator) #7
User title: Admin
Member since Aug 2006 · 125 posts · Location: Potsdam
Group memberships: Administratoren, Cehmes-Entwickler, Mitglieder
Show profile · Link to this post
Danke für den Code, spacer. Der weg über diese PID Dateien ist ja ein recht gebräuchlicher UNIX Weg um Instanzen zu erkennen und den so zu erweitern, dass bei fehlender "PID Datei" der Bot automatisch beendet wird ist natürlich eine gute Idee.
Funktionieren tut das ganze natürlich nur, wenn der Bot Schreibrechte im eigenen Verzeichnis hat und das ist nicht überall standardmäßig gegeben. Ist ja eigentlich kein großes Problem erschwert aber für manch einen Neuling doch den Einstieg :)

Ansonsten: Ich persönlich habe nicht sonderlich viel freie Zeit um mich Freizeit Projekten wie dem Bot zu widmen. Allerdings stelle ich gerne ein SVN Repository zur Verfügung und/oder nehme Anpassungen per Mail entgegen wenn jemand eigene Änderungen frei zugänglich machen möchte.

Grüße
foxx
>> PHP4You
>> Against ICQ
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please note the verification code from the picture into the text field next to it.
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Go to forum
This board is powered by the Unclassified NewsBoard software, 20090606-dev, © 2003-8 by Yves Goergen
Current time: 2012-02-05, 19:21:40 (UTC +01:00)