@@ -23,7 +23,7 @@ namespace Discord.API | |||||
private readonly RequestQueue _requestQueue; | private readonly RequestQueue _requestQueue; | ||||
private readonly JsonSerializer _serializer; | private readonly JsonSerializer _serializer; | ||||
private IRestClient _restClient; | |||||
private readonly IRestClient _restClient; | |||||
private CancellationToken _cancelToken; | private CancellationToken _cancelToken; | ||||
public TokenType AuthTokenType { get; private set; } | public TokenType AuthTokenType { get; private set; } | ||||
@@ -68,15 +68,26 @@ namespace Discord.API | |||||
} | } | ||||
public async Task Login(LoginParams args, CancellationToken cancelToken) | public async Task Login(LoginParams args, CancellationToken cancelToken) | ||||
{ | { | ||||
var response = await Send<LoginResponse>("POST", "auth/login", args).ConfigureAwait(false); | |||||
AuthTokenType = TokenType.User; | AuthTokenType = TokenType.User; | ||||
_restClient.SetHeader("authorization", null); | |||||
_cancelToken = cancelToken; | |||||
LoginResponse response; | |||||
try | |||||
{ | |||||
response = await Send<LoginResponse>("POST", "auth/login", args, GlobalBucket.Login).ConfigureAwait(false); | |||||
} | |||||
catch | |||||
{ | |||||
_cancelToken = CancellationToken.None; | |||||
throw; | |||||
} | |||||
_restClient.SetHeader("authorization", response.Token); | _restClient.SetHeader("authorization", response.Token); | ||||
} | } | ||||
public async Task Logout() | public async Task Logout() | ||||
{ | { | ||||
await _requestQueue.Clear().ConfigureAwait(false); | await _requestQueue.Clear().ConfigureAwait(false); | ||||
_restClient = null; | |||||
} | } | ||||
//Core | //Core | ||||
@@ -527,7 +538,7 @@ namespace Discord.API | |||||
Preconditions.NotEqual(userId, 0, nameof(userId)); | Preconditions.NotEqual(userId, 0, nameof(userId)); | ||||
Preconditions.NotNull(args, nameof(args)); | Preconditions.NotNull(args, nameof(args)); | ||||
await Send("PATCH", $"guilds/{guildId}/members/{userId}", args).ConfigureAwait(false); | |||||
await Send("PATCH", $"guilds/{guildId}/members/{userId}", args, GuildBucket.ModifyMember, guildId).ConfigureAwait(false); | |||||
} | } | ||||
//Guild Roles | //Guild Roles | ||||
@@ -3,6 +3,7 @@ | |||||
public enum GlobalBucket | public enum GlobalBucket | ||||
{ | { | ||||
General, | General, | ||||
Login, | |||||
DirectMessage | DirectMessage | ||||
} | } | ||||
} | } |
@@ -5,6 +5,7 @@ | |||||
SendEditMessage, | SendEditMessage, | ||||
DeleteMessage, | DeleteMessage, | ||||
DeleteMessages, | DeleteMessages, | ||||
ModifyMember, | |||||
Nickname | Nickname | ||||
} | } | ||||
} | } |
@@ -64,6 +64,7 @@ namespace Discord.Net.Rest | |||||
{ | { | ||||
//Globals | //Globals | ||||
case GlobalBucket.General: return new RequestQueueBucket(this, bucket, int.MaxValue, 0); //Catch-all | case GlobalBucket.General: return new RequestQueueBucket(this, bucket, int.MaxValue, 0); //Catch-all | ||||
case GlobalBucket.Login: return new RequestQueueBucket(this, bucket, 1, 1); //TODO: Is this actual logins or token validations too? | |||||
case GlobalBucket.DirectMessage: return new RequestQueueBucket(this, bucket, 5, 5); | case GlobalBucket.DirectMessage: return new RequestQueueBucket(this, bucket, 5, 5); | ||||
default: throw new ArgumentException($"Unknown global bucket: {bucket}", nameof(bucket)); | default: throw new ArgumentException($"Unknown global bucket: {bucket}", nameof(bucket)); | ||||
@@ -77,6 +78,7 @@ namespace Discord.Net.Rest | |||||
case GuildBucket.SendEditMessage: return new RequestQueueBucket(this, bucket, guildId, 5, 5); | case GuildBucket.SendEditMessage: return new RequestQueueBucket(this, bucket, guildId, 5, 5); | ||||
case GuildBucket.DeleteMessage: return new RequestQueueBucket(this, bucket, guildId, 5, 1); | case GuildBucket.DeleteMessage: return new RequestQueueBucket(this, bucket, guildId, 5, 1); | ||||
case GuildBucket.DeleteMessages: return new RequestQueueBucket(this, bucket, guildId, 1, 1); | case GuildBucket.DeleteMessages: return new RequestQueueBucket(this, bucket, guildId, 1, 1); | ||||
case GuildBucket.ModifyMember: return new RequestQueueBucket(this, bucket, guildId, 10, 10); //TODO: Is this all users or just roles? | |||||
case GuildBucket.Nickname: return new RequestQueueBucket(this, bucket, guildId, 1, 1); | case GuildBucket.Nickname: return new RequestQueueBucket(this, bucket, guildId, 1, 1); | ||||
default: throw new ArgumentException($"Unknown guild bucket: {bucket}", nameof(bucket)); | default: throw new ArgumentException($"Unknown guild bucket: {bucket}", nameof(bucket)); | ||||