using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Model = Discord.API.ApplicationCommandInteractionDataOption;
namespace Discord.WebSocket
{
///
/// Represents a Websocket-based recieved by the gateway
///
public class SocketInteractionDataOption : IApplicationCommandInteractionDataOption
{
///
public string Name { get; private set; }
///
public object Value { get; private set; }
///
/// The sub command options recieved for this sub command group.
///
public IReadOnlyCollection Options { get; private set; }
private DiscordSocketClient discord;
private ulong guild;
internal SocketInteractionDataOption() { }
internal SocketInteractionDataOption(Model model, DiscordSocketClient discord, ulong guild)
{
this.Name = model.Name;
this.Value = model.Value.IsSpecified ? model.Value.Value : null;
this.discord = discord;
this.guild = guild;
this.Options = model.Options.IsSpecified
? model.Options.Value.Select(x => new SocketInteractionDataOption(x, discord, guild)).ToImmutableArray().ToReadOnlyCollection()
: null;
}
// Converters
public static explicit operator bool(SocketInteractionDataOption option)
=> (bool)option.Value;
// The default value is of type long, so an implementaiton of of the long option is trivial
public static explicit operator int(SocketInteractionDataOption option)
=> unchecked(
(int)( (long)option.Value )
);
public static explicit operator string(SocketInteractionDataOption option)
=> option.Value.ToString();
public static explicit operator bool?(SocketInteractionDataOption option)
{
if (option.Value == null)
return null;
else
return (bool)option;
}
public static explicit operator int?(SocketInteractionDataOption option)
{
if (option.Value == null)
return null;
else
return (int)option;
}
public static explicit operator SocketGuildChannel(SocketInteractionDataOption option)
{
if (ulong.TryParse((string)option.Value, out ulong id))
{
var guild = option.discord.GetGuild(option.guild);
if (guild == null)
return null;
return guild.GetChannel(id);
}
return null;
}
public static explicit operator SocketRole(SocketInteractionDataOption option)
{
if (ulong.TryParse((string)option.Value, out ulong id))
{
var guild = option.discord.GetGuild(option.guild);
if (guild == null)
return null;
return guild.GetRole(id);
}
return null;
}
public static explicit operator SocketGuildUser(SocketInteractionDataOption option)
{
if (ulong.TryParse((string)option.Value, out ulong id))
{
var guild = option.discord.GetGuild(option.guild);
if (guild == null)
return null;
return guild.GetUser(id);
}
return null;
}
IReadOnlyCollection IApplicationCommandInteractionDataOption.Options => this.Options;
}
}