@@ -1,4 +1,4 @@ | |||
using System.Runtime.CompilerServices; | |||
using System.Runtime.CompilerServices; | |||
namespace Discord | |||
{ | |||
@@ -151,7 +151,7 @@ namespace Discord | |||
if (perms != null) | |||
resolvedPermissions = (resolvedPermissions & ~perms.Value.DenyValue) | perms.Value.AllowValue; | |||
if (channel is ITextChannel textChannel) | |||
if (channel is ITextChannel) | |||
{ | |||
if (!GetValue(resolvedPermissions, ChannelPermission.ViewChannel)) | |||
{ | |||
@@ -167,7 +167,7 @@ namespace Discord | |||
resolvedPermissions &= ~(ulong)ChannelPermission.AttachFiles; | |||
} | |||
} | |||
resolvedPermissions &= mask; //Ensure we didnt get any permissions this channel doesnt support (from guildPerms, for example) | |||
resolvedPermissions &= mask; //Ensure we didn't get any permissions this channel doesn't support (from guildPerms, for example) | |||
} | |||
return resolvedPermissions; | |||
@@ -58,7 +58,7 @@ namespace Discord.Rest | |||
ApiClient.SentRequest += async (method, endpoint, millis) => await _restLogger.VerboseAsync($"{method} {endpoint}: {millis} ms").ConfigureAwait(false); | |||
} | |||
public async Task LoginAsync(TokenType tokenType, string token, bool validateToken = true) | |||
public async Task LoginAsync(TokenType tokenType, string token) | |||
{ | |||
await _stateLock.WaitAsync().ConfigureAwait(false); | |||
try | |||
@@ -85,7 +85,7 @@ namespace Discord.Rest | |||
await OnLoginAsync(tokenType, token).ConfigureAwait(false); | |||
LoginState = LoginState.LoggedIn; | |||
} | |||
catch (Exception) | |||
catch | |||
{ | |||
await LogoutInternalAsync().ConfigureAwait(false); | |||
throw; | |||
@@ -49,7 +49,7 @@ namespace Discord.Rest | |||
public static async Task<IReadOnlyCollection<RestConnection>> GetConnectionsAsync(BaseDiscordClient client, RequestOptions options) | |||
{ | |||
var models = await client.ApiClient.GetMyConnectionsAsync(options).ConfigureAwait(false); | |||
return models.Select(x => RestConnection.Create(x)).ToImmutableArray(); | |||
return models.Select(RestConnection.Create).ToImmutableArray(); | |||
} | |||
public static async Task<RestInviteMetadata> GetInviteAsync(BaseDiscordClient client, | |||
@@ -127,7 +127,7 @@ namespace Discord.API | |||
LoginState = LoginState.LoggedIn; | |||
} | |||
catch (Exception) | |||
catch | |||
{ | |||
await LogoutInternalAsync().ConfigureAwait(false); | |||
throw; | |||
@@ -168,7 +168,7 @@ namespace Discord.API | |||
//Core | |||
internal Task SendAsync(string method, Expression<Func<string>> endpointExpr, BucketIds ids, | |||
ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null, [CallerMemberName] string funcName = null) | |||
=> SendAsync(method, GetEndpoint(endpointExpr), GetBucketId(ids, endpointExpr, AuthTokenType, funcName), clientBucket, options); | |||
=> SendAsync(method, GetEndpoint(endpointExpr), GetBucketId(ids, endpointExpr, funcName), clientBucket, options); | |||
public async Task SendAsync(string method, string endpoint, | |||
string bucketId = null, ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null) | |||
{ | |||
@@ -182,7 +182,7 @@ namespace Discord.API | |||
internal Task SendJsonAsync(string method, Expression<Func<string>> endpointExpr, object payload, BucketIds ids, | |||
ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null, [CallerMemberName] string funcName = null) | |||
=> SendJsonAsync(method, GetEndpoint(endpointExpr), payload, GetBucketId(ids, endpointExpr, AuthTokenType, funcName), clientBucket, options); | |||
=> SendJsonAsync(method, GetEndpoint(endpointExpr), payload, GetBucketId(ids, endpointExpr, funcName), clientBucket, options); | |||
public async Task SendJsonAsync(string method, string endpoint, object payload, | |||
string bucketId = null, ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null) | |||
{ | |||
@@ -197,7 +197,7 @@ namespace Discord.API | |||
internal Task SendMultipartAsync(string method, Expression<Func<string>> endpointExpr, IReadOnlyDictionary<string, object> multipartArgs, BucketIds ids, | |||
ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null, [CallerMemberName] string funcName = null) | |||
=> SendMultipartAsync(method, GetEndpoint(endpointExpr), multipartArgs, GetBucketId(ids, endpointExpr, AuthTokenType, funcName), clientBucket, options); | |||
=> SendMultipartAsync(method, GetEndpoint(endpointExpr), multipartArgs, GetBucketId(ids, endpointExpr, funcName), clientBucket, options); | |||
public async Task SendMultipartAsync(string method, string endpoint, IReadOnlyDictionary<string, object> multipartArgs, | |||
string bucketId = null, ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null) | |||
{ | |||
@@ -211,7 +211,7 @@ namespace Discord.API | |||
internal Task<TResponse> SendAsync<TResponse>(string method, Expression<Func<string>> endpointExpr, BucketIds ids, | |||
ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null, [CallerMemberName] string funcName = null) where TResponse : class | |||
=> SendAsync<TResponse>(method, GetEndpoint(endpointExpr), GetBucketId(ids, endpointExpr, AuthTokenType, funcName), clientBucket, options); | |||
=> SendAsync<TResponse>(method, GetEndpoint(endpointExpr), GetBucketId(ids, endpointExpr, funcName), clientBucket, options); | |||
public async Task<TResponse> SendAsync<TResponse>(string method, string endpoint, | |||
string bucketId = null, ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null) where TResponse : class | |||
{ | |||
@@ -224,7 +224,7 @@ namespace Discord.API | |||
internal Task<TResponse> SendJsonAsync<TResponse>(string method, Expression<Func<string>> endpointExpr, object payload, BucketIds ids, | |||
ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null, [CallerMemberName] string funcName = null) where TResponse : class | |||
=> SendJsonAsync<TResponse>(method, GetEndpoint(endpointExpr), payload, GetBucketId(ids, endpointExpr, AuthTokenType, funcName), clientBucket, options); | |||
=> SendJsonAsync<TResponse>(method, GetEndpoint(endpointExpr), payload, GetBucketId(ids, endpointExpr, funcName), clientBucket, options); | |||
public async Task<TResponse> SendJsonAsync<TResponse>(string method, string endpoint, object payload, | |||
string bucketId = null, ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null) where TResponse : class | |||
{ | |||
@@ -238,7 +238,7 @@ namespace Discord.API | |||
internal Task<TResponse> SendMultipartAsync<TResponse>(string method, Expression<Func<string>> endpointExpr, IReadOnlyDictionary<string, object> multipartArgs, BucketIds ids, | |||
ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null, [CallerMemberName] string funcName = null) | |||
=> SendMultipartAsync<TResponse>(method, GetEndpoint(endpointExpr), multipartArgs, GetBucketId(ids, endpointExpr, AuthTokenType, funcName), clientBucket, options); | |||
=> SendMultipartAsync<TResponse>(method, GetEndpoint(endpointExpr), multipartArgs, GetBucketId(ids, endpointExpr, funcName), clientBucket, options); | |||
public async Task<TResponse> SendMultipartAsync<TResponse>(string method, string endpoint, IReadOnlyDictionary<string, object> multipartArgs, | |||
string bucketId = null, ClientBucketType clientBucket = ClientBucketType.Unbucketed, RequestOptions options = null) | |||
{ | |||
@@ -1354,7 +1354,7 @@ namespace Discord.API | |||
{ | |||
return endpointExpr.Compile()(); | |||
} | |||
private static string GetBucketId(BucketIds ids, Expression<Func<string>> endpointExpr, TokenType tokenType, string callingMethod) | |||
private static string GetBucketId(BucketIds ids, Expression<Func<string>> endpointExpr, string callingMethod) | |||
{ | |||
return _bucketIdGenerators.GetOrAdd(callingMethod, x => CreateBucketId(endpointExpr))(ids); | |||
} | |||
@@ -1416,7 +1416,7 @@ namespace Discord.API | |||
} | |||
catch (Exception ex) | |||
{ | |||
throw new InvalidOperationException("Failed to generate the bucket id for this operation", ex); | |||
throw new InvalidOperationException("Failed to generate the bucket id for this operation.", ex); | |||
} | |||
} | |||
@@ -115,7 +115,7 @@ namespace Discord.Net.Queue | |||
foreach (var bucket in _buckets.Select(x => x.Value)) | |||
{ | |||
if ((now - bucket.LastAttemptAt).TotalMinutes > 1.0) | |||
_buckets.TryRemove(bucket.Id, out RequestBucket ignored); | |||
_buckets.TryRemove(bucket.Id, out _); | |||
} | |||
await Task.Delay(60000, _cancelToken.Token).ConfigureAwait(false); //Runs each minute | |||
} | |||
@@ -131,7 +131,7 @@ namespace Discord.Audio | |||
await keepaliveTask.ConfigureAwait(false); | |||
_keepaliveTask = null; | |||
while (_heartbeatTimes.TryDequeue(out long time)) { } | |||
while (_heartbeatTimes.TryDequeue(out _)) { } | |||
_lastMessageTime = 0; | |||
await ClearInputStreamsAsync().ConfigureAwait(false); | |||
@@ -425,7 +425,6 @@ namespace Discord.Audio | |||
} | |||
private async Task RunKeepaliveAsync(int intervalMillis, CancellationToken cancelToken) | |||
{ | |||
var packet = new byte[8]; | |||
try | |||
{ | |||
await _audioLogger.DebugAsync("Keepalive Started").ConfigureAwait(false); | |||
@@ -169,7 +169,7 @@ namespace Discord.Audio.Streams | |||
{ | |||
do | |||
cancelToken.ThrowIfCancellationRequested(); | |||
while (_queuedFrames.TryDequeue(out Frame ignored)); | |||
while (_queuedFrames.TryDequeue(out _)); | |||
return Task.Delay(0); | |||
} | |||
} | |||
@@ -14,10 +14,10 @@ namespace Discord.WebSocket | |||
private readonly DiscordSocketConfig _baseConfig; | |||
private readonly SemaphoreSlim _connectionGroupLock; | |||
private int[] _shardIds; | |||
private Dictionary<int, int> _shardIdsToIndex; | |||
private readonly Dictionary<int, int> _shardIdsToIndex; | |||
private DiscordSocketClient[] _shards; | |||
private int _totalShards; | |||
private bool _automaticShards; | |||
private readonly bool _automaticShards; | |||
/// <inheritdoc /> | |||
public override int Latency { get => GetLatency(); protected set { } } | |||
@@ -26,7 +26,7 @@ namespace Discord.WebSocket | |||
/// <inheritdoc /> | |||
public override IActivity Activity { get => _shards[0].Activity; protected set { } } | |||
internal new DiscordSocketApiClient ApiClient => base.ApiClient as DiscordSocketApiClient; | |||
internal new DiscordSocketApiClient ApiClient => base.ApiClient; | |||
/// <inheritdoc /> | |||
public override IReadOnlyCollection<SocketGuild> Guilds => GetGuilds().ToReadOnlyCollection(GetGuildCount); | |||
/// <inheritdoc /> | |||
@@ -95,13 +95,13 @@ namespace Discord.WebSocket | |||
} | |||
} | |||
//Assume threadsafe: already in a connection lock | |||
//Assume thread safe: already in a connection lock | |||
for (int i = 0; i < _shards.Length; i++) | |||
await _shards[i].LoginAsync(tokenType, token, false); | |||
await _shards[i].LoginAsync(tokenType, token); | |||
} | |||
internal override async Task OnLogoutAsync() | |||
{ | |||
//Assume threadsafe: already in a connection lock | |||
//Assume thread safe: already in a connection lock | |||
if (_shards != null) | |||
{ | |||
for (int i = 0; i < _shards.Length; i++) | |||
@@ -218,11 +218,11 @@ namespace Discord.WebSocket | |||
public override RestVoiceRegion GetVoiceRegion(string id) | |||
=> _shards[0].GetVoiceRegion(id); | |||
/// <summary> | |||
/// Downloads the users list for the provided guilds if they don't have a complete list. | |||
/// </summary> | |||
/// <inheritdoc /> | |||
/// <exception cref="ArgumentNullException"><paramref name="guilds"/> is <see langword="null"/></exception> | |||
public override async Task DownloadUsersAsync(IEnumerable<IGuild> guilds) | |||
{ | |||
if (guilds == null) throw new ArgumentNullException(nameof(guilds)); | |||
for (int i = 0; i < _shards.Length; i++) | |||
{ | |||
int id = _shardIds[i]; | |||
@@ -217,7 +217,7 @@ namespace Discord.WebSocket | |||
await heartbeatTask.ConfigureAwait(false); | |||
_heartbeatTask = null; | |||
while (_heartbeatTimes.TryDequeue(out long time)) { } | |||
while (_heartbeatTimes.TryDequeue(out _)) { } | |||
_lastMessageTime = 0; | |||
await _gatewayLogger.DebugAsync("Waiting for guild downloader").ConfigureAwait(false); | |||
@@ -228,7 +228,7 @@ namespace Discord.WebSocket | |||
//Clear large guild queue | |||
await _gatewayLogger.DebugAsync("Clearing large guild queue").ConfigureAwait(false); | |||
while (_largeGuilds.TryDequeue(out ulong guildId)) { } | |||
while (_largeGuilds.TryDequeue(out _)) { } | |||
//Raise virtual GUILD_UNAVAILABLEs | |||
await _gatewayLogger.DebugAsync("Raising virtual GuildUnavailables").ConfigureAwait(false); | |||
@@ -1636,7 +1636,7 @@ namespace Discord.WebSocket | |||
var guild = State.RemoveGuild(id); | |||
if (guild != null) | |||
{ | |||
foreach (var channel in guild.Channels) | |||
foreach (var _ in guild.Channels) | |||
State.RemoveChannel(id); | |||
foreach (var user in guild.Users) | |||
user.GlobalUser.RemoveRef(this); | |||
@@ -188,7 +188,7 @@ namespace Discord.Audio | |||
ConnectionState = ConnectionState.Connected; | |||
} | |||
catch (Exception) | |||
catch | |||
{ | |||
await DisconnectInternalAsync().ConfigureAwait(false); | |||
throw; | |||