Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Умный сокет для IRC (http://www.flasher.ru/forum/showthread.php?t=95822)

Usnul 17.05.2007 05:25

Умный сокет для IRC
 
Код:

/*
        This is an extension of the existing Socket class, the main two differences are:
       
                1)        Accumulative buffer to allow operating more than one packet at a time and also
                        to reduce the lag by allowing large packets of data to be sent in smaller chunks.
                       
                2)        Packet parser and packet dispatcher - this feature parses the buffer taking all known
                        packets out of the chain, processing the data out of those packets and dispatching
                        that packet in an "easy-to-use" format.
       
        Note:
                -        Because of the strict protocol introduced in this system, there is practically no way to
                        parse the chain after it has been desrupted. Because of this you don't have a luxery of
                        making mistakes.
*/
/*
a MOD of Connection class from MMORPG project v0.73 major difference is in the protocol structure, so most of the
data processing had to be re-writen
*/
package net
{
        import flash.net.Socket;
        import flash.events.Event;
        import flash.events.IOErrorEvent;
        import flash.errors.IOError;
        import flash.events.SecurityErrorEvent;
        import flash.events.ProgressEvent;
       
        public class Connection extends Socket
        {

                public var buffer:String = new String;
                //public var log:Array = new Array;
                private var _eng:engine;

                public function Connection(eng:engine, host:String="",port:int=0){
                        _eng = eng;
                       
                        if(host.length>0 && port>0){
                                super(host, port);
                        }
                       
                        //Adding listeners
                        addEventListener(Event.CONNECT, connectHandler);
                        addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
                        addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
                        addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
                }
               
                private function ioErrorHandler(event:IOErrorEvent):void {
                        //trace("ioErrorHandler: " + event);
                        trace("Socket has been closed due to operation timeout.");
                }
                private function connectHandler(event:Event):void {
                        //trace("connectHandler: " + event);
                        trace("Connection with server has beed successfully established.");
                        if(this.connected){
                                logon();
                        }
                }
                private function securityErrorHandler(event:SecurityErrorEvent):void {
                        trace("securityErrorHandler: " + event);
                }
       
            private function socketDataHandler(event:ProgressEvent):void {
                        var str:String = readUTFBytes(this.bytesAvailable);
                        buffer += String(str);
                parseBuffer();
            }
            private function parseBuffer():void{
                    if(buffer.length>=0){
                            var __t1:String;
                            var arr:Array = buffer.split("\n");
                            for(var i:int=0; i<arr.length; i++){
                                    var str:String = arr[i].slice(0,arr[i].length-1);
                                   
                                    if(str.length>0){
                                            trace("SERVER MSG: "+str);
                                           
                                            var shost:String = new String;
                                            var cmdAt:int = 0;
                                            if(str.charAt(0)==":"){
                                                    shost = str.slice(1,str.indexOf(" "));
                                                    cmdAt = shost.length+2;
                                            }
                                            var cmd:String = str.slice(cmdAt,str.indexOf(":",1)-1);
                                           
                                            var msg:String = str.slice(str.indexOf(":",1)+1,str.length);
                                            var code:int = str.split(" ",2)[1];
                                            //trace("CODE: "+code+"<");
                                            //trace("CMD: "+cmd+"<");
                                            switch(code){
                                                    case 001:
                                                            sendRequest("JOIN "+_eng.cChannel);
                                                            //_eng.logTF.text="";
                                                            break;
                                                    case 353: //names list
                                                            _eng.chanUsers = _eng.chanUsers.concat(msg.split(" "));
                                                            _eng.rCUList();
                                                            break;
                                                    default:
                                                            break;
                                            }
                                            switch(cmd){
                                                    /*case "NOTICE AUTH":
                                                            _eng.addToLog("<font color='#0000FF'>"+msg+"</font>");
                                                            trace("'"+cmd+"','"+msg+"'");
                                                            if(msg=="*** Found your hostname"){
                                                                    //logon();
                                                                    //this.addEventListener(ProgressEvent.SOCKET_DATA,__setMode);
                                                                    //function __setMode(evt:ProgressEvent):void{
                                                                    //        sendRequest("MODE "+_eng.nick+" +x");
                                                                    //}
                                                            }
                                                            break;*/
                                                    /*case "NOTICE "+_eng.nick:
                                                            _eng.addToLog("<font color='#0000FF'>"+msg+"</font>");
                                                            break;*/
                                                    case "QUIT":
                                                            __t1 = str.slice(1,str.indexOf("!"));
                                                            _eng.addToLog(__t1+" quits ("+msg+")");
                                                            _eng.removeNick(__t1);
                                                            break;
                                                    case "PART":
                                                            __t1 = str.slice(1,str.indexOf("!"));
                                                            _eng.addToLog(__t1+" leaves the channel ("+msg+")");
                                                            _eng.removeNick(__t1);
                                                            break;
                                                    case "NICK":
                                                            __t1 = str.slice(1,str.indexOf("!"));
                                                            _eng.changeNick(__t1,msg);
                                                            _eng.addToLog(__t1+" is now known as "+msg);
                                                            break;
                                                    case "JOIN":
                                                            __t1 = str.slice(1,str.indexOf("!"));
                                                            if(__t1==_eng.nick){
                                                                    //trace("It's your freaking nick.");
                                                            }
                                                            else{
                                                                    _eng.addToLog(__t1+" joined the channel");
                                                                    _eng.addNick(__t1);
                                                            }
                                                            break;
                                                    case "PING":
                                                            //_eng.addToLog("Ping? Pong!");
                                                            sendRequest("PONG "+msg);
                                                            break;
                                                    case String("PRIVMSG "+_eng.cChannel):
                                                            __t1 = str.slice(1,str.indexOf("!"));
                                                            _eng.addToLog("&lt;"+__t1+"&gt; "+msg);
                                                            break;
                                                    default:
                                                            _eng.addToLog(msg);
                                                            //trace("***ERROR: UNKNOWN COMMAND");
                                                            break;
                                            }
                                            //log.push(str); //Storing the processed string into the log
                                    }
                            }
                            buffer = "";
                    }
            }
            public function stdConnect():void{
                    connect("newyork.ny.us.undernet.org",6667);
            }
                public function sendRequest(str:String):void{
                        trace("        ->"+str)
                        writeUTFBytes(str+"\n");
                        flush();
                }
                public function logon(evt:Event=null):void{
                        trace("TRYING TO LOG IN");
                        sendRequest("NICK "+_eng.nick);
                        sendRequest("USER Guest \"hostaddress\" \"someservername\" :John Smith");
                }
        }
}


Usnul 17.05.2007 05:28

вчера занялся, переписал старый сокет дли игры на ходу протокол ирки изучал. Сокет очень примитивен но позволяет корректно обрабатывать простые события. В общем для чатанья его вполне достаточно.

Выкладывается скорее в ознакомительных целях, для людей кто хочет сделать что-то подобное но не знает с чего начать.

miramax 17.05.2007 05:31

Тоже хороший пример - http://dev.etcs.ru/blog/shit/irc_client_as3/ =)

Usnul 17.05.2007 05:36

типа мой умнее и это исключительно сокет, он расправляется с автоматическими запросами и дробит серверные сообщения в удобоваримый вид.
правда вообще без оптимизации, так сказать черновик.

добавочное чтиво для тех кого интересует
http://www.irchelp.org/irchelp/rfc/rfc.html

etc 17.05.2007 12:24

Типа у меня есть продвинутый вариант :)
Только там не один класс, но сам проект фасадный.

В основном классе пишем строки типа:

Код:

                        this.irc = new IRC('irc1','irc.dion.ru',6667);
                        this.irc.encoding = 'windows-1251';
                        this.irc.autoPong = true;
                        this.irc.addEventListener(SocketEvent.CONNECT,this.connectHandler);
                        this.irc.addEventListener(ServerEvent.RPL_NAMREPLY,this.nickListHandler);
                        this.irc.addEventListener(ServerEvent.RPL_ENDOFNAMES,this.nickListEndHandler);
                        this.irc.addEventListener(ServerEvent.RPL_TOPIC,this.topicHandler);
                        this.irc.addEventListener(UserEvent.PRIVMSG,this.messageHandler);
                        this.irc.connect();


                private function connectHandler(event:SocketEvent):void {
                        this.irc.queueCommands = true;
                        this.irc.setUser('flashirc','FlashIRC');
                        this.irc.setNick('FlashIRC');
                        this.irc.joinChannel('#flasher');
                        this.irc.flushCommands();
                }

И вуаля :)

Не дописан. Если есть желание поковыряться с этим — велкам!


Часовой пояс GMT +4, время: 10:50.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.