Пример #1
0
        /// <summary>
        /// Disconnects and disposes this voice connection.
        /// </summary>
        public void Dispose()
        {
            if (IsDisposed)
            {
                return;
            }

            IsDisposed    = true;
            IsInitialized = false;
            TokenSource.Cancel();
#if !NETSTANDARD1_1
            if (Configuration.EnableIncoming)
            {
                ReceiverTokenSource.Cancel();
            }
#endif

            try
            {
                VoiceWs.DisconnectAsync(null).ConfigureAwait(false).GetAwaiter().GetResult();
                UdpClient.Close();
            }
            catch (Exception)
            { }

            Opus?.Dispose();
            Opus   = null;
            Sodium = null;
            Rtp    = null;

            if (VoiceDisconnected != null)
            {
                VoiceDisconnected(Guild);
            }
        }
Пример #2
0
        public async Task DisconnectAsync(int code = 1000, string message = "")
        {
            // ReSharper disable once MethodSupportsCancellation
            await Locker.WaitAsync().ConfigureAwait(false);

            try
            {
                IsClientClosed = true;

                if (ClientWebSocket != null)
                {
                    await ClientWebSocket.CloseOutputAsync((WebSocketCloseStatus)code, message, CancellationToken.None)
                    .ConfigureAwait(false);
                }

                if (ReadTask != null)
                {
                    await ReadTask.ConfigureAwait(false);
                }

                if (IsConnected)
                {
                    IsConnected = false;
                }

                SocketTokenSource?.Cancel();
                SocketTokenSource?.Dispose();

                ReceiverTokenSource?.Cancel();
                ReceiverTokenSource?.Dispose();
            }
            catch
            {
                // ignored
            }
            finally
            {
                Locker.Release();
            }
        }