/// Disconnects the client and invokes the disconnect handler.
/// </summary>
/// <param name="reason">A reason.</param>
+ /// <param name="writer">A message to send with disconnect packet.</param>
/// <returns>Task that must be awaited.</returns>
- ValueTask DisconnectAsync(string? reason);
+ ValueTask DisconnectAsync(string? reason, IMessageWriter? writer = null);
}
}
--- /dev/null
+using System;
+using Impostor.Api.Innersloth;
+
+namespace Impostor.Api.Net.Messages.S2C
+{
+ public class MessageDisconnect
+ {
+ public static void Serialize(IMessageWriter writer, bool hasReason, DisconnectReason? reason, string? message)
+ {
+ writer.Write(hasReason);
+
+ if (hasReason)
+ {
+ if (reason == null)
+ {
+ throw new ArgumentNullException(nameof(reason));
+ }
+
+ writer.StartMessage(0);
+ writer.Write((byte)reason);
+
+ if (reason == DisconnectReason.Custom)
+ {
+ if (message == null)
+ {
+ throw new ArgumentNullException(nameof(message));
+ }
+
+ writer.Write(message);
+ }
+
+ writer.EndMessage();
+ }
+ }
+
+ public static void Deserialize(IMessageReader reader, out bool hasReason, out DisconnectReason? reason, out string? message)
+ {
+ hasReason = reader.ReadBoolean();
+
+ if (hasReason)
+ {
+ var inner = reader.ReadMessage();
+ reason = (DisconnectReason)inner.ReadByte();
+ message = reason == DisconnectReason.Custom ? inner.ReadString() : null;
+ }
+ else
+ {
+ reason = null;
+ message = null;
+ }
+ }
+ }
+}
return;
}
- using var packet = MessageWriter.Get(MessageType.Reliable);
- Message01JoinGameS2C.SerializeError(packet, false, reason, message);
+ using var writer = MessageWriter.Get();
+ MessageDisconnect.Serialize(writer, true, 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());
+ await Connection.DisconnectAsync(message ?? reason.ToString(), writer);
}
}
}
return InnerConnection.SendAsync(writer);
}
- public ValueTask DisconnectAsync(string? reason)
+ public ValueTask DisconnectAsync(string? reason, IMessageWriter? writer = null)
{
- return InnerConnection.Disconnect(reason);
+ return InnerConnection.Disconnect(reason, writer as MessageWriter);
}
public void DisposeInnerConnection()
return ValueTask.CompletedTask;
}
- public ValueTask DisconnectAsync(string reason)
+ public ValueTask DisconnectAsync(string reason, IMessageWriter writer = null)
{
return ValueTask.CompletedTask;
}