using System.Net; // ReSharper disable once CheckNamespace namespace Matchmaker.Server.BaseServer; internal static class ServerHandle { /// /// Gets the message received in response to the Welcome message /// /// /// /// public static void WelcomeReceived(Server server, int fromClient, Packet packet) { try { var clientIdCheck = packet.ReadInt(); var clientAPIVersion = packet.ReadString(); var clientGameVersion = packet.ReadString(); var clientGameId = packet.ReadString(); if (clientAPIVersion != Config.MatchmakerAPIVersion) { Terminal.LogError( $"[{server.DisplayName}] Client API is not the same version as the Server! \n Server API version: {Config.MatchmakerAPIVersion}. \n Client API version: {clientAPIVersion}"); server.Clients[fromClient].Disconnect(); return; } if (clientGameId != Config.GameId) { Terminal.LogError($"Client Game ID and Server Game ID do not match: \n Server Game ID: {Config.GameId}. \n Client Game ID: {clientGameId}."); server.Clients[fromClient].Disconnect(); return; } if (clientGameVersion != Config.GameVersion) { Terminal.LogError($"Client Game Version and Server Game Version do not match: \n Server Game Ver: {Config.GameVersion}. \n Client Game Ver: {clientGameVersion}."); server.Clients[fromClient].Disconnect(); return; } var tcp = server.Clients[fromClient].Tcp; if (tcp == null) { Terminal.LogWarn("TCP is null!"); } if (tcp is { Socket: { } }) Terminal.LogSuccess( $"[{server.DisplayName}] {tcp.Socket.Client.RemoteEndPoint} connected successfully and is now player {fromClient}."); if (fromClient != clientIdCheck) { Terminal.LogWarn( $"[{server.DisplayName}] Player (ID: {fromClient}) has assumed the wrong client ID ({clientIdCheck})!"); } var remoteIpEndPoint = server.Clients[fromClient].Tcp?.Socket?.Client.RemoteEndPoint as IPEndPoint; if (remoteIpEndPoint == null) { Terminal.LogDebug($"[{server.DisplayName}] WelcomeReceived: RemoteIpEndPoint is NULL!"); server.Clients[fromClient].Attributes.Clear(); server.Clients[fromClient].Disconnect(); return; } var uuidList = new List(); for (var i = 1; i < server.Clients.Count; i++) { if (server.Clients[i].IsConnected) { var x = server.Clients[i].Attributes.GetAttribute("_auto_uuid"); if (x != null) { uuidList.Add(x); } } } server.Clients[fromClient].Attributes.SetAttribute("_auto_ip", remoteIpEndPoint.Address.ToString()); server.Clients[fromClient].Attributes.SetAttribute("_auto_port", remoteIpEndPoint.Port.ToString()); server.Clients[fromClient].Attributes .SetAttribute("_auto_uuid", new UUID(Config.UuidLength, uuidList).GetValue()); server.Clients[fromClient].Attributes .SetAttribute("_auto_game_version", clientGameVersion); Terminal.LogInfo( $"[{server.DisplayName}] Automatically assigned _auto_ip for client {fromClient}. _auto_ip = {server.Clients[fromClient].Attributes.GetAttribute("_auto_ip")}"); Terminal.LogInfo( $"[{server.DisplayName}] Automatically assigned _auto_port for client {fromClient}. _auto_port = {server.Clients[fromClient].Attributes.GetAttribute("_auto_port")}"); Terminal.LogInfo( $"[{server.DisplayName}] Automatically assigned _auto_uuid for client {fromClient}. _auto_uuid = {server.Clients[fromClient].Attributes.GetAttribute("_auto_uuid")}"); Terminal.LogInfo( $"[{server.DisplayName}] Automatically assigned _auto_game_version for client {fromClient} based on received Client data. _auto_game_version = {server.Clients[fromClient].Attributes.GetAttribute("_auto_game_version")}"); } catch (Exception ex) { Terminal.LogError($"[{server.DisplayName}] Error in WelcomeReceived packet handler: {ex}"); ServerSend.Status(server, fromClient, ServerSend.StatusType.FAIL); server.Clients[fromClient].Disconnect(); } } public static void SetClientAttribute(Server server, int fromClient, Packet packet) { var clientIdCheck = packet.ReadInt(); var name = packet.ReadString(); var value = packet.ReadString(); var tcp = server.Clients[fromClient].Tcp; if (tcp is { Socket: { } }) Terminal.LogInfo( $"[{server.DisplayName}] {tcp.Socket.Client.RemoteEndPoint} is changing Client Attribute {name} to {value}."); if (fromClient != clientIdCheck) { Terminal.LogWarn( $"[{server.DisplayName}] Player (ID: {fromClient}) has assumed the wrong client ID ({clientIdCheck})!"); return; } server.Clients[fromClient].Attributes.SetAttribute(name, value); } public static void GetClientAttribute(Server server, int fromClient, Packet packet) { var clientIdCheck = packet.ReadInt(); var requestedId = packet.ReadInt(); var name = packet.ReadString(); try { var tcp = server.Clients[fromClient].Tcp; if (tcp is { Socket: { } }) Terminal.LogInfo( $"[{server.DisplayName}] {tcp.Socket.Client.RemoteEndPoint} requests Client Attribute {name}."); if (fromClient != clientIdCheck) { Terminal.LogWarn( $"[{server.DisplayName}] Player (ID: {fromClient}) has assumed the wrong client ID ({clientIdCheck})!"); } var value = server.Clients[requestedId].Attributes.GetAttribute(name); ServerSend.GetClientAttributesReceived(server, fromClient, requestedId, name, value ?? ""); } catch (Exception ex) { Terminal.LogError($"[{server.DisplayName}] Error in GetClientAttribute: {ex}"); ServerSend.GetClientAttributesReceived(server, fromClient, requestedId, name, "ERR_HANDLED_EXCEPTION"); } } }