public static void whoIs() { String[] ids = null; String[] names = null; using (BinaryReader r = getResponse(CSCommon.buildCMDString(CSCommon.cmd_whois))) { ids = new String[r.ReadInt16()]; System.Diagnostics.Trace.WriteLine("Doing whois"); System.Diagnostics.Trace.WriteLine(ids.Length); names = new String[ids.Length]; for (int i = 0; i < ids.Length; i++) { System.Diagnostics.Trace.WriteLine("Iteration " + i); ids[i] = r.ReadString(); System.Diagnostics.Trace.WriteLine(ids[i]); names[i] = r.ReadString(); System.Diagnostics.Trace.WriteLine(names[i]); } } //using int choice = Common.GenerateMenu("Press ENTER on a user to send a private message to them", names, Common.getIncDecVol()); if (choice == -1) { return; } if (ids[choice].Equals(serverTag)) { SapiSpeech.speak("The first sign of insanity is talking to yourself. Sorry, we can't let you do that!", SapiSpeech.SpeakFlag.interruptable); } else { sendChatMessage(ids[choice]); } }
public static void adminMenu() { bool isAdmin = false; using (BinaryReader r = Client.getResponse(CSCommon.buildCMDString(CSCommon.cmd_requestAdmin))) { isAdmin = r.ReadBoolean(); } if (!isAdmin) { return; } int choice = Common.GenerateMenu(null, new String[] { "Set message of the day", "Reboot server" }); switch (choice) { case 0: String msg = Common.mainGUI.receiveInput(); if (String.IsNullOrEmpty(msg)) { break; } sendCommand(CSCommon.cmd_setMessage, msg); break; case 1: sendCommand(CSCommon.cmd_reboot); break; default: return; } }
public static void whoIs() { String[] ids = null; String[] names = null; using (BinaryReader r = getResponse(CSCommon.buildCMDString(CSCommon.cmd_whois))) { ids = new String[r.ReadInt16()]; System.Diagnostics.Trace.WriteLine("Doing whois"); System.Diagnostics.Trace.WriteLine(ids.Length); names = new String[ids.Length]; for (int i = 0; i < ids.Length; i++) { System.Diagnostics.Trace.WriteLine("Iteration " + i); ids[i] = r.ReadString(); System.Diagnostics.Trace.WriteLine(ids[i]); names[i] = r.ReadString(); System.Diagnostics.Trace.WriteLine(names[i]); } } //using int choice = Common.GenerateMenu("Press ENTER on a user to send a private message to them", names, Common.getIncDecVol()); if (choice == -1) { return; } sendChatMessage(ids[choice]); }
public static void whoIs() { String[] ids = null; String[] names = null; using (BinaryReader r = getResponse(CSCommon.buildCMDString(CSCommon.cmd_whois))) { ids = new String[r.ReadInt16()]; System.Diagnostics.Trace.WriteLine("Doing whois"); System.Diagnostics.Trace.WriteLine(ids.Length); names = new String[ids.Length]; for (int i = 0; i < ids.Length; i++) { System.Diagnostics.Trace.WriteLine("Iteration " + i); ids[i] = r.ReadString(); System.Diagnostics.Trace.WriteLine(ids[i]); names[i] = r.ReadString(); System.Diagnostics.Trace.WriteLine(names[i]); } } //using int choice = Common.GenerateMenu("Press ENTER on a user to send a private message to them", names, Common.getIncDecVol()); if (choice == -1) { return; } if (ids[choice].Equals(serverTag)) { SapiSpeech.speak("Le premier signe de démence est de se parler à soi-même. Désolé, on ne peut vous laisser faire ça!", SapiSpeech.SpeakFlag.interruptable); } else { sendChatMessage(ids[choice]); } }
/// <summary> /// Sends a remove bot command to the server. /// </summary> public static void removeBot() { if (Options.mode == Options.Modes.teamDeath) { return; } Client.sendData(CSCommon.buildCMDString(CSCommon.cmd_removeBot)); }
public static MemoryStream getData(int ms) { MemoryStream data = null; while (data == null) { data = CSCommon.getData(client, ms, true); } return(data); }
/// <summary> /// Use this method for calls that require immediate responses from the server, such as an /// acknowledgement of success or another condition. /// This method will send the command to the server and wait for a response. It will also stop the monitoring thread from consuming the response. /// </summary> /// <param name="cmd">The command stream to send</param> /// <returns>The response from the server</returns> public static BinaryReader getResponse(MemoryStream cmd) { CSCommon.sendData(client, cmd); waitingForResponse.WaitOne(); MemoryStream stream = new MemoryStream(responseStream); stream.Position = 0; BinaryReader reader = new BinaryReader(stream); return(reader); }
/// <param name="forceUpdate">Set to true if you want to send the data, even if it is a duplicate. This is useful if you want to send /// the final data string to the server.</param> public static void sendObjectUpdate(MemoryStream stream, String id, bool forceUpdate) { ClientRecord cr = senders[id]; if (!forceUpdate && stream.Length != cr.previousObjectUpdate.Length) { bool areEqual = true; for (int i = 1; i <= stream.Length; i++) { areEqual = stream.ReadByte() == cr.previousObjectUpdate.ReadByte(); if (!areEqual) { break; } } if (areEqual) { return; } } cr.setPreviousObjectUpdate(stream); CSCommon.sendData(client, stream); stream.Close(); }
public static void sendData(String data) { lock (dataLocker) CSCommon.sendData(client, data); }
public static void sendData(MemoryStream data) { lock (dataLocker) CSCommon.sendData(client, data); }
private static void processRCV() { try { while (live) { if (!CSCommon.isLiveConnection(client)) { live = false; SapiSpeech.speak("Error: Server crash.", SapiSpeech.SpeakFlag.noInterrupt); Common.exitMenus = true; Common.repop(); return; } MemoryStream stream = null; //Bytes have to be explicitly copied into new stream since cmds is closed to save memory later on, so we'll lose rcvPauseData. stream = CSCommon.getData(client); BinaryReader cmds = null; if (stream != null) { cmds = new BinaryReader(stream); } if (cmds != null) { sbyte t; long start = 0; //start position of current packet while (cmds.BaseStream.Length > cmds.BaseStream.Position) { start = cmds.BaseStream.Position; System.Diagnostics.Trace.WriteLine(String.Format("S: {0}, L: {1}", start, cmds.BaseStream.Length)); t = cmds.ReadSByte(); if (t == 1) { byte command = cmds.ReadByte(); System.Diagnostics.Trace.WriteLine("co " + command); switch (command) { case CSCommon.cmd_addMember: addMember(cmds.ReadString(), cmds.ReadString()); break; case CSCommon.cmd_removeMember: removeMember(cmds.ReadString()); break; case CSCommon.cmd_resp: int respLength = cmds.ReadInt32(); responseStream = new byte[respLength]; cmds.BaseStream.Read(responseStream, 0, respLength); waitingForResponse.Set(); break; case CSCommon.cmd_notifyDemo: DSound.PlaySound(DSound.LoadSound(DSound.NSoundPath + "\\cd3.wav"), true, false); break; case CSCommon.cmd_newval: SelfVoice.purge(true); int amount = cmds.ReadInt32(); SelfVoice.NLS("#" + amount + "&points.wav", true, true); addChatMessage(String.Format("You earned {0} point{1}", amount, (amount == 1) ? "" : "s")); break; case CSCommon.cmd_position: next = cmds.ReadInt64(); addOns = processAddOns(cmds); break; case CSCommon.cmd_chat: MessageType type = (MessageType)cmds.ReadByte(); if (type == MessageType.normal) { DSound.PlaySound(chatSound, true, false); } else if (type == MessageType.enterRoom) { DSound.PlaySound(chatEnterSound, true, false); } else if (type == MessageType.leaveRoom) { DSound.PlaySound(chatLeaveSound, true, false); } else if (type == MessageType.privateMessage) { DSound.PlaySound(privateMessageSound, true, false); } else { DSound.PlaySound(serverMessageSound, true, false); } String incomingChatMessage = cmds.ReadString(); SapiSpeech.speak(incomingChatMessage, SapiSpeech.SpeakFlag.interruptable); addChatMessage(incomingChatMessage); Common.mainGUI.addToHistory(incomingChatMessage); break; case CSCommon.cmd_serverMessage: String incomingServerMessage = cmds.ReadString(); SapiSpeech.speak(incomingServerMessage, SapiSpeech.SpeakFlag.interruptable); addChatMessage(incomingServerMessage); break; case CSCommon.cmd_forceDisconnect: //Player was disconnected from the server //By the server itself and not through an in-game event, //so if we receive this command, we are being told to wipe our copy of the player in question. //Still, the server will send forceDisconnect even if object has already been disconnected //due to in-game event. This is ok since if the object is already gone, //this command will do nothing. It is just a redundancy check, more or less. String idToTerminate = cmds.ReadString(); Projector pToTerm = Interaction.objectAt(idToTerminate); if (pToTerm != null) { pToTerm.requestingTerminate(); } Interaction.clearLocks(idToTerminate); break; case CSCommon.cmd_requestCreate: //Response from server for requestCreate command sent by client. Interaction.createPlayer(cmds.ReadString(), cmds.ReadInt32()); addSender(Mission.player.id); if (addOns != null) { Mission.player.setAddOns(addOns); } addOns = null; if (Options.mode == Options.Modes.teamDeath) { Mission.player.team = Options.team; } Interaction.startMultiplayerGame(); break; case CSCommon.cmd_distributeServerTag: Projector o = Interaction.createObjectFromServer(cmds.ReadString(), cmds.ReadString(), OnlineRole.receiver, (ObjectType)cmds.ReadByte()); System.Diagnostics.Trace.WriteLine("Received request to create opponent " + o.name); if (Options.mode == Options.Modes.teamDeath) { o.team = (Projector.TeamColors)cmds.ReadInt32(); } AddOnArgs[] distAdd = processAddOns(cmds); if (distAdd != null) { o.setAddOns(distAdd); } break; case CSCommon.cmd_createBot: String createBotId = cmds.ReadString(); String createBotName = cmds.ReadString(); Projector bot = Interaction.createObjectFromServer(createBotId, createBotName, OnlineRole.bot, (ObjectType)cmds.ReadByte()); //will create bot or update current receiver to bot status. addSender(bot.id); break; case CSCommon.cmd_startGame: hostStartedGame = true; System.Diagnostics.Trace.WriteLine("Host started game"); break; case CSCommon.cmd_gameEnded: Options.serverEndedGame = true; break; } //switch System.Diagnostics.Trace.WriteLine("Command: " + t); continue; } //if command System.Diagnostics.Trace.Write(String.Format("Stream position: {0}, start: {1}, Char: {2} ", (int)cmds.BaseStream.Position, start, t)); int size = cmds.ReadInt32(); //total update size System.Diagnostics.Trace.WriteLine("Size: " + size); int temSize = size; String tag = cmds.ReadString(); System.Diagnostics.Trace.WriteLine(tag + " queuing data..."); Projector p = null; size = size - (int)(cmds.BaseStream.Position - start); byte[] buffer = null; try { buffer = new byte[size]; } catch (OverflowException) { throw new OverflowException(String.Format("Size: {0}, Stream position: {1}, start: {2}, original size: {3} Char: {4}", size, (int)cmds.BaseStream.Position, start, temSize, t)); } cmds.BaseStream.Read(buffer, 0, size); //Object could have been deleted by the time this command is reached if ((p = Interaction.objectAt(tag)) != null) { System.Diagnostics.Trace.WriteLine("Object found. sending queue"); p.queueData(t, buffer); } //if object exists else { System.Diagnostics.Trace.WriteLine("Object not found."); } } //while more data to read cmds.Close(); } //if got data Thread.Sleep(50); } //while live connection } catch (Exception e) { Common.handleError(e); } //catch finally { releaseConnection(); } }
public static void sendCommand(byte command, params Object[] args) { sendData(CSCommon.buildCMDString(command, args)); }
public static bool connect(String host, String callSign, int port) { ports = new int[] { 4444, 4445, 4567, 6969, 32000 }; if (dataLocker == null) { dataLocker = new object(); } if (chatLocker == null) { chatLocker = new object(); } if (chatMessages == null) { chatMessages = new List <String>(); } if (members == null) { members = new List <ChatRoomMember>(); } chatPointer = 0; chatSound = DSound.LoadSound(DSound.SoundPath + "\\chat1.wav"); chatEnterSound = DSound.LoadSound(DSound.SoundPath + "\\chat2.wav"); chatLeaveSound = DSound.LoadSound(DSound.SoundPath + "\\chat3.wav"); privateMessageSound = DSound.LoadSound(DSound.SoundPath + "\\chat4.wav"); serverMessageSound = DSound.LoadSound(DSound.SoundPath + "\\chat5.wav"); senders = new Dictionary <string, ClientRecord>(); waitingForResponse = new AutoResetEvent(false); isConnected = false; error = false; live = false; client = new TcpClient(); int i = (port != 0) ? Array.IndexOf(ports, port) : 0; int time = 0; while (i < ports.Length) { error = false; time = 0; client.BeginConnect(host, port = ports[i++], new AsyncCallback(connectedEvent), null); while (!isConnected && !error) { Application.DoEvents(); if (time >= 3000) { endConnect(); //stop trying to connect on this port break; } time += 100; Thread.Sleep(100); } if (isConnected) { break; } } //search ports if (!isConnected || error) { return(false); } Options.writeToFile(); try { using (BinaryWriter writer = new BinaryWriter(new MemoryStream())) { writer.Write(callSign); writer.Flush(); CSCommon.sendData(client, writer); } //using LoginMessages resp = LoginMessages.none; using (BinaryReader reader = new BinaryReader(CSCommon.getData(client, 5000))) { resp = (LoginMessages)reader.ReadInt32(); m_messages = resp; if ((resp & LoginMessages.serverAssignedTag) == LoginMessages.serverAssignedTag) { serverTag = reader.ReadString(); String messageOfTheDay = reader.ReadString(); if ((resp & LoginMessages.messageOfTheDay) == LoginMessages.messageOfTheDay) { // We now need to speak the message and then show an input box for the user to // press ENTER to continue. This is because some screen readers // Don't have a way to stop the running thread. SapiSpeech.speak("[Welcome message]: " + messageOfTheDay + " (press ENTER to continue)", SapiSpeech.SpeakFlag.interruptable); Common.mainGUI.receiveInput().Trim(); } System.Diagnostics.Trace.WriteLine("Server sent tag: " + serverTag); } } //using if ((resp & LoginMessages.demo) == LoginMessages.demo) { BPCSharedComponent.ExtendedAudio.DSound.playAndWait(BPCSharedComponent.ExtendedAudio.DSound.NSoundPath + "\\cd" + Common.getRandom(1, 2) + ".wav"); } if ((resp & LoginMessages.noCallSign) == LoginMessages.noCallSign) { BPCSharedComponent.ExtendedAudio.DSound.playAndWait(BPCSharedComponent.ExtendedAudio.DSound.NSoundPath + "\\ncs.wav"); } if ((resp & LoginMessages.badVersion) == LoginMessages.badVersion) { SapiSpeech.speak("There is a newer version of TDV available. Please update before logging on.", SapiSpeech.SpeakFlag.noInterrupt); return(false); } if ((resp & LoginMessages.wrongCredentials) == LoginMessages.wrongCredentials) { BPCSharedComponent.ExtendedAudio.DSound.playAndWait(BPCSharedComponent.ExtendedAudio.DSound.NSoundPath + "\\pw2.wav"); return(false); } } catch (IOException) { error = true; } catch (TimeoutException) { error = true; } if (error) { return(false); } if (log) { theFile = new StreamWriter(Addendums.File.appPath + "\\server_output.log"); } live = true; processThread = new Thread(processRCV); processThread.Start(); return(true); }
public static bool connect(String host, String password, int port, String tag) { System.Diagnostics.Trace.WriteLine("Server tag is " + tag); // ports = new int[]{4444, 4445, 4567, 6969, 32000 }; ports = new int[] { 31111 }; if (dataLocker == null) { dataLocker = new object(); } if (chatLocker == null) { chatLocker = new object(); } if (chatMessages == null) { chatMessages = new List <String>(); } if (members == null) { members = new List <ChatRoomMember>(); } chatPointer = 0; chatSound = DSound.LoadSound(DSound.SoundPath + "\\chat1.wav"); chatEnterSound = DSound.LoadSound(DSound.SoundPath + "\\chat2.wav"); chatLeaveSound = DSound.LoadSound(DSound.SoundPath + "\\chat3.wav"); privateMessageSound = DSound.LoadSound(DSound.SoundPath + "\\chat4.wav"); serverMessageSound = DSound.LoadSound(DSound.SoundPath + "\\chat5.wav"); senders = new Dictionary <string, ClientRecord>(); waitingForResponse = new AutoResetEvent(false); isConnected = false; error = false; live = false; client = new TcpClient(); serverTag = tag; int i = (port != 0) ? Array.IndexOf(ports, port) : 0; int time = 0; while (i < ports.Length) { error = false; time = 0; client.BeginConnect(host, port = ports[i++], new AsyncCallback(connectedEvent), null); while (!isConnected && !error) { Application.DoEvents(); if (time >= 3000) { endConnect(); //stop trying to connect on this port break; } time += 100; Thread.Sleep(100); } if (isConnected) { break; } } //search ports if (!isConnected || error) { return(false); } Options.writeToFile(); try { SslStream ssl = null; using (BinaryWriter writer = new BinaryWriter(new MemoryStream())) { writer.Write((int)0); System.Diagnostics.Trace.WriteLine("After int: " + writer.BaseStream.Length); writer.Write(Convert.ToSingle(Common.applicationVersion)); writer.Write(tag); System.Diagnostics.Trace.WriteLine("Tag is now " + tag); if (password != null) { writer.Write(password); } writer.Flush(); System.Diagnostics.Trace.WriteLine("After password: "******"bpcprograms.com"); writer.BaseStream.Position = 0; writer.Write((int)(writer.BaseStream.Length - 4)); writer.Flush(); System.Diagnostics.Trace.WriteLine("After data size print " + writer.BaseStream.Length); System.Diagnostics.Trace.WriteLine("SSL packet size: " + (writer.BaseStream.Length - 4)); writer.BaseStream.Position = 0; ((MemoryStream)writer.BaseStream).WriteTo(ssl); } //using LoginMessages resp = LoginMessages.none; using (BinaryReader reader = new BinaryReader(CSCommon.getData(client, 5000))) { resp = (LoginMessages)reader.ReadInt32(); m_messages = resp; if ((resp & LoginMessages.serverAssignedTag) == LoginMessages.serverAssignedTag) { serverTag = reader.ReadString(); System.Diagnostics.Trace.WriteLine("Server sent tag: " + serverTag); } } //using if ((resp & LoginMessages.demo) == LoginMessages.demo) { BPCSharedComponent.ExtendedAudio.DSound.playAndWait(BPCSharedComponent.ExtendedAudio.DSound.NSoundPath + "\\cd" + Common.getRandom(1, 2) + ".wav"); } if ((resp & LoginMessages.noCallSign) == LoginMessages.noCallSign) { BPCSharedComponent.ExtendedAudio.DSound.playAndWait(BPCSharedComponent.ExtendedAudio.DSound.NSoundPath + "\\ncs.wav"); } if ((resp & LoginMessages.badVersion) == LoginMessages.badVersion) { SapiSpeech.speak("There is a newer version of TDV available. Please update before logging on.", SapiSpeech.SpeakFlag.noInterrupt); return(false); } if ((resp & LoginMessages.wrongCredentials) == LoginMessages.wrongCredentials) { BPCSharedComponent.ExtendedAudio.DSound.playAndWait(BPCSharedComponent.ExtendedAudio.DSound.NSoundPath + "\\pw2.wav"); return(false); } } catch (IOException) { error = true; } catch (TimeoutException) { error = true; } if (error) { return(false); } if (log) { theFile = new StreamWriter(Addendums.File.appPath + "\\server_output.log"); } live = true; processThread = new Thread(processRCV); processThread.Start(); return(true); }