diff --git a/src/Discord.Net/API/DiscordAPIClient.cs b/src/Discord.Net/API/DiscordAPIClient.cs index e7e11f1ca..78396697a 100644 --- a/src/Discord.Net/API/DiscordAPIClient.cs +++ b/src/Discord.Net/API/DiscordAPIClient.cs @@ -535,7 +535,7 @@ namespace Discord.API Preconditions.NotEqual(args.AFKChannelId, 0, nameof(args.AFKChannelId)); Preconditions.AtLeast(args.AFKTimeout, 0, nameof(args.AFKTimeout)); Preconditions.NotNullOrEmpty(args.Name, nameof(args.Name)); - Preconditions.NotNull(args.Owner, nameof(args.Owner)); + Preconditions.GreaterThan(args.OwnerId, 0, nameof(args.OwnerId)); Preconditions.NotNull(args.Region, nameof(args.Region)); Preconditions.AtLeast(args.VerificationLevel, 0, nameof(args.VerificationLevel)); @@ -831,7 +831,21 @@ namespace Discord.API int limit = args.Limit; ulong? relativeId = args.RelativeMessageId.IsSpecified ? args.RelativeMessageId.Value : (ulong?)null; - string relativeDir = args.RelativeDirection == Direction.After ? "after" : "before"; + string relativeDir; + + switch (args.RelativeDirection) + { + case Direction.Before: + default: + relativeDir = "before"; + break; + case Direction.After: + relativeDir = "after"; + break; + case Direction.Around: + relativeDir = "around"; + break; + } int runs = (limit + DiscordConfig.MaxMessagesPerBatch - 1) / DiscordConfig.MaxMessagesPerBatch; int lastRunCount = limit - (runs - 1) * DiscordConfig.MaxMessagesPerBatch; @@ -1079,7 +1093,7 @@ namespace Discord.API public async Task CreateDMChannelAsync(CreateDMChannelParams args, RequestOptions options = null) { Preconditions.NotNull(args, nameof(args)); - Preconditions.NotEqual(args.RecipientId, 0, nameof(args.RecipientId)); + Preconditions.GreaterThan(args.RecipientId, 0, nameof(args.Recipient)); return await SendAsync("POST", $"users/@me/channels", args, options: options).ConfigureAwait(false); } diff --git a/src/Discord.Net/API/Rest/CreateDMChannelParams.cs b/src/Discord.Net/API/Rest/CreateDMChannelParams.cs index 9ce033783..779fd5dc9 100644 --- a/src/Discord.Net/API/Rest/CreateDMChannelParams.cs +++ b/src/Discord.Net/API/Rest/CreateDMChannelParams.cs @@ -6,5 +6,7 @@ namespace Discord.API.Rest { [JsonProperty("recipient_id")] public ulong RecipientId { get; set; } + [JsonIgnore] + public IUser Recipient { set { RecipientId = value.Id; } } } } diff --git a/src/Discord.Net/API/Rest/DeleteMessagesParams.cs b/src/Discord.Net/API/Rest/DeleteMessagesParams.cs index 41c6512e4..1ea2fca2a 100644 --- a/src/Discord.Net/API/Rest/DeleteMessagesParams.cs +++ b/src/Discord.Net/API/Rest/DeleteMessagesParams.cs @@ -1,5 +1,6 @@ using Newtonsoft.Json; using System.Collections.Generic; +using System.Linq; namespace Discord.API.Rest { @@ -7,5 +8,7 @@ namespace Discord.API.Rest { [JsonProperty("messages")] public IEnumerable MessageIds { get; set; } + [JsonIgnore] + public IEnumerable Messages { set { MessageIds = value.Select(x => x.Id); } } } } diff --git a/src/Discord.Net/API/Rest/GetChannelMessagesParams.cs b/src/Discord.Net/API/Rest/GetChannelMessagesParams.cs index c14d1c65f..18107807e 100644 --- a/src/Discord.Net/API/Rest/GetChannelMessagesParams.cs +++ b/src/Discord.Net/API/Rest/GetChannelMessagesParams.cs @@ -6,5 +6,6 @@ public Direction RelativeDirection { get; set; } = Direction.Before; public Optional RelativeMessageId { get; set; } + public Optional RelativeMessage { set { RelativeMessageId = value.IsSpecified ? value.Value.Id : Optional.Create(); } } } } diff --git a/src/Discord.Net/API/Rest/ModifyGuildEmbedParams.cs b/src/Discord.Net/API/Rest/ModifyGuildEmbedParams.cs index f717b4d52..f8e8de1f1 100644 --- a/src/Discord.Net/API/Rest/ModifyGuildEmbedParams.cs +++ b/src/Discord.Net/API/Rest/ModifyGuildEmbedParams.cs @@ -1,5 +1,4 @@ -using Discord.Net.Converters; -using Newtonsoft.Json; +using Newtonsoft.Json; namespace Discord.API.Rest { @@ -7,7 +6,10 @@ namespace Discord.API.Rest { [JsonProperty("enabled")] public Optional Enabled { get; set; } + [JsonProperty("channel")] - public Optional Channel { get; set; } + public Optional ChannelId { get; set; } + [JsonIgnore] + public Optional Channel { set { ChannelId = value.IsSpecified ? value.Value.Id : Optional.Create(); } } } } diff --git a/src/Discord.Net/API/Rest/ModifyGuildMemberParams.cs b/src/Discord.Net/API/Rest/ModifyGuildMemberParams.cs index 0fbaa6d15..8a4077e90 100644 --- a/src/Discord.Net/API/Rest/ModifyGuildMemberParams.cs +++ b/src/Discord.Net/API/Rest/ModifyGuildMemberParams.cs @@ -1,18 +1,26 @@ using Newtonsoft.Json; +using System.Collections.Generic; +using System.Linq; namespace Discord.API.Rest { public class ModifyGuildMemberParams { - [JsonProperty("roles")] - public Optional Roles { get; set; } [JsonProperty("mute")] public Optional Mute { get; set; } [JsonProperty("deaf")] public Optional Deaf { get; set; } [JsonProperty("nick")] public Optional Nickname { get; set; } + + [JsonProperty("roles")] + public Optional> RoleIds { get; set; } + [JsonIgnore] + public Optional> Roles { set { RoleIds = value.IsSpecified ? Optional.Create(value.Value.Select(x => x.Id)) : Optional.Create>(); } } + [JsonProperty("channel_id")] - public Optional VoiceChannel { get; set; } + public Optional VoiceChannelId { get; set; } + [JsonIgnore] + public Optional VoiceChannel { set { VoiceChannelId = value.IsSpecified ? value.Value.Id : Optional.Create(); } } } } diff --git a/src/Discord.Net/API/Rest/ModifyGuildParams.cs b/src/Discord.Net/API/Rest/ModifyGuildParams.cs index 6e7ff2e34..d610ab37e 100644 --- a/src/Discord.Net/API/Rest/ModifyGuildParams.cs +++ b/src/Discord.Net/API/Rest/ModifyGuildParams.cs @@ -1,5 +1,4 @@ -using Discord.Net.Converters; -using Newtonsoft.Json; +using Newtonsoft.Json; using System.IO; namespace Discord.API.Rest @@ -12,15 +11,21 @@ namespace Discord.API.Rest public Optional Region { get; set; } [JsonProperty("verification_level")] public Optional VerificationLevel { get; set; } - [JsonProperty("afk_channel_id")] - public Optional AFKChannelId { get; set; } [JsonProperty("afk_timeout")] public Optional AFKTimeout { get; set; } [JsonProperty("icon"), Image] public Optional Icon { get; set; } - [JsonProperty("owner_id")] - public Optional Owner { get; set; } [JsonProperty("splash"), Image] public Optional Splash { get; set; } + + [JsonProperty("afk_channel_id")] + public Optional AFKChannelId { get; set; } + [JsonIgnore] + public Optional AFKChannel { set { OwnerId = value.IsSpecified ? value.Value.Id : Optional.Create(); } } + + [JsonProperty("owner_id")] + public Optional OwnerId { get; set; } + [JsonIgnore] + public Optional Owner { set { OwnerId = value.IsSpecified ? value.Value.Id : Optional.Create(); } } } } diff --git a/src/Discord.Net/Entities/Users/GuildUser.cs b/src/Discord.Net/Entities/Users/GuildUser.cs index 3778f98b3..0d4784417 100644 --- a/src/Discord.Net/Entities/Users/GuildUser.cs +++ b/src/Discord.Net/Entities/Users/GuildUser.cs @@ -124,7 +124,7 @@ namespace Discord args.Nickname = new Optional(); //Remove } - if (!isCurrentUser || args.Deaf.IsSpecified || args.Mute.IsSpecified || args.Roles.IsSpecified) + if (!isCurrentUser || args.Deaf.IsSpecified || args.Mute.IsSpecified || args.RoleIds.IsSpecified) { await Discord.ApiClient.ModifyGuildMemberAsync(Guild.Id, Id, args).ConfigureAwait(false); if (args.Deaf.IsSpecified) @@ -133,8 +133,8 @@ namespace Discord IsMute = args.Mute.Value; if (args.Nickname.IsSpecified) Nickname = args.Nickname.Value ?? ""; - if (args.Roles.IsSpecified) - Roles = args.Roles.Value.Select(x => Guild.GetRole(x)).Where(x => x != null).ToImmutableArray(); + if (args.RoleIds.IsSpecified) + Roles = args.RoleIds.Value.Select(x => Guild.GetRole(x)).Where(x => x != null).ToImmutableArray(); } } public async Task KickAsync() @@ -153,7 +153,7 @@ namespace Discord public async Task CreateDMChannelAsync() { - var args = new CreateDMChannelParams { RecipientId = Id }; + var args = new CreateDMChannelParams { Recipient = this }; var model = await Discord.ApiClient.CreateDMChannelAsync(args).ConfigureAwait(false); return new DMChannel(Discord, User, model); diff --git a/src/Discord.Net/Net/Converters/DirectionConverter.cs b/src/Discord.Net/Net/Converters/DirectionConverter.cs deleted file mode 100644 index 899bd880c..000000000 --- a/src/Discord.Net/Net/Converters/DirectionConverter.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Newtonsoft.Json; -using System; - -namespace Discord.Net.Converters -{ - public class DirectionConverter : JsonConverter - { - public static readonly DirectionConverter Instance = new DirectionConverter(); - - public override bool CanConvert(Type objectType) => true; - public override bool CanRead => true; - public override bool CanWrite => true; - - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) - { - switch ((string)reader.Value) - { - case "before": - return Direction.Before; - case "after": - return Direction.After; - case "around": - return Direction.Around; - default: - throw new JsonSerializationException("Unknown direction"); - } - } - - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - switch ((Direction)value) - { - case Direction.Before: - writer.WriteValue("before"); - break; - case Direction.After: - writer.WriteValue("after"); - break; - case Direction.Around: - writer.WriteValue("around"); - break; - default: - throw new JsonSerializationException("Invalid direction"); - } - } - } -} diff --git a/src/Discord.Net/Net/Converters/DiscordContractResolver.cs b/src/Discord.Net/Net/Converters/DiscordContractResolver.cs index 99d75879f..f92de2a1c 100644 --- a/src/Discord.Net/Net/Converters/DiscordContractResolver.cs +++ b/src/Discord.Net/Net/Converters/DiscordContractResolver.cs @@ -77,8 +77,6 @@ namespace Discord.Net.Converters return PermissionTargetConverter.Instance; if (type == typeof(UserStatus)) return UserStatusConverter.Instance; - if (type == typeof(Direction)) - return DirectionConverter.Instance; //Special if (type == typeof(Stream) && propInfo.GetCustomAttribute() != null) diff --git a/src/Discord.Net/Utilities/Optional.cs b/src/Discord.Net/Utilities/Optional.cs index 8512b28bc..e2d55cf7f 100644 --- a/src/Discord.Net/Utilities/Optional.cs +++ b/src/Discord.Net/Utilities/Optional.cs @@ -7,6 +7,7 @@ namespace Discord [DebuggerDisplay(@"{DebuggerDisplay,nq}")] public struct Optional { + public static Optional Unspecified => default(Optional); private readonly T _value; /// Gets the value for this paramter. @@ -28,7 +29,7 @@ namespace Discord _value = value; IsSpecified = true; } - + public T GetValueOrDefault() => _value; public T GetValueOrDefault(T defaultValue) => IsSpecified ? _value : defaultValue; @@ -46,4 +47,9 @@ namespace Discord public static implicit operator Optional(T value) => new Optional(value); public static explicit operator T(Optional value) => value.Value; } + public static class Optional + { + public static Optional Create() => Optional.Unspecified; + public static Optional Create(T value) => new Optional(value); + } }