Browse Source

feature: V2 Permissions (#2222)

* Initial V2 permissions

* add perms-v2 attributes and properties, add deprecation messages

* add perms-v2 properties to command info classes

* add perms-v2 fields to Rest/SocketApplicationCommand entities and IApplicationCommand

* fix json name of DmPermission field

Co-authored-by: Cenngo <cenk.ergen1@gmail.com>
tags/3.6.0
Quin Lynch GitHub 3 years ago
parent
commit
d98b3cc495
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 451 additions and 9 deletions
  1. +10
    -0
      src/Discord.Net.Core/Entities/Interactions/ApplicationCommandProperties.cs
  2. +35
    -1
      src/Discord.Net.Core/Entities/Interactions/ContextMenus/MessageCommandBuilder.cs
  3. +35
    -1
      src/Discord.Net.Core/Entities/Interactions/ContextMenus/UserCommandBuilder.cs
  4. +13
    -0
      src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs
  5. +34
    -0
      src/Discord.Net.Core/Entities/Interactions/SlashCommands/SlashCommandBuilder.cs
  6. +25
    -0
      src/Discord.Net.Interactions/Attributes/DefaultMemberPermissionAttribute.cs
  7. +1
    -0
      src/Discord.Net.Interactions/Attributes/DefaultPermissionAttribute.cs
  8. +25
    -0
      src/Discord.Net.Interactions/Attributes/EnabledInDmAttribute.cs
  9. +38
    -0
      src/Discord.Net.Interactions/Builders/Commands/ContextCommandBuilder.cs
  10. +38
    -0
      src/Discord.Net.Interactions/Builders/Commands/SlashCommandBuilder.cs
  11. +38
    -0
      src/Discord.Net.Interactions/Builders/ModuleBuilder.cs
  12. +30
    -0
      src/Discord.Net.Interactions/Builders/ModuleClassBuilder.cs
  13. +8
    -0
      src/Discord.Net.Interactions/Info/Commands/ContextCommands/ContextCommandInfo.cs
  14. +8
    -0
      src/Discord.Net.Interactions/Info/Commands/SlashCommandInfo.cs
  15. +13
    -0
      src/Discord.Net.Interactions/Info/IApplicationCommandInfo.cs
  16. +28
    -0
      src/Discord.Net.Interactions/Info/ModuleInfo.cs
  17. +18
    -3
      src/Discord.Net.Interactions/Utilities/ApplicationCommandRestUtil.cs
  18. +7
    -0
      src/Discord.Net.Rest/API/Common/ApplicationCommand.cs
  19. +6
    -0
      src/Discord.Net.Rest/API/Rest/CreateApplicationCommandParams.cs
  20. +21
    -4
      src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs
  21. +10
    -0
      src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs
  22. +10
    -0
      src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs

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

@@ -17,6 +17,16 @@ namespace Discord
/// </summary>
public Optional<bool> IsDefaultPermission { get; set; }

/// <summary>
/// Gets or sets whether or not this command can be used in DMs.
/// </summary>
public Optional<bool> IsDMEnabled { get; set; }

/// <summary>
/// Gets or sets the default permissions required by a user to execute this application command.
/// </summary>
public Optional<GuildPermission> DefaultMemberPermissions { get; set; }

internal ApplicationCommandProperties() { }
}
}

+ 35
- 1
src/Discord.Net.Core/Entities/Interactions/ContextMenus/MessageCommandBuilder.cs View File

@@ -31,6 +31,16 @@ namespace Discord
/// </summary>
public bool IsDefaultPermission { get; set; } = true;

/// <summary>
/// Gets or sets whether or not this command can be used in DMs.
/// </summary>
public bool IsDMEnabled { get; set; } = true;

/// <summary>
/// Gets or sets the default permission required to use this slash command.
/// </summary>
public GuildPermission? DefaultMemberPermissions { get; set; }

private string _name;

/// <summary>
@@ -44,7 +54,9 @@ namespace Discord
var props = new MessageCommandProperties
{
Name = Name,
IsDefaultPermission = IsDefaultPermission
IsDefaultPermission = IsDefaultPermission,
IsDMEnabled = IsDMEnabled,
DefaultMemberPermissions = DefaultMemberPermissions ?? Optional<GuildPermission>.Unspecified
};

return props;
@@ -73,5 +85,27 @@ namespace Discord
IsDefaultPermission = isDefaultPermission;
return this;
}

/// <summary>
/// Sets whether or not this command can be used in dms
/// </summary>
/// <param name="permission"><see langword="true"/> if the command is available in dms, otherwise <see langword="false"/>.</param>
/// <returns>The current builder.</returns>
public MessageCommandBuilder WithDMPermission(bool permission)
{
IsDMEnabled = permission;
return this;
}

/// <summary>
/// Sets the default member permissions required to use this application command.
/// </summary>
/// <param name="permissions">The permissions required to use this command.</param>
/// <returns>The current builder.</returns>
public MessageCommandBuilder WithDefaultMemberPermissions(GuildPermission? permissions)
{
DefaultMemberPermissions = permissions;
return this;
}
}
}

+ 35
- 1
src/Discord.Net.Core/Entities/Interactions/ContextMenus/UserCommandBuilder.cs View File

@@ -31,6 +31,16 @@ namespace Discord
/// </summary>
public bool IsDefaultPermission { get; set; } = true;

/// <summary>
/// Gets or sets whether or not this command can be used in DMs.
/// </summary>
public bool IsDMEnabled { get; set; } = true;

/// <summary>
/// Gets or sets the default permission required to use this slash command.
/// </summary>
public GuildPermission? DefaultMemberPermissions { get; set; }

private string _name;

/// <summary>
@@ -42,7 +52,9 @@ namespace Discord
var props = new UserCommandProperties
{
Name = Name,
IsDefaultPermission = IsDefaultPermission
IsDefaultPermission = IsDefaultPermission,
IsDMEnabled = IsDMEnabled,
DefaultMemberPermissions = DefaultMemberPermissions ?? Optional<GuildPermission>.Unspecified
};

return props;
@@ -71,5 +83,27 @@ namespace Discord
IsDefaultPermission = isDefaultPermission;
return this;
}

/// <summary>
/// Sets whether or not this command can be used in dms
/// </summary>
/// <param name="permission"><see langword="true"/> if the command is available in dms, otherwise <see langword="false"/>.</param>
/// <returns>The current builder.</returns>
public UserCommandBuilder WithDMPermission(bool permission)
{
IsDMEnabled = permission;
return this;
}

/// <summary>
/// Sets the default member permissions required to use this application command.
/// </summary>
/// <param name="permissions">The permissions required to use this command.</param>
/// <returns>The current builder.</returns>
public UserCommandBuilder WithDefaultMemberPermissions(GuildPermission? permissions)
{
DefaultMemberPermissions = permissions;
return this;
}
}
}

+ 13
- 0
src/Discord.Net.Core/Entities/Interactions/IApplicationCommand.cs View File

@@ -34,6 +34,19 @@ namespace Discord
/// </summary>
bool IsDefaultPermission { get; }

/// <summary>
/// Indicates whether the command is available in DMs with the app.
/// </summary>
/// <remarks>
/// Only for globally-scoped commands.
/// </remarks>
bool IsEnabledInDm { get; }

/// <summary>
/// Set of default <see cref="GuildPermission"/> required to invoke the command.
/// </summary>
GuildPermissions DefaultMemberPermissions { get; }

/// <summary>
/// Gets a collection of options for this application command.
/// </summary>


+ 34
- 0
src/Discord.Net.Core/Entities/Interactions/SlashCommands/SlashCommandBuilder.cs View File

@@ -81,6 +81,16 @@ namespace Discord
/// </summary>
public bool IsDefaultPermission { get; set; } = true;

/// <summary>
/// Gets or sets whether or not this command can be used in DMs.
/// </summary>
public bool IsDMEnabled { get; set; } = true;

/// <summary>
/// Gets or sets the default permission required to use this slash command.
/// </summary>
public GuildPermission? DefaultMemberPermissions { get; set; }

private string _name;
private string _description;
private List<SlashCommandOptionBuilder> _options;
@@ -96,6 +106,8 @@ namespace Discord
Name = Name,
Description = Description,
IsDefaultPermission = IsDefaultPermission,
IsDMEnabled = IsDMEnabled,
DefaultMemberPermissions = DefaultMemberPermissions ?? Optional<GuildPermission>.Unspecified
};

if (Options != null && Options.Any())
@@ -145,6 +157,28 @@ namespace Discord
return this;
}

/// <summary>
/// Sets whether or not this command can be used in dms
/// </summary>
/// <param name="permission"><see langword="true"/> if the command is available in dms, otherwise <see langword="false"/>.</param>
/// <returns>The current builder.</returns>
public SlashCommandBuilder WithDMPermission(bool permission)
{
IsDMEnabled = permission;
return this;
}

/// <summary>
/// Sets the default member permissions required to use this application command.
/// </summary>
/// <param name="permissions">The permissions required to use this command.</param>
/// <returns>The current builder.</returns>
public SlashCommandBuilder WithDefaultMemberPermissions(GuildPermission? permissions)
{
DefaultMemberPermissions = permissions;
return this;
}

/// <summary>
/// Adds an option to the current slash command.
/// </summary>


+ 25
- 0
src/Discord.Net.Interactions/Attributes/DefaultMemberPermissionAttribute.cs View File

@@ -0,0 +1,25 @@
using System;

namespace Discord.Interactions
{
/// <summary>
/// Sets the <see cref="IApplicationCommandInfo.DefaultMemberPermissions"/> of an application command or module.
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class DefaultMemberPermissionsAttribute : Attribute
{
/// <summary>
/// Gets the default permission required to use this command.
/// </summary>
public GuildPermission Permissions { get; }

/// <summary>
/// Sets the <see cref="IApplicationCommandInfo.DefaultMemberPermissions"/> of an application command or module.
/// </summary>
/// <param name="permissions">The default permission required to use this command.</param>
public DefaultMemberPermissionsAttribute(GuildPermission permissions)
{
Permissions = permissions;
}
}
}

+ 1
- 0
src/Discord.Net.Interactions/Attributes/DefaultPermissionAttribute.cs View File

@@ -6,6 +6,7 @@ namespace Discord.Interactions
/// Set the "Default Permission" property of an Application Command.
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
[Obsolete($"Soon to be deprecated, use Permissions-v2 attributes like {nameof(EnabledInDmAttribute)} and {nameof(DefaultMemberPermissionsAttribute)}")]
public class DefaultPermissionAttribute : Attribute
{
/// <summary>


+ 25
- 0
src/Discord.Net.Interactions/Attributes/EnabledInDmAttribute.cs View File

@@ -0,0 +1,25 @@
using System;

namespace Discord.Interactions
{
/// <summary>
/// Sets the <see cref="IApplicationCommandInfo.IsEnabledInDm"/> property of an application command or module.
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class EnabledInDmAttribute : Attribute
{
/// <summary>
/// Gets whether or not this command can be used in DMs.
/// </summary>
public bool IsEnabled { get; }

/// <summary>
/// Sets the <see cref="IApplicationCommandInfo.IsEnabledInDm"/> property of an application command or module.
/// </summary>
/// <param name="isEnabled">Whether or not this command can be used in DMs.</param>
public EnabledInDmAttribute(bool isEnabled)
{
IsEnabled = isEnabled;
}
}
}

+ 38
- 0
src/Discord.Net.Interactions/Builders/Commands/ContextCommandBuilder.cs View File

@@ -17,8 +17,19 @@ namespace Discord.Interactions.Builders
/// <summary>
/// Gets the default permission of this command.
/// </summary>
[Obsolete($"To be deprecated soon, use {nameof(IsEnabledInDm)} and {nameof(DefaultMemberPermissions)} instead.")]
public bool DefaultPermission { get; set; } = true;

/// <summary>
/// Gets whether this command can be used in DMs.
/// </summary>
public bool IsEnabledInDm { get; set; } = true;

/// <summary>
/// Gets the default permissions needed for executing this command.
/// </summary>
public GuildPermission? DefaultMemberPermissions { get; set; } = null;

internal ContextCommandBuilder (ModuleBuilder module) : base(module) { }

/// <summary>
@@ -49,6 +60,7 @@ namespace Discord.Interactions.Builders
/// <returns>
/// The builder instance.
/// </returns>
[Obsolete($"To be deprecated soon, use {nameof(SetEnabledInDm)} and {nameof(WithDefaultMemberPermissions)} instead.")]
public ContextCommandBuilder SetDefaultPermission (bool defaultPermision)
{
DefaultPermission = defaultPermision;
@@ -70,6 +82,32 @@ namespace Discord.Interactions.Builders
return this;
}

/// <summary>
/// Sets <see cref="IsEnabledInDm"/>.
/// </summary>
/// <param name="isEnabled">New value of the <see cref="IsEnabledInDm"/>.</param>
/// <returns>
/// The builder instance.
/// </returns>
public ContextCommandBuilder SetEnabledInDm(bool isEnabled)
{
IsEnabledInDm = isEnabled;
return this;
}

/// <summary>
/// Sets <see cref="DefaultMemberPermissions"/>.
/// </summary>
/// <param name="permissions">New value of the <see cref="DefaultMemberPermissions"/>.</param>
/// <returns>
/// The builder instance.
/// </returns>
public ContextCommandBuilder WithDefaultMemberPermissions(GuildPermission permissions)
{
DefaultMemberPermissions = permissions;
return this;
}

internal override ContextCommandInfo Build (ModuleInfo module, InteractionService commandService) =>
ContextCommandInfo.Create(this, module, commandService);
}


+ 38
- 0
src/Discord.Net.Interactions/Builders/Commands/SlashCommandBuilder.cs View File

@@ -17,8 +17,19 @@ namespace Discord.Interactions.Builders
/// <summary>
/// Gets and sets the default permission of this command.
/// </summary>
[Obsolete($"To be deprecated soon, use {nameof(IsEnabledInDm)} and {nameof(DefaultMemberPermissions)} instead.")]
public bool DefaultPermission { get; set; } = true;

/// <summary>
/// Gets whether this command can be used in DMs.
/// </summary>
public bool IsEnabledInDm { get; set; } = true;

/// <summary>
/// Gets the default permissions needed for executing this command.
/// </summary>
public GuildPermission? DefaultMemberPermissions { get; set; } = null;

internal SlashCommandBuilder (ModuleBuilder module) : base(module) { }

/// <summary>
@@ -49,6 +60,7 @@ namespace Discord.Interactions.Builders
/// <returns>
/// The builder instance.
/// </returns>
[Obsolete($"To be deprecated soon, use {nameof(SetEnabledInDm)} and {nameof(WithDefaultMemberPermissions)} instead.")]
public SlashCommandBuilder WithDefaultPermission (bool permission)
{
DefaultPermission = permission;
@@ -70,6 +82,32 @@ namespace Discord.Interactions.Builders
return this;
}

/// <summary>
/// Sets <see cref="IsEnabledInDm"/>.
/// </summary>
/// <param name="isEnabled">New value of the <see cref="IsEnabledInDm"/>.</param>
/// <returns>
/// The builder instance.
/// </returns>
public SlashCommandBuilder SetEnabledInDm(bool isEnabled)
{
IsEnabledInDm = isEnabled;
return this;
}

/// <summary>
/// Sets <see cref="DefaultMemberPermissions"/>.
/// </summary>
/// <param name="permissions">New value of the <see cref="DefaultMemberPermissions"/>.</param>
/// <returns>
/// The builder instance.
/// </returns>
public SlashCommandBuilder WithDefaultMemberPermissions(GuildPermission permissions)
{
DefaultMemberPermissions = permissions;
return this;
}

internal override SlashCommandInfo Build (ModuleInfo module, InteractionService commandService) =>
new SlashCommandInfo(this, module, commandService);
}


+ 38
- 0
src/Discord.Net.Interactions/Builders/ModuleBuilder.cs View File

@@ -51,8 +51,19 @@ namespace Discord.Interactions.Builders
/// <summary>
/// Gets and sets the default permission of this module.
/// </summary>
[Obsolete($"To be deprecated soon, use {nameof(IsEnabledInDm)} and {nameof(DefaultMemberPermissions)} instead.")]
public bool DefaultPermission { get; set; } = true;

/// <summary>
/// Gets whether this command can be used in DMs.
/// </summary>
public bool IsEnabledInDm { get; set; } = true;

/// <summary>
/// Gets the default permissions needed for executing this command.
/// </summary>
public GuildPermission? DefaultMemberPermissions { get; set; } = null;

/// <summary>
/// Gets and sets whether this has a <see cref="DontAutoRegisterAttribute"/>.
/// </summary>
@@ -159,12 +170,39 @@ namespace Discord.Interactions.Builders
/// <returns>
/// The builder instance.
/// </returns>
[Obsolete($"To be deprecated soon, use {nameof(SetEnabledInDm)} and {nameof(WithDefaultMemberPermissions)} instead.")]
public ModuleBuilder WithDefaultPermission (bool permission)
{
DefaultPermission = permission;
return this;
}

/// <summary>
/// Sets <see cref="IsEnabledInDm"/>.
/// </summary>
/// <param name="isEnabled">New value of the <see cref="IsEnabledInDm"/>.</param>
/// <returns>
/// The builder instance.
/// </returns>
public ModuleBuilder SetEnabledInDm(bool isEnabled)
{
IsEnabledInDm = isEnabled;
return this;
}

/// <summary>
/// Sets <see cref="DefaultMemberPermissions"/>.
/// </summary>
/// <param name="permissions">New value of the <see cref="DefaultMemberPermissions"/>.</param>
/// <returns>
/// The builder instance.
/// </returns>
public ModuleBuilder WithDefaultMemberPermissions(GuildPermission permissions)
{
DefaultMemberPermissions = permissions;
return this;
}

/// <summary>
/// Adds attributes to <see cref="Attributes"/>.
/// </summary>


+ 30
- 0
src/Discord.Net.Interactions/Builders/ModuleClassBuilder.cs View File

@@ -85,6 +85,16 @@ namespace Discord.Interactions.Builders
builder.DefaultPermission = defPermission.IsDefaultPermission;
}
break;
case EnabledInDmAttribute enabledInDm:
{
builder.IsEnabledInDm = enabledInDm.IsEnabled;
}
break;
case DefaultMemberPermissionsAttribute memberPermission:
{
builder.DefaultMemberPermissions = memberPermission.Permissions;
}
break;
case PreconditionAttribute precondition:
builder.AddPreconditions(precondition);
break;
@@ -169,6 +179,16 @@ namespace Discord.Interactions.Builders
builder.DefaultPermission = defaultPermission.IsDefaultPermission;
}
break;
case EnabledInDmAttribute enabledInDm:
{
builder.IsEnabledInDm = enabledInDm.IsEnabled;
}
break;
case DefaultMemberPermissionsAttribute memberPermission:
{
builder.DefaultMemberPermissions = memberPermission.Permissions;
}
break;
case PreconditionAttribute precondition:
builder.WithPreconditions(precondition);
break;
@@ -211,6 +231,16 @@ namespace Discord.Interactions.Builders
builder.DefaultPermission = defaultPermission.IsDefaultPermission;
}
break;
case EnabledInDmAttribute enabledInDm:
{
builder.IsEnabledInDm = enabledInDm.IsEnabled;
}
break;
case DefaultMemberPermissionsAttribute memberPermission:
{
builder.DefaultMemberPermissions = memberPermission.Permissions;
}
break;
case PreconditionAttribute precondition:
builder.WithPreconditions(precondition);
break;


+ 8
- 0
src/Discord.Net.Interactions/Info/Commands/ContextCommands/ContextCommandInfo.cs View File

@@ -17,6 +17,12 @@ namespace Discord.Interactions
/// <inheritdoc/>
public bool DefaultPermission { get; }

/// <inheritdoc/>
public bool IsEnabledInDm { get; }

/// <inheritdoc/>
public GuildPermission? DefaultMemberPermissions { get; }

/// <inheritdoc/>
public override IReadOnlyCollection<CommandParameterInfo> Parameters { get; }

@@ -31,6 +37,8 @@ namespace Discord.Interactions
{
CommandType = builder.CommandType;
DefaultPermission = builder.DefaultPermission;
IsEnabledInDm = builder.IsEnabledInDm;
DefaultMemberPermissions = builder.DefaultMemberPermissions;
Parameters = builder.Parameters.Select(x => x.Build(this)).ToImmutableArray();
}



+ 8
- 0
src/Discord.Net.Interactions/Info/Commands/SlashCommandInfo.cs View File

@@ -26,6 +26,12 @@ namespace Discord.Interactions
/// <inheritdoc/>
public bool DefaultPermission { get; }

/// <inheritdoc/>
public bool IsEnabledInDm { get; }

/// <inheritdoc/>
public GuildPermission? DefaultMemberPermissions { get; }

/// <inheritdoc/>
public override IReadOnlyCollection<SlashCommandParameterInfo> Parameters { get; }

@@ -41,6 +47,8 @@ namespace Discord.Interactions
{
Description = builder.Description;
DefaultPermission = builder.DefaultPermission;
IsEnabledInDm = builder.IsEnabledInDm;
DefaultMemberPermissions = builder.DefaultMemberPermissions;
Parameters = builder.Parameters.Select(x => x.Build(this)).ToImmutableArray();
FlattenedParameters = FlattenParameters(Parameters).ToImmutableArray();



+ 13
- 0
src/Discord.Net.Interactions/Info/IApplicationCommandInfo.cs View File

@@ -1,3 +1,5 @@
using System;

namespace Discord.Interactions
{
/// <summary>
@@ -18,6 +20,17 @@ namespace Discord.Interactions
/// <summary>
/// Gets the DefaultPermission of this command.
/// </summary>
[Obsolete($"To be deprecated soon, use {nameof(IsEnabledInDm)} and {nameof(DefaultMemberPermissions)} instead.")]
bool DefaultPermission { get; }

/// <summary>
/// Gets whether this command can be used in DMs.
/// </summary>
public bool IsEnabledInDm { get; }

/// <summary>
/// Gets the default permissions needed for executing this command.
/// </summary>
public GuildPermission? DefaultMemberPermissions { get; }
}
}

+ 28
- 0
src/Discord.Net.Interactions/Info/ModuleInfo.cs View File

@@ -41,8 +41,19 @@ namespace Discord.Interactions
/// <summary>
/// Gets the default Permission of this module.
/// </summary>
[Obsolete($"To be deprecated soon, use {nameof(IsEnabledInDm)} and {nameof(DefaultMemberPermissions)} instead.")]
public bool DefaultPermission { get; }

/// <summary>
/// Gets whether this command can be used in DMs.
/// </summary>
public bool IsEnabledInDm { get; }

/// <summary>
/// Gets the default permissions needed for executing this command.
/// </summary>
public GuildPermission? DefaultMemberPermissions { get; }

/// <summary>
/// Gets the collection of Sub Modules of this module.
/// </summary>
@@ -110,6 +121,8 @@ namespace Discord.Interactions
Description = builder.Description;
Parent = parent;
DefaultPermission = builder.DefaultPermission;
IsEnabledInDm = builder.IsEnabledInDm;
DefaultMemberPermissions = BuildDefaultMemberPermissions(builder);
SlashCommands = BuildSlashCommands(builder).ToImmutableArray();
ContextCommands = BuildContextCommands(builder).ToImmutableArray();
ComponentCommands = BuildComponentCommands(builder).ToImmutableArray();
@@ -226,5 +239,20 @@ namespace Discord.Interactions
}
return true;
}

private static GuildPermission? BuildDefaultMemberPermissions(ModuleBuilder builder)
{
var permissions = builder.DefaultMemberPermissions;

var parent = builder.Parent;

while (parent != null)
{
permissions = (permissions ?? 0) | (parent.DefaultMemberPermissions ?? 0);
parent = parent.Parent;
}

return permissions;
}
}
}

+ 18
- 3
src/Discord.Net.Interactions/Utilities/ApplicationCommandRestUtil.cs View File

@@ -40,7 +40,8 @@ namespace Discord.Interactions
{
Name = commandInfo.Name,
Description = commandInfo.Description,
IsDefaultPermission = commandInfo.DefaultPermission,
IsDMEnabled = commandInfo.IsEnabledInDm,
DefaultMemberPermissions = (commandInfo.DefaultMemberPermissions ?? 0) | (commandInfo.Module.DefaultMemberPermissions ?? 0)
}.Build();

if (commandInfo.Parameters.Count > SlashCommandBuilder.MaxOptionsCount)
@@ -64,8 +65,20 @@ namespace Discord.Interactions
public static ApplicationCommandProperties ToApplicationCommandProps(this ContextCommandInfo commandInfo)
=> commandInfo.CommandType switch
{
ApplicationCommandType.Message => new MessageCommandBuilder { Name = commandInfo.Name, IsDefaultPermission = commandInfo.DefaultPermission}.Build(),
ApplicationCommandType.User => new UserCommandBuilder { Name = commandInfo.Name, IsDefaultPermission=commandInfo.DefaultPermission}.Build(),
ApplicationCommandType.Message => new MessageCommandBuilder
{
Name = commandInfo.Name,
IsDefaultPermission = commandInfo.DefaultPermission,
DefaultMemberPermissions = (commandInfo.DefaultMemberPermissions ?? 0) | (commandInfo.Module.DefaultMemberPermissions ?? 0),
IsDMEnabled = commandInfo.IsEnabledInDm
}.Build(),
ApplicationCommandType.User => new UserCommandBuilder
{
Name = commandInfo.Name,
IsDefaultPermission = commandInfo.DefaultPermission,
DefaultMemberPermissions = (commandInfo.DefaultMemberPermissions ?? 0) | (commandInfo.Module.DefaultMemberPermissions ?? 0),
IsDMEnabled = commandInfo.IsEnabledInDm
}.Build(),
_ => throw new InvalidOperationException($"{commandInfo.CommandType} isn't a supported command type.")
};
#endregion
@@ -113,6 +126,8 @@ namespace Discord.Interactions
Name = moduleInfo.SlashGroupName,
Description = moduleInfo.Description,
IsDefaultPermission = moduleInfo.DefaultPermission,
IsDMEnabled = moduleInfo.IsEnabledInDm,
DefaultMemberPermissions = moduleInfo.DefaultMemberPermissions
}.Build();

if (options.Count > SlashCommandBuilder.MaxOptionsCount)


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

@@ -24,5 +24,12 @@ namespace Discord.API

[JsonProperty("default_permission")]
public Optional<bool> DefaultPermissions { get; set; }

// V2 Permissions
[JsonProperty("dm_permission")]
public Optional<bool?> DmPermission { get; set; }

[JsonProperty("default_member_permissions")]
public Optional<GuildPermission?> DefaultMemberPermission { get; set; }
}
}

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

@@ -19,6 +19,12 @@ namespace Discord.API.Rest
[JsonProperty("default_permission")]
public Optional<bool> DefaultPermission { get; set; }

[JsonProperty("dm_permission")]
public Optional<bool?> DmPermission { get; set; }

[JsonProperty("default_member_permissions")]
public Optional<GuildPermission?> DefaultMemberPermission { get; set; }

public CreateApplicationCommandParams() { }
public CreateApplicationCommandParams(string name, string description, ApplicationCommandType type, ApplicationCommandOption[] options = null)
{


+ 21
- 4
src/Discord.Net.Rest/Entities/Interactions/InteractionHelper.cs View File

@@ -100,7 +100,12 @@ namespace Discord.Rest
Type = arg.Type,
DefaultPermission = arg.IsDefaultPermission.IsSpecified
? arg.IsDefaultPermission.Value
: Optional<bool>.Unspecified
: Optional<bool>.Unspecified,

// TODO: better conversion to nullable optionals
DefaultMemberPermission = arg.DefaultMemberPermissions.ToNullable(),
DmPermission = arg.IsDMEnabled.ToNullable()
};

if (arg is SlashCommandProperties slashProps)
@@ -134,7 +139,11 @@ namespace Discord.Rest
Type = arg.Type,
DefaultPermission = arg.IsDefaultPermission.IsSpecified
? arg.IsDefaultPermission.Value
: Optional<bool>.Unspecified
: Optional<bool>.Unspecified,

// TODO: better conversion to nullable optionals
DefaultMemberPermission = arg.DefaultMemberPermissions.ToNullable(),
DmPermission = arg.IsDMEnabled.ToNullable()
};

if (arg is SlashCommandProperties slashProps)
@@ -171,7 +180,11 @@ namespace Discord.Rest
Type = arg.Type,
DefaultPermission = arg.IsDefaultPermission.IsSpecified
? arg.IsDefaultPermission.Value
: Optional<bool>.Unspecified
: Optional<bool>.Unspecified,

// TODO: better conversion to nullable optionals
DefaultMemberPermission = arg.DefaultMemberPermissions.ToNullable(),
DmPermission = arg.IsDMEnabled.ToNullable()
};

if (arg is SlashCommandProperties slashProps)
@@ -285,7 +298,11 @@ namespace Discord.Rest
Type = arg.Type,
DefaultPermission = arg.IsDefaultPermission.IsSpecified
? arg.IsDefaultPermission.Value
: Optional<bool>.Unspecified
: Optional<bool>.Unspecified,

// TODO: better conversion to nullable optionals
DefaultMemberPermission = arg.DefaultMemberPermissions.ToNullable(),
DmPermission = arg.IsDMEnabled.ToNullable()
};

if (arg is SlashCommandProperties slashProps)


+ 10
- 0
src/Discord.Net.Rest/Entities/Interactions/RestApplicationCommand.cs View File

@@ -27,6 +27,12 @@ namespace Discord.Rest
/// <inheritdoc/>
public bool IsDefaultPermission { get; private set; }

/// <inheritdoc/>
public bool IsEnabledInDm { get; private set; }

/// <inheritdoc/>
public GuildPermissions DefaultMemberPermissions { get; private set; }

/// <summary>
/// Gets a collection of options for this command.
/// </summary>
@@ -57,6 +63,10 @@ namespace Discord.Rest
Options = model.Options.IsSpecified
? model.Options.Value.Select(RestApplicationCommandOption.Create).ToImmutableArray()
: ImmutableArray.Create<RestApplicationCommandOption>();

IsEnabledInDm = model.DmPermission.GetValueOrDefault(true).GetValueOrDefault(true);
DefaultMemberPermissions = model.DefaultMemberPermission.IsSpecified
? new GuildPermissions((ulong)model.DefaultMemberPermission.Value) : GuildPermissions.None;
}

/// <inheritdoc/>


+ 10
- 0
src/Discord.Net.WebSocket/Entities/Interaction/SocketBaseCommand/SocketApplicationCommand.cs View File

@@ -36,6 +36,12 @@ namespace Discord.WebSocket
/// <inheritdoc/>
public bool IsDefaultPermission { get; private set; }

/// <inheritdoc/>
public bool IsEnabledInDm { get; private set; }

/// <inheritdoc/>
public GuildPermissions DefaultMemberPermissions { get; private set; }

/// <summary>
/// Gets a collection of <see cref="SocketApplicationCommandOption"/>s for this command.
/// </summary>
@@ -86,6 +92,10 @@ namespace Discord.WebSocket
Options = model.Options.IsSpecified
? model.Options.Value.Select(SocketApplicationCommandOption.Create).ToImmutableArray()
: ImmutableArray.Create<SocketApplicationCommandOption>();

IsEnabledInDm = model.DmPermission.GetValueOrDefault(true).GetValueOrDefault(true);
DefaultMemberPermissions = model.DefaultMemberPermission.IsSpecified
? new GuildPermissions((ulong)model.DefaultMemberPermission.Value) : GuildPermissions.None;
}

/// <inheritdoc/>


Loading…
Cancel
Save