/************************************************************************
* tuveNetwork Class, by Christopher Olsen <cwolsen@domainatlantic.com> *
* Copyright 2007 Christopher Olsen *
* *
* $Id$ *
************************************************************************/
package {
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.TimerEvent;
import flash.net.Socket;
import flash.utils.Timer;
import mx.controls.Alert;
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("Ivorytower.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("CLIENT " + tvMaster.version + "\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 += "<TEXTFORMAT LEADING=\"2\"><P ALIGN=\"LEFT\"><FONT FACE=\"Verdana\" SIZE=\"10\" COLOR=\"#00FF00\" LETTERSPACING=\"0\" KERNING=\"0\">[" + tvMaster.fmtdDate() + "] TUveD: Connected to server.</FONT></P></TEXTFORMAT>";
}
private function onConnectError(event:IOErrorEvent):void {
if (event.text == "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;
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] == "PRIVMSG") {
tvMaster.sendIM(dataArray[1],tmpString);
}
else {
if (dataArray[1] == "TUveD")
tvMaster.masterObject.chatWindow.htmlText += "<TEXTFORMAT LEADING=\"2\"><P ALIGN=\"LEFT\"><FONT FACE=\"Verdana\" SIZE=\"10\" COLOR=\"#FF0000\" LETTERSPACING=\"0\" KERNING=\"0\">[" + tvMaster.fmtdDate() + "] " + dataArray[1] + ": " + tmpString + "</FONT></P></TEXTFORMAT>";
else
tvMaster.masterObject.chatWindow.htmlText += "<P>[" + tvMaster.fmtdDate() + "] " + dataArray[1] + ": " + tmpString + "<P>";
}
} /* End MSG */
else if (data.indexOf("EMOTE") == 0) {
dataArray = data.split(":");
tmpString = dataArray[3];
for (i=4;dataArray[i] != null;i++)
tmpString += ":" + dataArray[i];
tvMaster.masterObject.chatWindow.htmlText += "[" + tvMaster.fmtdDate() + "] " + dataArray[1] + " " + tmpString + "\n";
} /* End EMOTE */
else if (data.indexOf("PING") == 0) {
tvSocket.writeUTFBytes("PONG!\n");
tvSocket.flush();
} /* End PING */
else if (data.indexOf("LIST") == 0) {
dataArray = data.split(":");
tvMaster.tuveShowLW();
if (dataArray[1] == "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] + "\" />");
}
} /* End LIST */
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 == tmpString) {
tvMaster.masterObject.chatWindow.htmlText += "<TEXTFORMAT LEADING=\"2\"><P ALIGN=\"LEFT\"><FONT FACE=\"Verdana\" SIZE=\"10\" COLOR=\"#FF0000\" LETTERSPACING=\"0\" KERNING=\"0\">[" + tvMaster.fmtdDate() + "] TUveD: You Are Now Talking In: " + dataArray[1] + "</FONT></P></TEXTFORMAT>";
tvMaster.currentChannel = dataArray[1];
fc = false;
for (x = 0;x < tvMaster.chanList.length;x++) {
if (tvMaster.currentChannel.toLowerCase() == tvMaster.chanList[x].channel.toLowerCase()) {
tvMaster.masterObject.selChan.selectedIndex = x;
fc = true;
}
}
if (fc == false) {
tvMaster.chanList.addItem({channel:dataArray[1]});
tvMaster.masterObject.selChan.selectedIndex = tvMaster.chanList.length - 1;
}
}
i += 2;
}
} /* End JOIN */
else if (data.indexOf("GETVIDEO") == 0) {
tvSocket.writeUTFBytes("QUEUE EMPTY\n");
tvSocket.flush();
} /* End GETVIDEO */
else if (data.indexOf("PAUSE") == 0) {
curTime = tvMaster.tvSyncNS.time;
tvMaster.myTimer.stop();
tvMaster.tvSyncNS.close();
} /* End PAUSE */
else if (data.indexOf("RESUME") == 0) {
tvMaster.tvSyncNS.play(tvMaster.curSong,curTime);
tvMaster.myTimer.start();
} /* End RESUME */
else if (data.indexOf("SEEK") == 0) {
dataArray = data.split(":");
if (dataArray[1] != null)
tvMaster.tvSyncNS.seek(Number(dataArray[1]));
} /* End SEEK */
else if (data.indexOf("CURPOS") == 0) {
dataArray = data.split(":");
tvMaster.tvGotMeta = false;
tvMaster.curSong = dataArray[3];
if (tvMaster.tvSyncNC.connected == false) {
tvMaster.tvSyncFailed = true;
tvMaster.masterObject.chatWindow.htmlText += "<FONT COLOR=\"#990000\"><P>You are not currently connected to the video streaming service. Attempting Reconnect.</P></FONT>";
return;
}
tvMaster.tvSyncNS.close();
tvMaster.myTimer.stop();
tvMaster.myTimer.reset();
tvMaster.tvStartTime = Number(dataArray[2]);
tvMaster.myTimer.delay = 1000;
tvMaster.tvTotal = Number(dataArray[5])
tvMaster.myCount = tvMaster.tvTotal - tvMaster.tvStartTime;
tvMaster.myTimer.repeatCount = tvMaster.myCount;
tvMaster.myTimer.start();
tvMaster.tvSyncNS.play(tvMaster.curSong,0);
tvMaster.masterObject.songTitle.text = "Now Playing: " + dataArray[4];
tvMaster.vid = Number(dataArray[6]);
} /* End CURPOS */
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;
} /* End KICK */
else if (data.indexOf("PART") == 0) {
dataArray = data.split(":");
for (i=0;i<tvMaster.userList.length();i++) {
if (dataArray[2] == tvMaster.userList[i].@data) {
delete(tvMaster.userList[i]);
tvMaster.masterObject.userDispList.dataProvider = tvMaster.userList;
break;
}
}
} /* End PART */
else if (data.indexOf("NICK") == 0) {
dataArray = data.split(":");
if (dataArray[1] == tvMaster.userName) {
tvMaster.userName = dataArray[2];
tvMaster.tvSO.data.userName = dataArray[2];
}
for (i=0;i<tvMaster.userList.length();i++) {
if (dataArray[1] == 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 'O':
for (i=0;i<tvMaster.userList.length();i++) {
if (dataArray[4].toLowerCase() == 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;
}
} /* End MODE */
else if (data.indexOf("IDENT") == 0) {
dataArray = data.split(":");
if (dataArray[1] == 0) {
doNetSuccess();
tvMaster.authSuccess();
}
else {
tvMaster.authFail(dataArray[2]);
}
} /* End IDENT */
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];
tvMaster.masterObject.topic.text = tmpString;
} /* End TOPIC */
else if (data.indexOf("CLIENT") == 0) {
dataArray = data.split(":");
if (Number(dataArray[1]) == 1)
Alert.show(dataArray[2]);
tvSocket.writeUTFBytes("IDENT " + tvMaster.userName + ":" + tvMaster.tvSO.data.myID + "\n");
tvSocket.flush();
} /* End CLIENT */
} /*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 */