V tomto článku sa snažím popísať vlastnú implementáciu IRC klienta, ktorý má sprístupniť IRC pre bežných ľudí a otvoriť tak zomierajúcu IRC komunitu aj ľuďom, ktorý nie sú technicky zdatný a majú problém nainštalovať bežného IRC klienta. Názov tohoto IRC klienta je 3wIRC [1]. Bol vyvíjaný tak, aby ho vedel používať každý, kto si vie pozrieť video na http://youtube.com a teda na jeho použitie stačí použiť prehliadač s nainštalovaným flashPlayerom. Na implementáciu bolo použité prostredie Adobe Flex Builder 3 a technológie ActionScript 3.0, mxml.

1. Úvod

IRC bolo vyvinuté v roku 1988 a od tej doby vzniklo mnoho klientov podporujúcich tento protokol. Väčšina klientov však vyžaduje inštaláciu, čo robí niektorým ľuďom problémy, najmä keď množstvo portálov (ako napríklad facebook.com, pokec.sk atď) poskytuje omnoho jednoduchšiu alternatívu ako komunikovať s ľudmi – jednoduché zadanie URL do prehliadača.

Existuje mnoho klientov, ktorý fungujú cez web rozhranie (ako napríklad mibbit, alebo CGI::IRC), ale tieto zväčša používajú sprostredkovateľa pripojenia a pripájajú sa prostredníctvom servera. Ďalším problémom je závislosť na prehliadači, keďže tieto programy využívajú vo veľkej miere javaScript, ktorého možnosti sa v prehliadačoch líšia a zároveň medzi sebou nie sú vždy kompatibilné, čo prináša aj dnes problémy pri vývoji a taktiež aj pre samotných používateľov.

Riešenie pomocou flashu obchádza tieto problémy, pretože flashPlayer je v každom prehliadači rovnaký a teda každý, kto ho má nainštalovaný, môže používať aj 3wIRC.

2. IRC clients

Na obrázkoch 1 a 2 sú zobrazené bežne používaní klienti pre Windows (mIRC) a Linux (irssi), na obrázku 3 je znázornená možnosť pripojenia sa cez telnet. Na obrázkoch 4, 5 a 7 je zachytené prostredie 3wIRC. Podrobnejší prehľad IRC klientov a ich rozdielov nájdete tu [2].


Obr. 1. pripojenie na IRC v prostredí mIRC


Obr. 2. pripojenie na IRC prostredí irssi


Obr. 3. pripojenie na IRC pomocou telnet-u v CLI

3. Protokol IRC

IRC je „text based“ protokol, čiže z väčšej časti pracuje s „human readable“ dátami (RFC 1459 [3]), ktoré vo všeobecnosti majú formát:

:<header>[:<params>]

kde header (hlavička) má formát:

<from>[<command>[<commandArguments>]]

a from (pôvodca) správy má (zväčša) formát:

<nick>!<ident>@<host>

alebo:

<server>

Príklad celej prijatej správy:

:mojeMeno!ident@grepfruit JOIN #post.sk

Správa sa delí do nasledovnej štruktúry:

  • header: mojeMeno!ident@grepfruit JOIN #post.sk
    • from: mojeMeno!ident@grepfruit
      • nick: mojeMeno
      • ident: ident
      • host: grepfruit
    • command: JOIN
    • arguments: #post.sk
  • params:

Alebo príklad s obsahom:

:nick!ident@grepfruit PRIVMSG #post.sk :ahojte

  • header: mojeMeno!ident@grepfruit JOIN #post.sk
    • from: mojeMeno!ident@grepfruit
    • command: JOIN
    • arguments: #post.sk
  • params: ahojte

Znak # v oboch prípadoch znamená, že sa jedná o channel (kanál, miestnosť) a nie query (súkromný rozhovor, osobu). Komunikácia spätne prebieha v princípe rovnako.

&l<header>][:<content>]

Príklad poslania správy na kanál:

PRIVMSG #post.sk :ahojte!

  • command: PRIVMSG
  • header: #post.sk
  • content: ahojte

4. Všeobecné fungovanie 3wIRC

FlashPlayer ponúka ochranu proti nechcenému zneužívaniu pripojení na vzdialený server, preto si pred pripojením vyžiada od servera na ktorý sa pripája dokument, takzvaný „crossdomain.xml“, ktorý obsahuje nastavenia s povolenými portami z rozličných domén. Na posunutie crossdomain.xml flashPlayeru sa používa flashPolicyD, bez ktorého pokus o pripojenie zahlási chybu: SandBox violation.

Pre prihlásenie je z programátorského hľadiska najpodstatnejšia triedna ApplicationIRCEx, kde sa vykonáva:

// Socket&&bind
socket = new Socket();
socket.addEventListener(ProgressEvent.SOCKET_DATA,
this.connectionReceiveData);
socket.addEventListener( Event.CLOSE, this.connectionClosed);
socket.addEventListener( Event.CONNECT,
this.connectionConnected);
socket.addEventListener( IOErrorEvent.IO_ERROR,
this.connectionError);
socket.addEventListener( SecurityErrorEvent.SECURITY_ERROR,
this.connectionSecurity);
// Connect
socket.connect( this.server, this.port);

Táto trieda sa taktiež stará o nastavenie všetkých „eventHandler“-ov a teda zliepa všetko dohromady.


Obr. 4. úvodný (prihlasovací) formulár

Trieda ApplicationIRCEx je rozšítením triedy ApplicationIRC, ktorá sa stará o vypisovanie správ v správnom formáte podľa ich typu, prípadne o úpravu počtu ľudí na kanáli atp. Táto trieda je odvodená od triedy ApplicationEx, ktorá má na starosti v podstate výhradne windows managment (správu okien).

Akonáhle je klient úspešne pripojený príma správy od servera, ktoré následne prekladá pomocou triedy: DataParser, ktorá je jadrom celého programu a jej princíp fungovania je v:

text = text.replace( "\n", "").replace( "\r", "")
var parts:Array =
text.match( /^:([^ ]+) ([^ ]+) ([^:]*):(.*)$/);
if( !parts){
// May be 004
if( text.match( /^:([^ ]+)
(004|333|MODE|PART) (.*)([^ ]+)(.*)$/)){
return this.parse( text + ": ");
}
// Or PING
if( text.match( /^PING : (.+)$/i)){
return
this.onPing( text.replace( /^PING : (.+)$/i, "$1"));
}
// FAIL
this.onFailParse( text);
return;
}

Uplynulé riadky, rozložia text na hlavičku, argumenty a parametre a zároveň ošetria všetky typy správ, ktoré nemajú „bežný formát“ (väčšina správ má aj parametre (napríklad: :ahoj) a teda regulárny výraz je optimalizovaný práve na ne) a vykoná patričnú akciu na základe typu správy, napríklad:

switch( item.type){
// MOTDS
case "372":
case "375":
return this.onMOTD( item);
...

Kde v item.type je uložený typ správy (parts[2]). Podporované typy správ sú:

372, 375, 376, 001, 002, 003, 004, 005, 251, 252, 254, 255, 265, 266, 301, privmsg, 431, 432, 433, nick, topic, 332, 353, 366, join, kick, part, quit, mode, 307, 311, 312, 313, 314, 317, 319, 671, 315, 318, 474, 401, 333, 321, 322, 323, 305, 306, notice

Možno časom budú do-implementované ďalšie. Zoznam typov je uvedený v poradí v akom boli implementované ich obslužné funkcie.


Obr. 5. ukážka zobrazenia rozličných druhov správ tesne po pripojení na server v „Statuse“ (systémové okno)

O posielanie príkazov na server sa stará trieda CommandParser, ktorá vygeneruje text, ktorý sa posiela priamo na IRC server. Zoznam podporovaných príkazov:

msg, say, query, q, join, j, names, n, nick, quote, whois, wi, w, whowas, help, me, action, list, notice, away, part, disconnect, quit, exit, close, ii, rr, ignore, ignores, unignore, ctcp, kick, topic, mode, op, deop, voice, devoice, halfop, dehalfop, invite, motd, time, cycle, ban, kickban, kban, kb

(niektoré príkazy ešte neboli dostatočne otestované a mnohé sú len skratkou iných)








Obr. 6. kompletná hierarchia tried použitých v projekte


Obr. 7. vľavo – komunikácia na kanáli, vpravo – zoznam pripojených používateľov

5. Záver

3wIRC poskytuje veľa možností každému používateľovi. Obsahuje množstvo príkazov implementovaných v triede CommandParser, ako napríklad join, part, query, msg, list, kick, mode (tu treba podotknúť, že každý príkaz sa začína znakom /, teda napríklad /join. Je to spôsobené tým, že používateľ väčšinou chce písať správu priamo do okna, ktoré má práve teraz aktívne, zatiaľ čo príkazy sa používajú len zriedka) a mnoho ďalších, ktoré sú nevyhnutné pre používanie IRC. Medzi ďalšie možnosti 3wIRC patrí:

  • ignore – možnosť softwarovo ignorovať prakticky kohokoľvek
  • help – klient obsahuje vstavanú nápovedu a malý používateľský manuál so zhrnutím základných princípov používania IRC
  • nastavenia – program ponúka možnosť zmeniť si farby textu (podľa predvolených štýlov), veľkosť písma
  • hilighting – zvýrazňovanie nejakých slov, napríklad meno

a mnoho ďalších. Na záver mi ostáva len dodať, že dúfam, že tento produkt oživí IRC komunitu a tento článok osloví niekoho natoľko, že po publikovaní na sourceforge.net sa rozhodne pridať k vývoju.

6. Odkazy na literatúru

  1. 3wIRC online, [použité 18. Apríla 2010], http://irc.post.sk/3wIRC/
  2. Comparison of Internet Relay Chat clients, Upravené 15. Aprila 2010
    http://en.wikipedia.org/wiki/Comparison_of_Internet_Relay_Chat_clients
  3. Oikarinen J., RFC1459 – Internet Relay Chat Protocol, Máj 1993 [použité 15. Marca 2009], Dostupné z http://www.faqs.org/rfcs/rfc1459.html

1 príspevok k článku “Implementácia IRC klienta založeného na platforme Adobe Flash”

  1. Viktor Lucza napísal:

    Pripajam oficialnu stranku pre 3wFlashIRC

Napísať príspevok