A mIRC scriptnyelve

A mIRC kezelőfelületével és parancsrendszerével már megismerkedtünk - de van a mIRC scriptelésnek interaktívabb része is, s mivel eddig még nem találkoztunk vele, az minden bizonnyal a Tools/Remote menüpont alatt lelhető.

III. rész: Remote

A programozáskor legtöbbet használt rész egyúttal a legösszetettebb is - IRC kliensünk egy-egy ingerre való reakciójának közvetítése mellett az Aliases és a Popups szerepét is képes ellátni. Ha Remote scriptünkben akarunk új parancsot elhelyezni, akkor azt a sor elején lévő alias parancs segítségével tehetjük meg (a szintaxis innentől megegyezik az Aliases-nél írtakkal), amennyiben pedig menü írására szeretnénk használni, a sor elején lévő menu szócskával hozhatjuk mIRC-ünk számára ezt nyilvánvalóvá (a menu szó után az adott ablak neve kell hogy szerepeljen, majd a továbbiakban a Popups-ban tanultak szerint cselekedhetünk).

Az inger-figyelés szintaxisának megértéséhez fontos tudni, hogy a mIRC-ben egyes host-okhoz különbféle User-szinteket rendelhetünk (lásd Users fülecske), ezáltal szabályozva, hogy egy-egy kitüntetett felhasználóval szemben miként viselkedjen kliensünk. Amennyiben egy külső hatásra mindenkinek egyformán kell felelni, ezt a részt figyelmen kívül hagyhatjuk. A ctcp és a raw figyelések kivételével egységes formátumban kell megadni a különböző eseményekre szánt reakciókat:

on [felhasználó szint]:[inger]:[esetleges paraméter(ek)]: { [reakció]}

Ha pl. azt szeretnénk, hogy mindenkit üdvözöljön a scriptünk, aki a #magyar csatornára érkezik, akkor ehhez az

on *:JOIN:#magyar: { /msg $chan Szia $nick $+ ! }

 sort kell a Remote-ba szúrnunk (a $nick, $chan, $+ függvények jelentését lásd. az Aliases-ről szóló cikkben).

A Remote-nál is használhatunk kitüntetett karaktereket - egyikük a ^, melyet közvetlenül a felhasználó szintje elé rakva eltüntethetjük a mIRC alapértelmezett reakcióit (pl. JOIN-nál a csatira írt információt arról, hogy valaki érkezett). A másik két fontos karakter pedig a * és a ? - őket a paramétereknél és a felhasználó szintek megadásánál lehet használni (a * tetszőleges karaktersorozatot, a ? pedig tetszőleges karaktert helyettesíthet). A * és a ?, # társukkal együtt akkor is használható, ha azt kell megadni, hogy mely helyeken érvényes az adott szabály - a ? azonban így a privát msg-ket, a # pedig az összes csatornát jelöli, míg a * a privát msg-ket és a csatornákat együttesen szimbolizálja.

E havi scriptünkben a CTCP PING válaszát fogjuk kicserélni egy-egy meglepő véletlenszerű szövegre - de előtte nézzük végig a legfontosabb ingereket és paramétereiket:

on[felh. szint]:TEXT:[szöveg]:[hely]: { [parancs] } - ha az adott szöveget az adott helyen írja valaki, akkor végrehajtódik a parancs.

Hasonló szintaxisú: NOTICE, ACTION.

on [felh. szint]:OP:[csatorna]: { [parancs] } - akkor fut le a parancs, ha valaki OP-ol valakit az adott helyen. Hasonló szintaxisú: DEOP, VOICE, DEVOICE, HELP (IRCNet-en nincs), DEHELP (IRCNet-en nincs), SERVEROP (ha netsplit miatt a server opol valakit), JOIN, PART, KICK, BAN, UNBAN, MODE, SERVERMODE, TOPIC.

on [felh. szint]:QUIT: { [parancs] } - ha valaki lelép IRC-ről, akkor a parancs végrehajtódik. Hasonló szintaxisú: START (amikor a mIRC betöltődik), CONNECT (szerverrel való sikeres kapcsolat megkezdése esetén), USERMODE (felh. mód váltása esetén).

CTCP [felh. szint]:[paraméter]: { [parancs] } - adott paraméterrel küldött CTCP esetén fut le a parancs. raw [raw száma]:[paraméter]: { [parancs] }

Nem véletlenül került a raw a legutolsó helyre, hiszen ez a legösszetettebb az összes közül - gyakorlatilag bármit figyelhetünk vele (s egyes dolgokat kizárólag vele tudunk figyelni), csak az adott parancshoz tartozó számot kell tudnunk hozzá. Ennek megértéséhez, és használatához fontos ismerni az IRC RFC-t [1459] (itt van leírva, hogy miként is működik ez az egész rendszer), vagy - kevésbé érdeklődőknek, és az egyszerű kezelőfelületet kedvelőknek - érdemes elolvasni, és használni a Jeepster féle IRC Numeric Reference-et, melyet a www.ircworks.com címről lehet letölteni.

Példaképpen néhány fontosabb hibaüzenet száma:

406 - nem találtam ilyen nick-et

432 - a nick hibás

433 - a nick foglalt

471 - a csatornára nem férsz be

473 - a csati +i-s

474 - a csatiról BAN-olva vagy

475 - a csati jelszavas

482 - nem vagy opos a csatin.

Eme információzuhatag után nézzük végre az ígért példát! Sokan nem szeretik, ha PING-elik őket mások - nekik lesz most egy kis meglepetés: a következő script használatával a CTCP PING válasza helyett egy véletlenszerű szöveget kap a PING-elő válaszul.

ctcp *:PING:{[enter]

;ha bárki CTCP PING-et küld nekünk, akkor a következő utasításokat kell végrehajtani: [enter]

haltdef [enter]

;letiltjuk az eredeti választ [enter]

%ra = $rand(1,3) [enter]

;a %ra változónak a $rand függvény segítségével véletlenszeru értéket adunk (1-től 3-ig terjedőt) [enter]

if %ra = 1 { %szoveg = Miert vagy ra kivancsi $nick $+ ? } [enter]

elseif %ra = 2 { %szoveg = $nick $+ , $nick $+ , nem mondtak meg neked, hogy ezt nem illik? } [enter]

else { %szoveg = Pong! 8) } [enter]

;a random értéktől függően kiválasztunk egy szöveget, ami a válasz lesz [enter]

ctcpreply $nick PING %szoveg [enter]

;elküldjük a szöveget válaszként a PING-re [enter]

unset %szoveg [enter] unset %ra [enter]

;a használt változókat lenullázzuk, hogy ne maradjon bennük szemét [enter]

} [enter]

Mivel esetenként lehetséges, hogy egyes script-részeket - pl. ezt a szöveges ping választ - nem szeretnénk használni, érdemes csoportokba szervezni az esetlegesen kikapcsolandó részeket. A csoport eleje egy #[csoport neve] [on/off]-al kezdődik, ahol természetesen az on jelzi a bekapcsolt, az off pedig a kikapcsolt állapotot, a csoport vége pedig egy #[csoport neve] end-el van jelölve. A későbbiekben az /enable [csoport neve], ill. a /disable [csoport neve] parancsokkal tudjuk engedélyezni vagy letiltani az adott csoport használatát. Az utasítások végrehajtását szépítendő, gyakran lehet szükségünk arra, hogy egy-egy parancs ne jelezzen vissza, miután sikeresen lefutott (eredetileg ezt tenné pl. az enable, vagy a disable is, ill. az msg-k is látszanak a képernyőn, mikor küldjük őket) - ilyen esetekben az utasítás elé közvetlenül egy pontot kell tenni (pl. /.msg), így annak futásáról a felhasználónak semmiféle tudomása nem lesz.

A Remote scriptek legfőbb problémái abban rejlenek, hogy legtöbbjük folyamatosan teszi teendőit, nem figyelve a floodolásra - a netsplitek és a lag elkerülése végett ugyanis a serverek automatikusan eltávolítják azokat a szerverről, akiknek túlságosan nagy az adatforgalmuk. Ha pl. a scriptünk minden köszönőnek visszaköszön, akkor egy rosszindulatú felhasználó a köszönések gyors ismétlésével kifloodolhat minket a szerverről.

Egy helyesen megírt script mindig figyel az ilyen eshetőségekre - így pl. a CTCP-t küldő illető CTCP-it 20 mp-re rögtön ignore-olhatjuk a fenti scriptben, egy .ignore -tu20 $wildsite parancs segítségével. Mivel az emberek többnyire szeretnek tudni arról, ami velük történik - s ez IRC-n sincs másként - az eredeti válasz letiltását kiegyensúlyozandó, érdemes egy echo 4 -a *** $1 from $nick $+ ! sort is beszúrni a CTCP-k figyeléséhez, hogy a felhasználó is értesüljön a PING érkezéséről. Az echo parancs segítségével a képernyőre írhatunk - a négyes szám jelen esetben az írás színét adja, míg a -a az aktuális ablakra való hivatkozás (ami helyett állhat egy ablak neve is). A script elkészültével a legvégső dolgunk - amennyiben mások által is elérhetővé akarjuk tenni - a dokumentáció. Sok megválaszolásra váró kérdéstől kímélhetjük meg magunkat, ha az esetleges publikáláskor megfelelő kezelési útmutatót is adunk a felhasználóknak.

Varga Gábor