Hirdetés

Alkalmazásfejlesztés badára: IRC protokoll bevezető

Az elmúlt időszakban önszántamon kívül elhanyagoltam a blogot, ami miatt az olvasók és minden érintett elnézését kérem. Most már itt vagyok, az alkalmazásfejlesztői blog pedig folytatódik.

Érdekes dolgok derültek ki a Wave tesztjének topikjában. Egy-két szerencsés tulajdonos prémium módban futó telefont kapott a boltban (vélhetően azért, mert a készülékük olyan országból származik, ahol a premium verzió létezik), miközben a többségnek (köztük nekem is) a basic mód egyszerűsége maradt. Mivel számomra nagyon fontos az IM, a hegy pedig nem jön ide, marad az, hogy elkészítem a megfelelő eszközt: egy natív bada IRC klienst.

Miért pont IRC?

KISS, avagy "Keep It Simple, Stupid!" szól az egyik nekem kedves irányelv. Az 1988-ban megjelent Internet Relay Chat teljesen megfelel ennek, egy szöveges, ember által is könnyen emészthető chat protokoll. Eredetileg arra készült, hogy az azonos hálózatra fellépett felhasználókkal csoportos (csatornák) vagy privát beszélgetést lehessen folytatni, majd idővel megjelentek új kiegészítések, mint például a DCC - közvetlen P2P kapcsolat másik kliensekkel -, így akár fájlokat is lehet egymás között küldeni. A szerverek kommunikációja is bonyolódott, de ez minket nem érint.

Az IRC önmagában is nagyon hasznos, nem véletlen népszerű, de van még egy ráadás: a BitlBee lehetővé teszi, hogy MSN, GTalk és egyéb IM partnerekkel (a teljes listát lásd az oldalukon) bármilyen IRC klienssel kommunikálhassunk. A szoftver egy IRC szervert emulál, rajta egy csatornával, ahol az IM profilokat kezelő bot (root) ül, illetve sikeres kapcsolódás után a partnerlisták tagjai is. Üzengetni privát üzenetekkel lehet, a konferenciabeszélgetések ideiglenes csatornákon zajlanak, sőt most olvastam, hogy a fejlesztői branchben már fájlküldés is lehetséges. Azaz minden, amire szükség lehet. :)

Mennyire egyszerű?

A protokoll alapelemeit a következő ábra mutatja. Nem teljesen formális, hiszen nem definiáltam a legapróbb betűig a részeket, de a lényeg így is látható.

Hogy néz ki a gyakorlatban?

A protokoll alapjainak demonstrálására az OSX beépített telnet kliensével csatlakoztam a BitlBee publikus szerverére. Az általam küldött sorokat kiemeltem.

bash-3.2$ telnet im.bitlbee.org 6667
Trying 94.142.241.50...
Connected to im.bitlbee.org.
Escape character is '^]'.
:im.bitlbee.org NOTICE AUTH :BitlBee-IRCd initialized, please go on

A kapcsolat felépült, első lépésként azonosítani kell magunkat. A USER és NICK parancsok valóak erre, az előbbi a felhasználónevet és a valódi nevet állítja be, az utóbbi pedig a mindenki által kapásból látható becenevet. A USER utolsó paraméterénél látható egy fontos koncepció: amennyiben egy paraméter szóközt tartalmazhat, ":" karakterrel kell prefixálni.

USER vzsg * * :Testing IRC through telnet
NICK karma
:im.bitlbee.org 001 karma :Welcome to the BitlBee gateway, karma
[ ... ]

A szerver elfogadta az infómat, úgyhogy elküldte a "Message of the Day" üzenetet, amit terjedelmi okokból kivágtam. A szöveg végén azért előkerülök ismét:

:karma MODE karma +s
:karma!vzsg@catv-89-134-52-68.catv.broadband.hu JOIN :&bitlbee
:im.bitlbee.org MODE &bitlbee +t
:im.bitlbee.org 353 karma = &bitlbee :@karma @root
:im.bitlbee.org 366 karma &bitlbee :End of /NAMES list
:im.bitlbee.org 332 karma &bitlbee :Welcome to the control channel. Type help for help information.

A szerver "s" módot adott nekem, azaz a szervertől küldött broadcast üzeneteket én is megkapom. Mivel ez nem "igazi" IRC, nincs nagy jelentősége. A következő üzenet érdekesebb, mert normál felhasználás mellett többször találkozni vele: a szerver beléptetett a &bitlbee csatornába, majd kilistázta a tagjait.

:root!root@im.bitlbee.org PRIVMSG &bitlbee :Welcome to the BitlBee gateway!

És itt az első üzenet, amit a korábban említett root küldött. A PRIVMSG üzenet előtagja a feladó, :becenév!felhasználónév@szerver formában. Az első paraméter a címzett - ez az üzenet a &bitlbee csatorna minden felhasználójának szól, így megkaptam én is -, végül az üzenet szövege következik. Gondoltam megkérdezem, ki is ez a root:

WHOIS root
:im.bitlbee.org 311 karma root root im.bitlbee.org * :User manager
:im.bitlbee.org 312 karma root im.bitlbee.org :BitlBee
:im.bitlbee.org 318 karma root :End of /WHOIS list

A szerver periodikusan PING üzeneteket küld, amire pontosan és gyorsan válaszolni kell PONG üzenettel, különben kihajít:

PING :PinglBee
PONG :PinglBee

Küldök én is egy üzenetet:

PRIVMSG &bitlbee :help account
:root!root@im.bitlbee.org PRIVMSG &bitlbee :'Syntax:' account []
:root!root@im.bitlbee.org PRIVMSG &bitlbee :
:root!root@im.bitlbee.org PRIVMSG &bitlbee :Available actions: add, del, list, on, off and set. See 'help account ' for more information.

Végül kilépek:

QUIT
ERROR :Closing link: Leaving...
Connection closed by foreign host.

Tehát a USER, NICK, JOIN (és PART), QUIT, PRIVMSG, PING és PONG üzenetek kezelése már elegendő egy alapfunkciós kliens működéséhez. Már csak egy alkalmazás kell, ami felhasználóbaráttá teszi a kommunikációt. A következőkben ezt tervezem meg és készítem el.

Ha valakit részletesebben is érdekel, az RFC 2812 foglalkozik a kliens-oldali protokollal. A nyelvtan ábráját EBNF Visualizerrel készítettem.

Karma

Azóta történt

Előzmények