PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : X-Chat perl script



Chakotay
28-07-2006, 18:44
mit


IRC::add_message_handler("NOTICE","test_NOTICE");

sub test_NOTICE {
Xchat::command("SAY gelb");
return 1 ;
}

screibt mein script bei jeder art von NOTICE das word "gelb" ins irc

das iss mir zu allgemein
leider weiss ich nicht wie ich ihn nur auf ein word in der NOTICE (zB. IDENTIFY) reagieren lasse :-(

kennt sich hier jemand damit aus :-)

Molaf
29-07-2006, 20:47
Der Text, der den callback ausgelöst hat, wird normalerweise als erstes Argument in @_ übergeben.
Also als erste Zeile in die Subfunktion einfügen:
my $text=shift;

Dann kannst Du den Inhalt auswerten.

Chakotay
29-07-2006, 21:27
jo
und wie sag ich ihm dann das er den befehl nur ausführen soll wenn $text IDENTIFY enthällt ?

iss doch bestimmt wieder n if oder ?

ich hasse if's ^^

Molaf
30-07-2006, 10:25
IRC::add_message_handler("NOTICE","test_NOTICE");

sub test_NOTICE {
my $text=shift;
if ($text =~ m/IDENTIFY/)
{
Xchat::command("SAY gelb");
}
return 1 ;
}

Wenn keine RE verwendet werden sollen, geht auch
if (index($text,'IDENTIFY') >= 0) (index liefert -1 wenn kein Suchtreffer erfolgt)
oder
if (substr($text,0,8) eq 'IDENTIFY') (wenn das IDENTIFY direkt am Stringanfang steht)
Es gibt sicher noch ein paar mehr Möglichkeiten.

if beißt nicht und tut nicht weh!

Chakotay
30-07-2006, 15:18
danke

ich weiss ja das se nicht beissen

nur leider wollen se bei mir nie so wie ich^^

---
edit

kann man dem if auch noch hinzufügen das
er er einmal ausgeführt wurde
er nicht nochmal innerhalb 5 sec gestartet werden kann ???


es kommt hier bei mir nämlich zu ner lustigen dauerschleife^^

Molaf
30-07-2006, 22:26
Ich hab die Doku von den Xchat-Skripten mal vor Jahren überflogen, hatte aber nie richtig Zeit für eigene Entwürfe.

Wenn Xchat die Subroutinen selber einbindet, dann kann man vermutlich keine globalen Variablen nutzen, um sich die Aufrufzeit zu merken. Dann bleibt beispielsweise, die Ausgabe von time in einer Datei zu speichern, wenn die Funktion aufgerufen wurde (im Funktionsblock von if und diesen Wert vor jedem Aufruf zu prüfen.

Vielleicht hilft ja schon ein sleep(5) im Funktionsblock, wenn Xchat dieselbe Funktion pro Server nicht mehrfach gleichzeitig aufruft.

Chakotay
31-07-2006, 18:18
Xchat::hook_timer(1000) muss da irgendwie zwischen

aber wo wir gerade bei den if's sind^^

wie sag ich ihm das der befehl nur startet wenn 2 variabelen passen


sub test_NOTICE {
my $text = $_[0][0];
my $text2 = $_[0][1];
if ($text =~ m/IDENTIFY/) ??? ($text2 =~ m/password/) ???
{
Xchat::command("SAY gelb");
} else {
Xchat::command("SAY schwartz");
}
return 1 ;
}

---
edit

wie kann ich eine variabele die im inneren einer sub definiert werden muss auch in anderen sub's mitbenutzten ?

---
edit2

hat sich erledigt bin selber druff gekommen das ein


sub test_NOTICE {
my $text = $_[0][0];
my $text2 = $_[0][1];
if ($text =~ m/IDENTIFY/) {
if ($text2 =~ m/password/) {
Xchat::command("SAY gelb");
} else {
Xchat::command("SAY schwartz");
}
}
return 1 ;
}

die lösung war^^

Molaf
07-08-2006, 22:42
Statt verschachtelten ifs, geht bei Deinem alten Ansatz auch:

if ($text =~ m/IDENTIFY/) ??? ($text2 =~ m/password/) ???
if (($text =~ m/IDENTIFY/) and ($text2 =~ m/password/)) ???


wie kann ich eine variabele die im inneren einer sub definiert werden muss auch in anderen sub's mitbenutzten ?

Kann ich nur ahnen was gemeint ist.

Vielleicht meinst Du sowas:

my $Ozahl=0;

$Ozahl=&abcd{$Ozahl);
$Ozahl=&abcde{$Ozahl);

sub abcd {my $zahl=shift; $zahl++; return $zahl;}
sub abcde {my $zahl=shift; $zahl+=2; return $zahl;}
Voraussetzung ist aber, dass das Hauptprogramm zwischen den subs weiterläuft und sich die eigentliche Variable merkt. Werden die subs auch noch von Eventhandlern ausgelöst, sind race-conditions zu erwarten.

Chakotay
08-08-2006, 11:48
zu 1 : cool :-) das verkleinert meine ifs enorm :-D

zu 2 meinte ich eig was wie


sub start {
my $mess = shift;
***hier mach ich mehrere ding mit dem $mess ^^***
return 1;
}

sub weiter_im_text {
***hier will ich $mess nochmal verwenden***
return 1;
}
hab ich jetzt aber schon selber gelöst durch


sub erster_start {
my $mess = shift;
sub start {
***hier mach ich mehrere ding mit dem $mess ^^***
return 1;
}

sub weiter_im_text {
***hier verwenden ich $mess nochmal***
return 1;
}
return 1;
}