From dc3456c2a25b34e2659e1791c3bedb4add6fbe58 Mon Sep 17 00:00:00 2001 From: Paulo Date: Fri, 31 Jul 2020 23:14:18 -0300 Subject: [PATCH] Add missing channel create/modify properties --- .../Channels/GuildChannelProperties.cs | 16 +++++ .../API/Rest/CreateGuildChannelParams.cs | 4 ++ .../Entities/Channels/ChannelHelper.cs | 23 +++++- .../Entities/Guilds/GuildHelper.cs | 70 +++++++++++++++++-- 4 files changed, 106 insertions(+), 7 deletions(-) diff --git a/src/Discord.Net.Core/Entities/Channels/GuildChannelProperties.cs b/src/Discord.Net.Core/Entities/Channels/GuildChannelProperties.cs index 9552b0a60..0b09ee5c8 100644 --- a/src/Discord.Net.Core/Entities/Channels/GuildChannelProperties.cs +++ b/src/Discord.Net.Core/Entities/Channels/GuildChannelProperties.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; + namespace Discord { /// @@ -30,5 +32,19 @@ namespace Discord /// is set. /// public Optional CategoryId { get; set; } + /// + /// Gets or sets the user permission overwrites for this channel. + /// + /// + /// The key needs to be a user snowflake identifier. + /// + public Optional>> UserOverwrites { get; set; } + /// + /// Gets or sets the role permission overwrites for this channel. + /// + /// + /// The key needs to be a role snowflake identifier. + /// + public Optional>> RoleOverwrites { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Rest/CreateGuildChannelParams.cs b/src/Discord.Net.Rest/API/Rest/CreateGuildChannelParams.cs index a102bd38d..aec43dbef 100644 --- a/src/Discord.Net.Rest/API/Rest/CreateGuildChannelParams.cs +++ b/src/Discord.Net.Rest/API/Rest/CreateGuildChannelParams.cs @@ -14,12 +14,16 @@ namespace Discord.API.Rest public Optional CategoryId { get; set; } [JsonProperty("position")] public Optional Position { get; set; } + [JsonProperty("permission_overwrites")] + public Optional Overwrites { get; set; } //Text channels [JsonProperty("topic")] public Optional Topic { get; set; } [JsonProperty("nsfw")] public Optional IsNsfw { get; set; } + [JsonProperty("rate_limit_per_user")] + public Optional SlowModeInterval { get; set; } //Voice channels [JsonProperty("bitrate")] diff --git a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs index 55b6f03a4..463bdba10 100644 --- a/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs +++ b/src/Discord.Net.Rest/Entities/Channels/ChannelHelper.cs @@ -38,6 +38,25 @@ namespace Discord.Rest { var args = new TextChannelProperties(); func(args); + + var overwrites = new List(); + if (args.UserOverwrites.IsSpecified) + overwrites.AddRange(args.UserOverwrites.Value.Select(x => new API.Overwrite() + { + TargetId = x.Key, + TargetType = PermissionTarget.User, + Allow = x.Value.AllowValue, + Deny = x.Value.DenyValue, + })); + if (args.RoleOverwrites.IsSpecified) + overwrites.AddRange(args.RoleOverwrites.Value.Select(x => new API.Overwrite() + { + TargetId = x.Key, + TargetType = PermissionTarget.Role, + Allow = x.Value.AllowValue, + Deny = x.Value.DenyValue, + })); + var apiArgs = new API.Rest.ModifyTextChannelParams { Name = args.Name, @@ -46,6 +65,7 @@ namespace Discord.Rest Topic = args.Topic, IsNsfw = args.IsNsfw, SlowModeInterval = args.SlowModeInterval, + Overwrites = overwrites.Count != 0 ? Optional.Create(overwrites.ToArray()) : Optional.Create(), }; return await client.ApiClient.ModifyGuildChannelAsync(channel.Id, apiArgs, options).ConfigureAwait(false); } @@ -413,7 +433,8 @@ namespace Discord.Rest var apiArgs = new ModifyGuildChannelParams { Overwrites = category.PermissionOverwrites - .Select(overwrite => new API.Overwrite{ + .Select(overwrite => new API.Overwrite + { TargetId = overwrite.TargetId, TargetType = overwrite.TargetType, Allow = overwrite.Permissions.AllowValue, diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index 675847b58..db85cda48 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -171,12 +171,32 @@ namespace Discord.Rest var props = new TextChannelProperties(); func?.Invoke(props); + var overwrites = new List(); + if (props.UserOverwrites.IsSpecified) + overwrites.AddRange(props.UserOverwrites.Value.Select(x => new API.Overwrite() + { + TargetId = x.Key, + TargetType = PermissionTarget.User, + Allow = x.Value.AllowValue, + Deny = x.Value.DenyValue, + })); + if (props.RoleOverwrites.IsSpecified) + overwrites.AddRange(props.RoleOverwrites.Value.Select(x => new API.Overwrite() + { + TargetId = x.Key, + TargetType = PermissionTarget.Role, + Allow = x.Value.AllowValue, + Deny = x.Value.DenyValue, + })); + var args = new CreateGuildChannelParams(name, ChannelType.Text) { CategoryId = props.CategoryId, Topic = props.Topic, IsNsfw = props.IsNsfw, - Position = props.Position + Position = props.Position, + SlowModeInterval = props.SlowModeInterval, + Overwrites = overwrites.Count != 0 ? Optional.Create(overwrites.ToArray()) : Optional.Create(), }; var model = await client.ApiClient.CreateGuildChannelAsync(guild.Id, args, options).ConfigureAwait(false); return RestTextChannel.Create(client, guild, model); @@ -190,12 +210,31 @@ namespace Discord.Rest var props = new VoiceChannelProperties(); func?.Invoke(props); + var overwrites = new List(); + if (props.UserOverwrites.IsSpecified) + overwrites.AddRange(props.UserOverwrites.Value.Select(x => new API.Overwrite() + { + TargetId = x.Key, + TargetType = PermissionTarget.User, + Allow = x.Value.AllowValue, + Deny = x.Value.DenyValue, + })); + if (props.RoleOverwrites.IsSpecified) + overwrites.AddRange(props.RoleOverwrites.Value.Select(x => new API.Overwrite() + { + TargetId = x.Key, + TargetType = PermissionTarget.Role, + Allow = x.Value.AllowValue, + Deny = x.Value.DenyValue, + })); + var args = new CreateGuildChannelParams(name, ChannelType.Voice) { CategoryId = props.CategoryId, Bitrate = props.Bitrate, UserLimit = props.UserLimit, - Position = props.Position + Position = props.Position, + Overwrites = overwrites.Count != 0 ? Optional.Create(overwrites.ToArray()) : Optional.Create(), }; var model = await client.ApiClient.CreateGuildChannelAsync(guild.Id, args, options).ConfigureAwait(false); return RestVoiceChannel.Create(client, guild, model); @@ -209,9 +248,28 @@ namespace Discord.Rest var props = new GuildChannelProperties(); func?.Invoke(props); + var overwrites = new List(); + if (props.UserOverwrites.IsSpecified) + overwrites.AddRange(props.UserOverwrites.Value.Select(x => new API.Overwrite() + { + TargetId = x.Key, + TargetType = PermissionTarget.User, + Allow = x.Value.AllowValue, + Deny = x.Value.DenyValue, + })); + if (props.RoleOverwrites.IsSpecified) + overwrites.AddRange(props.RoleOverwrites.Value.Select(x => new API.Overwrite() + { + TargetId = x.Key, + TargetType = PermissionTarget.Role, + Allow = x.Value.AllowValue, + Deny = x.Value.DenyValue, + })); + var args = new CreateGuildChannelParams(name, ChannelType.Category) { - Position = props.Position + Position = props.Position, + Overwrites = overwrites.Count != 0 ? Optional.Create(overwrites.ToArray()) : Optional.Create(), }; var model = await client.ApiClient.CreateGuildChannelAsync(guild.Id, args, options).ConfigureAwait(false); @@ -451,7 +509,7 @@ namespace Discord.Rest var emote = await client.ApiClient.GetGuildEmoteAsync(guild.Id, id, options).ConfigureAwait(false); return emote.ToEntity(); } - public static async Task CreateEmoteAsync(IGuild guild, BaseDiscordClient client, string name, Image image, Optional> roles, + public static async Task CreateEmoteAsync(IGuild guild, BaseDiscordClient client, string name, Image image, Optional> roles, RequestOptions options) { var apiargs = new CreateGuildEmoteParams @@ -466,7 +524,7 @@ namespace Discord.Rest return emote.ToEntity(); } /// is null. - public static async Task ModifyEmoteAsync(IGuild guild, BaseDiscordClient client, ulong id, Action func, + public static async Task ModifyEmoteAsync(IGuild guild, BaseDiscordClient client, ulong id, Action func, RequestOptions options) { if (func == null) throw new ArgumentNullException(paramName: nameof(func)); @@ -484,7 +542,7 @@ namespace Discord.Rest var emote = await client.ApiClient.ModifyGuildEmoteAsync(guild.Id, id, apiargs, options).ConfigureAwait(false); return emote.ToEntity(); } - public static Task DeleteEmoteAsync(IGuild guild, BaseDiscordClient client, ulong id, RequestOptions options) + public static Task DeleteEmoteAsync(IGuild guild, BaseDiscordClient client, ulong id, RequestOptions options) => client.ApiClient.DeleteGuildEmoteAsync(guild.Id, id, options); } }