RMafia/MafiaGame/ServerConnection.cs
2021-01-17 22:47:37 +03:00

154 lines
6.6 KiB
C#

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
});
}));
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;
}
}
}
}
}