public override async ValueTask HandleMessageAsync(IMessageReader reader, MessageType messageType) { var flag = reader.Tag; Logger.Verbose("Server got {0}.", flag); switch (flag) { case MessageFlags.HostGame: { using var packet = MessageWriter.Get(MessageType.Reliable); Message13RedirectS2C.Serialize(packet, false, _nodeProvider.Get()); await Connection.SendAsync(packet); break; } case MessageFlags.JoinGame: { Message01JoinGameC2S.Deserialize( reader, out var gameCode, out _); using var packet = MessageWriter.Get(MessageType.Reliable); var endpoint = await _nodeLocator.FindAsync(GameCodeParser.IntToGameName(gameCode)); if (endpoint == null) { Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.GameMissing); } else { Message13RedirectS2C.Serialize(packet, false, endpoint); } await Connection.SendAsync(packet); break; } case MessageFlags.GetGameListV2: { // TODO: Implement. using var packet = MessageWriter.Get(MessageType.Reliable); Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.Custom, DisconnectMessages.NotImplemented); await Connection.SendAsync(packet); break; } default: { Logger.Warning("Received unsupported message flag on the redirector ({0}).", flag); break; } } }
public async ValueTask DisconnectAsync(DisconnectReason reason, string?message = null) { if (!Connection.IsConnected) { return; } using var packet = MessageWriter.Get(MessageType.Reliable); Message01JoinGameS2C.SerializeError(packet, false, reason, message); await Connection.SendAsync(packet); // Need this to show the correct message, otherwise it shows a generic disconnect message. await Task.Delay(TimeSpan.FromMilliseconds(250)); await Connection.DisconnectAsync(message ?? reason.ToString()); }
public async ValueTask RegisterConnectionAsync(IHazelConnection connection, string name, int clientVersion, ISet <Mod>?mods) { if (!SupportedVersions.Contains(clientVersion)) { using var packet = MessageWriter.Get(MessageType.Reliable); Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.IncorrectVersion); await connection.SendAsync(packet); return; } if (name.Length > 10) { using var packet = MessageWriter.Get(MessageType.Reliable); Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.Custom, DisconnectMessages.UsernameLength); await connection.SendAsync(packet); return; } if (string.IsNullOrWhiteSpace(name) || !name.All(TextBox.IsCharAllowed)) { using var packet = MessageWriter.Get(MessageType.Reliable); Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.Custom, DisconnectMessages.UsernameIllegalCharacters); await connection.SendAsync(packet); return; } var client = _clientFactory.Create(connection, name, clientVersion, mods ?? new HashSet <Mod>(0)); var id = NextId(); client.Id = id; _logger.LogTrace("Client connected."); _clients.TryAdd(id, client); using var writer = MessageWriter.Get(MessageType.Reliable); ModdedHandshakeS2C.Serialize(writer, ServerBrand); await connection.SendAsync(writer); }
public async ValueTask RegisterConnectionAsync(IHazelConnection connection, string name, int clientVersion) { if (!SupportedVersions.Contains(clientVersion)) { using var packet = MessageWriter.Get(MessageType.Reliable); Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.IncorrectVersion); await connection.SendAsync(packet); return; } if (name.Length > 10) { using var packet = MessageWriter.Get(MessageType.Reliable); Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.Custom, DisconnectMessages.UsernameLength); await connection.SendAsync(packet); return; } if (string.IsNullOrWhiteSpace(name) || !name.All(TextBox.IsCharAllowed)) { using var packet = MessageWriter.Get(MessageType.Reliable); Message01JoinGameS2C.SerializeError(packet, false, DisconnectReason.Custom, DisconnectMessages.UsernameIllegalCharacters); await connection.SendAsync(packet); return; } var client = _clientFactory.Create(connection, name, clientVersion); int id = NextId(); client.Id = id; _logger.LogTrace("Client connected."); _clients.TryAdd(id, client); await _eventManager.CallAsync(new ClientConnectedEvent(connection, client)); }