@@ -70,7 +70,9 @@ namespace Discord.Commands | |||||
else | else | ||||
perms = ChannelPermissions.All(context.Channel); | perms = ChannelPermissions.All(context.Channel); | ||||
return !perms.Has(ChannelPermission.Value) ? PreconditionResult.FromError($"Bot requires channel permission {ChannelPermission.Value}") : PreconditionResult.FromSuccess(); | |||||
return !perms.Has(ChannelPermission.Value) | |||||
? PreconditionResult.FromError($"Bot requires channel permission {ChannelPermission.Value}") | |||||
: PreconditionResult.FromSuccess(); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -52,7 +52,9 @@ namespace Discord.Commands | |||||
if ((Contexts & ContextType.Group) != 0) | if ((Contexts & ContextType.Group) != 0) | ||||
isValid = isValid || context.Channel is IGroupChannel; | isValid = isValid || context.Channel is IGroupChannel; | ||||
return Task.FromResult(isValid ? PreconditionResult.FromSuccess() : PreconditionResult.FromError($"Invalid context for command; accepted contexts: {Contexts}")); | |||||
return Task.FromResult(isValid | |||||
? PreconditionResult.FromSuccess() | |||||
: PreconditionResult.FromError($"Invalid context for command; accepted contexts: {Contexts}")); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -70,7 +70,9 @@ namespace Discord.Commands | |||||
else | else | ||||
perms = ChannelPermissions.All(context.Channel); | perms = ChannelPermissions.All(context.Channel); | ||||
return Task.FromResult(!perms.Has(ChannelPermission.Value) ? PreconditionResult.FromError($"User requires channel permission {ChannelPermission.Value}") : PreconditionResult.FromSuccess()); | |||||
return Task.FromResult(!perms.Has(ChannelPermission.Value) | |||||
? PreconditionResult.FromError($"User requires channel permission {ChannelPermission.Value}") | |||||
: PreconditionResult.FromSuccess()); | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -9,9 +9,8 @@ namespace Discord.Commands | |||||
public static IEnumerable<TResult> Permutate<TFirst, TSecond, TResult>( | public static IEnumerable<TResult> Permutate<TFirst, TSecond, TResult>( | ||||
this IEnumerable<TFirst> set, | this IEnumerable<TFirst> set, | ||||
IEnumerable<TSecond> others, | IEnumerable<TSecond> others, | ||||
Func<TFirst, TSecond, TResult> func) | |||||
{ | |||||
return from elem in set from elem2 in others select func(elem, elem2); | |||||
} | |||||
Func<TFirst, TSecond, TResult> func) => from elem in set | |||||
from elem2 in others | |||||
select func(elem, elem2); | |||||
} | } | ||||
} | } |
@@ -10,7 +10,6 @@ namespace Discord.Commands | |||||
if (text.Length <= 0 || text[0] != c) return false; | if (text.Length <= 0 || text[0] != c) return false; | ||||
argPos = 1; | argPos = 1; | ||||
return true; | return true; | ||||
} | } | ||||
public static bool HasStringPrefix(this IUserMessage msg, string str, ref int argPos, | public static bool HasStringPrefix(this IUserMessage msg, string str, ref int argPos, | ||||
@@ -20,7 +19,6 @@ namespace Discord.Commands | |||||
if (!text.StartsWith(str, comparisonType)) return false; | if (!text.StartsWith(str, comparisonType)) return false; | ||||
argPos = str.Length; | argPos = str.Length; | ||||
return true; | return true; | ||||
} | } | ||||
public static bool HasMentionPrefix(this IUserMessage msg, IUser user, ref int argPos) | public static bool HasMentionPrefix(this IUserMessage msg, IUser user, ref int argPos) | ||||
@@ -37,7 +35,6 @@ namespace Discord.Commands | |||||
if (userId != user.Id) return false; | if (userId != user.Id) return false; | ||||
argPos = endPos + 2; | argPos = endPos + 2; | ||||
return true; | return true; | ||||
} | } | ||||
} | } | ||||
} | } |
@@ -202,7 +202,8 @@ namespace Discord.Commands | |||||
case Task<IResult> resultTask: | case Task<IResult> resultTask: | ||||
{ | { | ||||
var result = await resultTask.ConfigureAwait(false); | var result = await resultTask.ConfigureAwait(false); | ||||
await Module.Service._commandExecutedEvent.InvokeAsync(this, context, result).ConfigureAwait(false); | |||||
await Module.Service._commandExecutedEvent.InvokeAsync(this, context, result) | |||||
.ConfigureAwait(false); | |||||
if (result is RuntimeResult execResult) | if (result is RuntimeResult execResult) | ||||
return execResult; | return execResult; | ||||
break; | break; | ||||
@@ -210,14 +211,16 @@ namespace Discord.Commands | |||||
case Task<ExecuteResult> execTask: | case Task<ExecuteResult> execTask: | ||||
{ | { | ||||
var result = await execTask.ConfigureAwait(false); | var result = await execTask.ConfigureAwait(false); | ||||
await Module.Service._commandExecutedEvent.InvokeAsync(this, context, result).ConfigureAwait(false); | |||||
await Module.Service._commandExecutedEvent.InvokeAsync(this, context, result) | |||||
.ConfigureAwait(false); | |||||
return result; | return result; | ||||
} | } | ||||
default: | default: | ||||
{ | { | ||||
await task.ConfigureAwait(false); | await task.ConfigureAwait(false); | ||||
var result = ExecuteResult.FromSuccess(); | var result = ExecuteResult.FromSuccess(); | ||||
await Module.Service._commandExecutedEvent.InvokeAsync(this, context, result).ConfigureAwait(false); | |||||
await Module.Service._commandExecutedEvent.InvokeAsync(this, context, result) | |||||
.ConfigureAwait(false); | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
@@ -280,9 +283,8 @@ namespace Discord.Commands | |||||
private static T[] ConvertParamsList<T>(IEnumerable<object> paramsList) | private static T[] ConvertParamsList<T>(IEnumerable<object> paramsList) | ||||
=> paramsList.Cast<T>().ToArray(); | => paramsList.Cast<T>().ToArray(); | ||||
internal string GetLogText(ICommandContext context) | |||||
{ | |||||
return context.Guild != null ? $"\"{Name}\" for {context.User} in {context.Guild}/{context.Channel}" : $"\"{Name}\" for {context.User} in {context.Channel}"; | |||||
} | |||||
internal string GetLogText(ICommandContext context) => context.Guild != null | |||||
? $"\"{Name}\" for {context.User} in {context.Guild}/{context.Channel}" | |||||
: $"\"{Name}\" for {context.User} in {context.Channel}"; | |||||
} | } | ||||
} | } |
@@ -68,10 +68,8 @@ namespace Discord.Commands | |||||
} | } | ||||
private IEnumerable<ModuleInfo> BuildSubmodules(ModuleBuilder parent, CommandService service, | private IEnumerable<ModuleInfo> BuildSubmodules(ModuleBuilder parent, CommandService service, | ||||
IServiceProvider services) | |||||
{ | |||||
return parent.Modules.Select(submodule => submodule.Build(service, services, this)).ToList(); | |||||
} | |||||
IServiceProvider services) => | |||||
parent.Modules.Select(submodule => submodule.Build(service, services, this)).ToList(); | |||||
private static IEnumerable<PreconditionAttribute> BuildPreconditions(ModuleBuilder builder) | private static IEnumerable<PreconditionAttribute> BuildPreconditions(ModuleBuilder builder) | ||||
{ | { | ||||
@@ -36,7 +36,9 @@ namespace Discord.Commands | |||||
_commands = _commands.Add(command); | _commands = _commands.Add(command); | ||||
break; | break; | ||||
default: | default: | ||||
var name = nextSegment == -1 ? text.Substring(index) : text.Substring(index, nextSegment - index); | |||||
var name = nextSegment == -1 | |||||
? text.Substring(index) | |||||
: text.Substring(index, nextSegment - index); | |||||
var fullName = _name == "" ? name : _name + service._separatorChar + name; | var fullName = _name == "" ? name : _name + service._separatorChar + name; | ||||
var nextNode = _nodes.GetOrAdd(name, x => new CommandMapNode(fullName)); | var nextNode = _nodes.GetOrAdd(name, x => new CommandMapNode(fullName)); | ||||
@@ -29,7 +29,9 @@ namespace Discord.Commands | |||||
foreach (var role in roles.Where(x => string.Equals(input, x.Name, StringComparison.OrdinalIgnoreCase))) | foreach (var role in roles.Where(x => string.Equals(input, x.Name, StringComparison.OrdinalIgnoreCase))) | ||||
AddResult(results, role as T, role.Name == input ? 0.80f : 0.70f); | AddResult(results, role as T, role.Name == input ? 0.80f : 0.70f); | ||||
return Task.FromResult(results.Count > 0 ? TypeReaderResult.FromSuccess(results.Values.ToReadOnlyCollection()) : TypeReaderResult.FromError(CommandError.ObjectNotFound, "Role not found.")); | |||||
return Task.FromResult(results.Count > 0 | |||||
? TypeReaderResult.FromSuccess(results.Values.ToReadOnlyCollection()) | |||||
: TypeReaderResult.FromError(CommandError.ObjectNotFound, "Role not found.")); | |||||
} | } | ||||
private void AddResult(Dictionary<ulong, TypeReaderValue> results, T role, float score) | private void AddResult(Dictionary<ulong, TypeReaderValue> results, T role, float score) | ||||
@@ -29,15 +29,11 @@ namespace Discord.Commands | |||||
IReadOnlyList<TypeReaderResult> paramValues) | IReadOnlyList<TypeReaderResult> paramValues) | ||||
{ | { | ||||
if (argValues.Any(t => t.Values.Count > 1)) | if (argValues.Any(t => t.Values.Count > 1)) | ||||
{ | |||||
return new ParseResult(argValues, paramValues, CommandError.MultipleMatches, | return new ParseResult(argValues, paramValues, CommandError.MultipleMatches, | ||||
"Multiple matches found."); | "Multiple matches found."); | ||||
} | |||||
if (paramValues.Any(t => t.Values.Count > 1)) | if (paramValues.Any(t => t.Values.Count > 1)) | ||||
{ | |||||
return new ParseResult(argValues, paramValues, CommandError.MultipleMatches, | return new ParseResult(argValues, paramValues, CommandError.MultipleMatches, | ||||
"Multiple matches found."); | "Multiple matches found."); | ||||
} | |||||
return new ParseResult(argValues, paramValues, null, null); | return new ParseResult(argValues, paramValues, null, null); | ||||
} | } | ||||
@@ -58,7 +58,9 @@ namespace Discord.Commands | |||||
var result = new List<PropertyInfo>(); | var result = new List<PropertyInfo>(); | ||||
while (ownerType != _objectTypeInfo) | while (ownerType != _objectTypeInfo) | ||||
{ | { | ||||
result.AddRange(ownerType.DeclaredProperties.Where(prop => prop.SetMethod?.IsStatic == false && prop.SetMethod?.IsPublic == true && prop.GetCustomAttribute<DontInjectAttribute>() == null)); | |||||
result.AddRange(ownerType.DeclaredProperties.Where(prop => | |||||
prop.SetMethod?.IsStatic == false && prop.SetMethod?.IsPublic == true && | |||||
prop.GetCustomAttribute<DontInjectAttribute>() == null)); | |||||
ownerType = ownerType.BaseType.GetTypeInfo(); | ownerType = ownerType.BaseType.GetTypeInfo(); | ||||
} | } | ||||
@@ -86,7 +86,6 @@ namespace Discord | |||||
var name = text.Substring(startIndex, splitIndex - startIndex); | var name = text.Substring(startIndex, splitIndex - startIndex); | ||||
result = new Emote(id, name, animated); | result = new Emote(id, name, animated); | ||||
return true; | return true; | ||||
} | } | ||||
public override string ToString() => $"<{(Animated ? "a" : "")}:{Name}:{Id}>"; | public override string ToString() => $"<{(Animated ? "a" : "")}:{Name}:{Id}>"; | ||||
@@ -46,7 +46,8 @@ namespace Discord | |||||
/// <remarks> | /// <remarks> | ||||
/// To add a role to a user: | /// To add a role to a user: | ||||
/// <see cref="IGuildUser.AddRolesAsync(System.Collections.Generic.IEnumerable{Discord.IRole}, RequestOptions)" /> | /// <see cref="IGuildUser.AddRolesAsync(System.Collections.Generic.IEnumerable{Discord.IRole}, RequestOptions)" /> | ||||
/// To remove a role from a user: <see cref="IGuildUser.RemoveRolesAsync(System.Collections.Generic.IEnumerable{Discord.IRole}, RequestOptions)" /> | |||||
/// To remove a role from a user: | |||||
/// <see cref="IGuildUser.RemoveRolesAsync(System.Collections.Generic.IEnumerable{Discord.IRole}, RequestOptions)" /> | |||||
/// </remarks> | /// </remarks> | ||||
public Optional<IEnumerable<IRole>> Roles { get; set; } | public Optional<IEnumerable<IRole>> Roles { get; set; } | ||||
@@ -28,9 +28,7 @@ namespace Discord | |||||
} | } | ||||
/// <summary> Sanitizes the string, safely escaping any Markdown sequences. </summary> | /// <summary> Sanitizes the string, safely escaping any Markdown sequences. </summary> | ||||
public static string Sanitize(string text) | |||||
{ | |||||
return SensitiveCharacters.Aggregate(text, (current, unsafeChar) => current.Replace(unsafeChar, $"\\{unsafeChar}")); | |||||
} | |||||
public static string Sanitize(string text) => SensitiveCharacters.Aggregate(text, | |||||
(current, unsafeChar) => current.Replace(unsafeChar, $"\\{unsafeChar}")); | |||||
} | } | ||||
} | } |
@@ -23,13 +23,13 @@ namespace Discord.Net | |||||
{ | { | ||||
string msg; | string msg; | ||||
if (discordCode != null && discordCode != 0) | if (discordCode != null && discordCode != 0) | ||||
{ | |||||
msg = reason != null ? $"The server responded with error {(int)discordCode}: {reason}" : $"The server responded with error {(int)discordCode}: {httpCode}"; | |||||
} | |||||
msg = reason != null | |||||
? $"The server responded with error {(int)discordCode}: {reason}" | |||||
: $"The server responded with error {(int)discordCode}: {httpCode}"; | |||||
else | else | ||||
{ | |||||
msg = reason != null ? $"The server responded with error {(int)httpCode}: {reason}" : $"The server responded with error {(int)httpCode}: {httpCode}"; | |||||
} | |||||
msg = reason != null | |||||
? $"The server responded with error {(int)httpCode}: {reason}" | |||||
: $"The server responded with error {(int)httpCode}: {httpCode}"; | |||||
return msg; | return msg; | ||||
} | } | ||||
@@ -214,6 +214,7 @@ namespace Discord | |||||
case TagHandling.Sanitize: | case TagHandling.Sanitize: | ||||
return $"@{SanitizeChar}everyone"; | return $"@{SanitizeChar}everyone"; | ||||
} | } | ||||
return ""; | return ""; | ||||
} | } | ||||
@@ -230,6 +231,7 @@ namespace Discord | |||||
case TagHandling.Sanitize: | case TagHandling.Sanitize: | ||||
return $"@{SanitizeChar}here"; | return $"@{SanitizeChar}here"; | ||||
} | } | ||||
return ""; | return ""; | ||||
} | } | ||||
@@ -239,10 +241,7 @@ namespace Discord | |||||
var emoji = (Emote)tag.Value; | var emoji = (Emote)tag.Value; | ||||
//Remove if its name contains any bad chars (prevents a few tag exploits) | //Remove if its name contains any bad chars (prevents a few tag exploits) | ||||
if (emoji.Name.Any(c => !char.IsLetterOrDigit(c) && c != '_' && c != '-')) | |||||
{ | |||||
return ""; | |||||
} | |||||
if (emoji.Name.Any(c => !char.IsLetterOrDigit(c) && c != '_' && c != '-')) return ""; | |||||
switch (mode) | switch (mode) | ||||
{ | { | ||||
@@ -111,7 +111,8 @@ namespace Discord | |||||
resolvedPermissions = GuildPermissions.Webhook.RawValue; | resolvedPermissions = GuildPermissions.Webhook.RawValue; | ||||
else | else | ||||
{ | { | ||||
resolvedPermissions = user.RoleIds.Aggregate(resolvedPermissions, (current, roleId) => current | (guild.GetRole(roleId)?.Permissions.RawValue ?? 0)); | |||||
resolvedPermissions = user.RoleIds.Aggregate(resolvedPermissions, | |||||
(current, roleId) => current | (guild.GetRole(roleId)?.Permissions.RawValue ?? 0)); | |||||
if (GetValue(resolvedPermissions, GuildPermission.Administrator)) | if (GetValue(resolvedPermissions, GuildPermission.Administrator)) | ||||
resolvedPermissions = GuildPermissions.All.RawValue; //Administrators always have all permissions | resolvedPermissions = GuildPermissions.All.RawValue; //Administrators always have all permissions | ||||
} | } | ||||
@@ -16,11 +16,11 @@ namespace Discord.Net.Providers.WS4Net | |||||
private readonly Dictionary<string, string> _headers; | private readonly Dictionary<string, string> _headers; | ||||
private readonly SemaphoreSlim _lock; | private readonly SemaphoreSlim _lock; | ||||
private readonly ManualResetEventSlim _waitUntilConnect; | |||||
private CancellationToken _cancelToken, _parentToken; | private CancellationToken _cancelToken, _parentToken; | ||||
private CancellationTokenSource _cancelTokenSource; | private CancellationTokenSource _cancelTokenSource; | ||||
private WS4NetSocket _client; | private WS4NetSocket _client; | ||||
private bool _isDisposed; | private bool _isDisposed; | ||||
private readonly ManualResetEventSlim _waitUntilConnect; | |||||
public WS4NetClient() | public WS4NetClient() | ||||
{ | { | ||||
@@ -47,9 +47,7 @@ namespace Discord.Rest | |||||
[ActionType.MessageDeleted] = MessageDeleteAuditLogData.Create | [ActionType.MessageDeleted] = MessageDeleteAuditLogData.Create | ||||
}; | }; | ||||
public static IAuditLogData CreateData(BaseDiscordClient discord, Model log, EntryModel entry) | |||||
{ | |||||
return CreateMapping.TryGetValue(entry.Action, out var func) ? func(discord, log, entry) : null; | |||||
} | |||||
public static IAuditLogData CreateData(BaseDiscordClient discord, Model log, EntryModel entry) => | |||||
CreateMapping.TryGetValue(entry.Action, out var func) ? func(discord, log, entry) : null; | |||||
} | } | ||||
} | } |
@@ -52,22 +52,19 @@ namespace Discord.Rest | |||||
} | } | ||||
IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(int limit, CacheMode mode, | IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(int limit, CacheMode mode, | ||||
RequestOptions options) | |||||
{ | |||||
return mode == CacheMode.AllowDownload ? GetMessagesAsync(limit, options) : AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
} | |||||
RequestOptions options) => mode == CacheMode.AllowDownload | |||||
? GetMessagesAsync(limit, options) | |||||
: AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(ulong fromMessageId, | IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(ulong fromMessageId, | ||||
Direction dir, int limit, CacheMode mode, RequestOptions options) | |||||
{ | |||||
return mode == CacheMode.AllowDownload ? GetMessagesAsync(fromMessageId, dir, limit, options) : AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
} | |||||
Direction dir, int limit, CacheMode mode, RequestOptions options) => mode == CacheMode.AllowDownload | |||||
? GetMessagesAsync(fromMessageId, dir, limit, options) | |||||
: AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(IMessage fromMessage, | IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(IMessage fromMessage, | ||||
Direction dir, int limit, CacheMode mode, RequestOptions options) | |||||
{ | |||||
return mode == CacheMode.AllowDownload ? GetMessagesAsync(fromMessage, dir, limit, options) : AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
} | |||||
Direction dir, int limit, CacheMode mode, RequestOptions options) => mode == CacheMode.AllowDownload | |||||
? GetMessagesAsync(fromMessage, dir, limit, options) | |||||
: AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
async Task<IReadOnlyCollection<IMessage>> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) | async Task<IReadOnlyCollection<IMessage>> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) | ||||
=> await GetPinnedMessagesAsync(options).ConfigureAwait(false); | => await GetPinnedMessagesAsync(options).ConfigureAwait(false); | ||||
@@ -57,22 +57,19 @@ namespace Discord.Rest | |||||
} | } | ||||
IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(int limit, CacheMode mode, | IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(int limit, CacheMode mode, | ||||
RequestOptions options) | |||||
{ | |||||
return mode == CacheMode.AllowDownload ? GetMessagesAsync(limit, options) : AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
} | |||||
RequestOptions options) => mode == CacheMode.AllowDownload | |||||
? GetMessagesAsync(limit, options) | |||||
: AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(ulong fromMessageId, | IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(ulong fromMessageId, | ||||
Direction dir, int limit, CacheMode mode, RequestOptions options) | |||||
{ | |||||
return mode == CacheMode.AllowDownload ? GetMessagesAsync(fromMessageId, dir, limit, options) : AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
} | |||||
Direction dir, int limit, CacheMode mode, RequestOptions options) => mode == CacheMode.AllowDownload | |||||
? GetMessagesAsync(fromMessageId, dir, limit, options) | |||||
: AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(IMessage fromMessage, | IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(IMessage fromMessage, | ||||
Direction dir, int limit, CacheMode mode, RequestOptions options) | |||||
{ | |||||
return mode == CacheMode.AllowDownload ? GetMessagesAsync(fromMessage, dir, limit, options) : AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
} | |||||
Direction dir, int limit, CacheMode mode, RequestOptions options) => mode == CacheMode.AllowDownload | |||||
? GetMessagesAsync(fromMessage, dir, limit, options) | |||||
: AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
async Task<IReadOnlyCollection<IMessage>> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) | async Task<IReadOnlyCollection<IMessage>> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) | ||||
=> await GetPinnedMessagesAsync(options).ConfigureAwait(false); | => await GetPinnedMessagesAsync(options).ConfigureAwait(false); | ||||
@@ -170,10 +167,7 @@ namespace Discord.Rest | |||||
_users = users.ToImmutable(); | _users = users.ToImmutable(); | ||||
} | } | ||||
public RestUser GetUser(ulong id) | |||||
{ | |||||
return _users.TryGetValue(id, out var user) ? user : null; | |||||
} | |||||
public RestUser GetUser(ulong id) => _users.TryGetValue(id, out var user) ? user : null; | |||||
public IDisposable EnterTypingState(RequestOptions options = null) | public IDisposable EnterTypingState(RequestOptions options = null) | ||||
=> ChannelHelper.EnterTypingState(this, Discord, options); | => ChannelHelper.EnterTypingState(this, Discord, options); | ||||
@@ -66,24 +66,19 @@ namespace Discord.Rest | |||||
} | } | ||||
IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(int limit, CacheMode mode, | IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(int limit, CacheMode mode, | ||||
RequestOptions options) | |||||
{ | |||||
return mode == CacheMode.AllowDownload | |||||
? GetMessagesAsync(limit, options) | |||||
: AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
} | |||||
RequestOptions options) => mode == CacheMode.AllowDownload | |||||
? GetMessagesAsync(limit, options) | |||||
: AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(ulong fromMessageId, | IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(ulong fromMessageId, | ||||
Direction dir, int limit, CacheMode mode, RequestOptions options) | |||||
{ | |||||
return mode == CacheMode.AllowDownload ? GetMessagesAsync(fromMessageId, dir, limit, options) : AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
} | |||||
Direction dir, int limit, CacheMode mode, RequestOptions options) => mode == CacheMode.AllowDownload | |||||
? GetMessagesAsync(fromMessageId, dir, limit, options) | |||||
: AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(IMessage fromMessage, | IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(IMessage fromMessage, | ||||
Direction dir, int limit, CacheMode mode, RequestOptions options) | |||||
{ | |||||
return mode == CacheMode.AllowDownload ? GetMessagesAsync(fromMessage, dir, limit, options) : AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
} | |||||
Direction dir, int limit, CacheMode mode, RequestOptions options) => mode == CacheMode.AllowDownload | |||||
? GetMessagesAsync(fromMessage, dir, limit, options) | |||||
: AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
async Task<IReadOnlyCollection<IMessage>> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) | async Task<IReadOnlyCollection<IMessage>> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) | ||||
=> await GetPinnedMessagesAsync(options).ConfigureAwait(false); | => await GetPinnedMessagesAsync(options).ConfigureAwait(false); | ||||
@@ -111,10 +106,10 @@ namespace Discord.Rest | |||||
return null; | return null; | ||||
} | } | ||||
IAsyncEnumerable<IReadOnlyCollection<IUser>> IChannel.GetUsersAsync(CacheMode mode, RequestOptions options) | |||||
{ | |||||
return mode == CacheMode.AllowDownload ? GetUsersAsync(options) : AsyncEnumerable.Empty<IReadOnlyCollection<IGuildUser>>(); | |||||
} | |||||
IAsyncEnumerable<IReadOnlyCollection<IUser>> IChannel.GetUsersAsync(CacheMode mode, RequestOptions options) => | |||||
mode == CacheMode.AllowDownload | |||||
? GetUsersAsync(options) | |||||
: AsyncEnumerable.Empty<IReadOnlyCollection<IGuildUser>>(); | |||||
public string Topic { get; private set; } | public string Topic { get; private set; } | ||||
public ulong? CategoryId { get; private set; } | public ulong? CategoryId { get; private set; } | ||||
@@ -153,10 +148,9 @@ namespace Discord.Rest | |||||
} | } | ||||
IAsyncEnumerable<IReadOnlyCollection<IGuildUser>> IGuildChannel.GetUsersAsync(CacheMode mode, | IAsyncEnumerable<IReadOnlyCollection<IGuildUser>> IGuildChannel.GetUsersAsync(CacheMode mode, | ||||
RequestOptions options) | |||||
{ | |||||
return mode == CacheMode.AllowDownload ? GetUsersAsync(options) : AsyncEnumerable.Empty<IReadOnlyCollection<IGuildUser>>(); | |||||
} | |||||
RequestOptions options) => mode == CacheMode.AllowDownload | |||||
? GetUsersAsync(options) | |||||
: AsyncEnumerable.Empty<IReadOnlyCollection<IGuildUser>>(); | |||||
// INestedChannel | // INestedChannel | ||||
async Task<ICategoryChannel> INestedChannel.GetCategoryAsync(CacheMode mode, RequestOptions options) | async Task<ICategoryChannel> INestedChannel.GetCategoryAsync(CacheMode mode, RequestOptions options) | ||||
@@ -38,22 +38,19 @@ namespace Discord.Rest | |||||
} | } | ||||
IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(int limit, CacheMode mode, | IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(int limit, CacheMode mode, | ||||
RequestOptions options) | |||||
{ | |||||
return mode == CacheMode.AllowDownload ? GetMessagesAsync(limit, options) : AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
} | |||||
RequestOptions options) => mode == CacheMode.AllowDownload | |||||
? GetMessagesAsync(limit, options) | |||||
: AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(ulong fromMessageId, | IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(ulong fromMessageId, | ||||
Direction dir, int limit, CacheMode mode, RequestOptions options) | |||||
{ | |||||
return mode == CacheMode.AllowDownload ? GetMessagesAsync(fromMessageId, dir, limit, options) : AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
} | |||||
Direction dir, int limit, CacheMode mode, RequestOptions options) => mode == CacheMode.AllowDownload | |||||
? GetMessagesAsync(fromMessageId, dir, limit, options) | |||||
: AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(IMessage fromMessage, | IAsyncEnumerable<IReadOnlyCollection<IMessage>> IMessageChannel.GetMessagesAsync(IMessage fromMessage, | ||||
Direction dir, int limit, CacheMode mode, RequestOptions options) | |||||
{ | |||||
return mode == CacheMode.AllowDownload ? GetMessagesAsync(fromMessage, dir, limit, options) : AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
} | |||||
Direction dir, int limit, CacheMode mode, RequestOptions options) => mode == CacheMode.AllowDownload | |||||
? GetMessagesAsync(fromMessage, dir, limit, options) | |||||
: AsyncEnumerable.Empty<IReadOnlyCollection<IMessage>>(); | |||||
async Task<IReadOnlyCollection<IMessage>> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) | async Task<IReadOnlyCollection<IMessage>> IMessageChannel.GetPinnedMessagesAsync(RequestOptions options) | ||||
=> await GetPinnedMessagesAsync(options); | => await GetPinnedMessagesAsync(options); | ||||
@@ -4,7 +4,6 @@ using System.Collections.Immutable; | |||||
using System.Diagnostics; | using System.Diagnostics; | ||||
using System.Linq; | using System.Linq; | ||||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||||
using Discord.API; | |||||
using Discord.Audio; | using Discord.Audio; | ||||
using EmbedModel = Discord.API.GuildEmbed; | using EmbedModel = Discord.API.GuildEmbed; | ||||
using Model = Discord.API.Guild; | using Model = Discord.API.Guild; | ||||
@@ -473,10 +472,7 @@ namespace Discord.Rest | |||||
=> GuildHelper.GetVanityInviteAsync(this, Discord, options); | => GuildHelper.GetVanityInviteAsync(this, Discord, options); | ||||
//Roles | //Roles | ||||
public RestRole GetRole(ulong id) | |||||
{ | |||||
return _roles.TryGetValue(id, out var value) ? value : null; | |||||
} | |||||
public RestRole GetRole(ulong id) => _roles.TryGetValue(id, out var value) ? value : null; | |||||
public async Task<RestRole> CreateRoleAsync(string name, | public async Task<RestRole> CreateRoleAsync(string name, | ||||
GuildPermissions? permissions = default(GuildPermissions?), Color? color = default(Color?), | GuildPermissions? permissions = default(GuildPermissions?), Color? color = default(Color?), | ||||
@@ -204,7 +204,9 @@ namespace Discord.Rest | |||||
return MessageSource.System; | return MessageSource.System; | ||||
if (msg.WebhookId.IsSpecified) | if (msg.WebhookId.IsSpecified) | ||||
return MessageSource.Webhook; | return MessageSource.Webhook; | ||||
return msg.Author.GetValueOrDefault()?.Bot.GetValueOrDefault(false) == true ? MessageSource.Bot : MessageSource.User; | |||||
return msg.Author.GetValueOrDefault()?.Bot.GetValueOrDefault(false) == true | |||||
? MessageSource.Bot | |||||
: MessageSource.User; | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -49,7 +49,9 @@ namespace Discord.Rest | |||||
internal static RestUser Create(BaseDiscordClient discord, IGuild guild, Model model, ulong? webhookId) | internal static RestUser Create(BaseDiscordClient discord, IGuild guild, Model model, ulong? webhookId) | ||||
{ | { | ||||
RestUser entity; | RestUser entity; | ||||
entity = webhookId.HasValue ? new RestWebhookUser(discord, guild, model.Id, webhookId.Value) : new RestUser(discord, model.Id); | |||||
entity = webhookId.HasValue | |||||
? new RestWebhookUser(discord, guild, model.Id, webhookId.Value) | |||||
: new RestUser(discord, model.Id); | |||||
entity.Update(model); | entity.Update(model); | ||||
return entity; | return entity; | ||||
} | } | ||||
@@ -89,7 +89,9 @@ namespace Discord.Net.Converters | |||||
var typeInfo = type.GetTypeInfo(); | var typeInfo = type.GetTypeInfo(); | ||||
if (typeInfo.ImplementedInterfaces.Any(x => x == typeof(IEntity<ulong>))) | if (typeInfo.ImplementedInterfaces.Any(x => x == typeof(IEntity<ulong>))) | ||||
return UInt64EntityConverter.Instance; | return UInt64EntityConverter.Instance; | ||||
return typeInfo.ImplementedInterfaces.Any(x => x == typeof(IEntity<string>)) ? StringEntityConverter.Instance : null; | |||||
return typeInfo.ImplementedInterfaces.Any(x => x == typeof(IEntity<string>)) | |||||
? StringEntityConverter.Instance | |||||
: null; | |||||
} | } | ||||
private static bool ShouldSerialize<TOwner, TValue>(object owner, Delegate getter) => | private static bool ShouldSerialize<TOwner, TValue>(object owner, Delegate getter) => | ||||
@@ -14,8 +14,8 @@ namespace Discord.Net.Queue | |||||
internal class RequestQueue : IDisposable | internal class RequestQueue : IDisposable | ||||
{ | { | ||||
private readonly ConcurrentDictionary<string, RequestBucket> _buckets; | private readonly ConcurrentDictionary<string, RequestBucket> _buckets; | ||||
private readonly SemaphoreSlim _tokenLock; | |||||
private readonly CancellationTokenSource _cancelToken; //Dispose token | private readonly CancellationTokenSource _cancelToken; //Dispose token | ||||
private readonly SemaphoreSlim _tokenLock; | |||||
private Task _cleanupTask; | private Task _cleanupTask; | ||||
private CancellationTokenSource _clearToken; | private CancellationTokenSource _clearToken; | ||||
@@ -198,10 +198,8 @@ namespace Discord.Audio | |||||
} | } | ||||
} | } | ||||
internal AudioInStream GetInputStream(ulong id) | |||||
{ | |||||
return _streams.TryGetValue(id, out var streamPair) ? streamPair.Reader : null; | |||||
} | |||||
internal AudioInStream GetInputStream(ulong id) => | |||||
_streams.TryGetValue(id, out var streamPair) ? streamPair.Reader : null; | |||||
internal async Task RemoveInputStreamAsync(ulong userId) | internal async Task RemoveInputStreamAsync(ulong userId) | ||||
{ | { | ||||
@@ -133,7 +133,9 @@ namespace Discord.Audio.Streams | |||||
public override async Task WriteAsync(byte[] data, int offset, int count, CancellationToken cancelToken) | public override async Task WriteAsync(byte[] data, int offset, int count, CancellationToken cancelToken) | ||||
{ | { | ||||
cancelToken = cancelToken.CanBeCanceled ? CancellationTokenSource.CreateLinkedTokenSource(cancelToken, _cancelToken).Token : _cancelToken; | |||||
cancelToken = cancelToken.CanBeCanceled | |||||
? CancellationTokenSource.CreateLinkedTokenSource(cancelToken, _cancelToken).Token | |||||
: _cancelToken; | |||||
await _queueLock.WaitAsync(-1, cancelToken).ConfigureAwait(false); | await _queueLock.WaitAsync(-1, cancelToken).ConfigureAwait(false); | ||||
if (!_bufferPool.TryDequeue(out var buffer)) | if (!_bufferPool.TryDequeue(out var buffer)) | ||||
@@ -11,12 +11,12 @@ namespace Discord.Audio.Streams | |||||
private const int MaxFrames = 100; //1-2 Seconds | private const int MaxFrames = 100; //1-2 Seconds | ||||
private readonly ConcurrentQueue<RTPFrame> _frames; | private readonly ConcurrentQueue<RTPFrame> _frames; | ||||
private readonly SemaphoreSlim _signal; | |||||
private bool _hasHeader; | private bool _hasHeader; | ||||
private bool _isDisposed; | private bool _isDisposed; | ||||
private bool _nextMissed; | private bool _nextMissed; | ||||
private ushort _nextSeq; | private ushort _nextSeq; | ||||
private uint _nextTimestamp; | private uint _nextTimestamp; | ||||
private readonly SemaphoreSlim _signal; | |||||
public InputStream() | public InputStream() | ||||
{ | { | ||||
@@ -246,3 +246,4 @@ namespace Discord.Audio.Streams | |||||
}*/ | }*/ | ||||
@@ -10,10 +10,10 @@ namespace Discord.Audio.Streams | |||||
protected readonly byte[] _buffer; | protected readonly byte[] _buffer; | ||||
private readonly byte[] _header; | private readonly byte[] _header; | ||||
private readonly AudioStream _next; | private readonly AudioStream _next; | ||||
private readonly uint _ssrc; | |||||
private bool _hasHeader; | private bool _hasHeader; | ||||
private ushort _nextSeq; | private ushort _nextSeq; | ||||
private uint _nextTimestamp; | private uint _nextTimestamp; | ||||
private readonly uint _ssrc; | |||||
public RTPWriteStream(AudioStream next, uint ssrc, int bufferSize = 4000) | public RTPWriteStream(AudioStream next, uint ssrc, int bufferSize = 4000) | ||||
{ | { | ||||
@@ -47,15 +47,10 @@ namespace Discord.WebSocket | |||||
_groupChannels.Select(x => GetChannel(x) as ISocketPrivateChannel)) | _groupChannels.Select(x => GetChannel(x) as ISocketPrivateChannel)) | ||||
.ToReadOnlyCollection(() => _dmChannels.Count + _groupChannels.Count); | .ToReadOnlyCollection(() => _dmChannels.Count + _groupChannels.Count); | ||||
internal SocketChannel GetChannel(ulong id) | |||||
{ | |||||
return _channels.TryGetValue(id, out var channel) ? channel : null; | |||||
} | |||||
internal SocketChannel GetChannel(ulong id) => _channels.TryGetValue(id, out var channel) ? channel : null; | |||||
internal SocketDMChannel GetDMChannel(ulong userId) | |||||
{ | |||||
return _dmChannels.TryGetValue(userId, out var channel) ? channel : null; | |||||
} | |||||
internal SocketDMChannel GetDMChannel(ulong userId) => | |||||
_dmChannels.TryGetValue(userId, out var channel) ? channel : null; | |||||
internal void AddChannel(SocketChannel channel) | internal void AddChannel(SocketChannel channel) | ||||
{ | { | ||||
@@ -86,32 +81,19 @@ namespace Discord.WebSocket | |||||
} | } | ||||
return channel; | return channel; | ||||
} | } | ||||
internal SocketGuild GetGuild(ulong id) | |||||
{ | |||||
return _guilds.TryGetValue(id, out var guild) ? guild : null; | |||||
} | |||||
internal SocketGuild GetGuild(ulong id) => _guilds.TryGetValue(id, out var guild) ? guild : null; | |||||
internal void AddGuild(SocketGuild guild) => _guilds[guild.Id] = guild; | internal void AddGuild(SocketGuild guild) => _guilds[guild.Id] = guild; | ||||
internal SocketGuild RemoveGuild(ulong id) | |||||
{ | |||||
return _guilds.TryRemove(id, out var guild) ? guild : null; | |||||
} | |||||
internal SocketGuild RemoveGuild(ulong id) => _guilds.TryRemove(id, out var guild) ? guild : null; | |||||
internal SocketGlobalUser GetUser(ulong id) | |||||
{ | |||||
return _users.TryGetValue(id, out var user) ? user : null; | |||||
} | |||||
internal SocketGlobalUser GetUser(ulong id) => _users.TryGetValue(id, out var user) ? user : null; | |||||
internal SocketGlobalUser GetOrAddUser(ulong id, Func<ulong, SocketGlobalUser> userFactory) => | internal SocketGlobalUser GetOrAddUser(ulong id, Func<ulong, SocketGlobalUser> userFactory) => | ||||
_users.GetOrAdd(id, userFactory); | _users.GetOrAdd(id, userFactory); | ||||
internal SocketGlobalUser RemoveUser(ulong id) | |||||
{ | |||||
return _users.TryRemove(id, out var user) ? user : null; | |||||
} | |||||
internal SocketGlobalUser RemoveUser(ulong id) => _users.TryRemove(id, out var user) ? user : null; | |||||
} | } | ||||
} | } |
@@ -11,11 +11,11 @@ namespace Discord.WebSocket | |||||
{ | { | ||||
public partial class DiscordShardedClient : BaseSocketClient, IDiscordClient | public partial class DiscordShardedClient : BaseSocketClient, IDiscordClient | ||||
{ | { | ||||
private readonly bool _automaticShards; | |||||
private readonly DiscordSocketConfig _baseConfig; | private readonly DiscordSocketConfig _baseConfig; | ||||
private readonly SemaphoreSlim _connectionGroupLock; | private readonly SemaphoreSlim _connectionGroupLock; | ||||
private readonly bool _automaticShards; | |||||
private int[] _shardIds; | |||||
private readonly Dictionary<int, int> _shardIdsToIndex; | private readonly Dictionary<int, int> _shardIdsToIndex; | ||||
private int[] _shardIds; | |||||
private DiscordSocketClient[] _shards; | private DiscordSocketClient[] _shards; | ||||
private int _totalShards; | private int _totalShards; | ||||
@@ -192,10 +192,7 @@ namespace Discord.WebSocket | |||||
} | } | ||||
} | } | ||||
public DiscordSocketClient GetShard(int id) | |||||
{ | |||||
return _shardIdsToIndex.TryGetValue(id, out id) ? _shards[id] : null; | |||||
} | |||||
public DiscordSocketClient GetShard(int id) => _shardIdsToIndex.TryGetValue(id, out id) ? _shards[id] : null; | |||||
private int GetShardIdFor(ulong guildId) | private int GetShardIdFor(ulong guildId) | ||||
=> (int)((guildId >> 22) % (uint)_totalShards); | => (int)((guildId >> 22) % (uint)_totalShards); | ||||
@@ -218,42 +215,24 @@ namespace Discord.WebSocket | |||||
=> GetShardFor(id).GetGuild(id); | => GetShardFor(id).GetGuild(id); | ||||
/// <inheritdoc /> | /// <inheritdoc /> | ||||
public override SocketChannel GetChannel(ulong id) | |||||
{ | |||||
return _shards.Select(t => t.GetChannel(id)).FirstOrDefault(channel => channel != null); | |||||
} | |||||
public override SocketChannel GetChannel(ulong id) => | |||||
_shards.Select(t => t.GetChannel(id)).FirstOrDefault(channel => channel != null); | |||||
private IEnumerable<ISocketPrivateChannel> GetPrivateChannels() | |||||
{ | |||||
return _shards.SelectMany(t => t.PrivateChannels); | |||||
} | |||||
private IEnumerable<ISocketPrivateChannel> GetPrivateChannels() => _shards.SelectMany(t => t.PrivateChannels); | |||||
private int GetPrivateChannelCount() | |||||
{ | |||||
return _shards.Sum(t => t.PrivateChannels.Count); | |||||
} | |||||
private int GetPrivateChannelCount() => _shards.Sum(t => t.PrivateChannels.Count); | |||||
private IEnumerable<SocketGuild> GetGuilds() | |||||
{ | |||||
return _shards.SelectMany(t => t.Guilds); | |||||
} | |||||
private IEnumerable<SocketGuild> GetGuilds() => _shards.SelectMany(t => t.Guilds); | |||||
private int GetGuildCount() | |||||
{ | |||||
return _shards.Sum(t => t.Guilds.Count); | |||||
} | |||||
private int GetGuildCount() => _shards.Sum(t => t.Guilds.Count); | |||||
/// <inheritdoc /> | /// <inheritdoc /> | ||||
public override SocketUser GetUser(ulong id) | |||||
{ | |||||
return _shards.Select(t => t.GetUser(id)).FirstOrDefault(user => user != null); | |||||
} | |||||
public override SocketUser GetUser(ulong id) => | |||||
_shards.Select(t => t.GetUser(id)).FirstOrDefault(user => user != null); | |||||
/// <inheritdoc /> | /// <inheritdoc /> | ||||
public override SocketUser GetUser(string username, string discriminator) | |||||
{ | |||||
return _shards.Select(t => t.GetUser(username, discriminator)).FirstOrDefault(user => user != null); | |||||
} | |||||
public override SocketUser GetUser(string username, string discriminator) => _shards | |||||
.Select(t => t.GetUser(username, discriminator)).FirstOrDefault(user => user != null); | |||||
/// <inheritdoc /> | /// <inheritdoc /> | ||||
public override RestVoiceRegion GetVoiceRegion(string id) | public override RestVoiceRegion GetVoiceRegion(string id) | ||||
@@ -18,6 +18,7 @@ namespace Discord.API | |||||
internal class DiscordSocketApiClient : DiscordRestApiClient | internal class DiscordSocketApiClient : DiscordRestApiClient | ||||
{ | { | ||||
private readonly AsyncEvent<Func<Exception, Task>> _disconnectedEvent = new AsyncEvent<Func<Exception, Task>>(); | private readonly AsyncEvent<Func<Exception, Task>> _disconnectedEvent = new AsyncEvent<Func<Exception, Task>>(); | ||||
private readonly bool _isExplicitUrl; | |||||
private readonly AsyncEvent<Func<GatewayOpCode, int?, string, object, Task>> _receivedGatewayEvent = | private readonly AsyncEvent<Func<GatewayOpCode, int?, string, object, Task>> _receivedGatewayEvent = | ||||
new AsyncEvent<Func<GatewayOpCode, int?, string, object, Task>>(); | new AsyncEvent<Func<GatewayOpCode, int?, string, object, Task>>(); | ||||
@@ -31,7 +32,6 @@ namespace Discord.API | |||||
private CancellationTokenSource _connectCancelToken; | private CancellationTokenSource _connectCancelToken; | ||||
private DeflateStream _decompressor; | private DeflateStream _decompressor; | ||||
private string _gatewayUrl; | private string _gatewayUrl; | ||||
private readonly bool _isExplicitUrl; | |||||
public DiscordSocketApiClient(RestClientProvider restClientProvider, WebSocketProvider webSocketProvider, | public DiscordSocketApiClient(RestClientProvider restClientProvider, WebSocketProvider webSocketProvider, | ||||
string userAgent, | string userAgent, | ||||
@@ -357,10 +357,8 @@ namespace Discord.WebSocket | |||||
=> State.RemoveUser(id); | => State.RemoveUser(id); | ||||
/// <inheritdoc /> | /// <inheritdoc /> | ||||
public override RestVoiceRegion GetVoiceRegion(string id) | |||||
{ | |||||
return _voiceRegions.TryGetValue(id, out var region) ? region : null; | |||||
} | |||||
public override RestVoiceRegion GetVoiceRegion(string id) => | |||||
_voiceRegions.TryGetValue(id, out var region) ? region : null; | |||||
/// <summary> Downloads the users list for the provided guilds, if they don't have a complete list. </summary> | /// <summary> Downloads the users list for the provided guilds, if they don't have a complete list. </summary> | ||||
public override async Task DownloadUsersAsync(IEnumerable<IGuild> guilds) | public override async Task DownloadUsersAsync(IEnumerable<IGuild> guilds) | ||||
@@ -1152,7 +1150,7 @@ namespace Discord.WebSocket | |||||
author = guild.GetUser(data.Author.Value.Id); | author = guild.GetUser(data.Author.Value.Id); | ||||
} | } | ||||
else | else | ||||
author = ((SocketChannel) channel).GetUser(data.Author.Value.Id); | |||||
author = ((SocketChannel)channel).GetUser(data.Author.Value.Id); | |||||
if (author == null) | if (author == null) | ||||
{ | { | ||||
@@ -1205,8 +1203,11 @@ namespace Discord.WebSocket | |||||
else if (data.Author.IsSpecified) | else if (data.Author.IsSpecified) | ||||
{ | { | ||||
//Edited message isnt in cache, create a detached one | //Edited message isnt in cache, create a detached one | ||||
var author = (guild != null ? guild.GetUser(data.Author.Value.Id) : ((SocketChannel) channel).GetUser(data.Author.Value.Id)) ?? | |||||
SocketUnknownUser.Create(this, State, data.Author.Value); | |||||
var author = | |||||
(guild != null | |||||
? guild.GetUser(data.Author.Value.Id) | |||||
: ((SocketChannel)channel).GetUser(data.Author.Value.Id)) ?? | |||||
SocketUnknownUser.Create(this, State, data.Author.Value); | |||||
after = SocketMessage.Create(this, State, author, channel, data); | after = SocketMessage.Create(this, State, author, channel, data); | ||||
} | } | ||||
@@ -37,10 +37,10 @@ namespace Discord.Audio | |||||
new AsyncEvent<Func<string, string, double, Task>>(); | new AsyncEvent<Func<string, string, double, Task>>(); | ||||
private readonly JsonSerializer _serializer; | private readonly JsonSerializer _serializer; | ||||
private readonly IUdpSocket _udp; | |||||
private CancellationTokenSource _connectCancelToken; | private CancellationTokenSource _connectCancelToken; | ||||
private bool _isDisposed; | private bool _isDisposed; | ||||
private ulong _nextKeepalive; | private ulong _nextKeepalive; | ||||
private readonly IUdpSocket _udp; | |||||
internal DiscordVoiceAPIClient(ulong guildId, WebSocketProvider webSocketProvider, | internal DiscordVoiceAPIClient(ulong guildId, WebSocketProvider webSocketProvider, | ||||
UdpSocketProvider udpSocketProvider, JsonSerializer serializer = null) | UdpSocketProvider udpSocketProvider, JsonSerializer serializer = null) | ||||
@@ -23,7 +23,9 @@ namespace Discord.WebSocket | |||||
if (dir == Direction.Before || mode == CacheMode.CacheOnly) | if (dir == Direction.Before || mode == CacheMode.CacheOnly) | ||||
{ | { | ||||
cachedMessages = messages != null ? messages.GetMany(fromMessageId, dir, limit) : ImmutableArray.Create<SocketMessage>(); | |||||
cachedMessages = messages != null | |||||
? messages.GetMany(fromMessageId, dir, limit) | |||||
: ImmutableArray.Create<SocketMessage>(); | |||||
result = ImmutableArray.Create(cachedMessages).ToAsyncEnumerable<IReadOnlyCollection<IMessage>>(); | result = ImmutableArray.Create(cachedMessages).ToAsyncEnumerable<IReadOnlyCollection<IMessage>>(); | ||||
} | } | ||||
@@ -45,10 +47,9 @@ namespace Discord.WebSocket | |||||
public static IReadOnlyCollection<SocketMessage> GetCachedMessages(SocketChannel channel, | public static IReadOnlyCollection<SocketMessage> GetCachedMessages(SocketChannel channel, | ||||
DiscordSocketClient discord, MessageCache messages, | DiscordSocketClient discord, MessageCache messages, | ||||
ulong? fromMessageId, Direction dir, int limit) | |||||
{ | |||||
return messages != null ? messages.GetMany(fromMessageId, dir, limit) : ImmutableArray.Create<SocketMessage>(); | |||||
} | |||||
ulong? fromMessageId, Direction dir, int limit) => messages != null | |||||
? messages.GetMany(fromMessageId, dir, limit) | |||||
: ImmutableArray.Create<SocketMessage>(); | |||||
public static void AddMessage(ISocketMessageChannel channel, DiscordSocketClient discord, | public static void AddMessage(ISocketMessageChannel channel, DiscordSocketClient discord, | ||||
SocketMessage msg) | SocketMessage msg) | ||||
@@ -19,10 +19,10 @@ namespace Discord.WebSocket | |||||
ISocketAudioChannel | ISocketAudioChannel | ||||
{ | { | ||||
private readonly MessageCache _messages; | private readonly MessageCache _messages; | ||||
private readonly ConcurrentDictionary<ulong, SocketVoiceState> _voiceStates; | |||||
private string _iconId; | private string _iconId; | ||||
private ConcurrentDictionary<ulong, SocketGroupUser> _users; | private ConcurrentDictionary<ulong, SocketGroupUser> _users; | ||||
private readonly ConcurrentDictionary<ulong, SocketVoiceState> _voiceStates; | |||||
internal SocketGroupChannel(DiscordSocketClient discord, ulong id) | internal SocketGroupChannel(DiscordSocketClient discord, ulong id) | ||||
: base(discord, id) | : base(discord, id) | ||||
@@ -211,10 +211,7 @@ namespace Discord.WebSocket | |||||
=> _messages?.Remove(id); | => _messages?.Remove(id); | ||||
//Users | //Users | ||||
public new SocketGroupUser GetUser(ulong id) | |||||
{ | |||||
return _users.TryGetValue(id, out var user) ? user : null; | |||||
} | |||||
public new SocketGroupUser GetUser(ulong id) => _users.TryGetValue(id, out var user) ? user : null; | |||||
internal SocketGroupUser GetOrAddUser(UserModel model) | internal SocketGroupUser GetOrAddUser(UserModel model) | ||||
{ | { | ||||
@@ -231,7 +228,6 @@ namespace Discord.WebSocket | |||||
if (!_users.TryRemove(id, out var user)) return null; | if (!_users.TryRemove(id, out var user)) return null; | ||||
user.GlobalUser.RemoveRef(Discord); | user.GlobalUser.RemoveRef(Discord); | ||||
return user; | return user; | ||||
} | } | ||||
//Voice States | //Voice States | ||||
@@ -523,10 +523,7 @@ namespace Discord.WebSocket | |||||
=> GuildHelper.GetVanityInviteAsync(this, Discord, options); | => GuildHelper.GetVanityInviteAsync(this, Discord, options); | ||||
//Roles | //Roles | ||||
public SocketRole GetRole(ulong id) | |||||
{ | |||||
return _roles.TryGetValue(id, out var value) ? value : null; | |||||
} | |||||
public SocketRole GetRole(ulong id) => _roles.TryGetValue(id, out var value) ? value : null; | |||||
public Task<RestRole> CreateRoleAsync(string name, GuildPermissions? permissions = default(GuildPermissions?), | public Task<RestRole> CreateRoleAsync(string name, GuildPermissions? permissions = default(GuildPermissions?), | ||||
Color? color = default(Color?), | Color? color = default(Color?), | ||||
@@ -540,16 +537,10 @@ namespace Discord.WebSocket | |||||
return role; | return role; | ||||
} | } | ||||
internal SocketRole RemoveRole(ulong id) | |||||
{ | |||||
return _roles.TryRemove(id, out var role) ? role : null; | |||||
} | |||||
internal SocketRole RemoveRole(ulong id) => _roles.TryRemove(id, out var role) ? role : null; | |||||
//Users | //Users | ||||
public SocketGuildUser GetUser(ulong id) | |||||
{ | |||||
return _members.TryGetValue(id, out var member) ? member : null; | |||||
} | |||||
public SocketGuildUser GetUser(ulong id) => _members.TryGetValue(id, out var member) ? member : null; | |||||
internal SocketGuildUser AddOrUpdateUser(UserModel model) | internal SocketGuildUser AddOrUpdateUser(UserModel model) | ||||
{ | { | ||||
@@ -602,7 +593,6 @@ namespace Discord.WebSocket | |||||
DownloadedMemberCount--; | DownloadedMemberCount--; | ||||
member.GlobalUser.RemoveRef(Discord); | member.GlobalUser.RemoveRef(Discord); | ||||
return member; | return member; | ||||
} | } | ||||
internal void CompleteDownloadUsers() => _downloaderPromise.TrySetResultAsync(true); | internal void CompleteDownloadUsers() => _downloaderPromise.TrySetResultAsync(true); | ||||
@@ -37,10 +37,7 @@ namespace Discord.WebSocket | |||||
return msg; | return msg; | ||||
} | } | ||||
public SocketMessage Get(ulong id) | |||||
{ | |||||
return _messages.TryGetValue(id, out var result) ? result : null; | |||||
} | |||||
public SocketMessage Get(ulong id) => _messages.TryGetValue(id, out var result) ? result : null; | |||||
public IReadOnlyCollection<SocketMessage> GetMany(ulong? fromMessageId, Direction dir, | public IReadOnlyCollection<SocketMessage> GetMany(ulong? fromMessageId, Direction dir, | ||||
int limit = DiscordConfig.MaxMessagesPerBatch) | int limit = DiscordConfig.MaxMessagesPerBatch) | ||||
@@ -60,10 +57,7 @@ namespace Discord.WebSocket | |||||
cachedMessageIds = cachedMessageIds.Reverse(); | cachedMessageIds = cachedMessageIds.Reverse(); | ||||
return cachedMessageIds | return cachedMessageIds | ||||
.Select(x => | |||||
{ | |||||
return _messages.TryGetValue(x, out var msg) ? msg : null; | |||||
}) | |||||
.Select(x => { return _messages.TryGetValue(x, out var msg) ? msg : null; }) | |||||
.Where(x => x != null) | .Where(x => x != null) | ||||
.Take(limit) | .Take(limit) | ||||
.ToImmutableArray(); | .ToImmutableArray(); | ||||
@@ -12,11 +12,11 @@ namespace Discord.WebSocket | |||||
[DebuggerDisplay(@"{" + nameof(DebuggerDisplay) + @",nq}")] | [DebuggerDisplay(@"{" + nameof(DebuggerDisplay) + @",nq}")] | ||||
public class SocketUserMessage : SocketMessage, IUserMessage | public class SocketUserMessage : SocketMessage, IUserMessage | ||||
{ | { | ||||
private readonly List<SocketReaction> _reactions = new List<SocketReaction>(); | |||||
private ImmutableArray<Attachment> _attachments; | private ImmutableArray<Attachment> _attachments; | ||||
private long? _editedTimestampTicks; | private long? _editedTimestampTicks; | ||||
private ImmutableArray<Embed> _embeds; | private ImmutableArray<Embed> _embeds; | ||||
private bool _isMentioningEveryone, _isTTS, _isPinned; | private bool _isMentioningEveryone, _isTTS, _isPinned; | ||||
private readonly List<SocketReaction> _reactions = new List<SocketReaction>(); | |||||
private ImmutableArray<ITag> _tags; | private ImmutableArray<ITag> _tags; | ||||
internal SocketUserMessage(DiscordSocketClient discord, ulong id, ISocketMessageChannel channel, | internal SocketUserMessage(DiscordSocketClient discord, ulong id, ISocketMessageChannel channel, | ||||
@@ -142,10 +142,8 @@ namespace Discord.WebSocket | |||||
{ | { | ||||
var newMentions = ImmutableArray.CreateBuilder<SocketUnknownUser>(value.Length); | var newMentions = ImmutableArray.CreateBuilder<SocketUnknownUser>(value.Length); | ||||
foreach (var val in value) | foreach (var val in value) | ||||
{ | |||||
if (val.Object != null) | if (val.Object != null) | ||||
newMentions.Add(SocketUnknownUser.Create(Discord, state, val.Object)); | newMentions.Add(SocketUnknownUser.Create(Discord, state, val.Object)); | ||||
} | |||||
mentions = newMentions.ToImmutable(); | mentions = newMentions.ToImmutable(); | ||||
} | } | ||||
@@ -18,11 +18,11 @@ namespace Discord.Net.WebSockets | |||||
private readonly Dictionary<string, string> _headers; | private readonly Dictionary<string, string> _headers; | ||||
private readonly SemaphoreSlim _lock; | private readonly SemaphoreSlim _lock; | ||||
private readonly IWebProxy _proxy; | |||||
private CancellationToken _cancelToken, _parentToken; | private CancellationToken _cancelToken, _parentToken; | ||||
private CancellationTokenSource _cancelTokenSource; | private CancellationTokenSource _cancelTokenSource; | ||||
private ClientWebSocket _client; | private ClientWebSocket _client; | ||||
private bool _isDisposed, _isDisconnecting; | private bool _isDisposed, _isDisconnecting; | ||||
private readonly IWebProxy _proxy; | |||||
private Task _task; | private Task _task; | ||||
public DefaultWebSocketClient(IWebProxy proxy = null) | public DefaultWebSocketClient(IWebProxy proxy = null) | ||||
@@ -15,11 +15,11 @@ namespace Discord.Net | |||||
{ | { | ||||
internal class CachedRestClient : IRestClient | internal class CachedRestClient : IRestClient | ||||
{ | { | ||||
private readonly IBlobCache _blobCache; | |||||
private readonly CancellationTokenSource _cancelTokenSource; | |||||
private readonly Dictionary<string, string> _headers; | private readonly Dictionary<string, string> _headers; | ||||
private string _baseUrl; | private string _baseUrl; | ||||
private readonly IBlobCache _blobCache; | |||||
private CancellationToken _cancelToken, _parentToken; | private CancellationToken _cancelToken, _parentToken; | ||||
private readonly CancellationTokenSource _cancelTokenSource; | |||||
private bool _isDisposed; | private bool _isDisposed; | ||||
public CachedRestClient() | public CachedRestClient() | ||||
@@ -44,7 +44,8 @@ namespace Discord | |||||
.Distinct() | .Distinct() | ||||
.ToArray(); | .ToArray(); | ||||
// test GuildPermissions.All | // test GuildPermissions.All | ||||
var sumOfAllGuildPermissions = enumValues.Aggregate<GuildPermission, ulong>(0, (current, v) => current | (ulong)v); | |||||
var sumOfAllGuildPermissions = | |||||
enumValues.Aggregate<GuildPermission, ulong>(0, (current, v) => current | (ulong)v); | |||||
// assert that the raw values match | // assert that the raw values match | ||||
Assert.Equal(sumOfAllGuildPermissions, GuildPermissions.All.RawValue); | Assert.Equal(sumOfAllGuildPermissions, GuildPermissions.All.RawValue); | ||||
@@ -41,8 +41,8 @@ namespace Discord | |||||
public partial class Tests : IClassFixture<TestsFixture> | public partial class Tests : IClassFixture<TestsFixture> | ||||
{ | { | ||||
private DiscordRestClient _client; | |||||
private readonly RestGuild _guild; | private readonly RestGuild _guild; | ||||
private DiscordRestClient _client; | |||||
public Tests(TestsFixture fixture) | public Tests(TestsFixture fixture) | ||||
{ | { | ||||