chat function
This commit is contained in:
74
Chat/Core/ChatPacket.cs
Normal file
74
Chat/Core/ChatPacket.cs
Normal file
@@ -0,0 +1,74 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Core
|
||||
{
|
||||
public class ChatPacket : IPacket
|
||||
{
|
||||
public string Message { get; private set; }
|
||||
public string NickName { get; private set; }
|
||||
|
||||
public ChatPacket(string nickname, string message)
|
||||
{
|
||||
NickName = nickname;
|
||||
Message = message;
|
||||
}
|
||||
|
||||
public ChatPacket(byte[] buffer)
|
||||
{
|
||||
int cursor = 2;
|
||||
|
||||
short messageSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, cursor));
|
||||
cursor += sizeof(short);
|
||||
|
||||
Message = Encoding.UTF8.GetString(buffer, cursor, messageSize);
|
||||
cursor += messageSize;
|
||||
|
||||
short nicknameSize = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, cursor));
|
||||
cursor += sizeof(short);
|
||||
|
||||
NickName = Encoding.UTF8.GetString(buffer, cursor, nicknameSize);
|
||||
}
|
||||
|
||||
public byte[] Serialize()
|
||||
{
|
||||
// 2bytes header
|
||||
// data: 2bytes packetType + 2bytes id size + id + 2bytes nickname size + nickname
|
||||
|
||||
byte[] packetType = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)PacketType.Chat));
|
||||
byte[] message = Encoding.UTF8.GetBytes(Message);
|
||||
byte[] messageSize = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)message.Length));
|
||||
byte[] nickname = Encoding.UTF8.GetBytes(NickName);
|
||||
byte[] nicknameSize = BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)nickname.Length));
|
||||
|
||||
short dataSize = (short)(packetType.Length + message.Length + messageSize.Length + nickname.Length + nicknameSize.Length);
|
||||
byte[] header = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(dataSize));
|
||||
|
||||
byte[] buffer = new byte[2 + dataSize];
|
||||
|
||||
int cursor = 0;
|
||||
Array.Copy(header, 0, buffer, cursor, header.Length);
|
||||
cursor += header.Length;
|
||||
|
||||
Array.Copy(packetType, 0, buffer, cursor, packetType.Length);
|
||||
cursor += packetType.Length;
|
||||
|
||||
Array.Copy(messageSize, 0, buffer, cursor, messageSize.Length);
|
||||
cursor += messageSize.Length;
|
||||
|
||||
Array.Copy(message, 0, buffer, cursor, message.Length);
|
||||
cursor += message.Length;
|
||||
|
||||
Array.Copy(nicknameSize, 0, buffer, cursor, nicknameSize.Length);
|
||||
cursor += nicknameSize.Length;
|
||||
|
||||
Array.Copy(nickname, 0, buffer, cursor, nickname.Length);
|
||||
|
||||
return buffer;
|
||||
}
|
||||
}
|
||||
}
|
@@ -76,13 +76,13 @@ namespace Core
|
||||
{
|
||||
LoginRequestPacket requestPacket = new LoginRequestPacket(dataBuffer);
|
||||
|
||||
Clients.TryAdd(requestPacket.Id, clientSocket);
|
||||
bool result = Clients.TryAdd(requestPacket.Id, clientSocket);
|
||||
Console.WriteLine($"[{DateTime.Now}] LoginRequest - Id: {requestPacket.Id}, Nickname: {requestPacket.NickName}");
|
||||
|
||||
id = requestPacket.Id;
|
||||
nickname = requestPacket.NickName;
|
||||
|
||||
LoginResponsePacket responsePacket = new LoginResponsePacket(StatusCode.Success);
|
||||
LoginResponsePacket responsePacket = new LoginResponsePacket(result ? StatusCode.Success : StatusCode.Failed);
|
||||
await clientSocket.SendAsync(responsePacket.Serialize(), SocketFlags.None);
|
||||
}
|
||||
else if (packetType == PacketType.CreateRoomRequest)
|
||||
@@ -169,6 +169,18 @@ namespace Core
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (packetType == PacketType.Chat)
|
||||
{
|
||||
ChatPacket packet = new ChatPacket(dataBuffer);
|
||||
if (Rooms.TryGetValue(roomName, out var room))
|
||||
{
|
||||
foreach (var user in room.Users)
|
||||
{
|
||||
if (Clients.TryGetValue(user.Key, out var otherClient))
|
||||
await otherClient.SendAsync(packet.Serialize(), SocketFlags.None);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -18,5 +18,6 @@ namespace Core
|
||||
EnterRoomResponse,
|
||||
UserEnter,
|
||||
UserLeave,
|
||||
Chat
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user