A mIRC scriptnyelve

II. rész: Aliases

Előző alkalommal a menük átírásával már elkápráztathattuk magunkat - itt az ideje, hogy másokban is hasonló érzéseket keltsünk, jelen esetben azzal, hogy milyen gyorsan tudunk visszafele gépelni.  A Tools/Aliases alatt található a mIRC azon része, ahol új parancsokat definiálhatunk, vagy régieket másíthatunk meg. Most egy olyan parancsot fogunk készíteni, mely a paramétereit visszafele írja ki az aktuális ablakba, azt a látszatot keltve, hogy mi gépeltünk úgy. Az Aliases felépítése igen egyszeru: a parancsnak szánt szó után itt is "{" "}" jelek között van az általunk írt algoritmus. Az Fx, sFx és a cFx (ahol x egy egész szám 0-13 között) parancsok az F1-F12 billentyűkkel, illetve azok SHIFT-tel vagy CONTROL-lal való együttes lenyomásával is futtathatóak - így ilyen neveken a gyakran használt funkciókat érdemes definiálni.

A menüknél szerzett tudásunkat két fontos dologgal kell bővítenünk. Aki programozott már, annak ismerősek a változók - a mIRC-ben ezek kezelése rendkívül egyszerű, még a típusukat sem kell megadni használatuk előtt. A változók nevei "%" jellel kezdődnek - a későbbiekben ezzel a névvel tudunk hivatkozni egy adott számra ill. szövegre, amit előtte értékül adtunk neki. Pl. ha set %proba kutya parancsot adjuk ki (amit egyszerűbben $proba = kutya formában is írhatunk), akkor az msg $active %proba eredménye az lesz, hogy az aktuális ablakba a "kutya" szót írjuk. A változók aktuális értékeit a Variables menüpont alatt tekinthetjük meg. A ciklusok legalább olyan fontosak, mint a változók - a nagyon egyszerű kódsorokat leszámítva nem igen boldogulunk nélkülük. A ciklus az egymás után elvégzendő, azonos programkódot igénylő munkákat egyszerűsíti le - adott esetben pl. nem kell tízszer leírni ugyanazt a parancssorozatot, elég ha egy goto parancs segítségével visszaugrunk egy ":" kezdettel megadott címkére, hogy újból lefuthassanak az utána álló utasítások.

Ezzel az úgynevezett hátultesztelő ciklust valósítottuk meg, mely nevét onnan kapta, hogy csak az első lefutás után ellenőrizzük le, hogy az adott feltétel (ami alapján eldöntjük, hogy lefusson-e még egyszer a goto és a ":" közötti kódrészlet) teljesült-e. A mIRC lehetővé teszi előltesztelős ciklus létrehozását is, ezt a while [feltétel] { [utasítások] } segítségével tehetjük meg. Ilyenkor az utasítások csak akkor futnak le, ha (és amíg) az előzőleg megadott feltétel fennáll. Fontos ügyelni arra, hogy valamilyen módon mindenképp kijussunk a ciklusból, azaz ne kerüljünk végtelen körforgásba. A kilépési feltételek mellett erre használhatjuk a return és a halt parancsokat is. Míg az előbbinél, ha másik parancsból hívtuk meg, akkor visszaugrik annak futtatásához, az utóbbinál tökéletesen leáll a program futása. A következő ciklus például végtelen, mert nincs olyan hely, ahol megállhatna:

%a = 0[ENTER]

:ciklus[ENTER]

inc %a[ENTER]

goto ciklus[ENTER]

Ha viszont a :ciklus és a goto ciklus közé beszúrunk egy if %a = 10 { halt } sort, akkor a ciklusunk 10 futás után megáll, hiszen a feltétel teljesül, s így lefut a halt parancs.

Három új függvényt is meg kell ismernünk a visszafele író script megírásához. Az első a $len, amely egy adott szöveg hosszát adja vissza. A második a $mid, amely három paramétert kap: az első egy szöveg, a második az a szám, ahányadik karaktertől kíváncsiak vagyunk a szövegre, a harmadik pedig az, hogy a másodikként megadott karaktertől számítva hány utána lévőt kapjunk eredményül a függvény meghívása után. A harmadik függvényünk a $remove, amely egy adott karakterláncban (ez a függvény első paramétere) megkeresi, és kiveszi belőle a további paraméterekként megadott karakterláncokat. Az áttekinthetőség érdekében a sorok végét most is [ENTER]-rel zárom, ezeket a forrásba természetesen nem szabad beleírni, helyettük ENTER-t kell ütni!

vissza {[ENTER]

;megadtuk az új parancsunk nevét (vissza)[ENTER]

if $1 = $null { return }[ENTER]

;ha nem adtunk meg paramétert a parancs meghívásakor, akkor nincs mit csinálnunk, tehát befejezzük annak futását ($1 és $null leírását lásd a popups-ról szóló részben)[ENTER]

%hossz = $len( $1- )[ENTER]

;a %hossz változóban eltároljuk, hogy milyen hosszú a megfordítandó szöveg. Ez ahhoz kell, hogy a $mid utasítással először a legutolsó karaktert kapjuk meg.[ENTER]

%mond = ""[ENTER]

;lenullázzuk a %mond változót, hátha volt benne valami (pl. egy másik program szemetelt bele). Ebben fogjuk tárolni a kész, megfordított szöveget. írhattuk volna azt is, hogy unset %mond[ENTER]

:ismet[ENTER]

;cimke - ide fog majd visszaugrani a goto utasításunk [ENTER]

%mond = %mond $+ $mid($1-, %hossz, 1 ) $+ [CTRL+B][CTRL+B][ENTER]

;a %mond-nak értékül adjuk saját magát + a paraméter %hossz–szadik karakterét. Ez először az utolsó karaktert fogja a %hossz-nak értékül adni, utána - mivel a %hossz-t csökkenteni fogjuk a következő lépésben - az utolsó elottit, s így tovább, szépen sorban minden karakter belekerül - visszafelé... A [CTRL+B]-t nem beírni kell, hanem megnyomni. Ez azért fontos, mert a mIRC nem veszi figyelembe a változó végén lévő szóközöket, ha viszont két [CTRL+B]-t rakunk oda, akkor semmiképpen nem lesz ez az utolsó karakter.[ENTER]

dec %hossz[ENTER]

if %hossz > 0 goto ismet[ENTER]

;ha a %hossz = 0, azaz már minden karakter szerepel a %mond-ban, akkor készen vagyunk: kiléphetünk a ciklusból. Ellenkező esetben visszaugrunk a címkére, és folytatjuk a ciklus futását.[ENTER] %mond = $remove( %mond, [CTRL+B][CTRL+B] )[ENTER]

msg $active %mond[ENTER]

unset %mond %hossz[ENTER]

;kiírjuk a megfordított szöveget az aktuális ablakba, de előtte megtisztítjuk a szóközök miatt belerakott [CTRL+B]-től. Ezután az unset parancs segítségével lenullázzuk a változókat, hogy ne maradjon szemét.[ENTER]

}[ENTER]

Ezen sorokat a Tools/Aliases-be írva máris élvezhetjük a visszafele írás könnyedségét, csak a /vissza parancsot kell beírnunk, s utána a kiírandó szöveget. Mivel a Status-ba nem tudunk írni msg-vel, ahhoz, hogy ezt a scriptet (ill. más próbálkozásokat) tesztelni tudjuk, egy IRC szerverre van szükség, ez pedig meglehetősen nagy költségeket jelent egy saját script fejlesztésnél, amennyiben telefonon keresztül kapcsolódunk a hálózatra.

A fenti esetben ez még kiküszöbölhető, ha az msg parancsot echo-ra cseréljük ki, de van olyan helyzet, amikor ilyesmi nem elég a teszteléshez. Erre a problémára kitunő megoldás, ha telepítünk otthonra egy IRC szervert. Ilyenekből sokféle létezik, egyik kedvencem közülük a WIRC Server, amelynek tesztverziója szabadon másolható, és a hálózatról letölthető. Habár a felhasználók maximális száma 10-re van korlátozva, ennél többre egy script tesztelésénél nem sokszor van szükség, így az egyszerű konfigurálhatósága, és rövidsége miatt érdemes ezt a programot használni. Script írásakor fontos figyelembe venni, hogy nem minden fog úgy működni az IRCNeten, mint az otthoni szerveren, hiszen akadnak különbségek a két szerver között. A WIRC szerver nem támogatja a WHOWAS parancsot, nincsenek rajta a szerver által fenntartott csatornák (&servers, stb.), nincs meg a hármas megkötés az egyes mode parancsokra, és az IRCOP-ok sokkal több privilégiummal rendelkeznek rajta, mint az IRCNet-es szervereken.

A wircsrv.exe indítása után a mIRC-ben a /server 127.0.0.1 utasítással csatlakozhatunk a szerverhez, és ettől kezdve a scriptünket úgy tesztelhetjük, mintha on-line lennénk. A 127.0.0.1 helyett (ez egy hivatkozás a saját gépünkre) használhatjuk a gép nevét is, amelyet a Windows installálásakor adtunk meg.  A saját parancsok gyártásához fontos ismerni a mIRC függvényeit, ezek egy részéről magyar leírást a www.extra.hu/webcen/irc.htm oldalon olvashatnak, ill. érdemes ötleteket meríteni mások forrásaiból. Ilyeneket például a www.mircscripts.com és a www.mirc.net címeken érhetünk el, ill. A video.fw.hu/scream címről letölthető egy általam írt, magyar nyelvű script is, melyben a fenti példához hasonlóakat is találhatnak.

Varga Gábor