Browse Source

add createForumChannelAsync to guild

pull/2469/head
Misha133 2 years ago
parent
commit
5195b980b1
5 changed files with 116 additions and 1 deletions
  1. +12
    -0
      src/Discord.Net.Core/Entities/Guilds/IGuild.cs
  2. +10
    -0
      src/Discord.Net.Rest/API/Rest/CreateGuildChannelParams.cs
  3. +58
    -0
      src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs
  4. +16
    -0
      src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs
  5. +20
    -1
      src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs

+ 12
- 0
src/Discord.Net.Core/Entities/Guilds/IGuild.cs View File

@@ -761,6 +761,18 @@ namespace Discord
/// </returns>
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>
/// Gets a collection of all the voice regions this guild can access.
/// </summary>


+ 10
- 0
src/Discord.Net.Rest/API/Rest/CreateGuildChannelParams.cs View File

@@ -23,6 +23,8 @@ namespace Discord.API.Rest
public Optional<bool> IsNsfw { get; set; }
[JsonProperty("rate_limit_per_user")]
public Optional<int> SlowModeInterval { get; set; }
[JsonProperty("default_auto_archive_duration")]
public Optional<ThreadArchiveDuration> DefaultAutoArchiveDuration { get; set; }

//Voice channels
[JsonProperty("bitrate")]
@@ -30,6 +32,14 @@ namespace Discord.API.Rest
[JsonProperty("user_limit")]
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)
{
Name = name;


+ 58
- 0
src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs View File

@@ -1,3 +1,4 @@
using Discord.API;
using Discord.API.Rest;
using System;
using System.Collections.Generic;
@@ -252,6 +253,7 @@ namespace Discord.Rest
Deny = overwrite.Permissions.DenyValue.ToString()
}).ToArray()
: Optional.Create<API.Overwrite[]>(),
DefaultAutoArchiveDuration = props.AutoArchiveDuration
};
var model = await client.ApiClient.CreateGuildChannelAsync(guild.Id, args, options).ConfigureAwait(false);
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);
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

#region Voice Regions


+ 16
- 0
src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs View File

@@ -710,6 +710,19 @@ namespace Discord.Rest
public Task<RestCategoryChannel> CreateCategoryChannelAsync(string name, Action<GuildChannelProperties> func = null, RequestOptions options = null)
=> 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>
/// Gets a collection of all the voice regions this guild can access.
/// </summary>
@@ -1370,6 +1383,9 @@ namespace Discord.Rest
/// <inheritdoc />
async Task<ICategoryChannel> IGuild.CreateCategoryAsync(string name, Action<GuildChannelProperties> func, RequestOptions options)
=> 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 />
async Task<IReadOnlyCollection<IVoiceRegion>> IGuild.GetVoiceRegionsAsync(RequestOptions options)


+ 20
- 1
src/Discord.Net.WebSocket/Entities/Guilds/SocketGuild.cs View File

@@ -790,6 +790,7 @@ namespace Discord.WebSocket
/// </returns>
public Task<RestStageChannel> CreateStageChannelAsync(string name, Action<VoiceChannelProperties> func = null, RequestOptions options = null)
=> GuildHelper.CreateStageChannelAsync(this, Discord, name, options, func);

/// <summary>
/// Creates a new channel category in this guild.
/// </summary>
@@ -801,9 +802,24 @@ namespace Discord.WebSocket
/// A task that represents the asynchronous creation operation. The task result contains the newly created
/// category channel.
/// </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);

/// <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)
{
var channel = SocketGuildChannel.Create(this, state, model);
@@ -1897,6 +1913,9 @@ namespace Discord.WebSocket
/// <inheritdoc />
async Task<ICategoryChannel> IGuild.CreateCategoryAsync(string name, Action<GuildChannelProperties> func, RequestOptions options)
=> 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 />
async Task<IReadOnlyCollection<IVoiceRegion>> IGuild.GetVoiceRegionsAsync(RequestOptions options)


Loading…
Cancel
Save