@@ -761,6 +761,18 @@ namespace Discord | |||||
/// </returns> | /// </returns> | ||||
Task<ICategoryChannel> CreateCategoryAsync(string name, Action<GuildChannelProperties> func = null, RequestOptions options = null); | Task<ICategoryChannel> CreateCategoryAsync(string name, Action<GuildChannelProperties> func = null, RequestOptions options = null); | ||||
/// <summary> | |||||
/// Creates a new channel forum in this guild. | |||||
/// </summary> | |||||
/// <param name="name">The new name for the forum.</param> | |||||
/// <param name="func">The delegate containing the properties to be applied to the channel upon its creation.</param> | |||||
/// <param name="options">The options to be used when sending the request.</param> | |||||
/// <returns> | |||||
/// A task that represents the asynchronous creation operation. The task result contains the newly created | |||||
/// forum channel. | |||||
/// </returns> | |||||
Task<IForumChannel> CreateForumChannelAsync(string name, Action<ForumChannelProperties> func = null, RequestOptions options = null); | |||||
/// <summary> | /// <summary> | ||||
/// Gets a collection of all the voice regions this guild can access. | /// Gets a collection of all the voice regions this guild can access. | ||||
/// </summary> | /// </summary> | ||||
@@ -23,6 +23,8 @@ namespace Discord.API.Rest | |||||
public Optional<bool> IsNsfw { get; set; } | public Optional<bool> IsNsfw { get; set; } | ||||
[JsonProperty("rate_limit_per_user")] | [JsonProperty("rate_limit_per_user")] | ||||
public Optional<int> SlowModeInterval { get; set; } | public Optional<int> SlowModeInterval { get; set; } | ||||
[JsonProperty("default_auto_archive_duration")] | |||||
public Optional<ThreadArchiveDuration> DefaultAutoArchiveDuration { get; set; } | |||||
//Voice channels | //Voice channels | ||||
[JsonProperty("bitrate")] | [JsonProperty("bitrate")] | ||||
@@ -30,6 +32,14 @@ namespace Discord.API.Rest | |||||
[JsonProperty("user_limit")] | [JsonProperty("user_limit")] | ||||
public Optional<int?> UserLimit { get; set; } | public Optional<int?> UserLimit { get; set; } | ||||
//Forum channels | |||||
[JsonProperty("default_reaction_emoji")] | |||||
public Optional<ModifyForumReactionEmojiParams> DefaultReactionEmoji { get; set; } | |||||
[JsonProperty("default_thread_rate_limit_per_user")] | |||||
public Optional<int> ThreadRateLimitPerUser { get; set; } | |||||
[JsonProperty("available_tags")] | |||||
public Optional<ModifyForumTagParams[]> AvailableTags { get; set; } | |||||
public CreateGuildChannelParams(string name, ChannelType type) | public CreateGuildChannelParams(string name, ChannelType type) | ||||
{ | { | ||||
Name = name; | Name = name; | ||||
@@ -1,3 +1,4 @@ | |||||
using Discord.API; | |||||
using Discord.API.Rest; | using Discord.API.Rest; | ||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
@@ -252,6 +253,7 @@ namespace Discord.Rest | |||||
Deny = overwrite.Permissions.DenyValue.ToString() | Deny = overwrite.Permissions.DenyValue.ToString() | ||||
}).ToArray() | }).ToArray() | ||||
: Optional.Create<API.Overwrite[]>(), | : Optional.Create<API.Overwrite[]>(), | ||||
DefaultAutoArchiveDuration = props.AutoArchiveDuration | |||||
}; | }; | ||||
var model = await client.ApiClient.CreateGuildChannelAsync(guild.Id, args, options).ConfigureAwait(false); | var model = await client.ApiClient.CreateGuildChannelAsync(guild.Id, args, options).ConfigureAwait(false); | ||||
return RestTextChannel.Create(client, guild, model); | return RestTextChannel.Create(client, guild, model); | ||||
@@ -338,6 +340,62 @@ namespace Discord.Rest | |||||
var model = await client.ApiClient.CreateGuildChannelAsync(guild.Id, args, options).ConfigureAwait(false); | var model = await client.ApiClient.CreateGuildChannelAsync(guild.Id, args, options).ConfigureAwait(false); | ||||
return RestCategoryChannel.Create(client, guild, model); | return RestCategoryChannel.Create(client, guild, model); | ||||
} | } | ||||
/// <exception cref="ArgumentNullException"><paramref name="name"/> is <c>null</c>.</exception> | |||||
public static async Task<RestForumChannel> CreateForumChannelAsync(IGuild guild, BaseDiscordClient client, | |||||
string name, RequestOptions options, Action<ForumChannelProperties> func = null) | |||||
{ | |||||
if (name == null) | |||||
throw new ArgumentNullException(paramName: nameof(name)); | |||||
var props = new ForumChannelProperties(); | |||||
func?.Invoke(props); | |||||
var args = new CreateGuildChannelParams(name, ChannelType.Forum) | |||||
{ | |||||
Position = props.Position, | |||||
Overwrites = props.PermissionOverwrites.IsSpecified | |||||
? props.PermissionOverwrites.Value.Select(overwrite => new API.Overwrite | |||||
{ | |||||
TargetId = overwrite.TargetId, | |||||
TargetType = overwrite.TargetType, | |||||
Allow = overwrite.Permissions.AllowValue.ToString(), | |||||
Deny = overwrite.Permissions.DenyValue.ToString() | |||||
}).ToArray() | |||||
: Optional.Create<API.Overwrite[]>(), | |||||
SlowModeInterval = props.ThreadCreationInterval, | |||||
AvailableTags = props.Tags.GetValueOrDefault().Select( | |||||
x => new ModifyForumTagParams | |||||
{ | |||||
Id = x.Id, | |||||
Name = x.Name, | |||||
EmojiId = x.Emoji is Emote emote | |||||
? emote.Id | |||||
: Optional<ulong?>.Unspecified, | |||||
EmojiName = x.Emoji is Emoji emoji | |||||
? emoji.Name | |||||
: Optional<string>.Unspecified, | |||||
Moderated = x.IsModerated | |||||
}).ToArray(), | |||||
DefaultReactionEmoji = props.DefaultReactionEmoji.IsSpecified | |||||
? new API.ModifyForumReactionEmojiParams | |||||
{ | |||||
EmojiId = props.DefaultReactionEmoji.Value is Emote emote ? | |||||
emote.Id : Optional<ulong?>.Unspecified, | |||||
EmojiName = props.DefaultReactionEmoji.Value is Emoji emoji ? | |||||
emoji.Name : Optional<string>.Unspecified | |||||
} | |||||
: Optional<ModifyForumReactionEmojiParams>.Unspecified, | |||||
ThreadRateLimitPerUser = props.DefaultSlowModeInterval, | |||||
CategoryId = props.CategoryId, | |||||
IsNsfw = props.IsNsfw, | |||||
Topic = props.Topic, | |||||
DefaultAutoArchiveDuration = props.AutoArchiveDuration | |||||
}; | |||||
var model = await client.ApiClient.CreateGuildChannelAsync(guild.Id, args, options).ConfigureAwait(false); | |||||
return RestForumChannel.Create(client, guild, model); | |||||
} | |||||
#endregion | #endregion | ||||
#region Voice Regions | #region Voice Regions | ||||
@@ -710,6 +710,19 @@ namespace Discord.Rest | |||||
public Task<RestCategoryChannel> CreateCategoryChannelAsync(string name, Action<GuildChannelProperties> func = null, RequestOptions options = null) | public Task<RestCategoryChannel> CreateCategoryChannelAsync(string name, Action<GuildChannelProperties> func = null, RequestOptions options = null) | ||||
=> GuildHelper.CreateCategoryChannelAsync(this, Discord, name, options, func); | => GuildHelper.CreateCategoryChannelAsync(this, Discord, name, options, func); | ||||
/// <summary> | |||||
/// Creates a category channel with the provided name. | |||||
/// </summary> | |||||
/// <param name="name">The name of the new channel.</param> | |||||
/// <param name="func">The delegate containing the properties to be applied to the channel upon its creation.</param> | |||||
/// <param name="options">The options to be used when sending the request.</param> | |||||
/// <exception cref="ArgumentNullException"><paramref name="name" /> is <see langword="null"/>.</exception> | |||||
/// <returns> | |||||
/// The created category channel. | |||||
/// </returns> | |||||
public Task<RestForumChannel> CreateForumChannelAsync(string name, Action<ForumChannelProperties> func = null, RequestOptions options = null) | |||||
=> GuildHelper.CreateForumChannelAsync(this, Discord, name, options, func); | |||||
/// <summary> | /// <summary> | ||||
/// Gets a collection of all the voice regions this guild can access. | /// Gets a collection of all the voice regions this guild can access. | ||||
/// </summary> | /// </summary> | ||||
@@ -1370,6 +1383,9 @@ namespace Discord.Rest | |||||
/// <inheritdoc /> | /// <inheritdoc /> | ||||
async Task<ICategoryChannel> IGuild.CreateCategoryAsync(string name, Action<GuildChannelProperties> func, RequestOptions options) | async Task<ICategoryChannel> IGuild.CreateCategoryAsync(string name, Action<GuildChannelProperties> func, RequestOptions options) | ||||
=> await CreateCategoryChannelAsync(name, func, options).ConfigureAwait(false); | => await CreateCategoryChannelAsync(name, func, options).ConfigureAwait(false); | ||||
/// <inheritdoc /> | |||||
async Task<IForumChannel> IGuild.CreateForumChannelAsync(string name, Action<ForumChannelProperties> func, RequestOptions options) | |||||
=> await CreateForumChannelAsync(name, func, options).ConfigureAwait(false); | |||||
/// <inheritdoc /> | /// <inheritdoc /> | ||||
async Task<IReadOnlyCollection<IVoiceRegion>> IGuild.GetVoiceRegionsAsync(RequestOptions options) | async Task<IReadOnlyCollection<IVoiceRegion>> IGuild.GetVoiceRegionsAsync(RequestOptions options) | ||||
@@ -790,6 +790,7 @@ namespace Discord.WebSocket | |||||
/// </returns> | /// </returns> | ||||
public Task<RestStageChannel> CreateStageChannelAsync(string name, Action<VoiceChannelProperties> func = null, RequestOptions options = null) | public Task<RestStageChannel> CreateStageChannelAsync(string name, Action<VoiceChannelProperties> func = null, RequestOptions options = null) | ||||
=> GuildHelper.CreateStageChannelAsync(this, Discord, name, options, func); | => GuildHelper.CreateStageChannelAsync(this, Discord, name, options, func); | ||||
/// <summary> | /// <summary> | ||||
/// Creates a new channel category in this guild. | /// Creates a new channel category in this guild. | ||||
/// </summary> | /// </summary> | ||||
@@ -801,9 +802,24 @@ namespace Discord.WebSocket | |||||
/// A task that represents the asynchronous creation operation. The task result contains the newly created | /// A task that represents the asynchronous creation operation. The task result contains the newly created | ||||
/// category channel. | /// category channel. | ||||
/// </returns> | /// </returns> | ||||
public Task<RestCategoryChannel> CreateCategoryChannelAsync(string name, Action<GuildChannelProperties> func = null, RequestOptions options = null) | |||||
public Task<RestCategoryChannel> CreateCategoryChannelAsync(string name, | |||||
Action<GuildChannelProperties> func = null, RequestOptions options = null) | |||||
=> GuildHelper.CreateCategoryChannelAsync(this, Discord, name, options, func); | => GuildHelper.CreateCategoryChannelAsync(this, Discord, name, options, func); | ||||
/// <summary> | |||||
/// Creates a new channel forum in this guild. | |||||
/// </summary> | |||||
/// <param name="name">The new name for the forum.</param> | |||||
/// <param name="func">The delegate containing the properties to be applied to the channel upon its creation.</param> | |||||
/// <param name="options">The options to be used when sending the request.</param> | |||||
/// <exception cref="ArgumentNullException"><paramref name="name"/> is <see langword="null"/>.</exception> | |||||
/// <returns> | |||||
/// A task that represents the asynchronous creation operation. The task result contains the newly created | |||||
/// forum channel. | |||||
/// </returns> | |||||
public Task<RestForumChannel> CreateForumChannelAsync(string name, Action<ForumChannelProperties> func = null, RequestOptions options = null) | |||||
=> GuildHelper.CreateForumChannelAsync(this, Discord, name, options, func); | |||||
internal SocketGuildChannel AddChannel(ClientState state, ChannelModel model) | internal SocketGuildChannel AddChannel(ClientState state, ChannelModel model) | ||||
{ | { | ||||
var channel = SocketGuildChannel.Create(this, state, model); | var channel = SocketGuildChannel.Create(this, state, model); | ||||
@@ -1897,6 +1913,9 @@ namespace Discord.WebSocket | |||||
/// <inheritdoc /> | /// <inheritdoc /> | ||||
async Task<ICategoryChannel> IGuild.CreateCategoryAsync(string name, Action<GuildChannelProperties> func, RequestOptions options) | async Task<ICategoryChannel> IGuild.CreateCategoryAsync(string name, Action<GuildChannelProperties> func, RequestOptions options) | ||||
=> await CreateCategoryChannelAsync(name, func, options).ConfigureAwait(false); | => await CreateCategoryChannelAsync(name, func, options).ConfigureAwait(false); | ||||
/// <inheritdoc /> | |||||
async Task<IForumChannel> IGuild.CreateForumChannelAsync(string name, Action<ForumChannelProperties> func, RequestOptions options) | |||||
=> await CreateForumChannelAsync(name, func, options).ConfigureAwait(false); | |||||
/// <inheritdoc /> | /// <inheritdoc /> | ||||
async Task<IReadOnlyCollection<IVoiceRegion>> IGuild.GetVoiceRegionsAsync(RequestOptions options) | async Task<IReadOnlyCollection<IVoiceRegion>> IGuild.GetVoiceRegionsAsync(RequestOptions options) | ||||