From fd5e237b41427ba530bfbddd6b422deb183dde66 Mon Sep 17 00:00:00 2001 From: FiniteReality Date: Sun, 20 Nov 2016 13:40:40 +0000 Subject: [PATCH 01/10] Fix commands from being created with invalid aliases --- .../Builders/ModuleClassBuilder.cs | 8 +++++++- src/Discord.Net.Commands/Info/CommandInfo.cs | 14 +++++++++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs index 9884f18db..31694d1d1 100644 --- a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs @@ -116,6 +116,9 @@ namespace Discord.Commands { var attributes = method.GetCustomAttributes(); + builder.Name = method.Name; + + var setName = false; foreach (var attribute in attributes) { // TODO: C#7 type switch @@ -124,10 +127,13 @@ namespace Discord.Commands var cmdAttr = attribute as CommandAttribute; builder.AddAliases(cmdAttr.Text); builder.RunMode = cmdAttr.RunMode; - builder.Name = builder.Name ?? cmdAttr.Text; + builder.Name = setName ? builder.Name ?? cmdAttr.Text : cmdAttr.Text ?? builder.Name; } else if (attribute is NameAttribute) + { builder.Name = (attribute as NameAttribute).Text; + setName = true; + } else if (attribute is PriorityAttribute) builder.Priority = (attribute as PriorityAttribute).Priority; else if (attribute is SummaryAttribute) diff --git a/src/Discord.Net.Commands/Info/CommandInfo.cs b/src/Discord.Net.Commands/Info/CommandInfo.cs index 4d546b6fa..06b0f25a3 100644 --- a/src/Discord.Net.Commands/Info/CommandInfo.cs +++ b/src/Discord.Net.Commands/Info/CommandInfo.cs @@ -39,11 +39,19 @@ namespace Discord.Commands RunMode = builder.RunMode; Priority = builder.Priority; - - if (module.Aliases.Count != 0) + + // both command and module provide aliases + if (module.Aliases.Count > 0 && builder.Aliases.Count > 0) Aliases = module.Aliases.Permutate(builder.Aliases, (first, second) => first + " " + second).ToImmutableArray(); - else + // only module provides aliases + else if (module.Aliases.Count > 0) + Aliases = module.Aliases.ToImmutableArray(); + // only command provides aliases + else if (builder.Aliases.Count > 0) Aliases = builder.Aliases.ToImmutableArray(); + // neither provide aliases + else + throw new InvalidOperationException("Cannot build a command without any aliases"); Preconditions = builder.Preconditions.ToImmutableArray(); From 05fb81c6176eb361e66a6db9946873fc26401417 Mon Sep 17 00:00:00 2001 From: FiniteReality Date: Sun, 20 Nov 2016 20:20:23 +0000 Subject: [PATCH 02/10] Fix a bunch of issues with aliases --- src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs | 7 ++++--- src/Discord.Net.Commands/CommandService.cs | 4 ++-- src/Discord.Net.Commands/Info/CommandInfo.cs | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs index 31694d1d1..57b40b6b3 100644 --- a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs @@ -118,7 +118,6 @@ namespace Discord.Commands builder.Name = method.Name; - var setName = false; foreach (var attribute in attributes) { // TODO: C#7 type switch @@ -127,12 +126,11 @@ namespace Discord.Commands var cmdAttr = attribute as CommandAttribute; builder.AddAliases(cmdAttr.Text); builder.RunMode = cmdAttr.RunMode; - builder.Name = setName ? builder.Name ?? cmdAttr.Text : cmdAttr.Text ?? builder.Name; + builder.Name = builder.Name ?? cmdAttr.Text; } else if (attribute is NameAttribute) { builder.Name = (attribute as NameAttribute).Text; - setName = true; } else if (attribute is PriorityAttribute) builder.Priority = (attribute as PriorityAttribute).Priority; @@ -146,6 +144,9 @@ namespace Discord.Commands builder.AddPrecondition(attribute as PreconditionAttribute); } + if (builder.Name == null) + builder.Name = method.Name; + var parameters = method.GetParameters(); int pos = 0, count = parameters.Length; foreach (var paramInfo in parameters) diff --git a/src/Discord.Net.Commands/CommandService.cs b/src/Discord.Net.Commands/CommandService.cs index 3c3760908..993dc7ebd 100644 --- a/src/Discord.Net.Commands/CommandService.cs +++ b/src/Discord.Net.Commands/CommandService.cs @@ -19,8 +19,8 @@ namespace Discord.Commands private readonly ConcurrentBag _moduleDefs; private readonly CommandMap _map; - public IEnumerable Modules => _typedModuleDefs.Select(x => x.Value); - public IEnumerable Commands => _typedModuleDefs.SelectMany(x => x.Value.Commands); + public IEnumerable Modules => _moduleDefs.Select(x => x); + public IEnumerable Commands => _moduleDefs.SelectMany(x => x.Commands); public CommandService() { diff --git a/src/Discord.Net.Commands/Info/CommandInfo.cs b/src/Discord.Net.Commands/Info/CommandInfo.cs index 06b0f25a3..55fdf0d90 100644 --- a/src/Discord.Net.Commands/Info/CommandInfo.cs +++ b/src/Discord.Net.Commands/Info/CommandInfo.cs @@ -42,7 +42,7 @@ namespace Discord.Commands // both command and module provide aliases if (module.Aliases.Count > 0 && builder.Aliases.Count > 0) - Aliases = module.Aliases.Permutate(builder.Aliases, (first, second) => first + " " + second).ToImmutableArray(); + Aliases = module.Aliases.Permutate(builder.Aliases, (first, second) => second != null ? first + " " + second : first).ToImmutableArray(); // only module provides aliases else if (module.Aliases.Count > 0) Aliases = module.Aliases.ToImmutableArray(); From bc76e38ce54a1d273f52e04c3ce78fe89e5a28bd Mon Sep 17 00:00:00 2001 From: FiniteReality Date: Fri, 25 Nov 2016 21:15:39 +0000 Subject: [PATCH 03/10] Fix additional issue with aliases building incorrectly --- src/Discord.Net.Commands/Info/ModuleInfo.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Discord.Net.Commands/Info/ModuleInfo.cs b/src/Discord.Net.Commands/Info/ModuleInfo.cs index 64fa29ea2..3baa2d34f 100644 --- a/src/Discord.Net.Commands/Info/ModuleInfo.cs +++ b/src/Discord.Net.Commands/Info/ModuleInfo.cs @@ -49,15 +49,21 @@ namespace Discord.Commands while (builderStack.Count() > 0) { - ModuleBuilder level = builderStack.Pop(); // get the topmost builder + ModuleBuilder level = builderStack.Pop(); //get the topmost builder if (result == null) - result = level.Aliases.ToList(); // create a shallow copy so we don't overwrite the builder unexpectedly + { + if (level.Aliases.Count > 0) + result = level.Aliases.ToList(); //create a shallow copy so we don't overwrite the builder unexpectedly + } else if (result.Count() > level.Aliases.Count) result = result.Permutate(level.Aliases, (first, second) => first + " " + second); else result = level.Aliases.Permutate(result, (second, first) => first + " " + second); } + if (result == null) //there were no aliases; default to an empty list + result = new List(); + return result; } From 5cdda592c19a6855ef761420235cd200f0164051 Mon Sep 17 00:00:00 2001 From: FiniteReality Date: Fri, 25 Nov 2016 21:19:41 +0000 Subject: [PATCH 04/10] Add requested changes --- src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs index 57b40b6b3..aaec43161 100644 --- a/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs +++ b/src/Discord.Net.Commands/Builders/ModuleClassBuilder.cs @@ -115,9 +115,7 @@ namespace Discord.Commands private static void BuildCommand(CommandBuilder builder, TypeInfo typeInfo, MethodInfo method, CommandService service) { var attributes = method.GetCustomAttributes(); - - builder.Name = method.Name; - + foreach (var attribute in attributes) { // TODO: C#7 type switch @@ -129,9 +127,7 @@ namespace Discord.Commands builder.Name = builder.Name ?? cmdAttr.Text; } else if (attribute is NameAttribute) - { builder.Name = (attribute as NameAttribute).Text; - } else if (attribute is PriorityAttribute) builder.Priority = (attribute as PriorityAttribute).Priority; else if (attribute is SummaryAttribute) From f9c5e229d0fb5b66939d7703a3c109c70c7b3605 Mon Sep 17 00:00:00 2001 From: Christopher F Date: Fri, 25 Nov 2016 18:49:35 -0500 Subject: [PATCH 05/10] Add CommandServiceConfig, DefaultRunMode This adds an (optional) CommandServiceConfig, as well as a DefaultRunMode for commands. This resolves #368 (for commands where a RunMode is not explicitly specified, a custom default value should be used) --- src/Discord.Net.Commands/Attributes/CommandAttribute.cs | 2 +- src/Discord.Net.Commands/Builders/CommandBuilder.cs | 2 +- src/Discord.Net.Commands/CommandService.cs | 6 +++++- src/Discord.Net.Commands/CommandServiceConfig.cs | 8 ++++++++ src/Discord.Net.Commands/Info/CommandInfo.cs | 2 +- 5 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 src/Discord.Net.Commands/CommandServiceConfig.cs diff --git a/src/Discord.Net.Commands/Attributes/CommandAttribute.cs b/src/Discord.Net.Commands/Attributes/CommandAttribute.cs index baac75ff9..86daf0103 100644 --- a/src/Discord.Net.Commands/Attributes/CommandAttribute.cs +++ b/src/Discord.Net.Commands/Attributes/CommandAttribute.cs @@ -6,7 +6,7 @@ namespace Discord.Commands public class CommandAttribute : Attribute { public string Text { get; } - public RunMode RunMode { get; set; } = RunMode.Sync; + public RunMode RunMode { get; set; } public CommandAttribute() { diff --git a/src/Discord.Net.Commands/Builders/CommandBuilder.cs b/src/Discord.Net.Commands/Builders/CommandBuilder.cs index 9b983fd1f..25c0223e6 100644 --- a/src/Discord.Net.Commands/Builders/CommandBuilder.cs +++ b/src/Discord.Net.Commands/Builders/CommandBuilder.cs @@ -17,7 +17,7 @@ namespace Discord.Commands.Builders public string Name { get; set; } public string Summary { get; set; } public string Remarks { get; set; } - public RunMode RunMode { get; set; } + public RunMode? RunMode { get; set; } public int Priority { get; set; } public IReadOnlyList Preconditions => _preconditions; diff --git a/src/Discord.Net.Commands/CommandService.cs b/src/Discord.Net.Commands/CommandService.cs index 3c3760908..376eca84e 100644 --- a/src/Discord.Net.Commands/CommandService.cs +++ b/src/Discord.Net.Commands/CommandService.cs @@ -19,10 +19,13 @@ namespace Discord.Commands private readonly ConcurrentBag _moduleDefs; private readonly CommandMap _map; + internal readonly RunMode _defaultRunMode; + public IEnumerable Modules => _typedModuleDefs.Select(x => x.Value); public IEnumerable Commands => _typedModuleDefs.SelectMany(x => x.Value.Commands); - public CommandService() + public CommandService() : this(new CommandServiceConfig()) { } + public CommandService(CommandServiceConfig config) { _moduleLock = new SemaphoreSlim(1, 1); _typedModuleDefs = new ConcurrentDictionary(); @@ -64,6 +67,7 @@ namespace Discord.Commands [typeof(IGroupUser)] = new UserTypeReader(), [typeof(IGuildUser)] = new UserTypeReader(), }; + _defaultRunMode = config.DefaultRunMode; } //Modules diff --git a/src/Discord.Net.Commands/CommandServiceConfig.cs b/src/Discord.Net.Commands/CommandServiceConfig.cs new file mode 100644 index 000000000..97c98a54c --- /dev/null +++ b/src/Discord.Net.Commands/CommandServiceConfig.cs @@ -0,0 +1,8 @@ +namespace Discord.Commands +{ + public class CommandServiceConfig + { + /// The default RunMode commands should have, if one is not specified on the Command attribute or builder. + public RunMode DefaultRunMode { get; set; } = RunMode.Mixed; + } +} diff --git a/src/Discord.Net.Commands/Info/CommandInfo.cs b/src/Discord.Net.Commands/Info/CommandInfo.cs index 4d546b6fa..a9a3c2415 100644 --- a/src/Discord.Net.Commands/Info/CommandInfo.cs +++ b/src/Discord.Net.Commands/Info/CommandInfo.cs @@ -37,7 +37,7 @@ namespace Discord.Commands Summary = builder.Summary; Remarks = builder.Remarks; - RunMode = builder.RunMode; + RunMode = builder.RunMode ?? service._defaultRunMode; Priority = builder.Priority; if (module.Aliases.Count != 0) From 6519b300d9394b662d3306146e048fa24702d73f Mon Sep 17 00:00:00 2001 From: Christopher F Date: Fri, 25 Nov 2016 22:12:28 -0500 Subject: [PATCH 06/10] ModifyAsync will accept an EmbedBuilder **This is not a breaking change**. This change begins to implement #379, where IUserMessage.ModifyAsync will now accept a `Discord.ModifyMessageParams` func over a `Discord.API.Rest.ModifyMessageParams` func. --- src/Discord.Net.Core/API/DiscordRestApiClient.cs | 2 +- src/Discord.Net.Core/API/Rest/ModifyMessageParams.cs | 2 ++ .../Entities/Messages/IUserMessage.cs | 3 +-- .../Entities/Messages/ModifyMessageParams.cs | 12 ++++++++++++ .../Entities/Messages/MessageHelper.cs | 7 ++++++- 5 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Messages/ModifyMessageParams.cs diff --git a/src/Discord.Net.Core/API/DiscordRestApiClient.cs b/src/Discord.Net.Core/API/DiscordRestApiClient.cs index d050f12a4..e280c730f 100644 --- a/src/Discord.Net.Core/API/DiscordRestApiClient.cs +++ b/src/Discord.Net.Core/API/DiscordRestApiClient.cs @@ -498,7 +498,7 @@ namespace Discord.API break; } } - public async Task ModifyMessageAsync(ulong channelId, ulong messageId, ModifyMessageParams args, RequestOptions options = null) + public async Task ModifyMessageAsync(ulong channelId, ulong messageId, Rest.ModifyMessageParams args, RequestOptions options = null) { Preconditions.NotEqual(channelId, 0, nameof(channelId)); Preconditions.NotEqual(messageId, 0, nameof(messageId)); diff --git a/src/Discord.Net.Core/API/Rest/ModifyMessageParams.cs b/src/Discord.Net.Core/API/Rest/ModifyMessageParams.cs index 4901ddc9d..c87d82c51 100644 --- a/src/Discord.Net.Core/API/Rest/ModifyMessageParams.cs +++ b/src/Discord.Net.Core/API/Rest/ModifyMessageParams.cs @@ -8,5 +8,7 @@ namespace Discord.API.Rest { [JsonProperty("content")] public Optional Content { get; set; } + [JsonProperty("embed")] + public Optional Embed { get; set; } } } diff --git a/src/Discord.Net.Core/Entities/Messages/IUserMessage.cs b/src/Discord.Net.Core/Entities/Messages/IUserMessage.cs index a9dc4735c..c33b3e359 100644 --- a/src/Discord.Net.Core/Entities/Messages/IUserMessage.cs +++ b/src/Discord.Net.Core/Entities/Messages/IUserMessage.cs @@ -1,5 +1,4 @@ -using Discord.API.Rest; -using System; +using System; using System.Threading.Tasks; namespace Discord diff --git a/src/Discord.Net.Core/Entities/Messages/ModifyMessageParams.cs b/src/Discord.Net.Core/Entities/Messages/ModifyMessageParams.cs new file mode 100644 index 000000000..cc05e620a --- /dev/null +++ b/src/Discord.Net.Core/Entities/Messages/ModifyMessageParams.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Discord +{ + public class ModifyMessageParams + { + public Optional Content { get; set; } + public Optional Embed { get; set; } + } +} diff --git a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs index 358f6f5a9..91ca2ce1b 100644 --- a/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs +++ b/src/Discord.Net.Rest/Entities/Messages/MessageHelper.cs @@ -15,7 +15,12 @@ namespace Discord.Rest { var args = new ModifyMessageParams(); func(args); - return await client.ApiClient.ModifyMessageAsync(msg.Channel.Id, msg.Id, args, options).ConfigureAwait(false); + var apiArgs = new API.Rest.ModifyMessageParams + { + Content = args.Content, + Embed = args.Embed.IsSpecified ? args.Embed.Value.Build() : Optional.Create() + }; + return await client.ApiClient.ModifyMessageAsync(msg.Channel.Id, msg.Id, apiArgs, options).ConfigureAwait(false); } public static async Task DeleteAsync(IMessage msg, BaseDiscordClient client, RequestOptions options) From 1be6f77efb623878d085b1012adae0aeb06f06eb Mon Sep 17 00:00:00 2001 From: Christopher F Date: Sat, 26 Nov 2016 21:22:35 -0500 Subject: [PATCH 07/10] Don't check message content if an embed is present when modifying --- src/Discord.Net.Core/API/DiscordRestApiClient.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Discord.Net.Core/API/DiscordRestApiClient.cs b/src/Discord.Net.Core/API/DiscordRestApiClient.cs index e280c730f..6ec7c5fb2 100644 --- a/src/Discord.Net.Core/API/DiscordRestApiClient.cs +++ b/src/Discord.Net.Core/API/DiscordRestApiClient.cs @@ -505,7 +505,8 @@ namespace Discord.API Preconditions.NotNull(args, nameof(args)); if (args.Content.IsSpecified) { - Preconditions.NotNullOrEmpty(args.Content, nameof(args.Content)); + if (!args.Embed.IsSpecified) + Preconditions.NotNullOrEmpty(args.Content, nameof(args.Content)); if (args.Content.Value.Length > DiscordConfig.MaxMessageSize) throw new ArgumentOutOfRangeException($"Message content is too long, length must be less or equal to {DiscordConfig.MaxMessageSize}.", nameof(args.Content)); } From 210c360fca85268c4697c4c4669af904f0e298af Mon Sep 17 00:00:00 2001 From: Christopher F Date: Sat, 26 Nov 2016 21:32:21 -0500 Subject: [PATCH 08/10] Throw an exception when creating a Color with an invalid float value This prevents a 400 when sending a malformed color to Discord. --- src/Discord.Net.Core/Entities/Roles/Color.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Discord.Net.Core/Entities/Roles/Color.cs b/src/Discord.Net.Core/Entities/Roles/Color.cs index 563917959..d518d6edd 100644 --- a/src/Discord.Net.Core/Entities/Roles/Color.cs +++ b/src/Discord.Net.Core/Entities/Roles/Color.cs @@ -32,6 +32,12 @@ namespace Discord } public Color(float r, float g, float b) { + if (r <= 0.0f && r >= 1.0f) + throw new ArgumentOutOfRangeException(nameof(r), "A float value must be within [0,1]"); + if (g <= 0.0f || g >= 1.0f) + throw new ArgumentOutOfRangeException(nameof(g), "A float value must be within [0,1]"); + if (b <= 0.0f || b >= 1.0f) + throw new ArgumentOutOfRangeException(nameof(b), "A float value must be within [0,1]"); RawValue = ((uint)(r * 255.0f) << 16) | ((uint)(g * 255.0f) << 8) | From fb99b019a0c031fcb930394e32723df8d6793108 Mon Sep 17 00:00:00 2001 From: Christopher F Date: Sat, 26 Nov 2016 22:04:02 -0500 Subject: [PATCH 09/10] Fix issues with DefaultRunMode For a command to use the DefaultRunMode, it must now have it's RunMode set to RunMode.Default (this is the default value on CommandAttribute now). --- src/Discord.Net.Commands/Attributes/CommandAttribute.cs | 2 +- src/Discord.Net.Commands/Builders/CommandBuilder.cs | 2 +- src/Discord.Net.Commands/Info/CommandInfo.cs | 2 +- src/Discord.Net.Commands/RunMode.cs | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Commands/Attributes/CommandAttribute.cs b/src/Discord.Net.Commands/Attributes/CommandAttribute.cs index 86daf0103..5ae6092eb 100644 --- a/src/Discord.Net.Commands/Attributes/CommandAttribute.cs +++ b/src/Discord.Net.Commands/Attributes/CommandAttribute.cs @@ -6,7 +6,7 @@ namespace Discord.Commands public class CommandAttribute : Attribute { public string Text { get; } - public RunMode RunMode { get; set; } + public RunMode RunMode { get; set; } = RunMode.Default; public CommandAttribute() { diff --git a/src/Discord.Net.Commands/Builders/CommandBuilder.cs b/src/Discord.Net.Commands/Builders/CommandBuilder.cs index 25c0223e6..9b983fd1f 100644 --- a/src/Discord.Net.Commands/Builders/CommandBuilder.cs +++ b/src/Discord.Net.Commands/Builders/CommandBuilder.cs @@ -17,7 +17,7 @@ namespace Discord.Commands.Builders public string Name { get; set; } public string Summary { get; set; } public string Remarks { get; set; } - public RunMode? RunMode { get; set; } + public RunMode RunMode { get; set; } public int Priority { get; set; } public IReadOnlyList Preconditions => _preconditions; diff --git a/src/Discord.Net.Commands/Info/CommandInfo.cs b/src/Discord.Net.Commands/Info/CommandInfo.cs index a9a3c2415..24f262482 100644 --- a/src/Discord.Net.Commands/Info/CommandInfo.cs +++ b/src/Discord.Net.Commands/Info/CommandInfo.cs @@ -37,7 +37,7 @@ namespace Discord.Commands Summary = builder.Summary; Remarks = builder.Remarks; - RunMode = builder.RunMode ?? service._defaultRunMode; + RunMode = (builder.RunMode == RunMode.Default ? service._defaultRunMode : builder.RunMode); Priority = builder.Priority; if (module.Aliases.Count != 0) diff --git a/src/Discord.Net.Commands/RunMode.cs b/src/Discord.Net.Commands/RunMode.cs index 0799f825c..2bb5dbbf6 100644 --- a/src/Discord.Net.Commands/RunMode.cs +++ b/src/Discord.Net.Commands/RunMode.cs @@ -2,6 +2,7 @@ { public enum RunMode { + Default, Sync, Mixed, Async From 9d4339e6952b10c010ec9f2e2197cc8a78aaf803 Mon Sep 17 00:00:00 2001 From: Christopher F Date: Sat, 26 Nov 2016 22:13:43 -0500 Subject: [PATCH 10/10] Fix a few typos in Color constraint logic --- src/Discord.Net.Core/Entities/Roles/Color.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Roles/Color.cs b/src/Discord.Net.Core/Entities/Roles/Color.cs index d518d6edd..ead46fd8a 100644 --- a/src/Discord.Net.Core/Entities/Roles/Color.cs +++ b/src/Discord.Net.Core/Entities/Roles/Color.cs @@ -32,11 +32,11 @@ namespace Discord } public Color(float r, float g, float b) { - if (r <= 0.0f && r >= 1.0f) + if (r < 0.0f || r > 1.0f) throw new ArgumentOutOfRangeException(nameof(r), "A float value must be within [0,1]"); - if (g <= 0.0f || g >= 1.0f) + if (g < 0.0f || g > 1.0f) throw new ArgumentOutOfRangeException(nameof(g), "A float value must be within [0,1]"); - if (b <= 0.0f || b >= 1.0f) + if (b < 0.0f || b > 1.0f) throw new ArgumentOutOfRangeException(nameof(b), "A float value must be within [0,1]"); RawValue = ((uint)(r * 255.0f) << 16) |