Newer
Older
AIR-TUve / src / tuveNetwork.as
@reddawg reddawg on 5 Dec 2007 14 KB *** empty log message ***
/************************************************************************
 * tuveNetwork Class, by Christopher Olsen <cwolsen@domainatlantic.com> *
 * Copyright 2007 Christopher Olsen                                     *
 *                                                                      *
 * $Id$          *
 ************************************************************************/
 
package {
  import flash.net.Socket;
  import flash.events.IOErrorEvent;
  import mx.controls.Alert;
  import flash.events.ProgressEvent;
  import flash.events.Event;
  import flash.utils.ByteArray;
  import flash.utils.Timer;
  import flash.events.TimerEvent;
  import mx.collections.ArrayCollection;
  import mx.utils.ArrayUtil;
	
  public class tuveNetwork {
  	private var tvSocket:Socket;
  	public  var tvMaster:Master;
  	private var attempts:Number = 0;
  	private var myTimer:Timer = new Timer(20000,1);
  	public  var tvNetCon:Boolean = false;
  	private var curTime:Number;
  		
  	public function init():void {
  	  myTimer.addEventListener(TimerEvent.TIMER_COMPLETE,conSocketEvent);
  	  conSocketEvent(null);
  	  } /* End init() */
  	  
  	private function conSocketEvent(event:TimerEvent):void {
  	  if (attempts >=3) {
  	  	Alert.show("Cannot reconnect to server. Some services will not be available.");
  	    }
  	  else {
  	  if (tvSocket == null)
        this.tvSocket = new Socket();
	  this.tvSocket.addEventListener(IOErrorEvent.IO_ERROR,onConnectError,false,0,true);
  	  this.tvSocket.addEventListener(ProgressEvent.SOCKET_DATA,gotData,false,0,true);
  	  this.tvSocket.addEventListener(Event.CONNECT,doNetAuth,false,0,true);
  	  this.tvSocket.addEventListener(Event.CLOSE,doReconnect,false,0,true);  	  	
  	    tvSocket.connect("tuved.ubixonline.com",9999);
  	    attempts++;
  	    }
  	  }
  	  
  	/* Send data to the socket */
  	public function sendData(data:String):void {
  	  tvSocket.writeUTFBytes(data);
  	  tvSocket.flush();
  	  } /* End sendData */
  	  
  	/* Let's auth to the network */
  	private function doNetAuth(event:Event):void {
  	  tvNetCon = true;
      tvSocket.writeUTFBytes("ident " + tvMaster.userName + ":" + tvMaster.tvSO.data.myID + "\n");
  	  tvSocket.flush();  	    
  	  } /* End doNetAuth */
  	  
  	private function doNetSuccess():void {
  	  tvMaster.userList = null;
  	  tvMaster.userList = new XMLList();
  	  tvMaster.masterObject.userDispList.dataProvider = tvMaster.userList;
  	  
  	  tvSocket.writeUTFBytes("join " + tvMaster.currentChannel + "\n");
  	  tvSocket.flush();
  	  attempts = 0;
  	  
  	  tvMaster.masterObject.chatWindow.htmlText += "<FONT COLOR=\"#00FF00\"><P>CONNECTED To Server.</P></FONT>";

  	  if ((tvMaster.myQueue != null) && (tvMaster.myQueue.length > 0)) {
  	    tvSocket.writeUTFBytes("QUEUE FULL\n");
  	    tvSocket.flush();
  	    }  		
  	  }
  	  
  	private function onConnectError(event:IOErrorEvent):void {
  	  if (event.text.match("close"))
        myTimer.start();
      else 
        Alert.show("ERROR: " + event.text);
  	  } /* End onConnectionError */
  	  
    private function gotData(event:ProgressEvent):void {
      var _data:String;
   	  var _dataArray:Array;    	
      var data:String;
   	  var dataArray:Array;
   	  var _i:Number;
      var i:Number;
      var x:Number;
      var tmpString:String;
      var fc:Boolean = false;
      var date:Date;
      
      event.bytesLoaded
      
        _data = this.tvSocket.readUTFBytes(this.tvSocket.bytesAvailable);
        _dataArray = _data.split("\n");
        
        for (_i = 0;_dataArray[_i] != null;_i++) {
          data = _dataArray[_i];
          
          if (data.length <= 0)
            return;
        
        
      if (data.indexOf("MSG") == 0) {
        dataArray = data.split(":");
        tmpString = dataArray[3];
        for (i=4;dataArray[i] != null;i++)
          tmpString += ":" + dataArray[i];
          
        if (dataArray[2].match("PRIVMSG")) {
          tvMaster.sendIM(dataArray[1],tmpString);
          }
        else {
          date = new Date;
          if (dataArray[1].match("TUveD")) {
          	tvMaster.masterObject.chatWindow.htmlText += "<TEXTFORMAT LEADING=\"2\"><P ALIGN=\"LEFT\"><FONT FACE=\"Verdana\" SIZE=\"10\" COLOR=\"#FF0000\" LETTERSPACING=\"0\" KERNING=\"0\">[" + date.toLocaleTimeString() + "] " + dataArray[1] + ": " + tmpString + "</FONT></P></TEXTFORMAT>";         
            }
          else {
            tvMaster.masterObject.chatWindow.htmlText += "<P>[" + date.toLocaleTimeString() + "] " + dataArray[1] + ": " + tmpString + "<P>";         
            }
          }
        }
     else if (data.indexOf("EMOTE") == 0) {
       dataArray = data.split(":");
       tmpString = dataArray[3];
       for (i=4;dataArray[i] != null;i++)
         tmpString += ":" + dataArray[i];
       date = new Date;  
       tvMaster.masterObject.chatWindow.htmlText += "[" + date.toLocaleTimeString() + "] " + dataArray[1] + " " + tmpString + "\n";
       }        
     else if (data.indexOf("PING") == 0) {
       tvSocket.writeUTFBytes("PONG!\n");
       tvSocket.flush();
       }
     else if (data.indexOf("LIST") == 0) {
       dataArray = data.split(":");     	
       tvMaster.tuveShowLW();
       
       if (dataArray[1].match("Channel")) {
         tvMaster.channels = null;
         tvMaster.channels = new XMLList();
         }
       else {
         tvMaster.channels += new XML("<mi channel=\"" + dataArray[1] + "\" users=\"" + dataArray[2] + "\" topic=\"" + dataArray[3] + "\" cursong=\"" + dataArray[4] + "\" />");
         }

       }
     else if (data.indexOf("JOIN") == 0) {
       dataArray = data.split(":");
       i = 2;
       while (dataArray[i] != null) {
       	 if (dataArray[i].indexOf("&") == 0)
       	   tmpString = dataArray[i].toString().substring(1,dataArray[i].toString().length);
       	 else
       	   tmpString = dataArray[i];
       	   
         tvMaster.userList += new XML("<mi label=\"" + dataArray[i] + "\" data=\"" + tmpString + "\" />");
         if (tvMaster.userName.match(dataArray[i])) {
           tvMaster.topicHistory = null;
           tvMaster.topicHistory = new XMLList();
           tvMaster.masterObject.chatWindow.htmlText += "You Are Now Talking In: " + dataArray[1] + "\n";
           tvMaster.currentChannel = dataArray[1];
           //Alert.show(tvMaster.chanList.length());
           for (x = 0;x < tvMaster.chanList.length();x++) {
           	 //Alert.show(tvMaster.chanList[x].@data);
           	 if (tvMaster.currentChannel.match(tvMaster.chanList[x].@data)) {
           	   tvMaster.masterObject.selChan.selectedIndex = x;
           	   fc = true;
           	   }
             }
           if (fc == false) {
             tvMaster.chanList += new XML("<mi label=\"" + dataArray[1] + "\" data=\"" + dataArray[1] + "\" />");
             tvMaster.masterObject.selChan.selectedIndex = tvMaster.chanList.length() - 1;
             }
           }
         i += 2;
         }
       }
     else if (data.indexOf("GETVIDEO") == 0) {
       if (tvMaster.myQueue != null && tvMaster.myQueue.length > 0) {
         tvSocket.writeUTFBytes("VIDEO " + tvMaster.currentChannel + ":" + tvMaster.myQueue[0].vid + "\n");
         tvMaster.myQueue.removeItemAt(0);
         tvSocket.flush();
         }
       else {
       	 tvSocket.writeUTFBytes("QUEUE EMPTY\n");
       	 tvSocket.flush();
         }
       }
     else if (data.indexOf("PAUSE") == 0) {
       curTime = tvMaster.tvNS.time;
       tvMaster.myTimer.stop();
       tvMaster.tvNS.close();
       }
     else if (data.indexOf("RESUME") == 0) {
       tvMaster.tvNS.play(tvMaster.curSong,curTime);
       tvMaster.myTimer.start();
       }
     else if (data.indexOf("SEEK") == 0) {
       dataArray = data.split(":");
       if (dataArray[1] != null)
         tvMaster.tvNS.seek(Number(dataArray[1]));
       }
     else if (data.indexOf("CURPOS") == 0) {
       dataArray = data.split(":");
       tvMaster.tvGotMeta = false;
       tvMaster.curSong = dataArray[2];
       if (tvMaster.tvNC.connected == false) {
         Alert.show("ERROR: tvMaster.tvNC.connected == false");
         return;
         }
       tvMaster.tvNS.close();
       tvMaster.myTimer.stop();
       tvMaster.myTimer.reset();
       tvMaster.tvStartTime = Number(dataArray[1]);
       tvMaster.myTimer.delay = 1000;
       tvMaster.myCount = Number(dataArray[4]) - tvMaster.tvStartTime;
       tvMaster.myTimer.repeatCount = tvMaster.myCount;
       tvMaster.myTimer.start();
       if (tvMaster.curSong.indexOf("stream") == 0) {
         tvMaster.tvNS.play(tvMaster.curSong,-1);
   	     tvMaster.tvVid.width = 320;
   	     tvMaster.tvVid.height = 240;
   	  	 tvMaster.tvVid.y = 30;
   	     tvMaster.tvVid.x = 40;

         }
       else
         tvMaster.tvNS.play(tvMaster.curSong,0);

       tvMaster.masterObject.songTitle.text = dataArray[3];
       tvMaster.vid = Number(dataArray[5]);
       tvMaster.getInfo();
       
       }
     else if (data.indexOf("BAN") == 0) {
       if (tvMaster.tuveFW == null) {
         tvMaster.tuveFW = new formatWindow();
         tvMaster.masterObject.addChild(tvMaster.tuveFW);
         tvMaster.tuveFW.tvMaster = tvMaster;
         tvMaster.tuveFW.addEventListener("closeWindow",tvMaster.tuveCloseFW,false,0,true);
         }
       }
     else if (data.indexOf("KICK") == 0) {
       dataArray = data.split(":");
       tmpString = dataArray[3];
        for (i=4;dataArray[i] != null;i++)
          tmpString += ":" + dataArray[i];
       tvMaster.masterObject.chatWindow.htmlText += "You Have Been Kick By: " + dataArray[2] + " For " + tmpString + "\n";
       tvMaster.userList = null;
       tvMaster.userList = new XMLList;
       }
     else if (data.indexOf("PART") == 0) {
       dataArray = data.split(":");

       for (i=0;i<tvMaster.userList.length();i++) {
       	  if (dataArray[2].match(tvMaster.userList[i].@data)) {
       	  	delete(tvMaster.userList[i]);
            tvMaster.masterObject.userDispList.dataProvider = tvMaster.userList;
       	    break;
       	    }
         }
       }
     else if (data.indexOf("NICK") == 0) {
       dataArray = data.split(":");
       if (dataArray[1].match(tvMaster.userName)) {
       	 tvMaster.userName = dataArray[2];
         tvMaster.tvSO.data.userName = dataArray[2];
         }
       for (i=0;i<tvMaster.userList.length();i++) {
         if (dataArray[1].match(tvMaster.userList[i].@label)) {
           delete(tvMaster.userList[i]);
           tmpString = dataArray[2].toString();
           
           if (tmpString.indexOf("&") == 0)
             tmpString = tmpString.substr(1,tmpString.length -1);

           tvMaster.userList += new XML("<mi label=\"" + dataArray[2] + "\" data=\"" + tmpString + "\" />");
           tvMaster.masterObject.userDispList.dataProvider = tvMaster.userList;
           break;
           }
         }
       } /* End NICK */
     else if (data.indexOf("MODE") == 0) {
       dataArray = data.split(":");
       switch (dataArray[2]) {
       	 case 'E':
       	   if (dataArray[3] == '1')
       	     tvMaster.masterObject.tvE.selected = true;
       	   else
       	     tvMaster.masterObject.tvE.selected = false;
       	   break;
       	 case 'R':
       	   if (dataArray[3] == '1')
       	     tvMaster.masterObject.tvR.selected = true;
       	   else
       	     tvMaster.masterObject.tvR.selected = false;
       	   break;
       	 case 'Q':
       	   if (dataArray[3] == '1')
       	     tvMaster.masterObject.tvQ.selected = true;
       	   else
       	     tvMaster.masterObject.tvQ.selected = false;
       	   break;
         case 'T':
           if (dataArray[3] == '1')
             tvMaster.masterObject.tvT.selected = true;
           else
             tvMaster.masterObject.tvT.selected = false;
           tvMaster.masterObject.tvTime.text = dataArray[4];
           break;
         case 'A':
           for (i = 0;i<tvMaster.tvRating.length();i++) {
           	 if (dataArray[3].match(tvMaster.tvRating[i].@data)) {
           	   tvMaster.masterObject.selR.selectedIndex = i;
           	   tvMaster.tvCurRating = i;
           	   break;
               } 
             }
           break;
         case 'C':
           for (i = 0;i<tvMaster.tvClass.length();i++) {
           	 if (dataArray[3].match(tvMaster.tvClass[i].@data)) {
           	   tvMaster.masterObject.selC.selectedIndex = i;
           	   tvMaster.tvCurClass = i;
           	   break;
               }
             }
           break;
           case 'O':
             for (i=0;i<tvMaster.userList.length();i++) {
               if (dataArray[4].toLowerCase().match(tvMaster.userList[i].@data.toLowerCase())) {
                 delete(tvMaster.userList[i]);
                 tmpString = dataArray[2].toString();
           
                 if (dataArray[3] == 1)
                   tmpString = "&" + dataArray[4];
                 else tmpString = dataArray[4];

                 tvMaster.userList += new XML("<mi label=\"" + tmpString + "\" data=\"" + dataArray[4] + "\" />");
                 tvMaster.masterObject.userDispList.dataProvider = tvMaster.userList;
                 break;
                 }
               }           
             break;
         }
       }
     else if (data.indexOf("IDENT") == 0) {
       dataArray = data.split(":");
       if (dataArray[1] == 0) {
         doNetSuccess();
         tvMaster.authSuccess();
         }
       else {
       	 tvMaster.masterObject.authFail(dataArray[2]);
         }
       }
     else if (data.indexOf("TOPIC") == 0) {
       var topic:Object = new Object();
       dataArray = data.split(":");
       tmpString = dataArray[2];
        for (i=3;dataArray[i] != null;i++)
          tmpString += ":" + dataArray[i];
       
       for (i=0;i<tvMaster.topicHistory.length();i++) {
       	 if (tmpString.match(tvMaster.topicHistory[i].@label)) {
       	 	tvMaster.masterObject.topicNew.selectedIndex = i;
       	   return;
       	   }
       }
       
       tvMaster.topicHistory += new XML("<mi label=\"" + tmpString + "\" />");
       tvMaster.masterObject.topicNew.selectedIndex = tvMaster.topicHistory.length() - 1;
       }
       
        } /*End big for */
      }
      
    /* Reconnect when connection fails */
  	private function doReconnect(event:Event):void {
  	  tvMaster.masterObject.chatWindow.htmlText += "<FONT COLOR=\"#990000\"><P>DISCONNECTED From Server!!!</P></FONT>";
  	  tvNetCon = false;
  	  myTimer.start(); /* Reconnect */
  	  } /* End doReconnect() */
  	  
    } /* End podzNEtwork Class */
    
  } /* End package */