/************************************************************************
* 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 */