Browse Source

General cleanup (#223)

* General cleanup

* Add Async suffix to SendAutocompleteResult

* Fix more formatting

* Fix unused RequestOptions in GetActiveThreadsAsync

* Add message to ArgumentNullException
pull/1923/head
d4n GitHub 3 years ago
parent
commit
1cf5c8f57e
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
100 changed files with 410 additions and 956 deletions
  1. +0
    -3
      src/Discord.Net.Core/Entities/Channels/IStageChannel.cs
  2. +5
    -8
      src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs
  3. +0
    -6
      src/Discord.Net.Core/Entities/Channels/StageInstanceProperties.cs
  4. +10
    -7
      src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs
  5. +3
    -9
      src/Discord.Net.Core/Entities/Channels/ThreadArchiveDuration.cs
  6. +1
    -7
      src/Discord.Net.Core/Entities/Channels/ThreadType.cs
  7. +8
    -13
      src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs
  8. +7
    -16
      src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs
  9. +2
    -8
      src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs
  10. +0
    -6
      src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs
  11. +0
    -6
      src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs
  12. +0
    -6
      src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs
  13. +17
    -25
      src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs
  14. +5
    -16
      src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs
  15. +0
    -6
      src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandProperties.cs
  16. +4
    -15
      src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs
  17. +0
    -6
      src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandProperties.cs
  18. +1
    -3
      src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs
  19. +0
    -4
      src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs
  20. +0
    -5
      src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs
  21. +3
    -7
      src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs
  22. +0
    -7
      src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs
  23. +5
    -8
      src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs
  24. +1
    -7
      src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs
  25. +4
    -8
      src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs
  26. +1
    -7
      src/Discord.Net.Core/Entities/Interactions/InteractionType.cs
  27. +3
    -9
      src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs
  28. +2
    -9
      src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs
  29. +0
    -6
      src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonStyle.cs
  30. +56
    -102
      src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs
  31. +5
    -11
      src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs
  32. +0
    -6
      src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs
  33. +0
    -4
      src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs
  34. +0
    -3
      src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs
  35. +0
    -6
      src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs
  36. +58
    -90
      src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs
  37. +0
    -4
      src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs
  38. +16
    -6
      src/Discord.Net.Core/Entities/Messages/StickerFormatType.cs
  39. +4
    -13
      src/Discord.Net.Core/Entities/Messages/TimestampTag.cs
  40. +0
    -6
      src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs
  41. +1
    -7
      src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissionTarget.cs
  42. +0
    -4
      src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs
  43. +0
    -3
      src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs
  44. +2
    -4
      src/Discord.Net.Core/Entities/Stickers/ISticker.cs
  45. +0
    -6
      src/Discord.Net.Core/Entities/Stickers/IStickerItem.cs
  46. +1
    -5
      src/Discord.Net.Core/Entities/Stickers/StickerPack.cs
  47. +0
    -4
      src/Discord.Net.Core/Entities/Stickers/StickerProperties.cs
  48. +2
    -8
      src/Discord.Net.Core/Entities/Stickers/StickerType.cs
  49. +0
    -4
      src/Discord.Net.Core/Net/ApplicationCommandException.cs
  50. +11
    -11
      src/Discord.Net.Core/Utils/UrlValidation.cs
  51. +1
    -6
      src/Discord.Net.Rest/API/Common/ActionRowComponent.cs
  52. +0
    -5
      src/Discord.Net.Rest/API/Common/ApplicationCommand.cs
  53. +0
    -2
      src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs
  54. +0
    -1
      src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs
  55. +17
    -35
      src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs
  56. +0
    -5
      src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs
  57. +0
    -5
      src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs
  58. +0
    -5
      src/Discord.Net.Rest/API/Common/AutocompleteInteractionData.cs
  59. +0
    -5
      src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs
  60. +3
    -8
      src/Discord.Net.Rest/API/Common/ButtonComponent.cs
  61. +0
    -5
      src/Discord.Net.Rest/API/Common/ChannelThreads.cs
  62. +1
    -6
      src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs
  63. +0
    -5
      src/Discord.Net.Rest/API/Common/Interaction.cs
  64. +3
    -3
      src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs
  65. +0
    -5
      src/Discord.Net.Rest/API/Common/InteractionResponse.cs
  66. +0
    -5
      src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs
  67. +0
    -4
      src/Discord.Net.Rest/API/Common/NitroStickerPacks.cs
  68. +0
    -4
      src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs
  69. +4
    -9
      src/Discord.Net.Rest/API/Common/SelectMenuOption.cs
  70. +0
    -5
      src/Discord.Net.Rest/API/Common/StageInstance.cs
  71. +1
    -1
      src/Discord.Net.Rest/API/Common/Sticker.cs
  72. +0
    -5
      src/Discord.Net.Rest/API/Common/StickerItem.cs
  73. +0
    -5
      src/Discord.Net.Rest/API/Common/StickerPack.cs
  74. +1
    -5
      src/Discord.Net.Rest/API/Common/ThreadMember.cs
  75. +0
    -4
      src/Discord.Net.Rest/API/Common/ThreadMetadata.cs
  76. +1
    -7
      src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs
  77. +0
    -5
      src/Discord.Net.Rest/API/Rest/CreateStageInstanceParams.cs
  78. +1
    -7
      src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs
  79. +0
    -5
      src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs
  80. +0
    -5
      src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs
  81. +0
    -5
      src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissionsParams.cs
  82. +1
    -6
      src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs
  83. +0
    -6
      src/Discord.Net.Rest/API/Rest/ModifyStageInstanceParams.cs
  84. +0
    -5
      src/Discord.Net.Rest/API/Rest/ModifyStickerParams.cs
  85. +0
    -6
      src/Discord.Net.Rest/API/Rest/ModifyThreadParams.cs
  86. +0
    -5
      src/Discord.Net.Rest/API/Rest/StartThreadParams.cs
  87. +15
    -15
      src/Discord.Net.Rest/ClientHelper.cs
  88. +1
    -2
      src/Discord.Net.Rest/DiscordRestApiClient.cs
  89. +7
    -7
      src/Discord.Net.Rest/DiscordRestClient.cs
  90. +3
    -9
      src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInfo.cs
  91. +0
    -5
      src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs
  92. +0
    -5
      src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs
  93. +0
    -4
      src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs
  94. +11
    -16
      src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs
  95. +16
    -23
      src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs
  96. +8
    -10
      src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs
  97. +4
    -4
      src/Discord.Net.Rest/Entities/Guilds/RestGuild.cs
  98. +67
    -76
      src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs
  99. +6
    -15
      src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs
  100. +0
    -5
      src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs

+ 0
- 3
src/Discord.Net.Core/Entities/Channels/IStageChannel.cs View File

@@ -1,7 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord


+ 5
- 8
src/Discord.Net.Core/Entities/Channels/IThreadChannel.cs View File

@@ -1,7 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
@@ -9,7 +6,7 @@ namespace Discord
/// <summary>
/// Represents a thread channel inside of a guild.
/// </summary>
public interface IThreadChannel : ITextChannel, IGuildChannel
public interface IThreadChannel : ITextChannel
{
/// <summary>
/// Gets the type of the current thread channel.
@@ -56,7 +53,7 @@ namespace Discord
/// </summary>
/// <param name="options">The options to be used when sending the request.</param>
/// <returns>
/// A task that represents the asynchronous join operation.
/// A task that represents the asynchronous join operation.
/// </returns>
Task JoinAsync(RequestOptions options = null);

@@ -65,7 +62,7 @@ namespace Discord
/// </summary>
/// <param name="options">The options to be used when sending the request.</param>
/// <returns>
/// A task that represents the asynchronous leave operation.
/// A task that represents the asynchronous leave operation.
/// </returns>
Task LeaveAsync(RequestOptions options = null);

@@ -75,7 +72,7 @@ namespace Discord
/// <param name="user">The <see cref="IGuildUser"/> to add.</param>
/// <param name="options">The options to be used when sending the request.</param>
/// <returns>
/// A task that represents the asynchronous operation of adding a member to a thread.
/// A task that represents the asynchronous operation of adding a member to a thread.
/// </returns>
Task AddUserAsync(IGuildUser user, RequestOptions options = null);

@@ -85,7 +82,7 @@ namespace Discord
/// <param name="user">The <see cref="IGuildUser"/> to remove from this thread.</param>
/// <param name="options">The options to be used when sending the request.</param>
/// <returns>
/// A task that represents the asynchronous operation of removing a user from this thread.
/// A task that represents the asynchronous operation of removing a user from this thread.
/// </returns>
Task RemoveUserAsync(IGuildUser user, RequestOptions options = null);
}


+ 0
- 6
src/Discord.Net.Core/Entities/Channels/StageInstanceProperties.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>


+ 10
- 7
src/Discord.Net.Core/Entities/Channels/StagePrivacyLevel.cs View File

@@ -1,14 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>
/// Specifies the privacy levels of a Stage instance.
/// </summary>
public enum StagePrivacyLevel
{
/// <summary>
/// The Stage instance is visible publicly, such as on Stage Discovery.
/// </summary>
Public = 1,
GuildOnly = 2,
/// <summary>
/// The Stage instance is visible to only guild members.
/// </summary>
GuildOnly = 2
}
}

+ 3
- 9
src/Discord.Net.Core/Entities/Channels/ThreadArchiveDuration.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>
@@ -24,7 +18,7 @@ namespace Discord
/// <summary>
/// Three days (4320 minutes).
/// <remarks>
/// This option is explicity avaliable to nitro users.
/// This option is explicitly available to nitro users.
/// </remarks>
/// </summary>
ThreeDays = 4320,
@@ -32,9 +26,9 @@ namespace Discord
/// <summary>
/// One week (10080 minutes).
/// <remarks>
/// This option is explicity avaliable to nitro users.
/// This option is explicitly available to nitro users.
/// </remarks>
/// </summary>
OneWeek = 10080,
OneWeek = 10080
}
}

+ 1
- 7
src/Discord.Net.Core/Entities/Channels/ThreadType.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>
@@ -24,6 +18,6 @@ namespace Discord
/// <summary>
/// Represents a temporary sub-channel within a GUILD_TEXT channel that is only viewable by those invited and those with the MANAGE_THREADS permission
/// </summary>
PrivateThread = 12,
PrivateThread = 12
}
}

+ 8
- 13
src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOption.cs View File

@@ -1,9 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Discord
{
@@ -24,13 +21,13 @@ namespace Discord
set
{
if (value == null)
throw new ArgumentNullException($"{nameof(Name)} cannot be null!");
throw new ArgumentNullException(nameof(value), $"{nameof(Name)} cannot be null.");

if (value.Length > 32)
throw new ArgumentException($"{nameof(Name)} length must be less than or equal to 32");
throw new ArgumentOutOfRangeException(nameof(value), "Name length must be less than or equal to 32.");

if (!Regex.IsMatch(value, @"^[\w-]{1,32}$"))
throw new ArgumentException($"{nameof(Name)} must match the regex ^[\\w-]{{1,32}}$");
throw new FormatException($"{nameof(value)} must match the regex ^[\\w-]{{1,32}}$");

_name = value;
}
@@ -42,14 +39,12 @@ namespace Discord
public string Description
{
get => _description;
set
set => _description = value?.Length switch
{
if (value?.Length > 100)
throw new ArgumentException("Description length must be less than or equal to 100");
if (value?.Length < 1)
throw new ArgumentException("Description length must at least 1 character in length");
_description = value;
}
> 100 => throw new ArgumentOutOfRangeException(nameof(value), "Description length must be less than or equal to 100."),
0 => throw new ArgumentOutOfRangeException(nameof(value), "Description length must be at least 1."),
_ => value
};
}

/// <summary>


+ 7
- 16
src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionChoice.cs View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
@@ -19,14 +15,12 @@ namespace Discord
public string Name
{
get => _name;
set
set => _name = value?.Length switch
{
if(value?.Length > 100)
throw new ArgumentException("Name length must be less than or equal to 100");
if (value?.Length < 1)
throw new ArgumentException("Name length must at least 1 character in length");
_name = value;
}
> 100 => throw new ArgumentOutOfRangeException(nameof(value), "Name length must be less than or equal to 100."),
0 => throw new ArgumentOutOfRangeException(nameof(value), "Name length must at least 1."),
_ => value
};
}

/// <summary>
@@ -40,11 +34,8 @@ namespace Discord
get => _value;
set
{
if(value != null)
{
if(!(value is int) && !(value is string))
throw new ArgumentException("The value of a choice must be a string or int!");
}
if (value != null && value is not int && value is not string)
throw new ArgumentException("The value of a choice must be a string or int!");
_value = value;
}
}


+ 2
- 8
src/Discord.Net.Core/Entities/Interactions/ApplicationCommandOptionType.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>
@@ -37,7 +31,7 @@ namespace Discord
Boolean = 5,

/// <summary>
/// A <see cref="IGuildUser"/>.
/// A <see cref="IUser"/>.
/// </summary>
User = 6,

@@ -55,7 +49,7 @@ namespace Discord
/// A <see cref="IUser"/> or <see cref="IRole"/>.
/// </summary>
Mentionable = 9,
/// <summary>
/// A <see cref="double"/>.
/// </summary>


+ 0
- 6
src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>


+ 0
- 6
src/Discord.Net.Core/Entities/Interactions/ApplicationCommandTypes.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>


+ 0
- 6
src/Discord.Net.Core/Entities/Interactions/AutocompleteOption.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>


+ 17
- 25
src/Discord.Net.Core/Entities/Interactions/AutocompleteResult.cs View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
@@ -11,8 +7,8 @@ namespace Discord
/// </summary>
public class AutocompleteResult
{
private object _value { get; set; }
private string _name { get; set; }
private object _value;
private string _name;

/// <summary>
/// Gets or sets the name of the result.
@@ -28,12 +24,13 @@ namespace Discord
set
{
if (value == null)
throw new ArgumentException("Name cannot be null!");
if (value.Length > 100)
throw new ArgumentException("Name length must be less than or equal to 100 characters in length!");
if (value.Length < 1)
throw new ArgumentException("Name length must at least 1 character in length!");
_name = value;
throw new ArgumentNullException(nameof(value), $"{nameof(Name)} cannot be null.");
_name = value.Length switch
{
> 100 => throw new ArgumentOutOfRangeException(nameof(value), "Name length must be less than or equal to 100."),
0 => throw new ArgumentOutOfRangeException(nameof(value), "Name length must be at least 1."),
_ => value
};
}
}

@@ -48,20 +45,15 @@ namespace Discord
public object Value
{
get => _value;
set
set => _value = value switch
{
if (value == null)
throw new ArgumentNullException("Value cannot be null");

_value = value switch
{
string str => str,
int integer => integer,
long lng => lng,
double number => number,
_ => throw new ArgumentException($"Type {value.GetType().Name} cannot be set as a value! Only string, int, and double allowed!"),
};
}
string str => str,
int integer => integer,
long lng => lng,
double number => number,
null => throw new ArgumentNullException(nameof(value), $"{nameof(Value)} cannot be null."),
_ => throw new ArgumentException($"Type {value.GetType().Name} cannot be set as a value! Only string, int, and double allowed!")
};
}

/// <summary>


+ 5
- 16
src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandBuilder.cs View File

@@ -1,10 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>
@@ -12,7 +5,7 @@ namespace Discord
/// </summary>
public class MessageCommandBuilder
{
/// <summary>
/// <summary>
/// Returns the maximum length a commands name allowed by Discord
/// </summary>
public const int MaxNameLength = 32;
@@ -22,10 +15,7 @@ namespace Discord
/// </summary>
public string Name
{
get
{
return _name;
}
get => _name;
set
{
Preconditions.NotNullOrEmpty(value, nameof(Name));
@@ -41,7 +31,7 @@ namespace Discord
/// </summary>
public bool IsDefaultPermission { get; set; } = true;

private string _name { get; set; }
private string _name;

/// <summary>
/// Build the current builder into a <see cref="MessageCommandProperties"/> class.
@@ -51,14 +41,13 @@ namespace Discord
/// </returns>
public MessageCommandProperties Build()
{
MessageCommandProperties props = new MessageCommandProperties()
var props = new MessageCommandProperties
{
Name = Name,
DefaultPermission = IsDefaultPermission
};

return props;

}

/// <summary>
@@ -79,7 +68,7 @@ namespace Discord
/// </summary>
/// <param name="isDefaultPermission">The default permission value to set.</param>
/// <returns>The current builder.</returns>
public MessageCommandBuilder WithDefaultPermission (bool isDefaultPermission)
public MessageCommandBuilder WithDefaultPermission(bool isDefaultPermission)
{
IsDefaultPermission = isDefaultPermission;
return this;


+ 0
- 6
src/Discord.Net.Core/Entities/Interactions/Context Menus/MessageCommandProperties.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>


+ 4
- 15
src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandBuilder.cs View File

@@ -1,10 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>
@@ -22,10 +15,7 @@ namespace Discord
/// </summary>
public string Name
{
get
{
return _name;
}
get => _name;
set
{
Preconditions.NotNullOrEmpty(value, nameof(Name));
@@ -41,7 +31,7 @@ namespace Discord
/// </summary>
public bool IsDefaultPermission { get; set; } = true;

private string _name { get; set; }
private string _name;

/// <summary>
/// Build the current builder into a <see cref="UserCommandProperties"/> class.
@@ -49,14 +39,13 @@ namespace Discord
/// <returns>A <see cref="UserCommandProperties"/> that can be used to create user commands.</returns>
public UserCommandProperties Build()
{
UserCommandProperties props = new UserCommandProperties()
var props = new UserCommandProperties
{
Name = Name,
DefaultPermission = IsDefaultPermission
};

return props;

}

/// <summary>
@@ -77,7 +66,7 @@ namespace Discord
/// </summary>
/// <param name="isDefaultPermission">The default permission value to set.</param>
/// <returns>The current builder.</returns>
public UserCommandBuilder WithDefaultPermission (bool isDefaultPermission)
public UserCommandBuilder WithDefaultPermission(bool isDefaultPermission)
{
IsDefaultPermission = isDefaultPermission;
return this;


+ 0
- 6
src/Discord.Net.Core/Entities/Interactions/Context Menus/UserCommandProperties.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>


+ 1
- 3
src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs View File

@@ -1,7 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
@@ -17,7 +15,7 @@ namespace Discord
ulong ApplicationId { get; }

/// <summary>
/// The type of the command
/// The type of the command.
/// </summary>
ApplicationCommandType Type { get; }



+ 0
- 4
src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionData.cs View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{


+ 0
- 5
src/Discord.Net.Core/Entities/Interactions/IApplicationCommandInteractionDataOption.cs View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
@@ -33,6 +29,5 @@ namespace Discord
/// Present if this option is a group or subcommand.
/// </summary>
IReadOnlyCollection<IApplicationCommandInteractionDataOption> Options { get; }

}
}

+ 3
- 7
src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOption.cs View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
@@ -39,16 +35,16 @@ namespace Discord
/// <summary>
/// Choices for string and int types for the user to pick from.
/// </summary>
IReadOnlyCollection<IApplicationCommandOptionChoice>? Choices { get; }
IReadOnlyCollection<IApplicationCommandOptionChoice> Choices { get; }

/// <summary>
/// If the option is a subcommand or subcommand group type, this nested options will be the parameters.
/// </summary>
IReadOnlyCollection<IApplicationCommandOption>? Options { get; }
IReadOnlyCollection<IApplicationCommandOption> Options { get; }

/// <summary>
/// The allowed channel types for this option.
/// </summary>
IReadOnlyCollection<ChannelType>? ChannelTypes { get; }
IReadOnlyCollection<ChannelType> ChannelTypes { get; }
}
}

+ 0
- 7
src/Discord.Net.Core/Entities/Interactions/IApplicationCommandOptionChoice.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>
@@ -20,6 +14,5 @@ namespace Discord
/// value of the choice.
/// </summary>
object Value { get; }

}
}

+ 5
- 8
src/Discord.Net.Core/Entities/Interactions/IDiscordInteraction.cs View File

@@ -1,7 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
@@ -51,7 +48,7 @@ namespace Discord
/// <param name="options">The request options for this response.</param>
/// <param name="component">A <see cref="MessageComponent"/> to be sent with this response.</param>
/// <param name="embed">A single embed to send with this response. If this is passed alongside an array of embeds, the single embed will be ignored.</param>
Task RespondAsync (string text = null, Embed[] embeds = null, bool isTTS = false,
Task RespondAsync(string text = null, Embed[] embeds = null, bool isTTS = false,
bool ephemeral = false, AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null);

/// <summary>
@@ -68,7 +65,7 @@ namespace Discord
/// <returns>
/// The sent message.
/// </returns>
Task<IUserMessage> FollowupAsync (string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false,
Task<IUserMessage> FollowupAsync(string text = null, Embed[] embeds = null, bool isTTS = false, bool ephemeral = false,
AllowedMentions allowedMentions = null, RequestOptions options = null, MessageComponent component = null, Embed embed = null);

/// <summary>
@@ -76,7 +73,7 @@ namespace Discord
/// </summary>
/// <param name="options">The request options for this <see langword="async"/> request.</param>
/// <returns>A <see cref="IUserMessage"/> that represents the initial response.</returns>
Task<IUserMessage> GetOriginalResponseAsync (RequestOptions options = null);
Task<IUserMessage> GetOriginalResponseAsync(RequestOptions options = null);

/// <summary>
/// Edits original response for this interaction.
@@ -84,7 +81,7 @@ namespace Discord
/// <param name="func">A delegate containing the properties to modify the message with.</param>
/// <param name="options">The request options for this <see langword="async"/> request.</param>
/// <returns>A <see cref="IUserMessage"/> that represents the initial response.</returns>
Task<IUserMessage> ModifyOriginalResponseAsync (Action<MessageProperties> func, RequestOptions options = null);
Task<IUserMessage> ModifyOriginalResponseAsync(Action<MessageProperties> func, RequestOptions options = null);

/// <summary>
/// Acknowledges this interaction.
@@ -92,6 +89,6 @@ namespace Discord
/// <returns>
/// A task that represents the asynchronous operation of acknowledging the interaction.
/// </returns>
Task DeferAsync (bool ephemeral = false, RequestOptions options = null);
Task DeferAsync(bool ephemeral = false, RequestOptions options = null);
}
}

+ 1
- 7
src/Discord.Net.Core/Entities/Interactions/IDiscordInteractionData.cs View File

@@ -1,13 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>
/// Represents an interface used to specify classes that they are a vaild data type of a <see cref="IDiscordInteraction"/> class.
/// Represents an interface used to specify classes that they are a valid data type of a <see cref="IDiscordInteraction"/> class.
/// </summary>
public interface IDiscordInteractionData { }
}

+ 4
- 8
src/Discord.Net.Core/Entities/Interactions/InteractionResponseType.cs View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
@@ -13,7 +9,7 @@ namespace Discord
/// After receiving an interaction, you must respond to acknowledge it. You can choose to respond with a message immediately using <see cref="ChannelMessageWithSource"/>
/// or you can choose to send a deferred response with <see cref="DeferredChannelMessageWithSource"/>. If choosing a deferred response, the user will see a loading state for the interaction,
/// and you'll have up to 15 minutes to edit the original deferred response using Edit Original Interaction Response.
/// You can read more about Response types <see href="https://discord.com/developers/docs/interactions/slash-commands#interaction-response">Here</see>
/// You can read more about Response types <see href="https://discord.com/developers/docs/interactions/slash-commands#interaction-response">Here</see>.
/// </remarks>
public enum InteractionResponseType : byte
{
@@ -45,17 +41,17 @@ namespace Discord
DeferredChannelMessageWithSource = 5,

/// <summary>
/// For components: ACK an interaction and edit the original message later; the user does not see a loading state
/// For components: ACK an interaction and edit the original message later; the user does not see a loading state.
/// </summary>
DeferredUpdateMessage = 6,

/// <summary>
/// For components: edit the message the component was attached to
/// For components: edit the message the component was attached to.
/// </summary>
UpdateMessage = 7,

/// <summary>
/// Respond with a set of choices to a autocomplete interaction
/// Respond with a set of choices to a autocomplete interaction.
/// </summary>
ApplicationCommandAutocompleteResult = 8
}


+ 1
- 7
src/Discord.Net.Core/Entities/Interactions/InteractionType.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>
@@ -29,6 +23,6 @@ namespace Discord
/// <summary>
/// An autocomplete request sent from discord.
/// </summary>
ApplicationCommandAutocomplete = 4,
ApplicationCommandAutocomplete = 4
}
}

+ 3
- 9
src/Discord.Net.Core/Entities/Interactions/Message Components/ActionRowComponent.cs View File

@@ -1,28 +1,22 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>
/// Represents a <see cref="IMessageComponent"/> Row for child components to live in.
/// Represents a <see cref="IMessageComponent"/> Row for child components to live in.
/// </summary>
public class ActionRowComponent : IMessageComponent
{
/// <inheritdoc/>
public ComponentType Type { get; } = ComponentType.ActionRow;
public ComponentType Type => ComponentType.ActionRow;

/// <summary>
/// Gets the child components in this row.
/// </summary>
public IReadOnlyCollection<IMessageComponent> Components { get; internal set; }


internal ActionRowComponent() { }

internal ActionRowComponent(List<IMessageComponent> components)
{
Components = components;


+ 2
- 9
src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonComponent.cs View File

@@ -1,10 +1,3 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>
@@ -13,7 +6,7 @@ namespace Discord
public class ButtonComponent : IMessageComponent
{
/// <inheritdoc/>
public ComponentType Type { get; } = ComponentType.Button;
public ComponentType Type => ComponentType.Button;

/// <summary>
/// Gets the <see cref="ButtonStyle"/> of this button, example buttons with each style can be found <see href="https://discord.com/assets/7bb017ce52cfd6575e21c058feb3883b.png">Here</see>.
@@ -34,7 +27,7 @@ namespace Discord
public string CustomId { get; }

/// <summary>
/// Gets the URL for a <see cref="ButtonStyle.Link"/> button.
/// Gets the URL for a <see cref="ButtonStyle.Link"/> button.
/// </summary>
/// <remarks>
/// You cannot have a button with a <b>URL</b> and a <b>CustomId</b>.


+ 0
- 6
src/Discord.Net.Core/Entities/Interactions/Message Components/ButtonStyle.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>


+ 56
- 102
src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentBuilder.cs View File

@@ -31,14 +31,14 @@ namespace Discord
set
{
if (value == null)
throw new ArgumentNullException(paramName: nameof(ActionRows), message: "Cannot set an component builder's components collection to null.");
throw new ArgumentNullException(nameof(value), $"{nameof(ActionRows)} cannot be null.");
if (value.Count > MaxActionRowCount)
throw new ArgumentException(message: $"Action row count must be less than or equal to {MaxActionRowCount}.", paramName: nameof(ActionRows));
throw new ArgumentOutOfRangeException(nameof(value), $"Action row count must be less than or equal to {MaxActionRowCount}.");
_actionRows = value;
}
}

private List<ActionRowBuilder> _actionRows { get; set; }
private List<ActionRowBuilder> _actionRows;

/// <summary>
/// Creates a new builder from a message.
@@ -56,7 +56,7 @@ namespace Discord
public static ComponentBuilder FromComponents(IReadOnlyCollection<IMessageComponent> components)
{
var builder = new ComponentBuilder();
for(int i = 0; i != components.Count; i++)
for (int i = 0; i != components.Count; i++)
{
var component = components.ElementAt(i);
builder.AddComponent(component, i);
@@ -118,7 +118,7 @@ namespace Discord
public ComponentBuilder WithSelectMenu(SelectMenuBuilder menu, int row = 0)
{
Preconditions.LessThan(row, MaxActionRowCount, nameof(row));
if (menu.Options.Distinct().Count() != menu.Options.Count())
if (menu.Options.Distinct().Count() != menu.Options.Count)
throw new InvalidOperationException("Please make sure that there is no duplicates values.");

var builtMenu = menu.Build();
@@ -218,7 +218,7 @@ namespace Discord
else
{
ActionRowBuilder actionRow;
if(_actionRows.Count > row)
if (_actionRows.Count > row)
actionRow = _actionRows.ElementAt(row);
else
{
@@ -244,10 +244,9 @@ namespace Discord
/// <returns>A <see cref="MessageComponent"/> that can be sent with <see cref="IMessageChannel.SendMessageAsync"/>.</returns>
public MessageComponent Build()
{
if (_actionRows != null)
return new MessageComponent(_actionRows.Select(x => x.Build()).ToList());
else
return MessageComponent.Empty;
return _actionRows != null
? new MessageComponent(_actionRows.Select(x => x.Build()).ToList())
: MessageComponent.Empty;
}
}

@@ -272,19 +271,18 @@ namespace Discord
set
{
if (value == null)
throw new ArgumentNullException(message: "Action row components cannot be null!", paramName: nameof(Components));

if (value.Count <= 0)
throw new ArgumentException(message: "There must be at least 1 component in a row", paramName: nameof(Components));

if (value.Count > MaxChildCount)
throw new ArgumentException(message: $"Action row can only contain {MaxChildCount} child components!", paramName: nameof(Components));
throw new ArgumentNullException(nameof(value), $"{nameof(Components)} cannot be null.");

_components = value;
_components = value.Count switch
{
0 => throw new ArgumentOutOfRangeException(nameof(value), "There must be at least 1 component in a row."),
> MaxChildCount => throw new ArgumentOutOfRangeException(nameof(value), $"Action row can only contain {MaxChildCount} child components!"),
_ => value
};
}
}

private List<IMessageComponent> _components { get; set; } = new List<IMessageComponent>();
private List<IMessageComponent> _components = new List<IMessageComponent>();

/// <summary>
/// Adds a list of components to the current row.
@@ -359,18 +357,12 @@ namespace Discord
public string Label
{
get => _label;
set
set => _label = value?.Length switch
{
if (value != null)
{
if (value.Length > MaxButtonLabelLength)
throw new ArgumentException($"Button label must be {MaxButtonLabelLength} characters or less!", paramName: nameof(Label));
if (value.Length < 1)
throw new ArgumentException("Button label must be 1 character or more!", paramName: nameof(Label));
}

_label = value;
}
> MaxButtonLabelLength => throw new ArgumentOutOfRangeException(nameof(value), $"Label length must be less or equal to {MaxButtonLabelLength}."),
0 => throw new ArgumentOutOfRangeException(nameof(value), "Label length must be at least 1."),
_ => value
};
}

/// <summary>
@@ -381,17 +373,12 @@ namespace Discord
public string CustomId
{
get => _customId;
set
set => _customId = value?.Length switch
{
if (value != null)
{
if (value.Length > ComponentBuilder.MaxCustomIdLength)
throw new ArgumentException($"Custom Id must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(CustomId));
if (value.Length < 1)
throw new ArgumentException("Custom Id must be 1 character or more!", paramName: nameof(CustomId));
}
_customId = value;
}
> ComponentBuilder.MaxCustomIdLength => throw new ArgumentOutOfRangeException(nameof(value), $"Custom Id length must be less or equal to {ComponentBuilder.MaxCustomIdLength}."),
0 => throw new ArgumentOutOfRangeException(nameof(value), "Custom Id length must be at least 1."),
_ => value
};
}

/// <summary>
@@ -414,7 +401,6 @@ namespace Discord
/// </summary>
public bool IsDisabled { get; set; }


private string _label;
private string _customId;

@@ -594,8 +580,7 @@ namespace Discord
{
if (string.IsNullOrEmpty(Url))
throw new InvalidOperationException("Link buttons must have a link associated with them");
else
UrlValidation.ValidateButton(Url);
UrlValidation.ValidateButton(Url);
}
else if (string.IsNullOrEmpty(CustomId))
throw new InvalidOperationException("Non-link buttons must have a custom id associated with them");
@@ -632,17 +617,12 @@ namespace Discord
public string CustomId
{
get => _customId;
set
set => _customId = value?.Length switch
{
if (value != null)
{
if (value.Length > ComponentBuilder.MaxCustomIdLength)
throw new ArgumentException($"Custom Id must be {ComponentBuilder.MaxCustomIdLength} characters or less!", paramName: nameof(CustomId));
if (value.Length < 1)
throw new ArgumentException("Custom Id must be 1 character or more!", paramName: nameof(CustomId));
}
_customId = value;
}
> ComponentBuilder.MaxCustomIdLength => throw new ArgumentOutOfRangeException(nameof(value), $"Custom Id length must be less or equal to {ComponentBuilder.MaxCustomIdLength}."),
0 => throw new ArgumentOutOfRangeException(nameof(value), "Custom Id length must be at least 1."),
_ => value
};
}

/// <summary>
@@ -653,18 +633,12 @@ namespace Discord
public string Placeholder
{
get => _placeholder;
set
set => _placeholder = value?.Length switch
{
if (value != null)
{
if (value.Length > MaxPlaceholderLength)
throw new ArgumentException($"The placeholder must be {MaxPlaceholderLength} characters or less!", paramName: nameof(Placeholder));
if (value.Length < 1)
throw new ArgumentException("The placeholder must be 1 character or more!", paramName: nameof(Placeholder));
}

_placeholder = value;
}
> MaxPlaceholderLength => throw new ArgumentOutOfRangeException(nameof(value), $"Placeholder length must be less or equal to {MaxPlaceholderLength}."),
0 => throw new ArgumentOutOfRangeException(nameof(value), "Placeholder length must be at least 1."),
_ => value
};
}

/// <summary>
@@ -708,7 +682,7 @@ namespace Discord
if (value != null)
Preconditions.LessThan(value.Count, MaxOptionCount, nameof(Options));
else
throw new ArgumentNullException(nameof(value));
throw new ArgumentNullException(nameof(value), $"{nameof(Options)} cannot be null.");

_options = value;
}
@@ -908,7 +882,7 @@ namespace Discord
/// The maximum length of a <see cref="SelectMenuOption.Description"/>.
/// </summary>
public const int MaxDescriptionLength = 100;
/// <summary>
/// The maximum length of a <see cref="SelectMenuOption.Value"/>.
/// </summary>
@@ -922,42 +896,28 @@ namespace Discord
public string Label
{
get => _label;
set
set => _label = value?.Length switch
{
if (value != null)
{
if (value.Length > MaxSelectLabelLength)
throw new ArgumentException($"Select option label must be {MaxSelectLabelLength} characters or less!", paramName: nameof(Label));
if (value.Length < 1)
throw new ArgumentException("Select option label must be 1 character or more!", paramName: nameof(Label));
}

_label = value;
}
> MaxSelectLabelLength => throw new ArgumentOutOfRangeException(nameof(value), $"Label length must be less or equal to {MaxSelectLabelLength}."),
0 => throw new ArgumentOutOfRangeException(nameof(value), "Label length must be at least 1."),
_ => value
};
}

/// <summary>
/// Gets or sets the custom id of the current select menu.
/// Gets or sets the value of the current select menu.
/// </summary>
/// <exception cref="ArgumentException" accessor="set"><see cref="Value"/> length exceeds <see cref="MaxSelectValueLength"/>.</exception>
/// <exception cref="ArgumentException" accessor="set"><see cref="Value"/> length subceeds 1.</exception>
public string Value
{
get => _value;
set
set => _value = value?.Length switch
{
if (value != null)
{
if (value.Length > MaxSelectValueLength)
throw new ArgumentException($"Select option value must be {MaxSelectValueLength} characters or less!", paramName: nameof(Label));
if (value.Length < 1)
throw new ArgumentException("Select option value must be 1 character or more!", paramName: nameof(Label));
}
else
throw new ArgumentException("Select option value must not be null or empty!", paramName: nameof(Label));

_value = value;
}
> MaxSelectValueLength => throw new ArgumentOutOfRangeException(nameof(value), $"Value length must be less or equal to {MaxSelectValueLength}."),
0 => throw new ArgumentOutOfRangeException(nameof(value), "Value length must be at least 1."),
_ => value
};
}

/// <summary>
@@ -968,18 +928,12 @@ namespace Discord
public string Description
{
get => _description;
set
set => _description = value?.Length switch
{
if (value != null)
{
if (value.Length > MaxDescriptionLength)
throw new ArgumentException($"The description must be {MaxDescriptionLength} characters or less!", paramName: nameof(Label));
if (value.Length < 1)
throw new ArgumentException("The description must be 1 character or more!", paramName: nameof(Label));
}

_description = value;
}
> MaxDescriptionLength => throw new ArgumentOutOfRangeException(nameof(value), $"Description length must be less or equal to {MaxDescriptionLength}."),
0 => throw new ArgumentOutOfRangeException(nameof(value), "Description length must be at least 1."),
_ => value
};
}

/// <summary>


+ 5
- 11
src/Discord.Net.Core/Entities/Interactions/Message Components/ComponentType.cs View File

@@ -1,29 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>
/// Represents a type of a component
/// Represents a type of a component.
/// </summary>
public enum ComponentType
{
/// <summary>
/// A container for other components
/// A container for other components.
/// </summary>
ActionRow = 1,

/// <summary>
/// A clickable button
/// A clickable button.
/// </summary>
Button = 2,

/// <summary>
/// A select menu for picking from choices
/// A select menu for picking from choices.
/// </summary>
SelectMenu = 3,
SelectMenu = 3
}
}

+ 0
- 6
src/Discord.Net.Core/Entities/Interactions/Message Components/IMessageComponent.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>


+ 0
- 4
src/Discord.Net.Core/Entities/Interactions/Message Components/MessageComponent.cs View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{


+ 0
- 3
src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuComponent.cs View File

@@ -1,8 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{


+ 0
- 6
src/Discord.Net.Core/Entities/Interactions/Message Components/SelectMenuOption.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>


+ 58
- 90
src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandBuilder.cs View File

@@ -1,9 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Discord
{
@@ -30,20 +28,17 @@ namespace Discord
/// </summary>
public string Name
{
get
{
return _name;
}
get => _name;
set
{
Preconditions.NotNullOrEmpty(value, nameof(Name));
Preconditions.AtLeast(value.Length, 1, nameof(Name));
Preconditions.AtMost(value.Length, MaxNameLength, nameof(Name));
Preconditions.NotNullOrEmpty(value, nameof(value));
Preconditions.AtLeast(value.Length, 1, nameof(value));
Preconditions.AtMost(value.Length, MaxNameLength, nameof(value));

// Discord updated the docs, this regex prevents special characters like @!$%(... etc,
// https://discord.com/developers/docs/interactions/slash-commands#applicationcommand
if (!Regex.IsMatch(value, @"^[\w-]{1,32}$"))
throw new ArgumentException("Command name cannot contain any special characters or whitespaces!");
throw new ArgumentException("Command name cannot contain any special characters or whitespaces!", nameof(value));

_name = value;
}
@@ -55,10 +50,7 @@ namespace Discord
/// </summary>
public string Description
{
get
{
return _description;
}
get => _description;
set
{
Preconditions.NotNullOrEmpty(value, nameof(Description));
@@ -77,10 +69,7 @@ namespace Discord
get => _options;
set
{
if (value != null)
if (value.Count > MaxOptionsCount)
throw new ArgumentException(message: $"Option count must be less than or equal to {MaxOptionsCount}.", paramName: nameof(Options));

Preconditions.AtMost(value?.Count ?? 0, MaxOptionsCount, nameof(value));
_options = value;
}
}
@@ -90,9 +79,9 @@ namespace Discord
/// </summary>
public bool DefaultPermission { get; set; } = true;

private string _name { get; set; }
private string _description { get; set; }
private List<SlashCommandOptionBuilder> _options { get; set; }
private string _name;
private string _description;
private List<SlashCommandOptionBuilder> _options;

/// <summary>
/// Build the current builder into a <see cref="SlashCommandProperties"/> class.
@@ -100,11 +89,11 @@ namespace Discord
/// <returns>A <see cref="SlashCommandProperties"/> that can be used to create slash commands over rest.</returns>
public SlashCommandProperties Build()
{
SlashCommandProperties props = new SlashCommandProperties()
var props = new SlashCommandProperties
{
Name = Name,
Description = Description,
DefaultPermission = DefaultPermission,
DefaultPermission = DefaultPermission
};

if (Options != null && Options.Any())
@@ -117,7 +106,6 @@ namespace Discord
}

return props;

}

/// <summary>
@@ -163,7 +151,7 @@ namespace Discord
/// <param name="description">The description of this option.</param>
/// <param name="required">If this option is required for this command.</param>
/// <param name="isDefault">If this option is the default option.</param>
/// <param name="isAutocomplete">If this option is set to autocompleate.</param>
/// <param name="isAutocomplete">If this option is set to autocomplete.</param>
/// <param name="options">The options of the option to add.</param>
/// <param name="channelTypes">The allowed channel types for this option.</param>
/// <param name="choices">The choices of this option.</param>
@@ -188,14 +176,10 @@ namespace Discord
Preconditions.AtMost(description.Length, MaxDescriptionLength, nameof(description));

// make sure theres only one option with default set to true
if (isDefault.HasValue && isDefault.Value)
{
if (Options != null)
if (Options.Any(x => x.Default.HasValue && x.Default.Value))
throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault));
}
if (isDefault == true && Options?.Any(x => x.Default == true) == true)
throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault));

SlashCommandOptionBuilder option = new SlashCommandOptionBuilder
var option = new SlashCommandOptionBuilder
{
Name = name,
Description = description,
@@ -204,8 +188,8 @@ namespace Discord
Options = options,
Type = type,
Autocomplete = isAutocomplete,
Choices = choices != null ? new List<ApplicationCommandOptionChoiceProperties>(choices) : null,
ChannelTypes = channelTypes,
Choices = (choices ?? Array.Empty<ApplicationCommandOptionChoiceProperties>()).ToList(),
ChannelTypes = channelTypes
};

return AddOption(option);
@@ -228,14 +212,12 @@ namespace Discord
/// <returns>The current builder.</returns>
public SlashCommandBuilder AddOption(SlashCommandOptionBuilder option)
{
if (Options == null)
Options = new List<SlashCommandOptionBuilder>();
Options ??= new List<SlashCommandOptionBuilder>();

if (Options.Count >= MaxOptionsCount)
throw new ArgumentOutOfRangeException(nameof(Options), $"Cannot have more than {MaxOptionsCount} options!");
throw new InvalidOperationException($"Cannot have more than {MaxOptionsCount} options!");

if (option == null)
throw new ArgumentNullException(nameof(option), "Option cannot be null");
Preconditions.NotNull(option, nameof(option));

Options.Add(option);
return this;
@@ -251,10 +233,9 @@ namespace Discord
throw new ArgumentNullException(nameof(options), "Options cannot be null!");

if (options.Length == 0)
throw new ArgumentException(nameof(options), "Options cannot be empty!");
throw new ArgumentException("Options cannot be empty!", nameof(options));

if (Options == null)
Options = new List<SlashCommandOptionBuilder>();
Options ??= new List<SlashCommandOptionBuilder>();

if (Options.Count + options.Length > MaxOptionsCount)
throw new ArgumentOutOfRangeException(nameof(options), $"Cannot have more than {MaxOptionsCount} options!");
@@ -290,14 +271,13 @@ namespace Discord
get => _name;
set
{
if (value?.Length > SlashCommandBuilder.MaxNameLength)
throw new ArgumentException($"Name length must be less than or equal to {SlashCommandBuilder.MaxNameLength}");
if (value?.Length < 1)
throw new ArgumentException("Name length must at least 1 characters in length");

if (value != null)
{
Preconditions.AtLeast(value.Length, 1, nameof(value));
Preconditions.AtMost(value.Length, SlashCommandBuilder.MaxNameLength, nameof(value));
if (!Regex.IsMatch(value, @"^[\w-]{1,32}$"))
throw new ArgumentException("Option name cannot contain any special characters or whitespaces!");
throw new ArgumentException("Option name cannot contain any special characters or whitespaces!", nameof(value));
}

_name = value;
}
@@ -311,10 +291,11 @@ namespace Discord
get => _description;
set
{
if (value?.Length > SlashCommandBuilder.MaxDescriptionLength)
throw new ArgumentException($"Description length must be less than or equal to {SlashCommandBuilder.MaxDescriptionLength}");
if (value?.Length < 1)
throw new ArgumentException("Description length must at least 1 character in length");
if (value != null)
{
Preconditions.AtLeast(value.Length, 1, nameof(value));
Preconditions.AtMost(value.Length, SlashCommandBuilder.MaxDescriptionLength, nameof(value));
}

_description = value;
}
@@ -333,7 +314,7 @@ namespace Discord
/// <summary>
/// Gets or sets if the option is required.
/// </summary>
public bool? Required { get; set; } = null;
public bool? Required { get; set; }

/// <summary>
/// Gets or sets whether or not this option supports autocomplete.
@@ -364,19 +345,19 @@ namespace Discord
bool isSubType = Type == ApplicationCommandOptionType.SubCommandGroup;

if (isSubType && (Options == null || !Options.Any()))
throw new ArgumentException(nameof(Options), "SubCommands/SubCommandGroups must have at least one option");
throw new InvalidOperationException("SubCommands/SubCommandGroups must have at least one option");

if (!isSubType && (Options != null && Options.Any()) && Type != ApplicationCommandOptionType.SubCommand)
throw new ArgumentException(nameof(Options), $"Cannot have options on {Type} type");
if (!isSubType && Options != null && Options.Any() && Type != ApplicationCommandOptionType.SubCommand)
throw new InvalidOperationException($"Cannot have options on {Type} type");

return new ApplicationCommandOptionProperties()
return new ApplicationCommandOptionProperties
{
Name = Name,
Description = Description,
Default = Default,
Required = Required,
Type = Type,
Options = Options?.Count > 0 ? new List<ApplicationCommandOptionProperties>(Options.Select(x => x.Build())) : null,
Options = Options?.Count > 0 ? Options.Select(x => x.Build()).ToList() : new List<ApplicationCommandOptionProperties>(),
Choices = Choices,
Autocomplete = Autocomplete,
ChannelTypes = ChannelTypes
@@ -416,14 +397,10 @@ namespace Discord
Preconditions.AtMost(description.Length, SlashCommandBuilder.MaxDescriptionLength, nameof(description));

// make sure theres only one option with default set to true
if (isDefault)
{
if (Options != null)
if (Options.Any(x => x.Default.HasValue && x.Default.Value))
throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault));
}
if (isDefault && Options?.Any(x => x.Default == true) == true)
throw new ArgumentException("There can only be one command option with default set to true!", nameof(isDefault));

SlashCommandOptionBuilder option = new SlashCommandOptionBuilder
var option = new SlashCommandOptionBuilder
{
Name = name,
Description = description,
@@ -432,8 +409,8 @@ namespace Discord
Autocomplete = isAutocomplete,
Options = options,
Type = type,
Choices = choices != null ? new List<ApplicationCommandOptionChoiceProperties>(choices) : null,
ChannelTypes = channelTypes,
Choices = (choices ?? Array.Empty<ApplicationCommandOptionChoiceProperties>()).ToList(),
ChannelTypes = channelTypes
};

return AddOption(option);
@@ -445,14 +422,12 @@ namespace Discord
/// <returns>The current builder.</returns>
public SlashCommandOptionBuilder AddOption(SlashCommandOptionBuilder option)
{
if (Options == null)
Options = new List<SlashCommandOptionBuilder>();
Options ??= new List<SlashCommandOptionBuilder>();

if (Options.Count >= SlashCommandBuilder.MaxOptionsCount)
throw new ArgumentOutOfRangeException(nameof(Choices), $"There can only be {SlashCommandBuilder.MaxOptionsCount} options per sub command group!");
throw new InvalidOperationException($"There can only be {SlashCommandBuilder.MaxOptionsCount} options per sub command group!");

if (option == null)
throw new ArgumentNullException(nameof(option), "Option cannot be null");
Preconditions.NotNull(option, nameof(option));

Options.Add(option);
return this;
@@ -466,19 +441,17 @@ namespace Discord
/// <returns>The current builder.</returns>
public SlashCommandOptionBuilder AddChoice(string name, int value)
{
if (Choices == null)
Choices = new List<ApplicationCommandOptionChoiceProperties>();
Choices ??= new List<ApplicationCommandOptionChoiceProperties>();

if (Choices.Count >= MaxChoiceCount)
throw new ArgumentOutOfRangeException(nameof(Choices), $"Cannot add more than {MaxChoiceCount} choices!");
throw new InvalidOperationException($"Cannot add more than {MaxChoiceCount} choices!");

if (name == null)
throw new ArgumentNullException($"{nameof(name)} cannot be null!");
Preconditions.NotNull(name, nameof(name));

Preconditions.AtLeast(name.Length, 1, nameof(name));
Preconditions.AtMost(name.Length, 100, nameof(name));

Choices.Add(new ApplicationCommandOptionChoiceProperties()
Choices.Add(new ApplicationCommandOptionChoiceProperties
{
Name = name,
Value = value
@@ -495,17 +468,13 @@ namespace Discord
/// <returns>The current builder.</returns>
public SlashCommandOptionBuilder AddChoice(string name, string value)
{
if (Choices == null)
Choices = new List<ApplicationCommandOptionChoiceProperties>();
Choices ??= new List<ApplicationCommandOptionChoiceProperties>();

if (Choices.Count >= MaxChoiceCount)
throw new ArgumentOutOfRangeException(nameof(Choices), $"Cannot add more than {MaxChoiceCount} choices!");

if (name == null)
throw new ArgumentNullException($"{nameof(name)} cannot be null!");
throw new InvalidOperationException($"Cannot add more than {MaxChoiceCount} choices!");

if (value == null)
throw new ArgumentNullException($"{nameof(value)} cannot be null!");
Preconditions.NotNull(name, nameof(name));
Preconditions.NotNull(value, nameof(value));

Preconditions.AtLeast(name.Length, 1, nameof(name));
Preconditions.AtMost(name.Length, 100, nameof(name));
@@ -513,7 +482,7 @@ namespace Discord
Preconditions.AtLeast(value.Length, 1, nameof(value));
Preconditions.AtMost(value.Length, 100, nameof(value));

Choices.Add(new ApplicationCommandOptionChoiceProperties()
Choices.Add(new ApplicationCommandOptionChoiceProperties
{
Name = name,
Value = value
@@ -523,14 +492,13 @@ namespace Discord
}

/// <summary>
/// Adds a channnel type to the current option.
/// Adds a channel type to the current option.
/// </summary>
/// <param name="channelType">The <see cref="ChannelType"/> to add.</param>
/// <returns>The current builder.</returns>
public SlashCommandOptionBuilder AddChannelType(ChannelType channelType)
{
if (ChannelTypes == null)
ChannelTypes = new List<ChannelType>();
ChannelTypes ??= new List<ChannelType>();

ChannelTypes.Add(channelType);



+ 0
- 4
src/Discord.Net.Core/Entities/Interactions/Slash Commands/SlashCommandProperties.cs View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{


+ 16
- 6
src/Discord.Net.Core/Entities/Messages/StickerFormatType.cs View File

@@ -1,15 +1,25 @@
namespace Discord
{
/// <summary> Defines the types of formats for stickers. </summary>
/// <summary>
/// Defines the types of formats for stickers.
/// </summary>
public enum StickerFormatType
{
/// <summary> Default value for a sticker format type. </summary>
/// <summary>
/// Default value for a sticker format type.
/// </summary>
None = 0,
/// <summary> The sticker format type is png. </summary>
/// <summary>
/// The sticker format type is png.
/// </summary>
Png = 1,
/// <summary> The sticker format type is apng. </summary>
/// <summary>
/// The sticker format type is apng.
/// </summary>
Apng = 2,
/// <summary> The sticker format type is lottie. </summary>
Lottie = 3,
/// <summary>
/// The sticker format type is lottie.
/// </summary>
Lottie = 3
}
}

+ 4
- 13
src/Discord.Net.Core/Entities/Messages/TimestampTag.cs View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
@@ -24,18 +20,13 @@ namespace Discord
/// <summary>
/// Converts the current timestamp tag to the string representation supported by discord.
/// <para>
/// If the <see cref="TimestampTag.Time"/> is null then the default 0 will be used.
/// If the <see cref="Time"/> is null then the default 0 will be used.
/// </para>
/// </summary>
/// <returns>A string thats compatible in a discord message, ex: <code>&lt;t:1625944201:f&gt;</code></returns>
/// <returns>A string that is compatible in a discord message, ex: <code>&lt;t:1625944201:f&gt;</code></returns>
public override string ToString()
{
if (Time == null)
return $"<t:0:{(char)Style}>";

var offset = (DateTimeOffset)this.Time;

return $"<t:{offset.ToUnixTimeSeconds()}:{(char)Style}>";
return $"<t:{((DateTimeOffset)Time).ToUnixTimeSeconds()}:{(char)Style}>";
}

/// <summary>
@@ -46,7 +37,7 @@ namespace Discord
/// <returns>The newly create timestamp tag.</returns>
public static TimestampTag FromDateTime(DateTime time, TimestampTagStyles style = TimestampTagStyles.ShortDateTime)
{
return new TimestampTag()
return new TimestampTag
{
Style = style,
Time = time


+ 0
- 6
src/Discord.Net.Core/Entities/Messages/TimestampTagStyle.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>


+ 1
- 7
src/Discord.Net.Core/Entities/Permissions/ApplicationCommandPermissionTarget.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>
@@ -18,6 +12,6 @@ namespace Discord
/// <summary>
/// The target of the permission is a user.
/// </summary>
User = 2,
User = 2
}
}

+ 0
- 4
src/Discord.Net.Core/Entities/Permissions/GuildApplicationCommandPermissions.cs View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{


+ 0
- 3
src/Discord.Net.Core/Entities/Stickers/ICustomSticker.cs View File

@@ -1,7 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord


+ 2
- 4
src/Discord.Net.Core/Entities/Stickers/ISticker.cs View File

@@ -1,6 +1,4 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace Discord
{
@@ -57,12 +55,12 @@ namespace Discord
new StickerFormatType Format { get; }

/// <summary>
/// Gets whether this guild sticker can be used, may be false due to loss of Server Boosts
/// Gets whether this guild sticker can be used, may be false due to loss of Server Boosts.
/// </summary>
bool? IsAvailable { get; }

/// <summary>
/// Gets the standard sticker's sort order within its pack
/// Gets the standard sticker's sort order within its pack.
/// </summary>
int? SortOrder { get; }
/// <summary>


+ 0
- 6
src/Discord.Net.Core/Entities/Stickers/IStickerItem.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>


+ 1
- 5
src/Discord.Net.Core/Entities/Stickers/StickerPack.cs View File

@@ -1,16 +1,12 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>
/// Represents a discord sticker pack.
/// </summary>
/// <typeparam name="TSticker">The type of the stickers within the collection</typeparam>
/// <typeparam name="TSticker">The type of the stickers within the collection.</typeparam>
public class StickerPack<TSticker> where TSticker : ISticker
{
/// <summary>


+ 0
- 4
src/Discord.Net.Core/Entities/Stickers/StickerProperties.cs View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{


+ 2
- 8
src/Discord.Net.Core/Entities/Stickers/StickerType.cs View File

@@ -1,13 +1,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord
{
/// <summary>
/// Represents a type of sticker
/// Represents a type of sticker..
/// </summary>
public enum StickerType
{
@@ -19,6 +13,6 @@ namespace Discord
/// <summary>
/// Represents a sticker that was created within a guild.
/// </summary>
Guild = 2,
Guild = 2
}
}

+ 0
- 4
src/Discord.Net.Core/Net/ApplicationCommandException.cs View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.Net
{


+ 11
- 11
src/Discord.Net.Core/Utils/UrlValidation.cs View File

@@ -2,38 +2,38 @@ using System;

namespace Discord.Utils
{
static class UrlValidation
internal static class UrlValidation
{
/// <summary>
/// Not full URL validation right now. Just ensures protocol is present and that it's either http or https
/// <see cref="ValidateButton(string)"/> should be used for url buttons
/// <see cref="ValidateButton(string)"/> should be used for url buttons.
/// </summary>
/// <param name="url">url to validate before sending to Discord.</param>
/// <param name="url">The URL to validate before sending to Discord.</param>
/// <exception cref="InvalidOperationException">A URL must include a protocol (http or https).</exception>
/// <returns>true if url is valid by our standard, false if null, throws an error upon invalid </returns>
/// <returns>true if URL is valid by our standard, false if null, throws an error upon invalid.</returns>
public static bool Validate(string url)
{
if (string.IsNullOrEmpty(url))
return false;
if(!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || (url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))))
if (!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)))
throw new InvalidOperationException($"The url {url} must include a protocol (either HTTP or HTTPS)");
return true;
}

/// <summary>
/// Not full URL validation right now. Just Ensures the protocol is either http, https, or discord
/// <see cref="Validate(string)"/> should be used everything other than url buttons
/// <see cref="Validate(string)"/> should be used everything other than url buttons.
/// </summary>
/// <param name="url">the url to validate before sending to discord</param>
/// <param name="url">The URL to validate before sending to discord.</param>
/// <exception cref="InvalidOperationException">A URL must include a protocol (either http, https, or discord).</exception>
/// <returns>true if the url is valid by our standard, false if null, throws an error upon invalid</returns>
/// <returns>true if the URL is valid by our standard, false if null, throws an error upon invalid.</returns>
public static bool ValidateButton(string url)
{
if (string.IsNullOrEmpty(url))
return false;
if(!((url.StartsWith("http://", StringComparison.OrdinalIgnoreCase)) ||
(url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) ||
(url.StartsWith("discord://", StringComparison.OrdinalIgnoreCase))))
if (!(url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) ||
url.StartsWith("https://", StringComparison.OrdinalIgnoreCase) ||
url.StartsWith("discord://", StringComparison.OrdinalIgnoreCase)))
throw new InvalidOperationException($"The url {url} must include a protocol (either HTTP, HTTPS, or DISCORD)");
return true;
}


+ 1
- 6
src/Discord.Net.Rest/API/Common/ActionRowComponent.cs View File

@@ -1,10 +1,5 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{
@@ -26,7 +21,7 @@ namespace Discord.API
{
ComponentType.Button => new ButtonComponent(x as Discord.ButtonComponent),
ComponentType.SelectMenu => new SelectMenuComponent(x as Discord.SelectMenuComponent),
_ => null,
_ => null
};
}).ToArray();
}


+ 0
- 5
src/Discord.Net.Rest/API/Common/ApplicationCommand.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{


+ 0
- 2
src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionData.cs View File

@@ -1,5 +1,4 @@
using Newtonsoft.Json;
using System.Collections.Generic;

namespace Discord.API
{
@@ -19,6 +18,5 @@ namespace Discord.API

[JsonProperty("type")]
public ApplicationCommandType Type { get; set; }

}
}

+ 0
- 1
src/Discord.Net.Rest/API/Common/ApplicationCommandInteractionDataOption.cs View File

@@ -1,5 +1,4 @@
using Newtonsoft.Json;
using System.Collections.Generic;

namespace Discord.API
{


+ 17
- 35
src/Discord.Net.Rest/API/Common/ApplicationCommandOption.cs View File

@@ -1,9 +1,5 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{
@@ -40,7 +36,7 @@ namespace Discord.API

public ApplicationCommandOption(IApplicationCommandOption cmd)
{
Choices = cmd.Choices.Select(x => new ApplicationCommandOptionChoice()
Choices = cmd.Choices.Select(x => new ApplicationCommandOptionChoice
{
Name = x.Name,
Value = x.Value
@@ -50,42 +46,28 @@ namespace Discord.API

ChannelTypes = cmd.ChannelTypes.ToArray();

Required = cmd.IsRequired.HasValue
? cmd.IsRequired.Value
: Optional<bool>.Unspecified;
Default = cmd.IsDefault.HasValue
? cmd.IsDefault.Value
: Optional<bool>.Unspecified;
Required = cmd.IsRequired ?? Optional<bool>.Unspecified;
Default = cmd.IsDefault ?? Optional<bool>.Unspecified;

Name = cmd.Name;
Type = cmd.Type;
Description = cmd.Description;
}
public ApplicationCommandOption(Discord.ApplicationCommandOptionProperties option)
public ApplicationCommandOption(ApplicationCommandOptionProperties option)
{
Choices = option.Choices != null
? option.Choices.Select(x => new ApplicationCommandOptionChoice()
{
Name = x.Name,
Value = x.Value
}).ToArray()
: Optional<ApplicationCommandOptionChoice[]>.Unspecified;

Options = option.Options != null
? option.Options.Select(x => new ApplicationCommandOption(x)).ToArray()
: Optional<ApplicationCommandOption[]>.Unspecified;

Required = option.Required.HasValue
? option.Required.Value
: Optional<bool>.Unspecified;

Default = option.Default.HasValue
? option.Default.Value
: Optional<bool>.Unspecified;

ChannelTypes = option.ChannelTypes != null
? option.ChannelTypes.ToArray()
: Optional<ChannelType[]>.Unspecified;
Choices = option.Choices?.Select(x => new ApplicationCommandOptionChoice
{
Name = x.Name,
Value = x.Value
}).ToArray() ?? Optional<ApplicationCommandOptionChoice[]>.Unspecified;

Options = option.Options?.Select(x => new ApplicationCommandOption(x)).ToArray() ?? Optional<ApplicationCommandOption[]>.Unspecified;

Required = option.Required ?? Optional<bool>.Unspecified;

Default = option.Default ?? Optional<bool>.Unspecified;

ChannelTypes = option.ChannelTypes?.ToArray() ?? Optional<ChannelType[]>.Unspecified;

Name = option.Name;
Type = option.Type;


+ 0
- 5
src/Discord.Net.Rest/API/Common/ApplicationCommandOptionChoice.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{


+ 0
- 5
src/Discord.Net.Rest/API/Common/ApplicationCommandPermissions.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{


+ 0
- 5
src/Discord.Net.Rest/API/Common/AutocompleteInteractionData.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{


+ 0
- 5
src/Discord.Net.Rest/API/Common/AutocompleteInteractionDataOption.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{


+ 3
- 8
src/Discord.Net.Rest/API/Common/ButtonComponent.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{
@@ -45,16 +40,16 @@ namespace Discord.API
{
if (c.Emote is Emote e)
{
Emote = new Emoji()
Emote = new Emoji
{
Name = e.Name,
Animated = e.Animated,
Id = e.Id,
Id = e.Id
};
}
else
{
Emote = new Emoji()
Emote = new Emoji
{
Name = c.Emote.Name
};


+ 0
- 5
src/Discord.Net.Rest/API/Common/ChannelThreads.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API.Rest
{


+ 1
- 6
src/Discord.Net.Rest/API/Common/GuildApplicationCommandPermissions.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{
@@ -19,6 +14,6 @@ namespace Discord.API
public ulong GuildId { get; set; }

[JsonProperty("permissions")]
public API.ApplicationCommandPermissions[] Permissions { get; set; }
public ApplicationCommandPermissions[] Permissions { get; set; }
}
}

+ 0
- 5
src/Discord.Net.Rest/API/Common/Interaction.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{


+ 3
- 3
src/Discord.Net.Rest/API/Common/InteractionCallbackData.cs View File

@@ -11,7 +11,7 @@ namespace Discord.API
public Optional<string> Content { get; set; }

[JsonProperty("embeds")]
public Optional<API.Embed[]> Embeds { get; set; }
public Optional<Embed[]> Embeds { get; set; }

[JsonProperty("allowed_mentions")]
public Optional<AllowedMentions> AllowedMentions { get; set; }
@@ -20,9 +20,9 @@ namespace Discord.API
public Optional<MessageFlags> Flags { get; set; }

[JsonProperty("components")]
public Optional<API.ActionRowComponent[]> Components { get; set; }
public Optional<ActionRowComponent[]> Components { get; set; }

[JsonProperty("choices")]
public Optional<API.ApplicationCommandOptionChoice[]> Choices { get; set; }
public Optional<ApplicationCommandOptionChoice[]> Choices { get; set; }
}
}

+ 0
- 5
src/Discord.Net.Rest/API/Common/InteractionResponse.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{


+ 0
- 5
src/Discord.Net.Rest/API/Common/MessageComponentInteractionData.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{


+ 0
- 4
src/Discord.Net.Rest/API/Common/NitroStickerPacks.cs View File

@@ -1,9 +1,5 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{


+ 0
- 4
src/Discord.Net.Rest/API/Common/SelectMenuComponent.cs View File

@@ -1,9 +1,5 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{


+ 4
- 9
src/Discord.Net.Rest/API/Common/SelectMenuOption.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{
@@ -36,23 +31,23 @@ namespace Discord.API
{
if (option.Emote is Emote e)
{
Emoji = new Emoji()
Emoji = new Emoji
{
Name = e.Name,
Animated = e.Animated,
Id = e.Id,
Id = e.Id
};
}
else
{
Emoji = new Emoji()
Emoji = new Emoji
{
Name = option.Emote.Name
};
}
}

Default = option.Default.HasValue ? option.Default.Value : Optional<bool>.Unspecified;
Default = option.Default ?? Optional<bool>.Unspecified;
}
}
}

+ 0
- 5
src/Discord.Net.Rest/API/Common/StageInstance.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{


+ 1
- 1
src/Discord.Net.Rest/API/Common/Sticker.cs View File

@@ -11,7 +11,7 @@ namespace Discord.API
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("description")]
public string Desription { get; set; }
public string Description { get; set; }
[JsonProperty("tags")]
public Optional<string> Tags { get; set; }
[JsonProperty("type")]


+ 0
- 5
src/Discord.Net.Rest/API/Common/StickerItem.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{


+ 0
- 5
src/Discord.Net.Rest/API/Common/StickerPack.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{


+ 1
- 5
src/Discord.Net.Rest/API/Common/ThreadMember.cs View File

@@ -1,9 +1,5 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{
@@ -18,7 +14,7 @@ namespace Discord.API
[JsonProperty("join_timestamp")]
public DateTimeOffset JoinTimestamp { get; set; }

[JsonProperty("presense")]
[JsonProperty("presence")]
public Optional<Presence> Presence { get; set; }

[JsonProperty("member")]


+ 0
- 4
src/Discord.Net.Rest/API/Common/ThreadMetadata.cs View File

@@ -1,9 +1,5 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API
{


+ 1
- 7
src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs View File

@@ -1,10 +1,4 @@
using Discord.API;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API.Rest
{
@@ -30,7 +24,7 @@ namespace Discord.API.Rest
{
Name = name;
Description = description;
Options = Optional.Create<ApplicationCommandOption[]>(options);
Options = Optional.Create(options);
Type = type;
}
}


+ 0
- 5
src/Discord.Net.Rest/API/Rest/CreateStageInstanceParams.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API.Rest
{


+ 1
- 7
src/Discord.Net.Rest/API/Rest/CreateStickerParams.cs View File

@@ -1,12 +1,6 @@
using Discord.Net.Rest;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API.Rest
{
internal class CreateStickerParams
@@ -30,7 +24,7 @@ namespace Discord.API.Rest

if (File is FileStream fileStream)
contentType = $"image/{Path.GetExtension(fileStream.Name)}";
else if(FileName != null)
else if (FileName != null)
contentType = $"image/{Path.GetExtension(FileName)}";

d["file"] = new MultipartFile(File, FileName ?? "image", contentType.Replace(".", ""));


+ 0
- 5
src/Discord.Net.Rest/API/Rest/ModifyApplicationCommandParams.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API.Rest
{


+ 0
- 5
src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissions.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API.Rest
{


+ 0
- 5
src/Discord.Net.Rest/API/Rest/ModifyGuildApplicationCommandPermissionsParams.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API.Rest
{


+ 1
- 6
src/Discord.Net.Rest/API/Rest/ModifyInteractionResponseParams.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API.Rest
{
@@ -19,7 +14,7 @@ namespace Discord.API.Rest
public Optional<AllowedMentions> AllowedMentions { get; set; }

[JsonProperty("components")]
public Optional<API.ActionRowComponent[]> Components { get; set; }
public Optional<ActionRowComponent[]> Components { get; set; }

[JsonProperty("flags")]
public Optional<MessageFlags?> Flags { get; set; }


+ 0
- 6
src/Discord.Net.Rest/API/Rest/ModifyStageInstanceParams.cs View File

@@ -1,15 +1,9 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API.Rest
{
internal class ModifyStageInstanceParams
{

[JsonProperty("topic")]
public Optional<string> Topic { get; set; }



+ 0
- 5
src/Discord.Net.Rest/API/Rest/ModifyStickerParams.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API.Rest
{


+ 0
- 6
src/Discord.Net.Rest/API/Rest/ModifyThreadParams.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Discord;
using Newtonsoft.Json;

namespace Discord.API.Rest


+ 0
- 5
src/Discord.Net.Rest/API/Rest/StartThreadParams.cs View File

@@ -1,9 +1,4 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.API.Rest
{


+ 15
- 15
src/Discord.Net.Rest/ClientHelper.cs View File

@@ -194,17 +194,17 @@ namespace Discord.Rest
};
}

public static async Task<IReadOnlyCollection<RestGlobalCommand>> GetGlobalApplicationCommands(BaseDiscordClient client,
public static async Task<IReadOnlyCollection<RestGlobalCommand>> GetGlobalApplicationCommandsAsync(BaseDiscordClient client,
RequestOptions options = null)
{
var response = await client.ApiClient.GetGlobalApplicationCommandsAsync(options).ConfigureAwait(false);

if (!response.Any())
return new RestGlobalCommand[0];
return Array.Empty<RestGlobalCommand>();

return response.Select(x => RestGlobalCommand.Create(client, x)).ToArray();
}
public static async Task<RestGlobalCommand> GetGlobalApplicationCommand(BaseDiscordClient client, ulong id,
public static async Task<RestGlobalCommand> GetGlobalApplicationCommandAsync(BaseDiscordClient client, ulong id,
RequestOptions options = null)
{
var model = await client.ApiClient.GetGlobalApplicationCommandAsync(id, options);
@@ -212,55 +212,55 @@ namespace Discord.Rest
return model != null ? RestGlobalCommand.Create(client, model) : null;
}

public static async Task<IReadOnlyCollection<RestGuildCommand>> GetGuildApplicationCommands(BaseDiscordClient client, ulong guildId,
public static async Task<IReadOnlyCollection<RestGuildCommand>> GetGuildApplicationCommandsAsync(BaseDiscordClient client, ulong guildId,
RequestOptions options = null)
{
var response = await client.ApiClient.GetGuildApplicationCommandsAsync(guildId, options).ConfigureAwait(false);

if (!response.Any())
return new RestGuildCommand[0].ToImmutableArray();
return ImmutableArray.Create<RestGuildCommand>();

return response.Select(x => RestGuildCommand.Create(client, x, guildId)).ToImmutableArray();
}
public static async Task<RestGuildCommand> GetGuildApplicationCommand(BaseDiscordClient client, ulong id, ulong guildId,
public static async Task<RestGuildCommand> GetGuildApplicationCommandAsync(BaseDiscordClient client, ulong id, ulong guildId,
RequestOptions options = null)
{
var model = await client.ApiClient.GetGuildApplicationCommandAsync(guildId, id, options);

return model != null ? RestGuildCommand.Create(client, model, guildId) : null;
}
public static async Task<RestGuildCommand> CreateGuildApplicationCommand(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties properties,
public static async Task<RestGuildCommand> CreateGuildApplicationCommandAsync(BaseDiscordClient client, ulong guildId, ApplicationCommandProperties properties,
RequestOptions options = null)
{
var model = await InteractionHelper.CreateGuildCommand(client, guildId, properties, options);
var model = await InteractionHelper.CreateGuildCommandAsync(client, guildId, properties, options);

return RestGuildCommand.Create(client, model, guildId);
}
public static async Task<RestGlobalCommand> CreateGlobalApplicationCommand(BaseDiscordClient client, ApplicationCommandProperties properties,
public static async Task<RestGlobalCommand> CreateGlobalApplicationCommandAsync(BaseDiscordClient client, ApplicationCommandProperties properties,
RequestOptions options = null)
{
var model = await InteractionHelper.CreateGlobalCommand(client, properties, options);
var model = await InteractionHelper.CreateGlobalCommandAsync(client, properties, options);

return RestGlobalCommand.Create(client, model);
}
public static async Task<IReadOnlyCollection<RestGlobalCommand>> BulkOverwriteGlobalApplicationCommand(BaseDiscordClient client, ApplicationCommandProperties[] properties,
public static async Task<IReadOnlyCollection<RestGlobalCommand>> BulkOverwriteGlobalApplicationCommandAsync(BaseDiscordClient client, ApplicationCommandProperties[] properties,
RequestOptions options = null)
{
var models = await InteractionHelper.BulkOverwriteGlobalCommands(client, properties, options);
var models = await InteractionHelper.BulkOverwriteGlobalCommandsAsync(client, properties, options);

return models.Select(x => RestGlobalCommand.Create(client, x)).ToImmutableArray();
}
public static async Task<IReadOnlyCollection<RestGuildCommand>> BulkOverwriteGuildApplicationCommand(BaseDiscordClient client, ulong guildId,
public static async Task<IReadOnlyCollection<RestGuildCommand>> BulkOverwriteGuildApplicationCommandAsync(BaseDiscordClient client, ulong guildId,
ApplicationCommandProperties[] properties, RequestOptions options = null)
{
var models = await InteractionHelper.BulkOverwriteGuildCommands(client, guildId, properties, options);
var models = await InteractionHelper.BulkOverwriteGuildCommandsAsync(client, guildId, properties, options);

return models.Select(x => RestGuildCommand.Create(client, x, guildId)).ToImmutableArray();
}

public static Task AddRoleAsync(BaseDiscordClient client, ulong guildId, ulong userId, ulong roleId, RequestOptions options = null)
=> client.ApiClient.AddRoleAsync(guildId, userId, roleId, options);
public static Task RemoveRoleAsync(BaseDiscordClient client, ulong guildId, ulong userId, ulong roleId, RequestOptions options = null)
=> client.ApiClient.RemoveRoleAsync(guildId, userId, roleId, options);
#endregion


+ 1
- 2
src/Discord.Net.Rest/DiscordRestApiClient.cs View File

@@ -534,7 +534,7 @@ namespace Discord.API

var bucket = new BucketIds(channelId: channelId);

return await SendAsync<ChannelThreads>("GET", () => $"channels/{channelId}/threads/active", bucket);
return await SendAsync<ChannelThreads>("GET", () => $"channels/{channelId}/threads/active", bucket, options: options);
}

public async Task<ChannelThreads> GetPublicArchivedThreadsAsync(ulong channelId, DateTimeOffset? before = null, int? limit = null, RequestOptions options = null)
@@ -609,7 +609,6 @@ namespace Discord.API
#region Stage
public async Task<StageInstance> CreateStageInstanceAsync(CreateStageInstanceParams args, RequestOptions options = null)
{

options = RequestOptions.CreateOrClone(options);

var bucket = new BucketIds();


+ 7
- 7
src/Discord.Net.Rest/DiscordRestClient.cs View File

@@ -110,17 +110,17 @@ namespace Discord.Rest
=> ClientHelper.GetWebhookAsync(this, id, options);

public Task<RestGlobalCommand> CreateGlobalCommand(ApplicationCommandProperties properties, RequestOptions options = null)
=> ClientHelper.CreateGlobalApplicationCommand(this, properties, options);
=> ClientHelper.CreateGlobalApplicationCommandAsync(this, properties, options);
public Task<RestGuildCommand> CreateGuildCommand(ApplicationCommandProperties properties, ulong guildId, RequestOptions options = null)
=> ClientHelper.CreateGuildApplicationCommand(this, guildId, properties, options);
=> ClientHelper.CreateGuildApplicationCommandAsync(this, guildId, properties, options);
public Task<IReadOnlyCollection<RestGlobalCommand>> GetGlobalApplicationCommands(RequestOptions options = null)
=> ClientHelper.GetGlobalApplicationCommands(this, options);
=> ClientHelper.GetGlobalApplicationCommandsAsync(this, options);
public Task<IReadOnlyCollection<RestGuildCommand>> GetGuildApplicationCommands(ulong guildId, RequestOptions options = null)
=> ClientHelper.GetGuildApplicationCommands(this, guildId, options);
=> ClientHelper.GetGuildApplicationCommandsAsync(this, guildId, options);
public Task<IReadOnlyCollection<RestGlobalCommand>> BulkOverwriteGlobalCommands(ApplicationCommandProperties[] commandProperties, RequestOptions options = null)
=> ClientHelper.BulkOverwriteGlobalApplicationCommand(this, commandProperties, options);
=> ClientHelper.BulkOverwriteGlobalApplicationCommandAsync(this, commandProperties, options);
public Task<IReadOnlyCollection<RestGuildCommand>> BulkOverwriteGuildCommands(ApplicationCommandProperties[] commandProperties, ulong guildId, RequestOptions options = null)
=> ClientHelper.BulkOverwriteGuildApplicationCommand(this, guildId, commandProperties, options);
=> ClientHelper.BulkOverwriteGuildApplicationCommandAsync(this, guildId, commandProperties, options);
public Task<IReadOnlyCollection<GuildApplicationCommandPermission>> BatchEditGuildCommandPermissions(ulong guildId, IDictionary<ulong, ApplicationCommandPermission[]> permissions, RequestOptions options = null)
=> InteractionHelper.BatchEditGuildCommandPermissionsAsync(this, guildId, permissions, options);
public Task DeleteAllGlobalCommandsAsync(RequestOptions options = null)
@@ -231,7 +231,7 @@ namespace Discord.Rest
=> await GetGlobalApplicationCommands(options).ConfigureAwait(false);
/// <inheritdoc />
async Task<IApplicationCommand> IDiscordClient.GetGlobalApplicationCommandAsync(ulong id, RequestOptions options)
=> await ClientHelper.GetGlobalApplicationCommand(this, id, options).ConfigureAwait(false);
=> await ClientHelper.GetGlobalApplicationCommandAsync(this, id, options).ConfigureAwait(false);
#endregion
}
}

+ 3
- 9
src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInfo.cs View File

@@ -1,9 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Discord.Rest
{
/// <summary>
@@ -28,9 +22,9 @@ namespace Discord.Rest

internal StageInfo(IUser user, StagePrivacyLevel? level, string topic)
{
this.Topic = topic;
this.PrivacyLevel = level;
this.User = user;
Topic = topic;
PrivacyLevel = level;
User = user;
}
}
}

+ 0
- 5
src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceCreateAuditLogData.cs View File

@@ -1,9 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Model = Discord.API.AuditLog;
using EntryModel = Discord.API.AuditLogEntry;



+ 0
- 5
src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceDeleteAuditLogData.cs View File

@@ -1,9 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Model = Discord.API.AuditLog;
using EntryModel = Discord.API.AuditLogEntry;



+ 0
- 4
src/Discord.Net.Rest/Entities/AuditLogs/DataTypes/StageInstanceUpdatedAuditLogData.cs View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Model = Discord.API.AuditLog;
using EntryModel = Discord.API.AuditLogEntry;



+ 11
- 16
src/Discord.Net.Rest/Entities/Channels/RestStageChannel.cs View File

@@ -1,10 +1,8 @@
using Discord.API;
using Discord.API.Rest;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Model = Discord.API.Channel;
using StageInstance = Discord.API.StageInstance;

namespace Discord.Rest
{
@@ -25,12 +23,9 @@ namespace Discord.Rest
/// <inheritdoc/>
public bool IsLive { get; private set; }
internal RestStageChannel(BaseDiscordClient discord, IGuild guild, ulong id)
: base(discord, guild, id)
{

}
: base(discord, guild, id) { }

internal static new RestStageChannel Create(BaseDiscordClient discord, IGuild guild, Model model)
internal new static RestStageChannel Create(BaseDiscordClient discord, IGuild guild, Model model)
{
var entity = new RestStageChannel(discord, guild, model.Id);
entity.Update(model);
@@ -65,7 +60,7 @@ namespace Discord.Rest
/// <inheritdoc/>
public async Task StartStageAsync(string topic, StagePrivacyLevel privacyLevel = StagePrivacyLevel.GuildOnly, RequestOptions options = null)
{
var args = new API.Rest.CreateStageInstanceParams()
var args = new CreateStageInstanceParams
{
ChannelId = Id,
PrivacyLevel = privacyLevel,
@@ -82,7 +77,7 @@ namespace Discord.Rest
{
await Discord.ApiClient.DeleteStageInstanceAsync(Id, options);

Update(null, false);
Update(null);
}

/// <inheritdoc/>
@@ -98,7 +93,7 @@ namespace Discord.Rest
/// <inheritdoc/>
public Task RequestToSpeakAsync(RequestOptions options = null)
{
var args = new API.Rest.ModifyVoiceStateParams()
var args = new ModifyVoiceStateParams
{
ChannelId = Id,
RequestToSpeakTimestamp = DateTimeOffset.UtcNow
@@ -109,7 +104,7 @@ namespace Discord.Rest
/// <inheritdoc/>
public Task BecomeSpeakerAsync(RequestOptions options = null)
{
var args = new API.Rest.ModifyVoiceStateParams()
var args = new ModifyVoiceStateParams
{
ChannelId = Id,
Suppressed = false
@@ -120,7 +115,7 @@ namespace Discord.Rest
/// <inheritdoc/>
public Task StopSpeakingAsync(RequestOptions options = null)
{
var args = new API.Rest.ModifyVoiceStateParams()
var args = new ModifyVoiceStateParams
{
ChannelId = Id,
Suppressed = true
@@ -131,7 +126,7 @@ namespace Discord.Rest
/// <inheritdoc/>
public Task MoveToSpeakerAsync(IGuildUser user, RequestOptions options = null)
{
var args = new API.Rest.ModifyVoiceStateParams()
var args = new ModifyVoiceStateParams
{
ChannelId = Id,
Suppressed = false
@@ -143,7 +138,7 @@ namespace Discord.Rest
/// <inheritdoc/>
public Task RemoveFromSpeakerAsync(IGuildUser user, RequestOptions options = null)
{
var args = new API.Rest.ModifyVoiceStateParams()
var args = new ModifyVoiceStateParams
{
ChannelId = Id,
Suppressed = true


+ 16
- 23
src/Discord.Net.Rest/Entities/Channels/RestThreadChannel.cs View File

@@ -2,8 +2,6 @@ using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Model = Discord.API.Channel;

@@ -42,10 +40,7 @@ namespace Discord.Rest
public ulong ParentChannelId { get; private set; }

internal RestThreadChannel(BaseDiscordClient discord, IGuild guild, ulong id)
: base(discord, guild, id)
{

}
: base(discord, guild, id) { }

internal new static RestThreadChannel Create(BaseDiscordClient discord, IGuild guild, Model model)
{
@@ -66,7 +61,6 @@ namespace Discord.Rest
AutoArchiveDuration = model.ThreadMetadata.Value.AutoArchiveDuration;
ArchiveTimestamp = model.ThreadMetadata.Value.ArchiveTimestamp;
IsLocked = model.ThreadMetadata.Value.Locked.GetValueOrDefault(false);
}

MemberCount = model.MemberCount.GetValueOrDefault(0);
@@ -110,107 +104,106 @@ namespace Discord.Rest
/// <b>This method is not supported in threads.</b>
/// </remarks>
public override Task AddPermissionOverwriteAsync(IRole role, OverwritePermissions permissions, RequestOptions options = null)
=> throw new NotImplementedException();
=> throw new NotSupportedException("This method is not supported in threads.");

/// <inheritdoc/>
/// <remarks>
/// <b>This method is not supported in threads.</b>
/// </remarks>
public override Task AddPermissionOverwriteAsync(IUser user, OverwritePermissions permissions, RequestOptions options = null)
=> throw new NotImplementedException();
=> throw new NotSupportedException("This method is not supported in threads.");

/// <inheritdoc/>
/// <remarks>
/// <b>This method is not supported in threads.</b>
/// </remarks>
public override Task<IInviteMetadata> CreateInviteAsync(int? maxAge = 86400, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null)
=> throw new NotImplementedException();
=> throw new NotSupportedException("This method is not supported in threads.");

/// <inheritdoc/>
/// <remarks>
/// <b>This method is not supported in threads.</b>
/// </remarks>
public override Task<IInviteMetadata> CreateInviteToApplicationAsync(ulong applicationId, int? maxAge, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null)
=> throw new NotImplementedException();
=> throw new NotSupportedException("This method is not supported in threads.");

/// <inheritdoc/>
/// <remarks>
/// <b>This method is not supported in threads.</b>
/// </remarks>
public override Task<IInviteMetadata> CreateInviteToStreamAsync(IUser user, int? maxAge, int? maxUses = null, bool isTemporary = false, bool isUnique = false, RequestOptions options = null)
=> throw new NotImplementedException();
=> throw new NotSupportedException("This method is not supported in threads.");

/// <inheritdoc/>
/// <remarks>
/// <b>This method is not supported in threads.</b>
/// </remarks>
public override Task<RestWebhook> CreateWebhookAsync(string name, Stream avatar = null, RequestOptions options = null)
=> throw new NotImplementedException();
=> throw new NotSupportedException("This method is not supported in threads.");

/// <inheritdoc/>
/// <remarks>
/// <b>This method is not supported in threads.</b>
/// </remarks>
public override Task<ICategoryChannel> GetCategoryAsync(RequestOptions options = null)
=> throw new NotImplementedException();
=> throw new NotSupportedException("This method is not supported in threads.");

/// <inheritdoc/>
/// <remarks>
/// <b>This method is not supported in threads.</b>
/// </remarks>
public override Task<IReadOnlyCollection<IInviteMetadata>> GetInvitesAsync(RequestOptions options = null)
=> throw new NotImplementedException();
=> throw new NotSupportedException("This method is not supported in threads.");

/// <inheritdoc/>
/// <remarks>
/// <b>This method is not supported in threads.</b>
/// </remarks>
public override OverwritePermissions? GetPermissionOverwrite(IRole role)
=> throw new NotImplementedException();
=> throw new NotSupportedException("This method is not supported in threads.");

/// <inheritdoc/>
/// <remarks>
/// <b>This method is not supported in threads.</b>
/// </remarks>
public override OverwritePermissions? GetPermissionOverwrite(IUser user)
=> throw new NotImplementedException();
=> throw new NotSupportedException("This method is not supported in threads.");

/// <inheritdoc/>
/// <remarks>
/// <b>This method is not supported in threads.</b>
/// </remarks>
public override Task<RestWebhook> GetWebhookAsync(ulong id, RequestOptions options = null)
=> throw new NotImplementedException();
=> throw new NotSupportedException("This method is not supported in threads.");

/// <inheritdoc/>
/// <remarks>
/// <b>This method is not supported in threads.</b>
/// </remarks>
public override Task<IReadOnlyCollection<RestWebhook>> GetWebhooksAsync(RequestOptions options = null)
=> throw new NotImplementedException();
=> throw new NotSupportedException("This method is not supported in threads.");

/// <inheritdoc/>
/// <remarks>
/// <b>This method is not supported in threads.</b>
/// </remarks>
public override Task RemovePermissionOverwriteAsync(IRole role, RequestOptions options = null)
=> throw new NotImplementedException();
=> throw new NotSupportedException("This method is not supported in threads.");

/// <inheritdoc/>
/// <remarks>
/// <b>This method is not supported in threads.</b>
/// </remarks>
public override Task RemovePermissionOverwriteAsync(IUser user, RequestOptions options = null)
=> throw new NotImplementedException();
=> throw new NotSupportedException("This method is not supported in threads.");

/// <inheritdoc/>
/// <remarks>
/// <b>This method is not supported in threads.</b>
/// </remarks>
public override IReadOnlyCollection<Overwrite> PermissionOverwrites
=> throw new NotImplementedException();
=> throw new NotSupportedException("This method is not supported in threads.");

/// <inheritdoc/>
public Task JoinAsync(RequestOptions options = null)
=> Discord.ApiClient.JoinThreadAsync(Id, options);


+ 8
- 10
src/Discord.Net.Rest/Entities/Channels/ThreadHelper.cs View File

@@ -1,8 +1,6 @@
using Discord.API.Rest;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Model = Discord.API.Channel;

@@ -14,22 +12,22 @@ namespace Discord.Rest
ThreadArchiveDuration autoArchiveDuration = ThreadArchiveDuration.OneDay, IMessage message = null, RequestOptions options = null)
{
if (autoArchiveDuration == ThreadArchiveDuration.OneWeek && !channel.Guild.Features.Contains("SEVEN_DAY_THREAD_ARCHIVE"))
throw new ArgumentException($"The guild {channel.Guild.Name} does not have the SEVEN_DAY_THREAD_ARCHIVE feature!");
throw new ArgumentException($"The guild {channel.Guild.Name} does not have the SEVEN_DAY_THREAD_ARCHIVE feature!", nameof(autoArchiveDuration));

if (autoArchiveDuration == ThreadArchiveDuration.ThreeDays && !channel.Guild.Features.Contains("THREE_DAY_THREAD_ARCHIVE"))
throw new ArgumentException($"The guild {channel.Guild.Name} does not have the THREE_DAY_THREAD_ARCHIVE feature!");
throw new ArgumentException($"The guild {channel.Guild.Name} does not have the THREE_DAY_THREAD_ARCHIVE feature!", nameof(autoArchiveDuration));

if (type == ThreadType.PrivateThread && !channel.Guild.Features.Contains("PRIVATE_THREADS"))
throw new ArgumentException($"The guild {channel.Guild.Name} does not have the PRIVATE_THREADS feature!");
throw new ArgumentException($"The guild {channel.Guild.Name} does not have the PRIVATE_THREADS feature!", nameof(type));

var args = new StartThreadParams()
var args = new StartThreadParams
{
Name = name,
Duration = autoArchiveDuration,
Type = type
};

Model model = null;
Model model;

if (message != null)
model = await client.ApiClient.StartThreadAsync(channel.Id, message.Id, args, options).ConfigureAwait(false);
@@ -45,7 +43,7 @@ namespace Discord.Rest
{
var args = new TextChannelProperties();
func(args);
var apiArgs = new API.Rest.ModifyThreadParams
var apiArgs = new ModifyThreadParams
{
Name = args.Name,
Archived = args.Archived,
@@ -63,7 +61,7 @@ namespace Discord.Rest
return users.Select(x => RestThreadUser.Create(client, channel.Guild, x, channel)).ToArray();
}

public static async Task<RestThreadUser> GetUserAsync(ulong userdId, IThreadChannel channel, BaseDiscordClient client, RequestOptions options = null)
=> (await GetUsersAsync(channel, client, options).ConfigureAwait(false)).FirstOrDefault(x => x.Id == userdId);
public static async Task<RestThreadUser> GetUserAsync(ulong userId, IThreadChannel channel, BaseDiscordClient client, RequestOptions options = null)
=> (await GetUsersAsync(channel, client, options).ConfigureAwait(false)).FirstOrDefault(x => x.Id == userId);
}
}

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

@@ -922,7 +922,7 @@ namespace Discord.Rest
/// of application commands found within the guild.
/// </returns>
public async Task<IReadOnlyCollection<RestGuildCommand>> GetApplicationCommandsAsync (RequestOptions options = null)
=> await ClientHelper.GetGuildApplicationCommands(Discord, Id, options).ConfigureAwait(false);
=> await ClientHelper.GetGuildApplicationCommandsAsync(Discord, Id, options).ConfigureAwait(false);
/// <summary>
/// Gets an application command within this guild with the specified id.
/// </summary>
@@ -933,7 +933,7 @@ namespace Discord.Rest
/// if found, otherwise <see langword="null"/>.
/// </returns>
public async Task<RestGuildCommand> GetApplicationCommandAsync(ulong id, RequestOptions options = null)
=> await ClientHelper.GetGuildApplicationCommand(Discord, id, Id, options);
=> await ClientHelper.GetGuildApplicationCommandAsync(Discord, id, Id, options);
/// <summary>
/// Creates an application command within this guild.
/// </summary>
@@ -944,7 +944,7 @@ namespace Discord.Rest
/// </returns>
public async Task<RestGuildCommand> CreateApplicationCommandAsync(ApplicationCommandProperties properties, RequestOptions options = null)
{
var model = await InteractionHelper.CreateGuildCommand(Discord, Id, properties, options);
var model = await InteractionHelper.CreateGuildCommandAsync(Discord, Id, properties, options);

return RestGuildCommand.Create(Discord, model, Id);
}
@@ -959,7 +959,7 @@ namespace Discord.Rest
public async Task<IReadOnlyCollection<RestGuildCommand>> BulkOverwriteApplicationCommandsAsync(ApplicationCommandProperties[] properties,
RequestOptions options = null)
{
var models = await InteractionHelper.BulkOverwriteGuildCommands(Discord, Id, properties, options);
var models = await InteractionHelper.BulkOverwriteGuildCommandsAsync(Discord, Id, properties, options);

return models.Select(x => RestGuildCommand.Create(Discord, x, Id)).ToImmutableArray();
}


+ 67
- 76
src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs View File

@@ -4,6 +4,7 @@ using Discord.Net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Threading.Tasks;

namespace Discord.Rest
@@ -13,15 +14,15 @@ namespace Discord.Rest
#region InteractionHelper
public static Task DeleteAllGuildCommandsAsync(BaseDiscordClient client, ulong guildId, RequestOptions options = null)
{
return client.ApiClient.BulkOverwriteGuildApplicationCommandsAsync(guildId, new CreateApplicationCommandParams[0], options);
return client.ApiClient.BulkOverwriteGuildApplicationCommandsAsync(guildId, Array.Empty<CreateApplicationCommandParams>(), options);
}

public static Task DeleteAllGlobalCommandsAsync(BaseDiscordClient client, RequestOptions options = null)
{
return client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(new CreateApplicationCommandParams[0], options);
return client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(Array.Empty<CreateApplicationCommandParams>(), options);
}

public static Task SendInteractionResponse(BaseDiscordClient client, InteractionResponse response,
public static Task SendInteractionResponseAsync(BaseDiscordClient client, InteractionResponse response,
ulong interactionId, string interactionToken, RequestOptions options = null)
{
return client.ApiClient.CreateInteractionResponseAsync(response, interactionId, interactionToken, options);
@@ -39,7 +40,7 @@ namespace Discord.Rest
{
var model = await client.ApiClient.CreateInteractionFollowupMessageAsync(args, token, options).ConfigureAwait(false);

RestFollowupMessage entity = RestFollowupMessage.Create(client, model, token, channel);
var entity = RestFollowupMessage.Create(client, model, token, channel);
return entity;
}
#endregion
@@ -50,22 +51,21 @@ namespace Discord.Rest
{
var model = await client.ApiClient.GetGlobalApplicationCommandAsync(id, options).ConfigureAwait(false);


return RestGlobalCommand.Create(client, model);
}
public static Task<ApplicationCommand> CreateGlobalCommand<TArg>(BaseDiscordClient client,
public static Task<ApplicationCommand> CreateGlobalCommandAsync<TArg>(BaseDiscordClient client,
Action<TArg> func, RequestOptions options = null) where TArg : ApplicationCommandProperties
{
var args = Activator.CreateInstance(typeof(TArg));
func((TArg)args);
return CreateGlobalCommand(client, (TArg)args, options);
return CreateGlobalCommandAsync(client, (TArg)args, options);
}
public static async Task<ApplicationCommand> CreateGlobalCommand(BaseDiscordClient client,
public static async Task<ApplicationCommand> CreateGlobalCommandAsync(BaseDiscordClient client,
ApplicationCommandProperties arg, RequestOptions options = null)
{
Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name));

var model = new CreateApplicationCommandParams()
var model = new CreateApplicationCommandParams
{
Name = arg.Name.Value,
Type = arg.Type,
@@ -81,25 +81,25 @@ namespace Discord.Rest
model.Description = slashProps.Description.Value;

model.Options = slashProps.Options.IsSpecified
? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray()
: Optional<Discord.API.ApplicationCommandOption[]>.Unspecified;
? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray()
: Optional<ApplicationCommandOption[]>.Unspecified;
}

return await client.ApiClient.CreateGlobalApplicationCommandAsync(model, options).ConfigureAwait(false);
}

public static async Task<ApplicationCommand[]> BulkOverwriteGlobalCommands(BaseDiscordClient client,
public static async Task<ApplicationCommand[]> BulkOverwriteGlobalCommandsAsync(BaseDiscordClient client,
ApplicationCommandProperties[] args, RequestOptions options = null)
{
Preconditions.NotNull(args, nameof(args));

List<CreateApplicationCommandParams> models = new List<CreateApplicationCommandParams>();
var models = new List<CreateApplicationCommandParams>();

foreach (var arg in args)
{
Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name));

var model = new CreateApplicationCommandParams()
var model = new CreateApplicationCommandParams
{
Name = arg.Name.Value,
Type = arg.Type,
@@ -115,28 +115,28 @@ namespace Discord.Rest
model.Description = slashProps.Description.Value;

model.Options = slashProps.Options.IsSpecified
? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray()
: Optional<Discord.API.ApplicationCommandOption[]>.Unspecified;
? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray()
: Optional<ApplicationCommandOption[]>.Unspecified;
}

models.Add(model);
}

return await client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(models.ToArray(), options).ConfigureAwait(false);
return await client.ApiClient.BulkOverwriteGlobalApplicationCommandsAsync(models.ToArray(), options).ConfigureAwait(false);
}

public static async Task<IReadOnlyCollection<ApplicationCommand>> BulkOverwriteGuildCommands(BaseDiscordClient client, ulong guildId,
public static async Task<IReadOnlyCollection<ApplicationCommand>> BulkOverwriteGuildCommandsAsync(BaseDiscordClient client, ulong guildId,
ApplicationCommandProperties[] args, RequestOptions options = null)
{
Preconditions.NotNull(args, nameof(args));

List<CreateApplicationCommandParams> models = new List<CreateApplicationCommandParams>();
var models = new List<CreateApplicationCommandParams>();

foreach (var arg in args)
{
Preconditions.NotNullOrEmpty(arg.Name, nameof(arg.Name));

var model = new CreateApplicationCommandParams()
var model = new CreateApplicationCommandParams
{
Name = arg.Name.Value,
Type = arg.Type,
@@ -152,8 +152,8 @@ namespace Discord.Rest
model.Description = slashProps.Description.Value;

model.Options = slashProps.Options.IsSpecified
? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray()
: Optional<Discord.API.ApplicationCommandOption[]>.Unspecified;
? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray()
: Optional<ApplicationCommandOption[]>.Unspecified;
}

models.Add(model);
@@ -180,15 +180,15 @@ namespace Discord.Rest
}
}

public static Task<ApplicationCommand> ModifyGlobalCommand<TArg>(BaseDiscordClient client, IApplicationCommand command,
public static Task<ApplicationCommand> ModifyGlobalCommandAsync<TArg>(BaseDiscordClient client, IApplicationCommand command,
Action<TArg> func, RequestOptions options = null) where TArg : ApplicationCommandProperties
{
var arg = GetApplicationCommandProperties<TArg>(command);
func(arg);
return ModifyGlobalCommand(client, command, arg, options);
return ModifyGlobalCommandAsync(client, command, arg, options);
}

public static async Task<ApplicationCommand> ModifyGlobalCommand(BaseDiscordClient client, IApplicationCommand command,
public static async Task<ApplicationCommand> ModifyGlobalCommandAsync(BaseDiscordClient client, IApplicationCommand command,
ApplicationCommandProperties args, RequestOptions options = null)
{
if (args.Name.IsSpecified)
@@ -197,7 +197,7 @@ namespace Discord.Rest
Preconditions.AtLeast(args.Name.Value.Length, 1, nameof(args.Name));
}

var model = new Discord.API.Rest.ModifyApplicationCommandParams()
var model = new ModifyApplicationCommandParams
{
Name = args.Name,
DefaultPermission = args.DefaultPermission.IsSpecified
@@ -205,7 +205,7 @@ namespace Discord.Rest
: Optional<bool>.Unspecified
};

if(args is SlashCommandProperties slashProps)
if (args is SlashCommandProperties slashProps)
{
if (slashProps.Description.IsSpecified)
{
@@ -222,15 +222,14 @@ namespace Discord.Rest
model.Description = slashProps.Description;

model.Options = slashProps.Options.IsSpecified
? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray()
: Optional<Discord.API.ApplicationCommandOption[]>.Unspecified;
? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray()
: Optional<ApplicationCommandOption[]>.Unspecified;
}

return await client.ApiClient.ModifyGlobalApplicationCommandAsync(model, command.Id, options).ConfigureAwait(false);
}


public static async Task DeleteGlobalCommand(BaseDiscordClient client, IApplicationCommand command, RequestOptions options = null)
public static async Task DeleteGlobalCommandAsync(BaseDiscordClient client, IApplicationCommand command, RequestOptions options = null)
{
Preconditions.NotNull(command, nameof(command));
Preconditions.NotEqual(command.Id, 0, nameof(command.Id));
@@ -240,18 +239,18 @@ namespace Discord.Rest
#endregion

#region Guild Commands
public static Task<ApplicationCommand> CreateGuildCommand<TArg>(BaseDiscordClient client, ulong guildId,
public static Task<ApplicationCommand> CreateGuildCommandAsync<TArg>(BaseDiscordClient client, ulong guildId,
Action<TArg> func, RequestOptions options) where TArg : ApplicationCommandProperties
{
var args = Activator.CreateInstance(typeof(TArg));
func((TArg)args);
return CreateGuildCommand(client, guildId, (TArg)args, options);
return CreateGuildCommandAsync(client, guildId, (TArg)args, options);
}

public static async Task<ApplicationCommand> CreateGuildCommand(BaseDiscordClient client, ulong guildId,
public static async Task<ApplicationCommand> CreateGuildCommandAsync(BaseDiscordClient client, ulong guildId,
ApplicationCommandProperties arg, RequestOptions options = null)
{
var model = new CreateApplicationCommandParams()
var model = new CreateApplicationCommandParams
{
Name = arg.Name.Value,
Type = arg.Type,
@@ -267,25 +266,25 @@ namespace Discord.Rest
model.Description = slashProps.Description.Value;

model.Options = slashProps.Options.IsSpecified
? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray()
: Optional<Discord.API.ApplicationCommandOption[]>.Unspecified;
? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray()
: Optional<ApplicationCommandOption[]>.Unspecified;
}

return await client.ApiClient.CreateGuildApplicationCommandAsync(model, guildId, options).ConfigureAwait(false);
}

public static Task<ApplicationCommand> ModifyGuildCommand<TArg>(BaseDiscordClient client, IApplicationCommand command, ulong guildId,
public static Task<ApplicationCommand> ModifyGuildCommandAsync<TArg>(BaseDiscordClient client, IApplicationCommand command, ulong guildId,
Action<TArg> func, RequestOptions options = null) where TArg : ApplicationCommandProperties
{
var arg = GetApplicationCommandProperties<TArg>(command);
func(arg);
return ModifyGuildCommand(client, command, guildId, arg, options);
return ModifyGuildCommandAsync(client, command, guildId, arg, options);
}

public static async Task<ApplicationCommand> ModifyGuildCommand(BaseDiscordClient client, IApplicationCommand command, ulong guildId,
public static async Task<ApplicationCommand> ModifyGuildCommandAsync(BaseDiscordClient client, IApplicationCommand command, ulong guildId,
ApplicationCommandProperties arg, RequestOptions options = null)
{
var model = new ModifyApplicationCommandParams()
var model = new ModifyApplicationCommandParams
{
Name = arg.Name,
DefaultPermission = arg.DefaultPermission.IsSpecified
@@ -300,14 +299,14 @@ namespace Discord.Rest
model.Description = slashProps.Description.Value;

model.Options = slashProps.Options.IsSpecified
? slashProps.Options.Value.Select(x => new Discord.API.ApplicationCommandOption(x)).ToArray()
: Optional<Discord.API.ApplicationCommandOption[]>.Unspecified;
? slashProps.Options.Value.Select(x => new ApplicationCommandOption(x)).ToArray()
: Optional<ApplicationCommandOption[]>.Unspecified;
}

return await client.ApiClient.ModifyGuildApplicationCommandAsync(model, guildId, command.Id, options).ConfigureAwait(false);
}

public static async Task DeleteGuildCommand(BaseDiscordClient client, ulong guildId, IApplicationCommand command, RequestOptions options = null)
public static async Task DeleteGuildCommandAsync(BaseDiscordClient client, ulong guildId, IApplicationCommand command, RequestOptions options = null)
{
Preconditions.NotNull(command, nameof(command));
Preconditions.NotEqual(command.Id, 0, nameof(command.Id));
@@ -315,21 +314,16 @@ namespace Discord.Rest
await client.ApiClient.DeleteGuildApplicationCommandAsync(guildId, command.Id, options).ConfigureAwait(false);
}

public static Task DeleteUnknownApplicationCommand(BaseDiscordClient client, ulong? guildId, IApplicationCommand command, RequestOptions options = null)
public static Task DeleteUnknownApplicationCommandAsync(BaseDiscordClient client, ulong? guildId, IApplicationCommand command, RequestOptions options = null)
{
if (guildId.HasValue)
{
return DeleteGuildCommand(client, guildId.Value, command, options);
}
else
{
return DeleteGlobalCommand(client, command, options);
}
return guildId.HasValue
? DeleteGuildCommandAsync(client, guildId.Value, command, options)
: DeleteGlobalCommandAsync(client, command, options);
}
#endregion

#region Responses
public static async Task<Discord.API.Message> ModifyFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, Action<MessageProperties> func,
public static async Task<Message> ModifyFollowupMessageAsync(BaseDiscordClient client, RestFollowupMessage message, Action<MessageProperties> func,
RequestOptions options = null)
{
var args = new MessageProperties();
@@ -359,21 +353,19 @@ namespace Discord.Rest

Preconditions.AtMost(apiEmbeds?.Count ?? 0, 10, nameof(args.Embeds), "A max of 10 embeds are allowed.");

var apiArgs = new API.Rest.ModifyInteractionResponseParams
var apiArgs = new ModifyInteractionResponseParams
{
Content = args.Content,
Embeds = apiEmbeds?.ToArray() ?? Optional<API.Embed[]>.Unspecified,
AllowedMentions = args.AllowedMentions.IsSpecified ? args.AllowedMentions.Value.ToModel() : Optional<API.AllowedMentions>.Unspecified,
Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional<API.ActionRowComponent[]>.Unspecified,
Components = args.Components.IsSpecified ? args.Components.Value?.Components.Select(x => new API.ActionRowComponent(x)).ToArray() : Optional<API.ActionRowComponent[]>.Unspecified
};

return await client.ApiClient.ModifyInteractionFollowupMessageAsync(apiArgs, message.Id, message.Token, options).ConfigureAwait(false);
}

public static async Task DeleteFollowupMessage(BaseDiscordClient client, RestFollowupMessage message, RequestOptions options = null)
public static async Task DeleteFollowupMessageAsync(BaseDiscordClient client, RestFollowupMessage message, RequestOptions options = null)
=> await client.ApiClient.DeleteInteractionFollowupMessageAsync(message.Id, message.Token, options);

public static async Task<Message> ModifyInteractionResponse(BaseDiscordClient client, string token, Action<MessageProperties> func,
public static async Task<Message> ModifyInteractionResponseAsync(BaseDiscordClient client, string token, Action<MessageProperties> func,
RequestOptions options = null)
{
var args = new MessageProperties();
@@ -415,25 +407,24 @@ namespace Discord.Rest
return await client.ApiClient.ModifyInteractionResponseAsync(apiArgs, token, options).ConfigureAwait(false);
}

public static async Task DeletedInteractionResponse(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null)
public static async Task DeleteInteractionResponseAsync(BaseDiscordClient client, RestInteractionMessage message, RequestOptions options = null)
=> await client.ApiClient.DeleteInteractionFollowupMessageAsync(message.Id, message.Token, options);

public static Task SendAutocompleteResult(BaseDiscordClient client, IEnumerable<AutocompleteResult> result, ulong interactionId,
public static Task SendAutocompleteResultAsync(BaseDiscordClient client, IEnumerable<AutocompleteResult> result, ulong interactionId,
string interactionToken, RequestOptions options)
{
if (result == null)
result = new AutocompleteResult[0];
result ??= Array.Empty<AutocompleteResult>();

Preconditions.AtMost(result.Count(), 20, nameof(result), "A maximum of 20 choices are allowed!");

var apiArgs = new InteractionResponse()
var apiArgs = new InteractionResponse
{
Type = InteractionResponseType.ApplicationCommandAutocompleteResult,
Data = new InteractionCallbackData()
Data = new InteractionCallbackData
{
Choices = result.Any()
? result.Select(x => new API.ApplicationCommandOptionChoice() { Name = x.Name, Value = x.Value }).ToArray()
: new ApplicationCommandOptionChoice[0]
? result.Select(x => new ApplicationCommandOptionChoice { Name = x.Name, Value = x.Value }).ToArray()
: Array.Empty<ApplicationCommandOptionChoice>()
}
};

@@ -448,7 +439,7 @@ namespace Discord.Rest
var models = await client.ApiClient.GetGuildApplicationCommandPermissionsAsync(guildId, options);
return models.Select(x =>
new GuildApplicationCommandPermission(x.Id, x.ApplicationId, guildId, x.Permissions.Select(
y => new Discord.ApplicationCommandPermission(y.Id, y.Type, y.Permission))
y => new ApplicationCommandPermission(y.Id, y.Type, y.Permission))
.ToArray())
).ToArray();
}
@@ -464,7 +455,7 @@ namespace Discord.Rest
}
catch (HttpException x)
{
if (x.HttpCode == System.Net.HttpStatusCode.NotFound)
if (x.HttpCode == HttpStatusCode.NotFound)
return null;
throw;
}
@@ -477,11 +468,11 @@ namespace Discord.Rest
Preconditions.AtMost(args.Length, 10, nameof(args));
Preconditions.AtLeast(args.Length, 0, nameof(args));

List<ApplicationCommandPermissions> permissionsList = new List<ApplicationCommandPermissions>();
var permissionsList = new List<ApplicationCommandPermissions>();

foreach (var arg in args)
{
var permissions = new ApplicationCommandPermissions()
var permissions = new ApplicationCommandPermissions
{
Id = arg.TargetId,
Permission = arg.Permission,
@@ -491,7 +482,7 @@ namespace Discord.Rest
permissionsList.Add(permissions);
}

ModifyGuildApplicationCommandPermissionsParams model = new ModifyGuildApplicationCommandPermissionsParams()
var model = new ModifyGuildApplicationCommandPermissionsParams
{
Permissions = permissionsList.ToArray()
};
@@ -508,16 +499,16 @@ namespace Discord.Rest
Preconditions.NotNull(args, nameof(args));
Preconditions.NotEqual(args.Count, 0, nameof(args));

List<ModifyGuildApplicationCommandPermissions> models = new List<ModifyGuildApplicationCommandPermissions>();
var models = new List<ModifyGuildApplicationCommandPermissions>();

foreach (var arg in args)
{
Preconditions.AtMost(arg.Value.Length, 10, nameof(args));

var model = new ModifyGuildApplicationCommandPermissions()
var model = new ModifyGuildApplicationCommandPermissions
{
Id = arg.Key,
Permissions = arg.Value.Select(x => new ApplicationCommandPermissions()
Permissions = arg.Value.Select(x => new ApplicationCommandPermissions
{
Id = x.TargetId,
Permission = x.Permission,


+ 6
- 15
src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs View File

@@ -2,7 +2,6 @@ using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Model = Discord.API.ApplicationCommand;

@@ -38,21 +37,13 @@ namespace Discord.Rest
=> SnowflakeUtils.FromSnowflake(Id);

internal RestApplicationCommand(BaseDiscordClient client, ulong id)
: base(client, id)
{

}
: base(client, id) { }

internal static RestApplicationCommand Create(BaseDiscordClient client, Model model, ulong? guildId)
{
if (guildId.HasValue)
{
return RestGuildCommand.Create(client, model, guildId.Value);
}
else
{
return RestGlobalCommand.Create(client, model);
}
return guildId.HasValue
? RestGuildCommand.Create(client, model, guildId.Value)
: RestGlobalCommand.Create(client, model);
}

internal virtual void Update(Model model)
@@ -64,7 +55,7 @@ namespace Discord.Rest
IsDefaultPermission = model.DefaultPermissions.GetValueOrDefault(true);

Options = model.Options.IsSpecified
? model.Options.Value.Select(x => RestApplicationCommandOption.Create(x)).ToImmutableArray()
? model.Options.Value.Select(RestApplicationCommandOption.Create).ToImmutableArray()
: ImmutableArray.Create<RestApplicationCommandOption>();
}

@@ -76,7 +67,7 @@ namespace Discord.Rest
{
return ModifyAsync<ApplicationCommandProperties>(func, options);
}
/// <inheritdoc/>
public abstract Task ModifyAsync<TArg>(Action<TArg> func, RequestOptions options = null)
where TArg : ApplicationCommandProperties;


+ 0
- 5
src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommandChoice.cs View File

@@ -1,8 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Model = Discord.API.ApplicationCommandOptionChoice;

namespace Discord.Rest


Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save