PsyBNC scripts/de
Die psyBNC Scripting Funktion
Zurückzuführen darauf, dass niemand wirklich versteht, auf welche Weise psyBNC das Scripting (Verschriftung) den Benutzern anbietet, sollte es in diesem File etwas detaillierter beschrieben werden
I. Allgemein
psyBNC bietet eine verschiedenartige Weise des Scripting an. Während z. B. Eggdrop TCL als Skript-Sprache anbietet, offeriert psyBNC seinen eigenen Mechanismus zum Erstellen von benutzerbestimmten Scripts.
I.1 Der Allgemeine Begriff
IRC sendet Nachrichten zum Benutzer und der Benutzer sendet Nachrichten zum IRC. Wenn keine Daten vom Server empfangen und keine Daten vom Benutzer empfangen werden, passiert normalerweise keine Aktion. Das Scripting psyBNC basiert auf Ereignissen, dir nur dann passieren, wenn Daten vom Benutzer oder vom Server empfangen werden. Wenn ein Ereignis dem Syntax (Kommandoaufbau) des Scripts entspricht, dann passiert die Aktion, die im Script gegeben ist. Ein Script kann nur in psyBNC eingegeben werden, wenn man den Zugang zu einer Shell hat, indem die Scripts in das Script-Verzeichnis (Script-Directory) gegeben werden. Wenn ein Script eingegeben wurde, während der Bouncer durchgeführt wurde, wird das Script nicht automatisch neu geladen. Du mußt den psyBNC Befehl /SRELOAD einleiten, um die Änderungen in deinem Script neu zu laden.
I.2 Ereignis-gehandhabtes Scripting
Der Kommandoaufbau jeder Zeile eines psyBNC Scripts ist folgender: event function fromuserhost/name to content script (Ereignis Funktion von userhost/Name zu Inhalt Script) Das Ereignis beschreibt 6 mögliche Ereignis-Arten der Scripting Funktion. Diese sind: - dccchat (Benutzer erhält ein dcc chat Anbot von einem irc user) - dccsend (Benutzer erhält ein dcc datei Anbot von einem irc user) - server (Jedes Ereignis vom Server) - dialogue (Ein permanent offener Dialog der vom Script gehandhabt wird) - ctcp (wenn eine CTCP-Anfrage erhalten wird von einem irc user) - alias (ein benutzerbestimmter Befehl für psyBNC) Alle anderen Bereiche (Felder) hängen von der Funktionalität des Ereignisses ab: Der Funktions-Bereich: - In dccchat, dccsend and dialogue hat er keine Bedeutung - in server, ist es der Name oder die Nummer der Nachricht, die vom Server kommt - in ctcp, ist es der Name des CTCP-Befehls (bei CTCP PING würde es PING sein) - in aliases, ist es der Name des Befehls, welcher benutzerbestimmt sein sollte Der fromuserhost/name-Bereich: - In dialogues hat er keine Bedeutung - In server, ctcp, dccchat and dccsend ist es ein wildcard-hostmask (*!*a@*.b.com) Wenn die Hostmask übereinstimmt, dann wird das Skript aufgerufen. Bei Server Ereignissen muss auch der Inhalt passen. - In aliases, ist es die Beschreibung des Befehls. Der to-Bereich: - In alias, dccsend and dccfile hat er keine Bedeutung - in server and ctcp, kann es ein Raum sein (wie #sausage), oder ein * wildcard. - In dialogues, ist es der "nick" des Dialogs, welcher in einer Anfrage zum Bouncer Benutzer spricht (in Klammern). Der content(Inhalts)-Bereich: - In alias, dialogues, dccsend, dccfile and ctcp hat er keine Bedeutung - Im Server Ereignis ist es ein wildcard "Inhalt" einer Nachricht, z. B. wenn dieses Feld "*Hello*" beinhaltet muss die Servernachricht, die das Script aufruft auch "Hello" im IRC-Inhalt enthalten. Der Script-Bereich: - Bei ctcp, dccfile and server können es beliebige Shellsripts oder shellbasierende Befehle sein, die einmal aufgerufen werden und nach der Aufführung beendet werden müssen. - Bei dialogue, dccchat and alias, können die aufgerufenen Scripts im Hintergrund bleiben und ihre Arbeit machen, so lange sie benötigt werden. Du kannst auch PHP/Perl/tcl-Scripts vom Scriptkatalog aufrufen.
I.3 Das DEFAULT (Standard)-Script
Wenn ein Script mit dem Dateinammen "DEFAULT.SCRIPT" in das Script-Verzeichnis platziert wird, führen alle Benutzer dieses Script aus, solange kein spezielles Benutzerscript definiert wird. Dieses allgemeine Script wird auch von allen neuen hinzugefügten Benutzern ausgeführt.
I.4 Spezielle Benutzer-Scripts
Wenn ein spezielles User Script erstellt wird, muß der Dateiname USERnn.SCRIPT lauten, wobei nn die Nummer des Benutzers ist, entsprechend der Nummer in der psybnc.conf (Konfiguration), mit keinen führenden Nullen (z. B. User1 muß das USER1.SCRIPT benützen). Die Datei muß in scripts/. gegeben werden.
II. Variablen
Wenn ein Script aufgerufen wird, setzt psyBNC spezielle Environment-Variables (Umfeld-Variablen) um Daten zum Script zu tragen. Allgemeine Variablen werden immer gesetzt, egal welches Ereignis aufgerufen wird. Einige Ereignisse bekommen spezielle Variablen, welche in den Unterabteilungen dieses Abschnittes beschrieben werden. Eine Variable kann von einem Shellscript als eine normale Environment-Variable angesprochen werden. Variable wird angesprochen: echo "$USER did start a script" würde die Benutzer-Variable von psyBNC wiedergeben zur aktuellen Standard-Ausgabe, welche von psyBNC gehandhabt werden würde (siehe III. Events). == II.1 Allgemein Variablen für alle Ereignisse: Hier wird eine Liste von allen Variablen gezeigt, welche bei jedem Script-Aufruf gesetzt werden. USERNUMBER (Benutzernummer) - Nummer des psyBNC Benutzers USERLOGIN (Benutzeranmeldung - Ident/login des psyBNC Benutzers USERNICK - aktueller Nickname des psyBNC Benutzers USERHOST - verbundener Host des psyBNC Benutzers USERON - ist useron auf 1 gesetzt, ist der Benuzter aktuell verbunden. Wenn das Ereignis ein Server-Ereignis, ein dccsend-Ereignis, ein dccfile-Ereignis oder ein ctcp-Ereignis ist, werden folgende Variablen benützt. Sie werden von der eingehenden IRC-Nachricht gefiltert. Wenn die Nachricht eine Benutzer-Nachricht oder eine Raum-Nachricht sein würde, würde dies so aussehen: Variable
- joe!joe@host.com PRIVMSG #hello :hello
| | | | | | | | | | | |____ CONTENT | | | | | | | | | |___________ TO | | | | | | | |___________________ CMD | | | | | |____________________________ HOST \ | | | |__________________________________ IDENT \ USER | |______________________________________ NICK /
Wenn du die Variable CONTENT abfragen würdest, würdest du "hello" erhalten. CONTENT speichert den ganzen Text von der Raum- oder Benutzernachricht. Die Variable CMD würde PRIVMSG sein (Befehl dient dazu, Nachrichten an User oder Räume zu schreiben). Zur Erinnerung, IRC kennt nicht wirklich Befehle wie "QUERY" or "MSG", alle Benutzer- und Raumnachrichten sind so gehandhabt, dass PRIVMSG verwendet wird. Das NICK Feld würde joe sein, das ident Feld in diesem Fall genauso. Das HOST Feld würde host.com sein. Das USER Feld würde irc-hostmask sein, in diesem Fall joe!joe@host.com. Wenn die Nachricht eine Server-Nachricht sein würde, würde dies dann so aussehen: Variable
- irc.somenet.org 001 ircgeek :Welcome to irc.somenet.org, ircgeek.
| | | | | | | |____ CONTENT | | | | | |___________ TO | | | |___________________ CMD | |____________________________ HOST / USER
In diesem Fall tragen HOST and Benutzer denselben Wert. Servernachrichten unterstützen mehr als einen Parameter in TO. Deshalb ist es möglich, noch eine Liste von Variablen zu lesen:
- joe!joe@host.com PRIVMSG #hello :hello people, how are you ?
| | | | | | | | | | | | | | | | | | P1 P2 P3 P4 P5 P6 P7 P8 P9 Die Pnn-Variablen beinhalten eine Anordnung eines jeden Elementes der IRC-Zeile. Wenn du dies machen würdest: echo $P3 würdest du
- hello
bekommen Bei Aliases wird die Eingabe im Befehl-Format gesendet. Dieses Befehl-Format würde auch in diesen Variablen gespeichert werden: MYPART #something :Byebye
| | | | | |____ CONTENT | | | |______________ TO | |______________________ CMD
Die Pnn-Variablen sind auch in den Aliases erhältlich.
II.2 Ereignis-spezifische Variablen
Der Dialog Event bietet eine Variable namens MYNICK an. Er speichert den Nick des Dialog-Querys, der dem Benutzer erscheint. Das Serverereignis setzt Raum-Variablen, wenn das TO-Feld ein Raum ist. Diese Variablen sind: CHANNEL - Name des Raumes. Wenn der psyBNC-User im Raum ist, wird er auch mit folgenden Variablen beliefert: CHANTOPIC - Topic des Raumes CHANMODE - Modus des Raumes(z. B. +tn) CHANKEY - Schlüssel des Raumes, wenn einer gesestzt wird. Ansonsten wird die Variable nicht benutzt. CHANLIMIT - Raumlimit (+l Mode), wenn dieser Modus gesetzt wird. CHANUSERnn - Ein User des Raumes, numeriert von NN z. B. CHANUSER1. Der Syntax eines Raumbenutzer-Feldes ist folgender: nick!ident@host|mode Die User-Hostmask ist getrennt vom Raumbenutzermodus durch einen Pipe-Charakter (|). Der Benutzermodus ist festgelegt zum Modus, den der Benutzer im Raum hat. Beispiel: joe!joe@host.com|o zeigt, dass der Benutzer joe ein Operator im Raum ist. Das dccchat-Ereignis liefert eine Variable namens IP, welche die Host des dccchat-anbietenden Benutzers unterhält. Das dccsend-Ereignis liefert, genauso sie dccchat, die IP-Variable, und eine andere Variable namens FILE. Sie unterhält den Namen der Datei, welche der DCC-Send-anbietende Benutzer dir übermitteln will. Das ctcp-Ereignis liefert eine Variable namens X01. Diese Variable wird benutzt, um eine Antwort auf eine simple shellschript-Echo-Zeile zu erstellen, ohne ein fremdes Programm aufrufen zu müssen um den control-character \x01 zu erzeugen.
III. Ereignisse
Dieser Abschnitt versucht die Ereignisse selber zu beschreiben, wie sie verwendet werden und wie sie parametriert werden. Die Ausgabe und Eingabe bei jedem aufgerufenem Script wird vom Ereignis selber definiert. psyBNC wechselt die standard-input, -output and Fehler-Output für das Script zu seinen eigenen internen Anordnungen. Wenn eine Aufgabe, die von einem Script von psyBNC aufgerufen wird, zum STDOUT (Standard-Output) schreibt, wird sie direkt in psyBNC eingegeben. Wie psyBNC die Ausgabe handhabt, hängt vom Ereignis ab. Die folgenden Wörter werden im Ereignis-Kontext verwendet: STDIN - Standard Eingabe zu einer aufgerufenen Aufgabe (Socket 0) STDOUT - Standard Ausgabe von einer aufgerufenem Aufgabe (Socket 1) STDERR - Standard Fehler-Ausgabe von einer aufgerufenen Aufgabe(Socket 2) Die Ereignisse benutzen auch öfters STDIN für empfangene Ausgaben von der Aufgabe. Ein normales Shellscript handhabt Output (Ausgabe) zu STDERR oder STDIN wie folgt: echo "Hello" >&0 sendet Hello zu STDIN echo "Error !" >&2 sendet Error ! zu STDERR. Bei allen Ereignissen kommt STDERR in das psyBNC-Haupt-Log.
III.1 Das Server-Ereignis
Das Server-Ereignis reagiert auf Nachrichtn vom Server. Das kann jede beliebiege Server-Nachricht (numerisch), oder Raum- und Benutzer-Nachricht (wie PRIVMSG, JOIN, PART) sein. Ein Script, das bei einem Server-Ereignis aufgerufen wird, würde nicht im Hintergrund stehen, sondern eine Antwort auf das gegebene Ereignis senden. Das Server-Ereignis hat folgenden Einstellungen für Standard Ein- und Ausgaben: STDOUT geht zum Server, via psyBNC Befehl Interpreter. Du kannst auch psyBNC Befehle vom gegebenen Script einleiten, während Ausgaben zu STDOUT erzeugt werden. Beispiel: server JOIN *!*@* #mychannel * echo "PRIVMSG $NICK :Welcome to #mychannel" Jeder, der den Raum #mychannel betritt, würde die Nachricht "Welcome to #mychannel" von deinem Client bekommen. Wenn das Script eine Ausgabe zu STDIN sendet, wird die Ausgabe zu dem verbundenen Client des psyBNC gesendet. Beispiel: server PRIVMSG *!*@* #mychannel *damned* echo ":irc.server.net NOTICE $USERNICK :someone said damned" >&0 Wenn jemand im Raum einen Satz, der das Wort "damned" enthält, posten würde, würde dein Client eine Nachricht vom Server irc.server.net bekommen, dass jemand im Raum "damned" gesagt hat. Wenn das Script eine Ausgabe zu STDERR sendet, wird psyBNC dies in das Haupt-Log des psyBNC geben. Beispiel: server PART *!*@* #mychannel * echo "User $NICK left the channel !" >&2 Wenn jemand den Raum verläßt, würdest du ein aufgezeichnete Nachricht bekommen, dass dieser User den Raum verlassen hat.
III.2 Das Dialog-Ereignis
Das Dialog-Ereignis startet eine Hintergrund-Anwendung, welche mit dem Benutzer auf psyBNC reagiert in Verwendung eines nachgebildeten Querys. Du kannst Dialoge verwenden, um Anwendungen auszuführen, die eine Wechselwirkung brauchen, aber auch sinnvoll im psyBNC Context sind. Möglicherweise willst du einen Newsticker schreiben, der aktuell die News im Query anzeigt. Oder du willst mit einer Mail-Software via einer Anfrage in psyBNC interagieren. Beispiel: dialogue * * mail * mail Ruft den unix-mailreader auf, und wenn eine Mail abrufbar ist, würde er im Hintergrund stehen, bis der Benutzer diese Anwendung stoppt. STDIN and STDOUT sind umgeleitet zur nachgebildeten Query, STDERR ist das Haupt-Log of psyBNC.
III.3 Das dccchat-Ereignis
Das dccchat Ereignis darf auch eine Hintergrund-Anwendung starten, welche eine mögliche Benutzer Kommunikation eines dccchat ersetzt. Zum Beispiel: dccchat * *!*joe@bla.com * * echo "DCCANSWER $NICK"; /home/me/eliza Diese Zeile würde automatisch jeden DCC Chat von jedem Benutzer mit der Hostmask *!*joe@bla.com. akzeptieren. Nach der Zustimmung zum Chat würde das Programm /home/me/eliza gestartet werden und könnte direkt in der Benutzer-Eingabe reagieren. Der Bouncer-Benutzer würde die Ein- und Ausgaben, die zum und vom DCC-Query des psyBNC gesendet würden, überwachen. Vergewissere dich, dass du DCC aktiviert hast, wenn du den psyBNC kompilierst. Eine Ausgabe zu STDIN würde zum Server gesendet werden. Jede Ausgabe zu STDOUT würde zum DCC-Chat gesendet werden. Jede Ausgabe zu STDERR würde in das psyBNC-Haupt-Log gestellt werden.
III.4 Das dccfile-Ereignis
Ein dccfile Ereignis kann verwendet werden, um einen Fileserver zu schaffen, welcher möglicherweise den Erhalt von bereits existierenden Dateien zurückweist und automatisch auf eine DCC File-Send Anfrage antwortet. Beispiel: dccfile * *!*@* * * /home/me/filecheck Würde eine eigene Anwendung namens /home/me/filecheck aufrufen, welche möglicherweise die zum Senden angefragte Datei verarbeiten könnte und die automatisch dem DCCGET antworten könnte. STDIN Ausgabe würde zum Server geleitet werden. Mit STDIN kannst du Befehle zum Bouncer senden, z. B. dass er die Datei akzeptieren soll. STDOUT würde zur Eingabe des Clients geleitet werden. Du könntest eine Notiz zum User senden, dass die Datei automatisch akzeptiert wurde z. B. STDERR wird zum psyBNC-Haupot-Log geleitet.
III.5 Das alias-Ereignis
Aliases können verwendet werden um eigene Befehle der psyBNC-Befehle-Liste hinzuzufügen. Der Benutzer kann den Alias als einen IRC- oder psyBNC Befehl benutzen. Wenn ein Alias existiert, der denselben Namen eines psyBNC-Befehls hat, wird der Alias anstelle des psyBNC-Befehls verwendet. Beispiel: alias HELLO "Say Hello" * * echo "PRIVMSG $TO :Hello" würde ein Hello zum gegebenen "TO" Argument senden. Die Verwendung des Alias würde sein: /HELLO #bla Der Text würde dann im Raum #bla gepostet werden. Du kannst auch /BHELP HELLO eingeben, aber wenn du eine Hilfe für den hinzugefügten Alias fördern willst, mußt du ein HELLO.TXT in help/ eingeben. Wenn du /BHELP ohnen einen Parameter auslöst, würde der Text "Say Hello" als Quick-Command Help angezeigt. STDIN Ausgaben vom Script würden in die Eingabe des Clients gesendet werden. STDOUT Ausgaben würden zum Server gesendet werden. STDERR wird in das psyBNC Haupt-Log geschrieben.
III.6 Das ctcp-Ereignis
Ein ctcp-Ereignis wird ausgelöst, wenn der Benutzer eine CTCP-Nachricht von einem IRC-Benutzer empfängt. Beispiel: ctcp FINGER *!*@* * * echo "NOTICE $NICK :Dont finger me" Wenn jemand einen CTCP FINGER zu deinem Bouncer senden würde, würde er die Nachricht "Dont finger me" bekommen. STDIN Ausgabe würde zum Client gesendet werden. STDOUT Ausgabe würde zum Server gesendet werden. STDERR wird in das psyBNC-Haupt-Log geschrieben.
IV. Schlusswort
Ich hoffe, dass diese Dokumentation etwas nützlicher ist als der Text, den ich in der README für Version 2.2.2 geschrieben habe. Wenn Ihr noch Fragen über die Scripting-Funktion habt, kontaktiert mich bitte im IRCNet. Bitte fragt mich nicht nach fertigen Skripts, ich biete nur die Scripting-Funktion von psyBNC an, die zum Scripten verwendet werden kann.