using System; using System.Net.Sockets; using System.Text; using System.Threading; using System.Windows.Controls; using DiscordRPC; using MafiaCommon.Packets; namespace MafiaGame { public class ServerConnection { private String _host = "localhost"; private int _port = 25743; private Socket _socket; private Thread _thread; private bool _breakFlag = false; public ServerConnection(String ip) { if (ip.Contains(':')) { _host = ip.Split(":")[0]; _port = Convert.ToInt32(ip.Split(":")[1]); } else if (_host.Length != 0) { _host = ip; } _thread = new Thread(serverListener); _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { _socket.Connect(_host, _port); } catch (Exception e) { App.Current.Dispatcher.Invoke((Action)(() => { MainWindow.Instance.ShowDisconnectScreen(e.Message); })); return; } _socket.Send(PacketConverter.toBytes(new ConnectPacket(Settings.Config().Nick))); _thread.IsBackground = true; _thread.Start(); } public void SendMessage(ChatType chatType, string text) { _socket.Send(PacketConverter.toBytes(new MessageSendPacket(chatType, text))); } private void serverListener() { while (!_breakFlag) { StringBuilder builder = new StringBuilder(); int bytes = 0; byte[] data = new byte[256]; do { bytes = _socket.Receive(data); builder.Append(Encoding.UTF8.GetString(data, 0, bytes)); } while (_socket.Available>0); Console.WriteLine(builder.ToString()); Packet packet = PacketConverter.toPacket(builder.ToString()); switch (packet.PacketType) { case PacketType.Welcome: App.Current.Dispatcher.Invoke((Action)(() => { MainWindow.Instance.QueueOnline.Text = ((WelcomePacket) packet).Players + "/" + ((WelcomePacket) packet).MaxPlayers; MainWindow.Instance.ShowGameQueueScreen(); Party party = new Party(); party.ID = _host + ":" + _port; party.Size = ((WelcomePacket) packet).Players; party.Max = ((WelcomePacket) packet).MaxPlayers; Secrets secrets = new Secrets(); secrets.JoinSecret = _host + ":" + _port + "/join"; secrets.SpectateSecret = _host + ":" + _port + "/spectate"; App.Instance.GetRpcClient().SetPresence(new RichPresence() { State = ((WelcomePacket)packet).ServerName, Party = party, Secrets = secrets, Timestamps = Timestamps.Now, Details = "Ожидание старта" }); })); break; case PacketType.Disconnect: App.Current.Dispatcher.Invoke((Action)(() => { MainWindow.Instance.ShowDisconnectScreen(((DisconnectPacket)packet).Reason); })); _breakFlag = true; break; case PacketType.PlayerConnected: App.Current.Dispatcher.Invoke((Action)(() => { MainWindow.Instance.QueueOnline.Text = ((PlayerConnectedPacket) packet).Players + "/" + ((PlayerConnectedPacket) packet).MaxPlayers; })); App.Instance.GetRpcClient().UpdatePartySize(((PlayerConnectedPacket) packet).Players); break; case PacketType.PlayerDisconnected: App.Current.Dispatcher.Invoke((Action)(() => { MainWindow.Instance.QueueOnline.Text = ((PlayerDisconnectedPacket) packet).Players + "/" + ((PlayerDisconnectedPacket) packet).MaxPlayers; })); App.Instance.GetRpcClient().UpdatePartySize(((PlayerDisconnectedPacket) packet).Players); break; case PacketType.ServerShutdown: App.Current.Dispatcher.Invoke((Action)(() => { MainWindow.Instance.ShowDisconnectScreen("Сервер выключен: "+((ServerShutdownPacket)packet).Reason); })); _breakFlag = true; break; case PacketType.MessageReceivePacket: App.Current.Dispatcher.Invoke((Action)(() => { ListBoxItem message = new ListBoxItem(); if (((MessageReceivePacket) packet).IsSystem) { message.Content = ((MessageReceivePacket) packet).Text; } else { message.Content = ((MessageReceivePacket) packet).Author + ": " + ((MessageReceivePacket) packet).Text; } switch (((MessageReceivePacket)packet).ChatType) { case ChatType.Queue: MainWindow.Instance.QueueChat.Items.Add(message); MainWindow.Instance.QueueChat.ScrollIntoView(message); break; } })); break; } } } } }