@@ -24,14 +24,41 @@ namespace Discord.WebSocket
/// </summary>
public IReadOnlyCollection<SocketSlashCommandDataOption> Options { get; private set; }
private SocketSlashCommandData data;
internal SocketSlashCommandDataOption() { }
internal SocketSlashCommandDataOption(SocketSlashCommandData data, Model model)
{
this.Name = model.Name;
this.Value = model.Value.IsSpecified ? model.Value.Value : null;
this.Type = model.Type;
if (model.Value.IsSpecified)
{
if (ulong.TryParse($"{model.Value.Value}", out var valueId))
{
switch (this.Type)
{
case ApplicationCommandOptionType.User:
var guildUser = data.guildMembers.FirstOrDefault(x => x.Key == valueId).Value;
if (guildUser != null)
this.Value = guildUser;
else
this.Value = data.users.FirstOrDefault(x => x.Key == valueId).Value;
break;
case ApplicationCommandOptionType.Channel:
this.Value = data.channels.FirstOrDefault(x => x.Key == valueId).Value;
break;
case ApplicationCommandOptionType.Role:
this.Value = data.roles.FirstOrDefault(x => x.Key == valueId).Value;
break;
default:
this.Value = model.Value.Value;
break;
}
}
else
this.Value = model.Value.Value;
}
this.Options = model.Options.Any()
? model.Options.Select(x => new SocketSlashCommandDataOption(data, x)).ToImmutableArray()
@@ -46,48 +73,6 @@ namespace Discord.WebSocket
public static explicit operator string(SocketSlashCommandDataOption option)
=> option.Value.ToString();
public static explicit operator SocketChannel(SocketSlashCommandDataOption option)
{
if(ulong.TryParse(option.Value.ToString(), out ulong id))
{
if (option.data.channels.TryGetValue(id, out var channel))
return channel;
}
return null;
}
public static explicit operator SocketRole(SocketSlashCommandDataOption option)
{
if (ulong.TryParse(option.Value.ToString(), out ulong id))
{
if (option.data.roles.TryGetValue(id, out var role))
return role;
}
return null;
}
public static explicit operator SocketUser(SocketSlashCommandDataOption option)
{
if (ulong.TryParse(option.Value.ToString(), out ulong id))
{
if (option.data.users.TryGetValue(id, out var user))
return user;
}
return null;
}
public static explicit operator SocketGuildUser(SocketSlashCommandDataOption option)
{
if (option.Value as SocketUser is SocketGuildUser guildUser)
return guildUser;
return null;
}
IReadOnlyCollection<IApplicationCommandInteractionDataOption> IApplicationCommandInteractionDataOption.Options => this.Options;
}
}