SlideShare uma empresa Scribd logo
1 de 7
Baixar para ler offline
//////////////////////////////////////////////////////////////
// Esta classe tem a responsabilidade de conhecer o protocolo
// IRC - Internet Relay Chat
//
// Comunica com o servidor de Irc e dispara eventos conforme
// o significado das mensagens que recebe.
//
// Autor: José Travado Data: 12/07/22
// versão 2
//////////////////////////////////////////////////////////////

package irc.comunicador
{
    import fl.controls.*;
    import flash.net.Socket;
    import flash.events.*;
    import flash.errors.*;
    import flash.system.Security;

   public class ComunicadorIrc
   {

        // Para provocar eventos
        public var evento:EventDispatcher=new EventDispatcher();
        //Socket de comunicação
        var s:Socket=new Socket();

        //strings com a comunicação
        var erro,mensagemCliente,mensagemServidor,resposta:String;

        //////////////////////////////////////////////////////////////////////////
        //mensagem decomposta
        //[0] nome servidor
        //[1] utilizador
        //[2] host
        //[3] comando
        // [4 e seguintes] parâmetros
        var mensagem:Array;
        ////////////////////////////////////////////////////////////////////////

       //lista de salas
       var salas:Array;
       var quantidadeSalas:int = 0;
       var utilizador:String;
       public function ComunicadorIrc()
       {
           mensagemServidor = "";
           mensagem=new Array();
           salas=new Array();
           //Eventos provocados pela comunicação (Socket).
           s.addEventListener(Event.CLOSE, closeHandler);
           s.addEventListener(Event.CONNECT, connectHandler);
           s.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
           s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
           s.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);

       }

       //Estabelecer comunicação com um servidor de IRC
       public function conectarRede(endereco:String,porto:int)
       {

           Security.allowDomain(endereco);
           Security.loadPolicyFile(endereco);
           s.connect(endereco,porto);
           resposta = endereco + porto;
           evento.dispatchEvent(new Event("Mensagem Enviada"));
       }
       function reconectar()
       {

       }
       // Funções para enviar mensagem
       public function desconectar()
       {
           if (s.connected)
           {
                                                1/7
enviar("QUIT :Até à próxima");
       s.close();
       quantidadeSalas = 0;
    }
    s == null;

}


//Seletores

public function obterListaSalas():Array
{
    return salas;
}

public function obterMensagem():String
{
    return mensagem[4];
}
public function obterMensagemCompleta():Array
{
    return mensagem;
}
public function obterParametro(i:int):String
{
    return mensagem[4+i];
}
public function obterErro():String
{
    return erro;
}
public function obterNomes(sala:String)
{
    if (s.connected)
    {
        enviar("Names "+sala);
    }
}
public function obterLista()
{
    if (s.connected)
    {
        enviar("List ");
    }
}
public function obterMensagemDia()
{
    if (s.connected)
    {
        enviar("MOTD ");
    }
}
public function obterEstado():Boolean
{
    return s.connected;
}
//Modificadores
public function limparMensagem()
{
    mensagemServidor = "";
}
public function obterQuantidadeSalas()
{
    return quantidadeSalas;
}
//Eventos do socket
function closeHandler(event:Event):void
{

    evento.dispatchEvent(new Event("Desconectado"));

}

function connectHandler(event:Event):void
{

                                          2/7
evento.dispatchEvent(new Event("Conectado"));

}


function securityErrorHandler(event:SecurityErrorEvent):void
{
    trace("securiyErrorHandler: " + event);
    erro = event;
    evento.dispatchEvent(new Event("Erro"));

}
function ioErrorHandler(event:IOErrorEvent):void
{
    trace("IOErro " );
    erro = event;
    evento.dispatchEvent(new Event("Erro"));


}
function socketDataHandler(event:ProgressEvent):void
{
    trace("Dados Recebidos");
    receberMensagem();

}
public function registarUtilizador(utilizador:String):void
{
    if (utilizador != null)
    {
        this.utilizador = utilizador;
        enviar("NICK "+utilizador);
        enviar("USER "+utilizador+" 0 * :"+utilizador);
    }
}
//Para enviar mensagens
function enviar(str:String):void
{

    prepararMensagem(str);
    s.flush();
}
function prepararMensagem(str:String):void
{
    str += "rn";
    trace(str);
    try
    {
        s.writeMultiByte(str,"iso-8859-1");
    }
    catch (e:IOError)
    {
        trace(e);
    }
}

private function receberMensagem():void
{
    mensagemServidor = s.readMultiByte(s.bytesAvailable,"iso-8859-1");
    evento.dispatchEvent(new Event("Mensagem Recebida"));
    trace(mensagemServidor);
    //O servidor verifica a conexão pingando constantemente
    if (mensagemServidor.indexOf("rn") > 0)
    {
        decomporMensagem();
    }
}

//Decomposição de uma mensagem segundo o RFC 2812 ; 1459
function decomporMensagem()
{
    var fim:int = obterFimMensagem();
    var pos:int = obterFimPrefixo();
    pos = verificaEspacos(pos);
    pos = obterFimComando(pos);
    pos = verificaEspacos(pos);

                                        3/7
if (pos != -1 && pos < fim)
   {
       obterParametros(pos,fim);
       //A mensagem terminou, retirá-la da mensagemservidor, tratá-la e decompor o resto
       //
       //ou deixar que seja completada com outro fluxo de mensagem ???
       mensagemServidor = mensagemServidor.substring(fim + 2);
       tratarMensagem();
       if (mensagemServidor.indexOf("rn") > 0)
       {
           decomporMensagem();
       }
   }
   else
   {
       erro = "Mensagem incompleta";
       evento.dispatchEvent(new Event("Erro"));
   }
}
function verificaEspacos(pos:int):int
{
    var i:int;
    for (i=pos; i<mensagemServidor.length; i++)
    {
        if (mensagemServidor.charAt(i) != " ")
        {
            break;
        }
    }
    return i;
}
function obterFimMensagem()
{
    return mensagemServidor.indexOf("rn");
}
//Verifica se a mensagem tem prefixo e decompõem-o
function obterFimPrefixo():int
{
    var posUtilizador:int;
    var posHost:int;
    var valor:int = 0;
    if (mensagemServidor.indexOf(":",0) == 0)
    {
        valor = mensagemServidor.indexOf(" ",0);
        posUtilizador = mensagemServidor.indexOf("!",0);
        if (posUtilizador < valor)
        {
            mensagem[0] = mensagemServidor.substring(1,posUtilizador);
            posHost = mensagemServidor.indexOf("@",posUtilizador + 1);
            if (posHost < valor)
            {
                mensagem[1] = mensagemServidor.substring(posUtilizador + 1,posHost);
                mensagem[2] = mensagemServidor.substring(posHost + 1,valor);
            }
            else
            {
                mensagem[1]=mensagemServidor.substring(posUtilizador+1,(valor));
            }
        }
        else
        {
            mensagem[0] = mensagemServidor.substring(1,valor);
        }
    }
    return (valor);

}
//Obtem o comando
function obterFimComando(pos:int):int
{
    var posEspaco:int = mensagemServidor.indexOf(" ",pos);
    if (posEspaco != -1)
    {
        mensagem[3] = mensagemServidor.substring(pos,posEspaco);

   }
   return posEspaco;
                                        4/7
}

function lerQuantidadeSalas(texto:String):int
{
    var valor:int = 0;
    var pos:int = texto.indexOf(" ",7);
    if (pos != -1)
    {
        var str:String = texto.substring(7,pos);
        //if(!isNaN(str))
        valor = parseInt(texto);

    }
    return valor;
}
//obtem o parametro e o trailing se existir
function obterParametros(pos,fim:int)
{
    var posicao:int = 5;
    var fimMiddle:int;
    var posMiddle:int = mensagemServidor.indexOf(" ",pos);
    var posParametro:int = mensagemServidor.indexOf(":",pos);

    if (posParametro >= pos)
    {
        mensagem[4] = mensagemServidor.substring(posParametro + 1,fim + 2);
    }
    else
    {
        posParametro = fim;

    }
    while (posMiddle!=-1 && (posMiddle)<posParametro)
    {
        mensagem[posicao++] = mensagemServidor.substring(pos,posMiddle);
        pos=posMiddle+1;
        posMiddle = mensagemServidor.indexOf(" ",pos);


        //trace("param - "+ mensagem[posicao-1]+"   - Fim"+(posicao-1));
    }


}
function tratarMensagem()
{

    switch (mensagem[3].toString().toUpperCase())
    {
        case "001" :
        case "002" :
        case "003" :
        case "004" :
            evento.dispatchEvent(new Event("Utilizador Aceite"));
            break;
        case "005" :
            reconectar();
            evento.dispatchEvent(new Event("Reconecção"));
            break;
        case "254" :
            lerQuantidadeSalas(mensagem[4]);
            evento.dispatchEvent(new Event("Obtido Número de Salas"));
            break;
        case "321" :
            evento.dispatchEvent(new Event("Inicio Recepção Salas"));
            break;
        case "322" :
            evento.dispatchEvent(new Event("Recepção Sala"));
            break;
        case "323" :
            evento.dispatchEvent(new Event("Fim Recepção Salas"));
            break;//Fim de lista
        case "341" :
            evento.dispatchEvent(new Event("Convite Enviado"));
            break;
        case "347" :
            evento.dispatchEvent(new Event("Convite efetuado"));
                                        5/7
break;
        case "349" :
            evento.dispatchEvent(new   Event("Erro no Convite"));
            break;
        case "366" :
            evento.dispatchEvent(new   Event("Fim Recepção Nomes"));
            break;
        case "376" :
            evento.dispatchEvent(new   Event("Fim Mensagem do Dia"));
            break;
        case "403" :
            evento.dispatchEvent(new   Event("Sala Desconhecida"));
            break;
        case "406" :
            evento.dispatchEvent(new   Event("Utilizador Desconhecido"));
            break;
        case "407" :
        case "412" :
        case "413" :
        case "414" :
        case "415" :
            evento.dispatchEvent(new   Event("Erro no Envio na Conversa"));
            break;
        case "421" :
            evento.dispatchEvent(new   Event("Erro Desconhecido"));
            break;
        case "433" :
        case "436" :
        case "437" :
        case "451" :
            evento.dispatchEvent(new   Event("Erro de Utilizador"));
            break;
        case "441" :
        case "442" :
            evento.dispatchEvent(new   Event("Erro de Sala"));
            break;
        case "464" :
            evento.dispatchEvent(new   Event("Senha Incorreta"));
            break;
        case "471" :
        case "472" :
        case "473" :
        case "474" :
        case "475" :
        case "476" :
        case "477" :
        case "479" :
        case "481" :
            evento.dispatchEvent(new   Event("Impossível Entrar na Sala"));
            break;
        case "478" :
            evento.dispatchEvent(new   Event("Sala Cheia"));
            break;
        case "PRIVMSG" :
            evento.dispatchEvent(new   Event("Recepção Conversa"));
            break;
        case "PING" :
            pingar();
            break;
        default :
    }

}

public function entrarSala(sala:String)
{
    if (s.connected)
    {
        enviar("Join "+sala);

    }
}
public function conversarCom(texto,utilizador:String)
{
    if (s.connected)
    {
        enviar("PRIVMSG "+ utilizador+ " :" + texto);
                                        6/7
}
        }
        public function abandonarSala(sala:String)
        {
            if (s.connected)
            {
                enviar("PART "+sala);
            }
        }

        function pingar()
        {
            enviar("PONG :"+ mensagem[4]);
        }

    }
}




                                                7/7

Mais conteúdo relacionado

Mais procurados

Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFutureHelder da Rocha
 
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasNode.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasRodrigo Branas
 
Spock Framework
Spock FrameworkSpock Framework
Spock FrameworkIsmael
 
Node.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasNode.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasRodrigo Branas
 
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo BranasNode.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo BranasRodrigo Branas
 
Conexões SSH com PHP
Conexões SSH com PHPConexões SSH com PHP
Conexões SSH com PHPFelipe Weckx
 
Introdução a linguagem Go
Introdução a linguagem GoIntrodução a linguagem Go
Introdução a linguagem GoAllisson Azevedo
 
Persistência com Realm.io
Persistência com Realm.ioPersistência com Realm.io
Persistência com Realm.ioOnyo
 
Spock Framework 2
Spock Framework 2Spock Framework 2
Spock Framework 2Ismael
 
Programação Concorrente - Aula 05
Programação Concorrente - Aula 05Programação Concorrente - Aula 05
Programação Concorrente - Aula 05thomasdacosta
 
Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010rafaelferreira
 

Mais procurados (20)

Threads 10: CompletableFuture
Threads 10: CompletableFutureThreads 10: CompletableFuture
Threads 10: CompletableFuture
 
Node.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo BranasNode.js - #4 - Timers - Rodrigo Branas
Node.js - #4 - Timers - Rodrigo Branas
 
Spock Framework
Spock FrameworkSpock Framework
Spock Framework
 
Design OO
Design OODesign OO
Design OO
 
Doctrine2 Seminário PHP
Doctrine2 Seminário PHPDoctrine2 Seminário PHP
Doctrine2 Seminário PHP
 
Node.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo BranasNode.js - #3 - Global Objects - Rodrigo Branas
Node.js - #3 - Global Objects - Rodrigo Branas
 
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo BranasNode.js - #2 - Sistema de Módulos - Rodrigo Branas
Node.js - #2 - Sistema de Módulos - Rodrigo Branas
 
Conexões SSH com PHP
Conexões SSH com PHPConexões SSH com PHP
Conexões SSH com PHP
 
Git, GitHub e OO
Git, GitHub e OOGit, GitHub e OO
Git, GitHub e OO
 
Curso de Java: Threads
Curso de Java: ThreadsCurso de Java: Threads
Curso de Java: Threads
 
Javascript avançado
Javascript avançadoJavascript avançado
Javascript avançado
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Introdução a linguagem Go
Introdução a linguagem GoIntrodução a linguagem Go
Introdução a linguagem Go
 
Persistência com Realm.io
Persistência com Realm.ioPersistência com Realm.io
Persistência com Realm.io
 
Spock Framework 2
Spock Framework 2Spock Framework 2
Spock Framework 2
 
Programação Concorrente - Aula 05
Programação Concorrente - Aula 05Programação Concorrente - Aula 05
Programação Concorrente - Aula 05
 
Linguagem Go
Linguagem GoLinguagem Go
Linguagem Go
 
Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010Palestra Mocks - AgileBrazil 2010
Palestra Mocks - AgileBrazil 2010
 
PowerShell
PowerShellPowerShell
PowerShell
 
Threads 09: Paralelismo
Threads 09: ParalelismoThreads 09: Paralelismo
Threads 09: Paralelismo
 

Destaque

Pesona ain galeri
Pesona ain galeriPesona ain galeri
Pesona ain galeripesonaain
 
Fluor EconamineFGPlus Technology
Fluor EconamineFGPlus TechnologyFluor EconamineFGPlus Technology
Fluor EconamineFGPlus Technologycvquick
 
Pp inventive curiosity, creativity and risk taking
Pp inventive curiosity, creativity and risk takingPp inventive curiosity, creativity and risk taking
Pp inventive curiosity, creativity and risk takingBhags Tamang Chettri
 
Behavior Driven Development (BDD)
Behavior Driven Development (BDD)Behavior Driven Development (BDD)
Behavior Driven Development (BDD)David Bächler
 
The obesity epidemic comes to colleges, but not Colorado
The obesity epidemic comes to colleges, but not ColoradoThe obesity epidemic comes to colleges, but not Colorado
The obesity epidemic comes to colleges, but not Coloradojennajohnson95
 
Microsoft power point tm overview sept 15
Microsoft power point   tm overview sept 15Microsoft power point   tm overview sept 15
Microsoft power point tm overview sept 15dieple88
 

Destaque (8)

Pesona ain galeri
Pesona ain galeriPesona ain galeri
Pesona ain galeri
 
Fluor EconamineFGPlus Technology
Fluor EconamineFGPlus TechnologyFluor EconamineFGPlus Technology
Fluor EconamineFGPlus Technology
 
Pp inventive curiosity, creativity and risk taking
Pp inventive curiosity, creativity and risk takingPp inventive curiosity, creativity and risk taking
Pp inventive curiosity, creativity and risk taking
 
Icandles
IcandlesIcandles
Icandles
 
Behavior Driven Development (BDD)
Behavior Driven Development (BDD)Behavior Driven Development (BDD)
Behavior Driven Development (BDD)
 
The obesity epidemic comes to colleges, but not Colorado
The obesity epidemic comes to colleges, but not ColoradoThe obesity epidemic comes to colleges, but not Colorado
The obesity epidemic comes to colleges, but not Colorado
 
Microsoft power point tm overview sept 15
Microsoft power point   tm overview sept 15Microsoft power point   tm overview sept 15
Microsoft power point tm overview sept 15
 
Entourage recovery
Entourage recoveryEntourage recovery
Entourage recovery
 

Semelhante a Protocolo IRC comunicador

Node.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo BranasNode.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo BranasRodrigo Branas
 
Integração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPIntegração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPelliando dias
 
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsTDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsDiego Castro
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaEduardo Bregaida
 
JavaScript - De verdade
JavaScript - De verdadeJavaScript - De verdade
JavaScript - De verdadeLuis Vendrame
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasRodrigo Branas
 
Golang para desenvolvedores pragmáticos parte 2
Golang para desenvolvedores pragmáticos  parte 2Golang para desenvolvedores pragmáticos  parte 2
Golang para desenvolvedores pragmáticos parte 2Wilson Júnior
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesStanislaw Pusep
 
Novas APIs do Java EE 7: JMS e Web Services
Novas APIs do Java EE 7: JMS e Web ServicesNovas APIs do Java EE 7: JMS e Web Services
Novas APIs do Java EE 7: JMS e Web ServicesHelder da Rocha
 
O Aduino ama a Internet - TDC 2012
O Aduino ama a Internet - TDC 2012O Aduino ama a Internet - TDC 2012
O Aduino ama a Internet - TDC 2012Marco Antonio Maciel
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o JavascriptMichel Ribeiro
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com AjaxAdler Medrado
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanElton Minetto
 

Semelhante a Protocolo IRC comunicador (20)

Node.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo BranasNode.js - #6 - Core Modules - net - Rodrigo Branas
Node.js - #6 - Core Modules - net - Rodrigo Branas
 
Integração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHPIntegração do Flex com PHP através do AMFPHP
Integração do Flex com PHP através do AMFPHP
 
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal AppsTDC 2015 - Execução em Background e Live Tiles em Universal Apps
TDC 2015 - Execução em Background e Live Tiles em Universal Apps
 
Refatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completaRefatoração de código com Capitão Nascimento versão completa
Refatoração de código com Capitão Nascimento versão completa
 
Realtime com node.js e socket.io
Realtime com node.js e socket.ioRealtime com node.js e socket.io
Realtime com node.js e socket.io
 
JavaScript - De verdade
JavaScript - De verdadeJavaScript - De verdade
JavaScript - De verdade
 
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo BranasNode.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
Node.js - #7 - Core Modules - http - Parte 1 - Rodrigo Branas
 
Design patterns
Design patternsDesign patterns
Design patterns
 
JQuery
JQuery JQuery
JQuery
 
Golang para desenvolvedores pragmáticos parte 2
Golang para desenvolvedores pragmáticos  parte 2Golang para desenvolvedores pragmáticos  parte 2
Golang para desenvolvedores pragmáticos parte 2
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testes
 
Novas APIs do Java EE 7: JMS e Web Services
Novas APIs do Java EE 7: JMS e Web ServicesNovas APIs do Java EE 7: JMS e Web Services
Novas APIs do Java EE 7: JMS e Web Services
 
O Aduino ama a Internet - TDC 2012
O Aduino ama a Internet - TDC 2012O Aduino ama a Internet - TDC 2012
O Aduino ama a Internet - TDC 2012
 
Javascript
JavascriptJavascript
Javascript
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com Ajax
 
Vraptor
VraptorVraptor
Vraptor
 
App scala
App scalaApp scala
App scala
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando Gearman
 
Apresentação Phonegap
Apresentação PhonegapApresentação Phonegap
Apresentação Phonegap
 

Protocolo IRC comunicador

  • 1. ////////////////////////////////////////////////////////////// // Esta classe tem a responsabilidade de conhecer o protocolo // IRC - Internet Relay Chat // // Comunica com o servidor de Irc e dispara eventos conforme // o significado das mensagens que recebe. // // Autor: José Travado Data: 12/07/22 // versão 2 ////////////////////////////////////////////////////////////// package irc.comunicador { import fl.controls.*; import flash.net.Socket; import flash.events.*; import flash.errors.*; import flash.system.Security; public class ComunicadorIrc { // Para provocar eventos public var evento:EventDispatcher=new EventDispatcher(); //Socket de comunicação var s:Socket=new Socket(); //strings com a comunicação var erro,mensagemCliente,mensagemServidor,resposta:String; ////////////////////////////////////////////////////////////////////////// //mensagem decomposta //[0] nome servidor //[1] utilizador //[2] host //[3] comando // [4 e seguintes] parâmetros var mensagem:Array; //////////////////////////////////////////////////////////////////////// //lista de salas var salas:Array; var quantidadeSalas:int = 0; var utilizador:String; public function ComunicadorIrc() { mensagemServidor = ""; mensagem=new Array(); salas=new Array(); //Eventos provocados pela comunicação (Socket). s.addEventListener(Event.CLOSE, closeHandler); s.addEventListener(Event.CONNECT, connectHandler); s.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); s.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler); } //Estabelecer comunicação com um servidor de IRC public function conectarRede(endereco:String,porto:int) { Security.allowDomain(endereco); Security.loadPolicyFile(endereco); s.connect(endereco,porto); resposta = endereco + porto; evento.dispatchEvent(new Event("Mensagem Enviada")); } function reconectar() { } // Funções para enviar mensagem public function desconectar() { if (s.connected) { 1/7
  • 2. enviar("QUIT :Até à próxima"); s.close(); quantidadeSalas = 0; } s == null; } //Seletores public function obterListaSalas():Array { return salas; } public function obterMensagem():String { return mensagem[4]; } public function obterMensagemCompleta():Array { return mensagem; } public function obterParametro(i:int):String { return mensagem[4+i]; } public function obterErro():String { return erro; } public function obterNomes(sala:String) { if (s.connected) { enviar("Names "+sala); } } public function obterLista() { if (s.connected) { enviar("List "); } } public function obterMensagemDia() { if (s.connected) { enviar("MOTD "); } } public function obterEstado():Boolean { return s.connected; } //Modificadores public function limparMensagem() { mensagemServidor = ""; } public function obterQuantidadeSalas() { return quantidadeSalas; } //Eventos do socket function closeHandler(event:Event):void { evento.dispatchEvent(new Event("Desconectado")); } function connectHandler(event:Event):void { 2/7
  • 3. evento.dispatchEvent(new Event("Conectado")); } function securityErrorHandler(event:SecurityErrorEvent):void { trace("securiyErrorHandler: " + event); erro = event; evento.dispatchEvent(new Event("Erro")); } function ioErrorHandler(event:IOErrorEvent):void { trace("IOErro " ); erro = event; evento.dispatchEvent(new Event("Erro")); } function socketDataHandler(event:ProgressEvent):void { trace("Dados Recebidos"); receberMensagem(); } public function registarUtilizador(utilizador:String):void { if (utilizador != null) { this.utilizador = utilizador; enviar("NICK "+utilizador); enviar("USER "+utilizador+" 0 * :"+utilizador); } } //Para enviar mensagens function enviar(str:String):void { prepararMensagem(str); s.flush(); } function prepararMensagem(str:String):void { str += "rn"; trace(str); try { s.writeMultiByte(str,"iso-8859-1"); } catch (e:IOError) { trace(e); } } private function receberMensagem():void { mensagemServidor = s.readMultiByte(s.bytesAvailable,"iso-8859-1"); evento.dispatchEvent(new Event("Mensagem Recebida")); trace(mensagemServidor); //O servidor verifica a conexão pingando constantemente if (mensagemServidor.indexOf("rn") > 0) { decomporMensagem(); } } //Decomposição de uma mensagem segundo o RFC 2812 ; 1459 function decomporMensagem() { var fim:int = obterFimMensagem(); var pos:int = obterFimPrefixo(); pos = verificaEspacos(pos); pos = obterFimComando(pos); pos = verificaEspacos(pos); 3/7
  • 4. if (pos != -1 && pos < fim) { obterParametros(pos,fim); //A mensagem terminou, retirá-la da mensagemservidor, tratá-la e decompor o resto // //ou deixar que seja completada com outro fluxo de mensagem ??? mensagemServidor = mensagemServidor.substring(fim + 2); tratarMensagem(); if (mensagemServidor.indexOf("rn") > 0) { decomporMensagem(); } } else { erro = "Mensagem incompleta"; evento.dispatchEvent(new Event("Erro")); } } function verificaEspacos(pos:int):int { var i:int; for (i=pos; i<mensagemServidor.length; i++) { if (mensagemServidor.charAt(i) != " ") { break; } } return i; } function obterFimMensagem() { return mensagemServidor.indexOf("rn"); } //Verifica se a mensagem tem prefixo e decompõem-o function obterFimPrefixo():int { var posUtilizador:int; var posHost:int; var valor:int = 0; if (mensagemServidor.indexOf(":",0) == 0) { valor = mensagemServidor.indexOf(" ",0); posUtilizador = mensagemServidor.indexOf("!",0); if (posUtilizador < valor) { mensagem[0] = mensagemServidor.substring(1,posUtilizador); posHost = mensagemServidor.indexOf("@",posUtilizador + 1); if (posHost < valor) { mensagem[1] = mensagemServidor.substring(posUtilizador + 1,posHost); mensagem[2] = mensagemServidor.substring(posHost + 1,valor); } else { mensagem[1]=mensagemServidor.substring(posUtilizador+1,(valor)); } } else { mensagem[0] = mensagemServidor.substring(1,valor); } } return (valor); } //Obtem o comando function obterFimComando(pos:int):int { var posEspaco:int = mensagemServidor.indexOf(" ",pos); if (posEspaco != -1) { mensagem[3] = mensagemServidor.substring(pos,posEspaco); } return posEspaco; 4/7
  • 5. } function lerQuantidadeSalas(texto:String):int { var valor:int = 0; var pos:int = texto.indexOf(" ",7); if (pos != -1) { var str:String = texto.substring(7,pos); //if(!isNaN(str)) valor = parseInt(texto); } return valor; } //obtem o parametro e o trailing se existir function obterParametros(pos,fim:int) { var posicao:int = 5; var fimMiddle:int; var posMiddle:int = mensagemServidor.indexOf(" ",pos); var posParametro:int = mensagemServidor.indexOf(":",pos); if (posParametro >= pos) { mensagem[4] = mensagemServidor.substring(posParametro + 1,fim + 2); } else { posParametro = fim; } while (posMiddle!=-1 && (posMiddle)<posParametro) { mensagem[posicao++] = mensagemServidor.substring(pos,posMiddle); pos=posMiddle+1; posMiddle = mensagemServidor.indexOf(" ",pos); //trace("param - "+ mensagem[posicao-1]+" - Fim"+(posicao-1)); } } function tratarMensagem() { switch (mensagem[3].toString().toUpperCase()) { case "001" : case "002" : case "003" : case "004" : evento.dispatchEvent(new Event("Utilizador Aceite")); break; case "005" : reconectar(); evento.dispatchEvent(new Event("Reconecção")); break; case "254" : lerQuantidadeSalas(mensagem[4]); evento.dispatchEvent(new Event("Obtido Número de Salas")); break; case "321" : evento.dispatchEvent(new Event("Inicio Recepção Salas")); break; case "322" : evento.dispatchEvent(new Event("Recepção Sala")); break; case "323" : evento.dispatchEvent(new Event("Fim Recepção Salas")); break;//Fim de lista case "341" : evento.dispatchEvent(new Event("Convite Enviado")); break; case "347" : evento.dispatchEvent(new Event("Convite efetuado")); 5/7
  • 6. break; case "349" : evento.dispatchEvent(new Event("Erro no Convite")); break; case "366" : evento.dispatchEvent(new Event("Fim Recepção Nomes")); break; case "376" : evento.dispatchEvent(new Event("Fim Mensagem do Dia")); break; case "403" : evento.dispatchEvent(new Event("Sala Desconhecida")); break; case "406" : evento.dispatchEvent(new Event("Utilizador Desconhecido")); break; case "407" : case "412" : case "413" : case "414" : case "415" : evento.dispatchEvent(new Event("Erro no Envio na Conversa")); break; case "421" : evento.dispatchEvent(new Event("Erro Desconhecido")); break; case "433" : case "436" : case "437" : case "451" : evento.dispatchEvent(new Event("Erro de Utilizador")); break; case "441" : case "442" : evento.dispatchEvent(new Event("Erro de Sala")); break; case "464" : evento.dispatchEvent(new Event("Senha Incorreta")); break; case "471" : case "472" : case "473" : case "474" : case "475" : case "476" : case "477" : case "479" : case "481" : evento.dispatchEvent(new Event("Impossível Entrar na Sala")); break; case "478" : evento.dispatchEvent(new Event("Sala Cheia")); break; case "PRIVMSG" : evento.dispatchEvent(new Event("Recepção Conversa")); break; case "PING" : pingar(); break; default : } } public function entrarSala(sala:String) { if (s.connected) { enviar("Join "+sala); } } public function conversarCom(texto,utilizador:String) { if (s.connected) { enviar("PRIVMSG "+ utilizador+ " :" + texto); 6/7
  • 7. } } public function abandonarSala(sala:String) { if (s.connected) { enviar("PART "+sala); } } function pingar() { enviar("PONG :"+ mensagem[4]); } } } 7/7