RMafia/MafiaServer/PlayerSocketWorker.cs
2021-01-17 22:47:37 +03:00

83 lines
2.5 KiB
C#

using System;
using System.Net.Sockets;
using System.Text;
using MafiaCommon.Packets;
using MafiaServer.Events;
namespace MafiaServer
{
public class PlayerSocketWorker
{
private Socket _socket;
public readonly string PlayerName;
public event OnDisconnectByErrorEvent OnDisconnectByErrorEvent;
public event OnPlayerSendMessageEvent OnPlayerSendMessageEvent;
public int Id;
public PlayerSocketWorker(Socket socket)
{
_socket = socket;
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);
var packet = PacketConverter.toPacket(builder.ToString());
if (packet.GetType() == typeof(ConnectPacket))
{
PlayerName = ((ConnectPacket) packet).Name;
MafiaServer.Game.ConnectPlayer(this);
}
else
{
_socket.Close();
}
}
public void sendPacket(Packet packet)
{
_socket.Send(PacketConverter.toBytes(packet));
}
public void disconnect()
{
_socket.Close();
}
public void run()
{
while (_socket.Connected)
{
try
{
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.MessageSendPacket:
OnPlayerSendMessageEvent.Invoke(this,((MessageSendPacket)packet).ChatType,((MessageSendPacket)packet).Text);
break;
}
}
catch (SocketException e)
{
OnDisconnectByErrorEvent.Invoke(this);
}
}
}
}
}