This adds the following property to ITextChannel - SlowMode (int) The SlowMode field defines the time in seconds users must wait between sending messages; if zero, slow-mode is disabled. Bots are not affected by slow-mode, and as such, no changes need to be made to the REST client's internal ratelimiting. This is strictly a read/write cosmetic property for bots.tags/2.0
| @@ -13,6 +13,9 @@ namespace Discord | |||||
| /// <summary> Gets the current topic for this text channel. </summary> | /// <summary> Gets the current topic for this text channel. </summary> | ||||
| string Topic { get; } | string Topic { get; } | ||||
| ///<summary> Gets the current slow-mode delay for this channel. 0 if disabled. </summary> | |||||
| int SlowMode { get; } | |||||
| /// <summary> Bulk deletes multiple messages. </summary> | /// <summary> Bulk deletes multiple messages. </summary> | ||||
| Task DeleteMessagesAsync(IEnumerable<IMessage> messages, RequestOptions options = null); | Task DeleteMessagesAsync(IEnumerable<IMessage> messages, RequestOptions options = null); | ||||
| /// <summary> Bulk deletes multiple messages. </summary> | /// <summary> Bulk deletes multiple messages. </summary> | ||||
| @@ -1,4 +1,6 @@ | |||||
| namespace Discord | |||||
| using System; | |||||
| namespace Discord | |||||
| { | { | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public class TextChannelProperties : GuildChannelProperties | public class TextChannelProperties : GuildChannelProperties | ||||
| @@ -11,5 +13,15 @@ | |||||
| /// Should this channel be flagged as NSFW? | /// Should this channel be flagged as NSFW? | ||||
| /// </summary> | /// </summary> | ||||
| public Optional<bool> IsNsfw { get; set; } | public Optional<bool> IsNsfw { get; set; } | ||||
| /// <summary> | |||||
| /// What the slow-mode ratelimit for this channel should be set to; 0 will disable slow-mode. | |||||
| /// </summary> | |||||
| /// <remarks> | |||||
| /// This value must fall within [0, 120] | |||||
| /// | |||||
| /// Users with <see cref="ChannelPermission.ManageMessages"/> will be exempt from slow-mode. | |||||
| /// </remarks> | |||||
| /// <exception cref="ArgumentOutOfRangeException">Throws ArgummentOutOfRange if the value does not fall within [0, 120]</exception> | |||||
| public Optional<int> SlowMode { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -1,4 +1,4 @@ | |||||
| #pragma warning disable CS1591 | |||||
| #pragma warning disable CS1591 | |||||
| using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
| using System; | using System; | ||||
| @@ -33,6 +33,8 @@ namespace Discord.API | |||||
| public Optional<DateTimeOffset?> LastPinTimestamp { get; set; } | public Optional<DateTimeOffset?> LastPinTimestamp { get; set; } | ||||
| [JsonProperty("nsfw")] | [JsonProperty("nsfw")] | ||||
| public Optional<bool> Nsfw { get; set; } | public Optional<bool> Nsfw { get; set; } | ||||
| [JsonProperty("rate_limit_per_user")] | |||||
| public Optional<int> SlowMode { get; set; } | |||||
| //VoiceChannel | //VoiceChannel | ||||
| [JsonProperty("bitrate")] | [JsonProperty("bitrate")] | ||||
| @@ -1,4 +1,4 @@ | |||||
| #pragma warning disable CS1591 | |||||
| #pragma warning disable CS1591 | |||||
| using Newtonsoft.Json; | using Newtonsoft.Json; | ||||
| namespace Discord.API.Rest | namespace Discord.API.Rest | ||||
| @@ -10,5 +10,7 @@ namespace Discord.API.Rest | |||||
| public Optional<string> Topic { get; set; } | public Optional<string> Topic { get; set; } | ||||
| [JsonProperty("nsfw")] | [JsonProperty("nsfw")] | ||||
| public Optional<bool> IsNsfw { get; set; } | public Optional<bool> IsNsfw { get; set; } | ||||
| [JsonProperty("rate_limit_per_user")] | |||||
| public Optional<int> SlowMode { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -356,6 +356,8 @@ namespace Discord.API | |||||
| Preconditions.NotNull(args, nameof(args)); | Preconditions.NotNull(args, nameof(args)); | ||||
| Preconditions.AtLeast(args.Position, 0, nameof(args.Position)); | Preconditions.AtLeast(args.Position, 0, nameof(args.Position)); | ||||
| Preconditions.NotNullOrEmpty(args.Name, nameof(args.Name)); | Preconditions.NotNullOrEmpty(args.Name, nameof(args.Name)); | ||||
| Preconditions.AtLeast(args.SlowMode, 0, nameof(args.SlowMode)); | |||||
| Preconditions.AtMost(args.SlowMode, 120, nameof(args.SlowMode)); | |||||
| options = RequestOptions.CreateOrClone(options); | options = RequestOptions.CreateOrClone(options); | ||||
| var ids = new BucketIds(channelId: channelId); | var ids = new BucketIds(channelId: channelId); | ||||
| @@ -45,7 +45,8 @@ namespace Discord.Rest | |||||
| Position = args.Position, | Position = args.Position, | ||||
| CategoryId = args.CategoryId, | CategoryId = args.CategoryId, | ||||
| Topic = args.Topic, | Topic = args.Topic, | ||||
| IsNsfw = args.IsNsfw | |||||
| IsNsfw = args.IsNsfw, | |||||
| SlowMode = args.SlowMode, | |||||
| }; | }; | ||||
| return await client.ApiClient.ModifyGuildChannelAsync(channel.Id, apiArgs, options).ConfigureAwait(false); | return await client.ApiClient.ModifyGuildChannelAsync(channel.Id, apiArgs, options).ConfigureAwait(false); | ||||
| } | } | ||||
| @@ -12,6 +12,7 @@ namespace Discord.Rest | |||||
| public class RestTextChannel : RestGuildChannel, IRestMessageChannel, ITextChannel | public class RestTextChannel : RestGuildChannel, IRestMessageChannel, ITextChannel | ||||
| { | { | ||||
| public string Topic { get; private set; } | public string Topic { get; private set; } | ||||
| public int SlowMode { get; private set; } | |||||
| public ulong? CategoryId { get; private set; } | public ulong? CategoryId { get; private set; } | ||||
| public string Mention => MentionUtils.MentionChannel(Id); | public string Mention => MentionUtils.MentionChannel(Id); | ||||
| @@ -34,6 +35,7 @@ namespace Discord.Rest | |||||
| base.Update(model); | base.Update(model); | ||||
| CategoryId = model.CategoryId; | CategoryId = model.CategoryId; | ||||
| Topic = model.Topic.Value; | Topic = model.Topic.Value; | ||||
| SlowMode = model.SlowMode.Value; | |||||
| _nsfw = model.Nsfw.GetValueOrDefault(); | _nsfw = model.Nsfw.GetValueOrDefault(); | ||||
| } | } | ||||
| @@ -16,6 +16,7 @@ namespace Discord.WebSocket | |||||
| private readonly MessageCache _messages; | private readonly MessageCache _messages; | ||||
| public string Topic { get; private set; } | public string Topic { get; private set; } | ||||
| public int SlowMode { get; private set; } | |||||
| public ulong? CategoryId { get; private set; } | public ulong? CategoryId { get; private set; } | ||||
| public ICategoryChannel Category | public ICategoryChannel Category | ||||
| => CategoryId.HasValue ? Guild.GetChannel(CategoryId.Value) as ICategoryChannel : null; | => CategoryId.HasValue ? Guild.GetChannel(CategoryId.Value) as ICategoryChannel : null; | ||||
| @@ -47,6 +48,7 @@ namespace Discord.WebSocket | |||||
| base.Update(state, model); | base.Update(state, model); | ||||
| CategoryId = model.CategoryId; | CategoryId = model.CategoryId; | ||||
| Topic = model.Topic.Value; | Topic = model.Topic.Value; | ||||
| SlowMode = model.SlowMode.GetValueOrDefault(); // some guilds haven't been patched to include this yet? | |||||
| _nsfw = model.Nsfw.GetValueOrDefault(); | _nsfw = model.Nsfw.GetValueOrDefault(); | ||||
| } | } | ||||