Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 17.05.2007, 05:25
Usnul вне форума Посмотреть профиль Отправить личное сообщение для Usnul Посетить домашнюю страницу Usnul Найти все сообщения от Usnul
  № 1  
Ответить с цитированием
Usnul
 
Аватар для Usnul

Регистрация: Mar 2001
Адрес: во сне
Сообщений: 2,701
Отправить сообщение для Usnul с помощью ICQ
По умолчанию Умный сокет для 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");
		}
	}
}
__________________
I'm only happy when it rains.
Waka Laka


Последний раз редактировалось Usnul; 17.05.2007 в 05:29.
Создать новую тему   Часовой пояс GMT +4, время: 12:52.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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