Voice stability patches
This commit is contained in:
@@ -15,10 +15,22 @@ namespace Discord
|
||||
if (channelId == null) throw new ArgumentNullException(nameof(channelId));
|
||||
|
||||
await LeaveVoiceServer().ConfigureAwait(false);
|
||||
_voiceSocket.SetServer(serverId);
|
||||
_dataSocket.SendJoinVoice(serverId, channelId);
|
||||
//await _voiceSocket.WaitForConnection().ConfigureAwait(false);
|
||||
//TODO: Add another ManualResetSlim to wait on here, base it off of DiscordClient's setup
|
||||
|
||||
try
|
||||
{
|
||||
await Task.Run(() =>
|
||||
{
|
||||
_voiceSocket.SetServer(serverId);
|
||||
_dataSocket.SendJoinVoice(serverId, channelId);
|
||||
_voiceSocket.WaitForConnection();
|
||||
})
|
||||
.Timeout(_config.ConnectionTimeout)
|
||||
.ConfigureAwait(false);
|
||||
}
|
||||
catch (TaskCanceledException)
|
||||
{
|
||||
await LeaveVoiceServer().ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
public async Task LeaveVoiceServer()
|
||||
{
|
||||
@@ -26,9 +38,12 @@ namespace Discord
|
||||
|
||||
if (_voiceSocket.State != Net.WebSockets.WebSocketState.Disconnected)
|
||||
{
|
||||
await _voiceSocket.Disconnect().ConfigureAwait(false);
|
||||
await TaskHelper.CompletedTask.ConfigureAwait(false);
|
||||
_dataSocket.SendLeaveVoice();
|
||||
var serverId = _voiceSocket.CurrentVoiceServerId;
|
||||
if (serverId != null)
|
||||
{
|
||||
await _voiceSocket.Disconnect().ConfigureAwait(false);
|
||||
_dataSocket.SendLeaveVoice(serverId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +72,7 @@ namespace Discord
|
||||
{
|
||||
CheckReady(checkVoice: true);
|
||||
|
||||
_voiceSocket.Wait();
|
||||
_voiceSocket.WaitForQueue();
|
||||
await TaskHelper.CompletedTask.ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,11 +32,12 @@ namespace Discord
|
||||
private readonly ManualResetEvent _disconnectedEvent;
|
||||
private readonly ManualResetEventSlim _connectedEvent;
|
||||
private readonly JsonSerializer _serializer;
|
||||
protected ExceptionDispatchInfo _disconnectReason;
|
||||
private Task _runTask;
|
||||
private bool _wasDisconnectUnexpected;
|
||||
private string _token;
|
||||
|
||||
protected ExceptionDispatchInfo _disconnectReason;
|
||||
private bool _wasDisconnectUnexpected;
|
||||
|
||||
/// <summary> Returns the id of the current logged-in user. </summary>
|
||||
public string CurrentUserId => _currentUserId;
|
||||
private string _currentUserId;
|
||||
@@ -754,14 +755,14 @@ namespace Discord
|
||||
//When the first task ends, make sure the rest do too
|
||||
await DisconnectInternal(skipAwait: true);
|
||||
|
||||
bool wasUnexpected = _wasDisconnectUnexpected;
|
||||
_wasDisconnectUnexpected = false;
|
||||
|
||||
await Cleanup(wasUnexpected).ConfigureAwait(false);
|
||||
await Cleanup().ConfigureAwait(false);
|
||||
_runTask = null;
|
||||
}
|
||||
private async Task Cleanup(bool wasUnexpected)
|
||||
private async Task Cleanup()
|
||||
{
|
||||
var wasDisconnectUnexpected = _wasDisconnectUnexpected;
|
||||
_wasDisconnectUnexpected = false;
|
||||
|
||||
await _dataSocket.Disconnect().ConfigureAwait(false);
|
||||
if (_config.EnableVoice)
|
||||
await _voiceSocket.Disconnect().ConfigureAwait(false);
|
||||
@@ -783,7 +784,7 @@ namespace Discord
|
||||
_currentUserId = null;
|
||||
_token = null;
|
||||
|
||||
if (!wasUnexpected)
|
||||
if (!wasDisconnectUnexpected)
|
||||
{
|
||||
_state = (int)DiscordClientState.Disconnected;
|
||||
_disconnectedEvent.Set();
|
||||
|
||||
@@ -119,9 +119,10 @@ namespace Discord.Net.WebSockets
|
||||
joinVoice.Payload.ChannelId = channelId;
|
||||
QueueMessage(joinVoice);
|
||||
}
|
||||
public void SendLeaveVoice()
|
||||
public void SendLeaveVoice(string serverId)
|
||||
{
|
||||
var leaveVoice = new Commands.JoinVoice();
|
||||
leaveVoice.Payload.ServerId = serverId;
|
||||
QueueMessage(leaveVoice);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -514,9 +514,13 @@ namespace Discord.Net.WebSockets
|
||||
return new VoiceCommands.KeepAlive();
|
||||
}
|
||||
|
||||
public void Wait()
|
||||
public void WaitForQueue()
|
||||
{
|
||||
_sendQueueEmptyWait.Wait();
|
||||
_sendQueueEmptyWait.Wait(_cancelToken);
|
||||
}
|
||||
public void WaitForConnection()
|
||||
{
|
||||
_connectedEvent.Wait();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,31 +37,33 @@ namespace Discord.Net.WebSockets
|
||||
protected readonly IWebSocketEngine _engine;
|
||||
protected readonly DiscordClient _client;
|
||||
protected readonly LogMessageSeverity _logLevel;
|
||||
protected readonly ManualResetEventSlim _connectedEvent;
|
||||
|
||||
public string Host { get; set; }
|
||||
protected ExceptionDispatchInfo _disconnectReason;
|
||||
protected bool _wasDisconnectUnexpected;
|
||||
protected WebSocketState _disconnectState;
|
||||
|
||||
protected int _loginTimeout, _heartbeatInterval;
|
||||
private DateTime _lastHeartbeat;
|
||||
private Task _runTask;
|
||||
|
||||
public WebSocketState State => (WebSocketState)_state;
|
||||
protected int _state;
|
||||
|
||||
protected ExceptionDispatchInfo _disconnectReason;
|
||||
protected bool _wasDisconnectUnexpected;
|
||||
protected WebSocketState _disconnectState;
|
||||
|
||||
public CancellationToken ParentCancelToken { get; set; }
|
||||
public CancellationToken CancelToken => _cancelToken;
|
||||
private CancellationTokenSource _cancelTokenSource;
|
||||
protected CancellationToken _cancelToken;
|
||||
|
||||
public string Host { get; set; }
|
||||
|
||||
public WebSocketState State => (WebSocketState)_state;
|
||||
protected int _state;
|
||||
|
||||
public WebSocket(DiscordClient client)
|
||||
{
|
||||
_client = client;
|
||||
_logLevel = client.Config.LogLevel;
|
||||
_loginTimeout = client.Config.ConnectionTimeout;
|
||||
_cancelToken = new CancellationToken(true);
|
||||
_connectedEvent = new ManualResetEventSlim(false);
|
||||
|
||||
_engine = new BuiltInWebSocketEngine(client.Config.WebSocketInterval);
|
||||
_engine.ProcessMessage += async (s, e) =>
|
||||
@@ -102,6 +104,7 @@ namespace Discord.Net.WebSockets
|
||||
protected void CompleteConnect()
|
||||
{
|
||||
_state = (int)WebSocketState.Connected;
|
||||
_connectedEvent.Set();
|
||||
RaiseConnected();
|
||||
}
|
||||
/*public Task Reconnect(CancellationToken cancelToken)
|
||||
@@ -184,6 +187,7 @@ namespace Discord.Net.WebSockets
|
||||
var oldState = _state;
|
||||
_state = (int)WebSocketState.Disconnected;
|
||||
_runTask = null;
|
||||
_connectedEvent.Reset();
|
||||
|
||||
if (disconnectState == WebSocketState.Connected)
|
||||
RaiseDisconnected(wasDisconnectUnexpected, _disconnectReason?.SourceException);
|
||||
|
||||
Reference in New Issue
Block a user