using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Model = Discord.API.ApplicationCommand;
namespace Discord.Rest
{
///
/// Represents a Rest-based implementation of the .
///
public abstract class RestApplicationCommand : RestEntity, IApplicationCommand
{
///
public ulong ApplicationId { get; private set; }
///
public ApplicationCommandType Type { get; private set; }
///
public string Name { get; private set; }
///
public string Description { get; private set; }
///
public bool IsDefaultPermission { get; private set; }
///
public bool IsEnabledInDm { get; private set; }
///
public GuildPermissions DefaultMemberPermissions { get; private set; }
///
/// Gets a collection of options for this command.
///
public IReadOnlyCollection Options { get; private set; }
///
public DateTimeOffset CreatedAt
=> SnowflakeUtils.FromSnowflake(Id);
internal RestApplicationCommand(BaseDiscordClient client, ulong id)
: base(client, id) { }
internal static RestApplicationCommand Create(BaseDiscordClient client, Model model, ulong? guildId)
{
return guildId.HasValue
? RestGuildCommand.Create(client, model, guildId.Value)
: RestGlobalCommand.Create(client, model);
}
internal virtual void Update(Model model)
{
Type = model.Type;
ApplicationId = model.ApplicationId;
Name = model.Name;
Description = model.Description;
IsDefaultPermission = model.DefaultPermissions.GetValueOrDefault(true);
Options = model.Options.IsSpecified
? model.Options.Value.Select(RestApplicationCommandOption.Create).ToImmutableArray()
: ImmutableArray.Create();
IsEnabledInDm = model.DmPermission.GetValueOrDefault(true).GetValueOrDefault(true);
DefaultMemberPermissions = new GuildPermissions((ulong)model.DefaultMemberPermission.GetValueOrDefault(0).GetValueOrDefault(0));
}
///
public abstract Task DeleteAsync(RequestOptions options = null);
///
public Task ModifyAsync(Action func, RequestOptions options = null)
{
return ModifyAsync(func, options);
}
///
public abstract Task ModifyAsync(Action func, RequestOptions options = null)
where TArg : ApplicationCommandProperties;
IReadOnlyCollection IApplicationCommand.Options => Options;
}
}