namespace Matchmaker.Server.BaseServer; public static class ServerSend { public enum StatusType { OK, RECEIVED, FAIL } /// /// Sends TCP data to a Client /// /// Server the Client is in /// ID for the recipient /// Data to send public static void SendTcpData(Server server, int toClient, Packet packet) { packet.WriteLength(); var tcp = server.Clients[toClient].Tcp; tcp?.SendData(packet); } /// /// Sends UDP data to a Client /// /// Server the Client is in /// ID for the recipient /// Data to send // ReSharper disable once UnusedMember.Global public static void SendUdpData(Server server, int toClient, Packet packet) { packet.WriteLength(); var udp = server.Clients[toClient].Udp; udp.SendData(packet); } /// /// Sends TCP data to all Clients /// /// Server the Client is in /// Data to send // ReSharper disable once UnusedMember.Global public static void SendTcpDataToAll(Server server, Packet packet) { packet.WriteLength(); for (var i = 1; i <= server.MaxPlayers; i++) { var tcp = server.Clients[i].Tcp; tcp?.SendData(packet); } } /// /// Sends TCP data to all Clients except one /// /// Server the Client is in /// /// What Client to exclude /// Data to send // ReSharper disable once UnusedMember.Global public static void SendTcpDataToAll(Server server, int exceptClient, Packet packet) { packet.WriteLength(); for (var i = 1; i <= server.MaxPlayers; i++) { if (i == exceptClient) continue; var tcp = server.Clients[i].Tcp; tcp?.SendData(packet); } } /// /// Sends UDP data to all Clients /// /// Server the Client is in /// Data to send // ReSharper disable once UnusedMember.Global public static void SendUdpDataToAll(Server server, Packet packet) { packet.WriteLength(); for (var i = 1; i <= server.MaxPlayers; i++) { var udp = server.Clients[i].Udp; udp.SendData(packet); } } /// /// Sends UDP data to all Clients except one /// /// Server the Client is in /// What Client to exclude /// Data to send // ReSharper disable once UnusedMember.Global public static void SendUdpDataToAll(Server server, int exceptClient, Packet packet) { packet.WriteLength(); for (var i = 1; i <= server.MaxPlayers; i++) { if (i == exceptClient) continue; var udp = server.Clients[i].Udp; udp.SendData(packet); } } /// /// Sends TCP data to a Client /// /// Server the Client is in /// ID for the recipient /// Data to send public static void SendTcpDataNoSync(Server server, int toClient, Packet packet) { packet.WriteLength(); var tcp = server.Clients[toClient].Tcp; tcp?.SendData(packet); } /// /// Sends UDP data to a Client /// /// Server the Client is in /// ID for the recipient /// Data to send // ReSharper disable once UnusedMember.Global public static void SendUdpDataNoSync(Server server, int toClient, Packet packet) { packet.WriteLength(); var udp = server.Clients[toClient].Udp; udp.SendData(packet); } /// /// Sends TCP data to all Clients /// /// Server the Client is in /// Data to send // ReSharper disable once UnusedMember.Global public static void SendTcpDataToAllNoSync(Server server, Packet packet) { packet.WriteLength(); for (var i = 1; i <= server.MaxPlayers; i++) { var tcp = server.Clients[i].Tcp; tcp?.SendData(packet); } } /// /// Sends TCP data to all Clients except one /// /// Server the Client is in /// /// What Client to exclude /// Data to send // ReSharper disable once UnusedMember.Global public static void SendTcpDataToAllNoSync(Server server, int exceptClient, Packet packet) { packet.WriteLength(); for (var i = 1; i <= server.MaxPlayers; i++) { if (i == exceptClient) continue; var tcp = server.Clients[i].Tcp; tcp?.SendData(packet); } } /// /// Sends UDP data to all Clients /// /// Server the Client is in /// Data to send // ReSharper disable once UnusedMember.Global public static void SendUdpDataToAllNoSync(Server server, Packet packet) { packet.WriteLength(); for (var i = 1; i <= server.MaxPlayers; i++) { var udp = server.Clients[i].Udp; udp.SendData(packet); } } /// /// Sends UDP data to all Clients except one /// /// Server the Client is in /// What Client to exclude /// Data to send // ReSharper disable once UnusedMember.Global public static void SendUdpDataToAllNoSync(Server server, int exceptClient, Packet packet) { packet.WriteLength(); for (var i = 1; i <= server.MaxPlayers; i++) { if (i == exceptClient) continue; var udp = server.Clients[i].Udp; udp.SendData(packet); } } #region Built-in Packets /// /// Welcome message for Client /// /// Server the Client is in /// ID for the recipient /// Message to send public static void Welcome(Server server, int toClient, string msg) { Terminal.LogDebug($"[{server.DisplayName}] Sending 'Welcome' message."); using var packet = new Packet(int.MaxValue); packet.Write(msg); packet.Write(toClient); packet.Write(Config.MatchmakerAPIVersion); packet.Write(Config.GameId); packet.Write(Config.GameVersion); SendTcpData(server, toClient, packet); } /// /// Disconnect a Client /// /// What server the Client is in /// What Client to kick public static void DisconnectClient(Server server, int toClient) { using var packet = new Packet(int.MaxValue-1); SendTcpData(server, toClient, packet); } /// /// Send an Attribute to the Client /// /// What server the Client is in /// ID for the recipient /// What Client the Attribute is from /// The Attribute name /// The Attribute value public static void GetClientAttributesReceived(BaseServer.Server server, int toClient, int requestedId, string name, string value) { using var packet = new Packet(int.MaxValue-2); packet.Write(requestedId); packet.Write(name); packet.Write(value); ServerSend.SendTcpData(server, toClient, packet); } /// /// Respond to the client with a status /// /// What server the Client is in /// ID for the recipient /// What status public static void Status(BaseServer.Server server, int toClient, StatusType status) { Terminal.LogDebug($"[{server.DisplayName}] Sending status {status}..."); using var packet = new Packet(int.MaxValue-3); packet.Write((int)status); ServerSend.SendUdpDataNoSync(server, toClient, packet); } #endregion }