Fixed DiscordClient.Disconnect
This commit is contained in:
@@ -24,7 +24,7 @@ namespace Discord
|
||||
private readonly Semaphore _connectionLock;
|
||||
private readonly ManualResetEvent _disconnectedEvent;
|
||||
private readonly ManualResetEventSlim _connectedEvent;
|
||||
private readonly TaskManager _taskManager;
|
||||
private readonly TaskManager _taskManager;
|
||||
private readonly ConcurrentDictionary<ulong, Server> _servers;
|
||||
private readonly ConcurrentDictionary<ulong, Channel> _channels;
|
||||
private readonly ConcurrentDictionary<ulong, Channel> _privateChannels; //Key = RecipientId
|
||||
@@ -72,16 +72,16 @@ namespace Discord
|
||||
public IEnumerable<Channel> PrivateChannels => _privateChannels.Select(x => x.Value);
|
||||
/// <summary> Gets a collection of all voice regions currently offered by Discord. </summary>
|
||||
public IEnumerable<Region> Regions => _regions.Select(x => x.Value);
|
||||
|
||||
/// <summary> Initializes a new instance of the DiscordClient class. </summary>
|
||||
public DiscordClient(DiscordConfig config = null)
|
||||
{
|
||||
Config = config ?? new DiscordConfig();
|
||||
|
||||
/// <summary> Initializes a new instance of the DiscordClient class. </summary>
|
||||
public DiscordClient(DiscordConfig config = null)
|
||||
{
|
||||
Config = config ?? new DiscordConfig();
|
||||
Config.Lock();
|
||||
|
||||
State = (int)ConnectionState.Disconnected;
|
||||
Status = UserStatus.Online;
|
||||
|
||||
|
||||
State = (int)ConnectionState.Disconnected;
|
||||
Status = UserStatus.Online;
|
||||
|
||||
//Logging
|
||||
Log = new LogManager(this);
|
||||
Logger = Log.CreateLogger("Discord");
|
||||
@@ -89,8 +89,8 @@ namespace Discord
|
||||
//Async
|
||||
_taskManager = new TaskManager(Cleanup);
|
||||
_connectionLock = new Semaphore(1, 1);
|
||||
_disconnectedEvent = new ManualResetEvent(true);
|
||||
_connectedEvent = new ManualResetEventSlim(false);
|
||||
_disconnectedEvent = new ManualResetEvent(true);
|
||||
_connectedEvent = new ManualResetEventSlim(false);
|
||||
CancelToken = new CancellationToken(true);
|
||||
|
||||
//Cache
|
||||
@@ -102,8 +102,8 @@ namespace Discord
|
||||
_serializer = new JsonSerializer();
|
||||
_serializer.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
|
||||
#if TEST_RESPONSES
|
||||
_serializer.CheckAdditionalContent = true;
|
||||
_serializer.MissingMemberHandling = MissingMemberHandling.Error;
|
||||
_serializer.CheckAdditionalContent = true;
|
||||
_serializer.MissingMemberHandling = MissingMemberHandling.Error;
|
||||
#else
|
||||
_serializer.Error += (s, e) =>
|
||||
{
|
||||
@@ -123,14 +123,14 @@ namespace Discord
|
||||
};
|
||||
GatewaySocket.Disconnected += (s, e) => OnDisconnected(e.WasUnexpected, e.Exception);
|
||||
GatewaySocket.ReceivedDispatch += (s, e) => OnReceivedEvent(e);
|
||||
|
||||
if (Config.UseMessageQueue)
|
||||
MessageQueue = new MessageQueue(this);
|
||||
Connected += async (s, e) =>
|
||||
{
|
||||
|
||||
if (Config.UseMessageQueue)
|
||||
MessageQueue = new MessageQueue(this);
|
||||
Connected += async (s, e) =>
|
||||
{
|
||||
ClientAPI.CancelToken = CancelToken;
|
||||
await SendStatus().ConfigureAwait(false);
|
||||
};
|
||||
await SendStatus().ConfigureAwait(false);
|
||||
};
|
||||
|
||||
//Extensibility
|
||||
Services = new ServiceManager(this);
|
||||
@@ -140,18 +140,18 @@ namespace Discord
|
||||
//_messageImporter.ContractResolver = new Message.ImportResolver();
|
||||
}
|
||||
|
||||
/// <summary> Connects to the Discord server with the provided email and password. </summary>
|
||||
/// <returns> Returns a token that can be optionally stored for future connections. </returns>
|
||||
public async Task<string> Connect(string email, string password)
|
||||
{
|
||||
/// <summary> Connects to the Discord server with the provided email and password. </summary>
|
||||
/// <returns> Returns a token that can be optionally stored for future connections. </returns>
|
||||
public async Task<string> Connect(string email, string password)
|
||||
{
|
||||
if (email == null) throw new ArgumentNullException(email);
|
||||
if (password == null) throw new ArgumentNullException(password);
|
||||
|
||||
await BeginConnect(email, password, null).ConfigureAwait(false);
|
||||
return ClientAPI.Token;
|
||||
}
|
||||
/// <summary> Connects to the Discord server with the provided token. </summary>
|
||||
public async Task Connect(string token)
|
||||
/// <summary> Connects to the Discord server with the provided token. </summary>
|
||||
public async Task Connect(string token)
|
||||
{
|
||||
if (token == null) throw new ArgumentNullException(token);
|
||||
|
||||
@@ -171,8 +171,8 @@ namespace Discord
|
||||
_taskManager.ClearException();
|
||||
State = ConnectionState.Connecting;
|
||||
_disconnectedEvent.Reset();
|
||||
|
||||
await Login(email, password, token).ConfigureAwait(false);
|
||||
|
||||
await Login(email, password, token).ConfigureAwait(false);
|
||||
await GatewaySocket.Connect().ConfigureAwait(false);
|
||||
|
||||
List<Task> tasks = new List<Task>();
|
||||
@@ -258,22 +258,25 @@ namespace Discord
|
||||
}
|
||||
}
|
||||
private void EndConnect()
|
||||
{
|
||||
State = ConnectionState.Connected;
|
||||
_connectedEvent.Set();
|
||||
OnConnected();
|
||||
}
|
||||
{
|
||||
State = ConnectionState.Connected;
|
||||
_connectedEvent.Set();
|
||||
OnConnected();
|
||||
}
|
||||
|
||||
/// <summary> Disconnects from the Discord server, canceling any pending requests. </summary>
|
||||
public Task Disconnect() => _taskManager.Stop(true);
|
||||
private async Task Cleanup()
|
||||
public async Task Disconnect()
|
||||
{
|
||||
if (State == ConnectionState.Connected)
|
||||
await ClientAPI.Send(new LogoutRequest()).ConfigureAwait(false);
|
||||
await _taskManager.Stop(true).ConfigureAwait(false);
|
||||
}
|
||||
private Task Cleanup()
|
||||
{
|
||||
State = ConnectionState.Disconnecting;
|
||||
if (Config.UseMessageQueue)
|
||||
MessageQueue.Clear();
|
||||
|
||||
await ClientAPI.Send(new LogoutRequest()).ConfigureAwait(false);
|
||||
|
||||
ClientAPI.Token = null;
|
||||
GatewaySocket.Token = null;
|
||||
|
||||
@@ -287,6 +290,7 @@ namespace Discord
|
||||
State = (int)ConnectionState.Disconnected;
|
||||
_connectedEvent.Reset();
|
||||
_disconnectedEvent.Set();
|
||||
return TaskHelper.CompletedTask;
|
||||
}
|
||||
|
||||
public Task SetStatus(UserStatus status)
|
||||
|
||||
@@ -64,10 +64,10 @@ namespace Discord.Net.Rest
|
||||
private async Task<string> Send(RestRequest request, CancellationToken cancelToken)
|
||||
{
|
||||
int retryCount = 0;
|
||||
while (true)
|
||||
{
|
||||
var response = await _client.ExecuteTaskAsync(request, cancelToken).ConfigureAwait(false);
|
||||
int statusCode = (int)response.StatusCode;
|
||||
while (true)
|
||||
{
|
||||
var response = await _client.ExecuteTaskAsync(request, cancelToken).ConfigureAwait(false);
|
||||
int statusCode = (int)response.StatusCode;
|
||||
if (statusCode == 0) //Internal Error
|
||||
{
|
||||
//The request was aborted: Could not create SSL/TLS secure channel.
|
||||
@@ -99,11 +99,11 @@ namespace Discord.Net.Rest
|
||||
}
|
||||
throw new HttpException(response.StatusCode);
|
||||
}
|
||||
else if (statusCode < 200 || statusCode >= 300) //2xx = Success
|
||||
throw new HttpException(response.StatusCode);
|
||||
else if (statusCode < 200 || statusCode >= 300) //2xx = Success
|
||||
throw new HttpException(response.StatusCode);
|
||||
else
|
||||
return response.Content;
|
||||
}
|
||||
return response.Content;
|
||||
}
|
||||
}
|
||||
|
||||
private Method GetMethod(string method)
|
||||
|
||||
Reference in New Issue
Block a user