
Код:
/*
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("<"+__t1+"> "+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");
}
}
}