| Fortgeschrittener Umgang mit Befehlen;
Mehrzeilen-Befehle
In mIRC könnt Ihr Befehle verwenden, Aliase, Popups und
Remote-Scripts mit bewertenden Optionen, Schleifen und anderen
trickigen Dingen erstellen. ich fürchte, dies alles zu
erklären, würde eine zweite FAQ erfordern aber ich
werde versuchen, eine kleine Einleitung mit ein paar Beispielen
zu geben.
Am besten, man versucht es einfach!
(Anmerkung des Übersetzers: ab dieser Stelle werde ich
die Textinhalte der Beispiele nicht mehr mitübersetzen.
Sie sind so knapp gehalten, daß Ihr eigentlich auch
so drauf kommen könnt.)
mIRC erlaubt Mehrzeilen-Aliase, -Popups und Script-Definitionen.
Dies erlaubt eine schön übersichtliche Darstellungsweise:
<Definition>{
/Befehl1...
/Befehl2...
/Befehl3...
}
Beispiel:
/away /ame is AWAY ( $+ $?="Reason" $+ ) | /away
Set away at $time { $+ $! $+ }
/back /ame is back,.. what did I miss ? | /away
Diese Aliase könnten allerdings auch so dargestellt werden:
/away {
/ame is AWAY ( $+ $?="Reason" $+ )
/away Set away at $time { $+ $! $+ }
}
/back {
/ame is back,.. what did I miss ?
/away
}
Ich geben zu, das ist in diesem Fall nicht besonders nützlich,
aber wenn Ihr anfangt, mit den neuen Möglichkeiten der
vergleichenden und bewertenden Befehle von mIRC zu arbeiten,
dann findet Ihr diese Darstellungsweise bestimmt besser, oder?
Die geschwungenen Klammern {} um alle Befehle, die die neuen
Möglichkeiten von Konditionalschleifen nutzen, sind notwendig.
Jetzt sind wir auch an dem Punkt, an dem Ihr das Befehlspräfix
/ weglassen könnt, wenn ihr wollt. Es wird nicht mehr
benötigt.
Ein /goto Befehl wurde hinzugefügt, der in {}-Definitionen
verwendet werden kann.
Beispiel:
/greet {
/set %x 0
:retry
/inc %x
/goto %x
:2
/echo line2
/halt
:1
/echo line1
/goto retry
}
Dieses Alias wird die Zeilen "line1" und "line2"
auf eurem Schirm ausgeben.
Testet es, indem Ihr diesen völlig gleichwertigen Befehl
in irgendeine Editbox eingebt:
/set %x 0 | :retry | inc %x | goto %x | :2 | echo line2 |
halt | :1 | echo line1 | goto retry
Das zeigt euch exakt, was passiert ;-) Ihr könnt auch
eine Variable als goto-Name verwenden:
:%jumppoint
Wenn Ihr %jumppoint den Wert 5 zuweist (/set %jumppoint 5),
dann kann diese mit /goto 5 angesteuert werden. Im oberen
Beispiel waren die Jumppoints, also die Abschnittskennzeichnungen
die vom /goto-Befehl angesteuert wurden mit "1"
und "2" festgelegt. Probiert mal die nächsten
drei Befehle aus, und schaut, was passiert:
/set %jump1 1
/set %jump2 2
/set %x 0 | :retry | inc %x | goto %x | :%jump2 | echo line2
| halt | :%jump1 | echo line1 | goto retry
Mit dem /return-Befehl kann man die Bearbeitung eines Befehls
beenden, und zu einer etwaigen Standardprozedur zurückkehren:
on 1:JOIN:#mIRC {
/echo 3 #mirc [Joins $nick]
/return
/echo 3 #mirc Diese Zeile wird nicht mehr ausgegeben!
}
Daraus ergibt sich dann folgendes:
[Joins henk]
*** henk (monster@ppp.dial.tip.nl) has joined #mIRC
Vorsicht
Achtet darauf, daß Ihr euch nicht in unvollständigen
Klammerdefinitionen verliert (z.B. eine geöffnete Klammer
nicht zu schließen ). mIRC kann sich dann sehr merkwürdig
verhalten!! Arbeitet sorgfältig! Ein spezieller Check-Button
ist in den Editor für die Aliase, Popups ind Remotes
eingebaut worden, der die Anzahl der geöffneten und geschlossenen
Klammern überprüft. Es ist der Knopf mit dem Bild
"{}" darauf.
/if /elseif /else
Ich denke, Ihr seid jetzt bereit für den richtig interessanten
Stoff! mIRC bietet eine einfache If-Then-Else-Schleife:
/if v1 Operator v2 { ... } | /elseif v1 Operator v2 { ...
} | /else { ... }
Beispiel:
Erstellt dieses Alias und startet es z.B. mit /test 4
/test { set %i 0 | :start | inc %i | if %i > $1 halt |
echo $active %i | goto start }
If-Then-Else-Schleifen können auch ineinandergeschachtelt
werden. Ihr solltet entweder {} oder () Klammern verwenden,
um ganz sicherzugehen, daß die Bedingungen in der richtigen
Reihenfolge bearbeitet werden, obwohl man es eigentlich nicht
*muß*. Die Verwendung von Klammern beschleunigt auch
die Bearbeitung ein bißchen, da mIRC dann genau weiß,
was es bewerten muß.
Hier sind die verfügbaren Vergleiche und Operatoren:
== gleich
!= ungleich
< kleiner als
> größer als
>= größer oder gleich
<= kleiner oder gleich
// ist ein Vielfaches von
\\ ist kein Vielfaches von
isin String v1 ist in String v2 enthalten
iswm String 1 mit Sternchen v1 paßt auf String v2
ison Nickname v1 ist auf Channel v2
isop Nickname v1 ist Ops auf Channel v2
isvo User v1 hat Srecherlaubnis auf Channel v2
isnum Zahl v1 ist eine Zahl im Bereich von v2 mit dem Format
n1-n2 (v2 ist optional)
ischan ob v1 mit Euch auf demselben Channel ist
isauto ob v1 ein User in Eurer AutoOp-Liste für Channel
v2 ist
isignore ob v1 ein User in Eurer Ignore-liste mit den Parametern
v2 ist (v2 ist optional)
isprotect ob v1 ein User in Eurer Protect-liste für den
Channel v2 ist (v2 ist optional)
isnotify ob v1 ein User in Eurer Notify-Liste ist
Um die oberen Operatoren umzukehren, kann man ein
! Ausrufezeichen voranstellen.
/if $nick !ison #mIRC { /echo $nick is NOT on #mIRC }
Beispiel:
/massinvite { echo 4 * Mass-inviting # | set %i $nick(#,0)
| :next | if $nick(#,%i) != $me invite $nick(#,%i) $1 | dec
%i | if %i > 1 goto next | echo 4 * Mass-invite # done
}
Verwendet dieses Alias so: "/massinvite #euerchannel".
Massinvites sind allerdings sehr unhöflich
Beispiel:
/randnopkick { :begin | set %kicknick $nick(#,$r(1,$nick(#,0)))
| if %kicknick isop # goto begin | /echo 6 %kicknick }
Wenn Ihr ein Op auf einem Channel seid, dann mögt Ihr
vielleicht diesen Nicht-Ops-Zufallskick. Es kickt eine Zufallsperson
aus Eurem Channel, jedoch nie einen Ops. (Anmerkung des Übersetzers:
Was ich jedoch enorm unhöflich finde!!). Wenn allerdings
nur Opse anwesend sind, dann habt Ihr ein Problem ;-)
Beispiel:
/line { %line = "" | if $asc($1) < $asc($2)
{ set %i $asc($1) | :add | %line = %line $chr(%i) | inc %i
| if %i <= $asc($2) { goto add } | if (%line == "")
{ halt } | else { echo # %line | halt } } else echo # sorry
not valid }
Startet dieses Alias z.B. mit "/line d k" und schaut,
was es tut. Es wird dann folgende Zeile ausgeben: "d
e f g h i j k". Das ist nicht viel und obendrein ziemlich
nutzlos, aber es demonstriert doch sehr gut, was man mit If-Then-Else-Schleifen
alles machen kann.
Beispiel:
/printnum1 { if $len($1) = 1 { if $1 !isin 1234567890 {
echo 6 $1 is not a number | goto end } } | elseif $len($1)
= 2 { if $mid(1,1,$1) !isin 1234567890 { echo 6 $mid(1,1,$1)
is not a number | goto end } | elseif $mid(2,1,$1) !isin 1234567890
{ echo 6 $mid(2,1,$1) is not a number | goto end } } | elseif
$len($1) > 2 { echo 6 $1 has too many chars | goto end
} | { set %x 1 | :begin | echo 6 %x | if %x >= $1 { goto
end } | else { inc %x | goto begin } | :end } }
/printnum2 { if $1 !isnum { echo 6 $1 is not a number | goto
end } | elseif $1 !isnum 0-99 { echo 6 $1 is a too large number
| goto end } | { set %x 1 | :begin | echo 6 %x | if %x >=
$1 { goto end } | else { inc %x | goto begin } | :end } }
Diese Aliases tun exakt das selbe. Sie listen beide die Zahlen
bis zu einem bestimmten vom Benutzer definierten Wert auf.
Versucht es mit "/printnum1 14". Das zweite Alias
zeigt, wie man mit korrektem Gebrauchvon Identifiers die Länge
eines Alias anorm verkürzen kann.
Leere oder ungültige Identifiers
Variablen oder Identifiers, die keinen Wert enthalten, erwidern
$null, können also auch zu vergleichenden Definitionen
herangezogen werden.
Beispiel:
/listops { echo 4 * Listing Ops on # | set %i 1 | :next
| set %nick $nick(%i,#) | if %nick == $null { goto done }
| if %nick isop # { echo 3 %nick is an Op on # } | inc %i
| goto next | :done | echo 4 * End of Ops list }
Dieses Alias wird alle Opse des Channels aufzählen, in
dem es ausgelöst wurde.
Oder in einem Remote-Event:
on 1:CTCPREPLY:PING* {
if ($2 == $null) echo [ $+ $nick PING reply]
else {
%pt = $ctime - $2
if (%pt < 0) set %pt 0
echo [ $+ $nick PING reply] %pt seconds
}
halt
}
Andere PopUp-Beispiele
GiveOps { %i = 0 | %nicks = "" | :nextnick | inc
%i | if ($snick(#,%i) == $null) { if ($len(%nicks) > 0)
mode # +oooo %nicks | halt } | %nicks = %nicks $snick(#,%i)
| if (4 // %i) { mode # +oooo %nicks | %nicks = ""
} | goto nextnick }
Dieses Popup in der Menüleiste wird alle ausgewählten
Nicknamen auf einem Channel open, in dem Ihr selber Ops seid.
--------------------------------------------------------------------------------
Selkick:/kick # $token($r(1,$snick(#,0)),44,$snicks)
Dieses Popup wird nach dem Zufallsprinzip einen von mehreren
ausgewählten Usern kicken.
--------------------------------------------------------------------------------
RandNopkick:/kick # $nopnick(#,$r(1,$nopnick(#,0)))
Kickt zufällig einen Nicht-Ops aus dem Channel, in dem
Ihr Euch befindet
--------------------------------------------------------------------------------
RandNopkick { :begin | /set %kicknick $nick(#,$r(1,$nick(#,0)))
| if %kicknick isop # goto begin | /kick # %kicknick }
Kickt ebenfalls zufällig einen Nicht-Ops aus dem Channel,
in dem Ihr Euch befindet
--------------------------------------------------------------------------------
Randkick:/kick # $nick(#,$r(1,$nick(#,0)))
Machen Kicks nicht Spaß??? Hier noch einer... Dieser
kickt völlig zufällig irgendeinen User - unter Umständen
auch sich selbst!
--------------------------------------------------------------------------------
RandOpkick:/kick # $opnick(#,$r(1,$opnick(#,0)))
Kickt zufällig irgendeinen Ops... die können sich
wenigstens wehren!! >=)
--------------------------------------------------------------------------------
Endlosschleifen
Ich sehe es schon kommen. Irgendwann werdet Ihr Euch mal
in einer Endlosschleife verlieren. Ein einfaches Beispiel
dafür ist:
/loop { :start | echo 6 # test loop | goto start }
Wenn Euch so etwas passiert, dann rettet Euch die Tastenkombination
Strg+Pause. Sie stoppt die Bearbeitung.
Benutzerdefinierte Fenster
In mIRC 5.0 wurde ein neues Tool hinzugefügt, mit dem
man selbst Fenster nach eigenem Belieben erstellen kann. Mit
diesem Fenster-Erstellungs/Manipulations-Tool kann man zum
Beispiel ein Fenster schaffen, in dem man nachschauen kann,
was das eigene Script gerade tut. Ein benutzerdefiniertes
Fenster wird mit dem /window-Befehl erstellt. Es kann mit
vielen Parametern festgelegt werden, was für eine Art
Fenster mIRC schafft, wo es sich befindet und was es enthalten
soll.
/window [-abcdelnorsx] @name [x y [w h]] [/Befehl] [popup.txt]
[Schriftart [Größe]]
Einstellungen:
a Fenster aktivieren
b Breite der horizontalen Bildaufleiste für die Listenbox
auf den neuesten Stand bringen
c Fenster schließen (close)
d als Desktop-Fenster öffnen
e Editbox
l Listenbox
n Fenster minimieren
o wenn das Fenster sich auf dem Desktop befindet, dann immer
im Vordergrund behalten
r Fenster wiederherstellen (restore)
s eine sortierte Liste verwenden
x Fenster maximieren
@name Name des Fensters (ein @ muß vorangestellt werden)
x,y,w,h obere Linke Position, Breite und Höhe des Fensters
popup.txt Datei für die fensterspezifischen Kontextmenüs
/Befehl Standartbefehl
Schriftart/ Schriftart und Größe für das Fenster
festlegen. Standardmäßig werden die Einstellungen
des Statusfensters genommen.
Größe
Man kann den /window-Befehl auch verwenden, um die obenstehenden
Einstellugen für ein existierendes Fenster zu manipulieren.
Die folgenden Befehle stehen für die
Veränderung von Zeilen zur Verfügung:
/aline [-cN] @name Text Zeile zur Liste hinzufügen
/dline @name N Nte Zeile löschen
/iline [-cN] @name Text Zeile nach der Nten Zeile einfügen
/rline [-cN] @name Text Nte Zeile ersetzen
/sline @name N Nte Zeile auswählen
-cN definiert die Farbe der Zeile
Man kann den $window(N/@name)-Identifier verwenden, um auf
die folgenden Fenster-Informationen zuzugreifen:
$window(N).x links
$window(N).y oben
$window(N).w Breite
$window(N).h Höhe
$window(N).state minimiert/maximiert/normal
Um direkt auf Zeilen in benutzerdefinierten Fenstern zuzugreifen
können folgende verwendet werden:
$line(@name,N) Erwidert die Nte Zeilge
$sline(@name,N) Erwidert die Nte ausgewählte Zeile (nur
für Listenboxen)
$sline(@name,N).ln Erwidert die Zeilennummer des ausgewählten
Listengegestandes
Dieses neue Tool bietet eine Menge Spielraum für kreative
Zwecke, man muß aber ein bißchen herumtüfteln,
um genau zu verstehen, wie es funktoniert. Viel Spaß!
|