@@ -1,6 +1,9 @@
using Discord.Rest;
using Discord.Utils;
using System;
using System.Linq;
using System.Collections.Generic;
using System.Collections.Immutable;
using Model = Discord.API.MessageComponentInteractionData;
namespace Discord.WebSocket
@@ -19,27 +22,74 @@ namespace Discord.WebSocket
/// <inheritdoc />
public IReadOnlyCollection<string> Values { get; }
/// <inheritdoc cref="IComponentInteractionData.Channels"/>/>
public IReadOnlyCollection<SocketChannel> Channels { get; }
/// <inheritdoc cref="IComponentInteractionData.Users"/>/>
public IReadOnlyCollection<RestUser> Users { get; }
/// <inheritdoc cref="IComponentInteractionData.Roles"/>/>
public IReadOnlyCollection<SocketRole> Roles { get; }
/// <inheritdoc cref="IComponentInteractionData.Members"/>/>
public IReadOnlyCollection<SocketGuildUser> Members { get; }
#region IComponentInteractionData
/// <inheritdoc />
public IReadOnlyCollection<IChannel> Channels { get; }
IReadOnlyCollection<IChannel> IComponentInteractionData.Channels => Channels;
/// <inheritdoc />
public IReadOnlyCollection<IUser> Users { get; }
IReadOnlyCollection<IUser> IComponentInteractionData.Users => Users;
/// <inheritdoc />
public IReadOnlyCollection<IRole> Roles { get; }
IReadOnlyCollection<IRole> IComponentInteractionData.Roles => Roles;
/// <inheritdoc />
IReadOnlyCollection<IGuildUser> IComponentInteractionData.Members => Members;
#endregion
/// <inheritdoc />
public string Value { get; }
internal SocketMessageComponentData(Model model)
internal SocketMessageComponentData(Model model, DiscordSocketClient discord, ClientState state, SocketGuild guild )
{
CustomId = model.CustomId;
Type = model.ComponentType;
Values = model.Values.GetValueOrDefault();
Value = model.Value.GetValueOrDefault();
if (model.Resolved.IsSpecified)
{
Users = model.Resolved.Value.Users.IsSpecified
? model.Resolved.Value.Users.Value.Select(user => RestUser.Create(discord, user.Value)).ToImmutableArray()
: null;
Members = model.Resolved.Value.Members.IsSpecified
? model.Resolved.Value.Members.Value.Select(member =>
{
member.Value.User = model.Resolved.Value.Users.Value.First(u => u.Key == member.Key).Value;
return SocketGuildUser.Create(guild, state, member.Value);
}).ToImmutableArray()
: null;
Channels = model.Resolved.Value.Channels.IsSpecified
? model.Resolved.Value.Channels.Value.Select(
channel =>
{
if (channel.Value.Type is ChannelType.DM)
return SocketDMChannel.Create(discord, state, channel.Value);
return (SocketChannel)SocketGuildChannel.Create(guild, state, channel.Value);
}).ToImmutableArray()
: null;
Roles = model.Resolved.Value.Roles.IsSpecified
? model.Resolved.Value.Roles.Value.Select(role => SocketRole.Create(guild, state, role.Value)).ToImmutableArray()
: null;
}
}
internal SocketMessageComponentData(IMessageComponent component)
internal SocketMessageComponentData(IMessageComponent component, DiscordSocketClient discord, ClientState state, SocketGuild guild )
{
CustomId = component.CustomId;
Type = component.Type;
@@ -51,6 +101,35 @@ namespace Discord.WebSocket
if (component is API.SelectMenuComponent select)
{
Values = select.Values.GetValueOrDefault(null);
if (select.Resolved.IsSpecified)
{
Users = select.Resolved.Value.Users.IsSpecified
? select.Resolved.Value.Users.Value.Select(user => RestUser.Create(discord, user.Value)).ToImmutableArray()
: null;
Members = select.Resolved.Value.Members.IsSpecified
? select.Resolved.Value.Members.Value.Select(member =>
{
member.Value.User = select.Resolved.Value.Users.Value.First(u => u.Key == member.Key).Value;
return SocketGuildUser.Create(guild, state, member.Value);
}).ToImmutableArray()
: null;
Channels = select.Resolved.Value.Channels.IsSpecified
? select.Resolved.Value.Channels.Value.Select(
channel =>
{
if (channel.Value.Type is ChannelType.DM)
return SocketDMChannel.Create(discord, state, channel.Value);
return (SocketChannel)SocketGuildChannel.Create(guild, state, channel.Value);
}).ToImmutableArray()
: null;
Roles = select.Resolved.Value.Roles.IsSpecified
? select.Resolved.Value.Roles.Value.Select(role => SocketRole.Create(guild, state, role.Value)).ToImmutableArray()
: null;
}
}
}
}