Fix channel being null in DMs on Interactions (#2098)

This commit is contained in:
Quin Lynch
2022-02-11 21:43:32 -04:00
committed by GitHub
parent 0352374e74
commit 7e1b8c9db0
12 changed files with 111 additions and 64 deletions

View File

@@ -13,8 +13,8 @@ namespace Discord.WebSocket
/// </summary>
public new SocketMessageCommandData Data { get; }
internal SocketMessageCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel)
: base(client, model, channel)
internal SocketMessageCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel, SocketUser user)
: base(client, model, channel, user)
{
var dataModel = model.Data.IsSpecified
? (DataModel)model.Data.Value
@@ -27,9 +27,9 @@ namespace Discord.WebSocket
Data = SocketMessageCommandData.Create(client, dataModel, model.Id, guildId);
}
internal new static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel)
internal new static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel, SocketUser user)
{
var entity = new SocketMessageCommand(client, model, channel);
var entity = new SocketMessageCommand(client, model, channel, user);
entity.Update(model);
return entity;
}

View File

@@ -13,8 +13,8 @@ namespace Discord.WebSocket
/// </summary>
public new SocketUserCommandData Data { get; }
internal SocketUserCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel)
: base(client, model, channel)
internal SocketUserCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel, SocketUser user)
: base(client, model, channel, user)
{
var dataModel = model.Data.IsSpecified
? (DataModel)model.Data.Value
@@ -27,9 +27,9 @@ namespace Discord.WebSocket
Data = SocketUserCommandData.Create(client, dataModel, model.Id, guildId);
}
internal new static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel)
internal new static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel, SocketUser user)
{
var entity = new SocketUserCommand(client, model, channel);
var entity = new SocketUserCommand(client, model, channel, user);
entity.Update(model);
return entity;
}

View File

@@ -28,8 +28,8 @@ namespace Discord.WebSocket
private object _lock = new object();
public override bool HasResponded { get; internal set; } = false;
internal SocketMessageComponent(DiscordSocketClient client, Model model, ISocketMessageChannel channel)
: base(client, model.Id, channel)
internal SocketMessageComponent(DiscordSocketClient client, Model model, ISocketMessageChannel channel, SocketUser user)
: base(client, model.Id, channel, user)
{
var dataModel = model.Data.IsSpecified
? (DataModel)model.Data.Value
@@ -38,9 +38,9 @@ namespace Discord.WebSocket
Data = new SocketMessageComponentData(dataModel);
}
internal new static SocketMessageComponent Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel)
internal new static SocketMessageComponent Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel, SocketUser user)
{
var entity = new SocketMessageComponent(client, model, channel);
var entity = new SocketMessageComponent(client, model, channel, user);
entity.Update(model);
return entity;
}

View File

@@ -22,8 +22,8 @@ namespace Discord.WebSocket
/// <value></value>
public new SocketModalData Data { get; set; }
internal SocketModal(DiscordSocketClient client, ModelBase model, ISocketMessageChannel channel)
: base(client, model.Id, channel)
internal SocketModal(DiscordSocketClient client, ModelBase model, ISocketMessageChannel channel, SocketUser user)
: base(client, model.Id, channel, user)
{
var dataModel = model.Data.IsSpecified
? (DataModel)model.Data.Value
@@ -32,9 +32,9 @@ namespace Discord.WebSocket
Data = new SocketModalData(dataModel);
}
internal new static SocketModal Create(DiscordSocketClient client, ModelBase model, ISocketMessageChannel channel)
internal new static SocketModal Create(DiscordSocketClient client, ModelBase model, ISocketMessageChannel channel, SocketUser user)
{
var entity = new SocketModal(client, model, channel);
var entity = new SocketModal(client, model, channel, user);
entity.Update(model);
return entity;
}

View File

@@ -21,8 +21,8 @@ namespace Discord.WebSocket
public override bool HasResponded { get; internal set; }
private object _lock = new object();
internal SocketAutocompleteInteraction(DiscordSocketClient client, Model model, ISocketMessageChannel channel)
: base(client, model.Id, channel)
internal SocketAutocompleteInteraction(DiscordSocketClient client, Model model, ISocketMessageChannel channel, SocketUser user)
: base(client, model.Id, channel, user)
{
var dataModel = model.Data.IsSpecified
? (DataModel)model.Data.Value
@@ -32,9 +32,9 @@ namespace Discord.WebSocket
Data = new SocketAutocompleteInteractionData(dataModel);
}
internal new static SocketAutocompleteInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel)
internal new static SocketAutocompleteInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel, SocketUser user)
{
var entity = new SocketAutocompleteInteraction(client, model, channel);
var entity = new SocketAutocompleteInteraction(client, model, channel, user);
entity.Update(model);
return entity;
}

View File

@@ -13,8 +13,8 @@ namespace Discord.WebSocket
/// </summary>
public new SocketSlashCommandData Data { get; }
internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel)
: base(client, model, channel)
internal SocketSlashCommand(DiscordSocketClient client, Model model, ISocketMessageChannel channel, SocketUser user)
: base(client, model, channel, user)
{
var dataModel = model.Data.IsSpecified
? (DataModel)model.Data.Value
@@ -27,9 +27,9 @@ namespace Discord.WebSocket
Data = SocketSlashCommandData.Create(client, dataModel, guildId);
}
internal new static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel)
internal new static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel, SocketUser user)
{
var entity = new SocketSlashCommand(client, model, channel);
var entity = new SocketSlashCommand(client, model, channel, user);
entity.Update(model);
return entity;
}

View File

@@ -35,8 +35,8 @@ namespace Discord.WebSocket
private object _lock = new object();
internal SocketCommandBase(DiscordSocketClient client, Model model, ISocketMessageChannel channel)
: base(client, model.Id, channel)
internal SocketCommandBase(DiscordSocketClient client, Model model, ISocketMessageChannel channel, SocketUser user)
: base(client, model.Id, channel, user)
{
var dataModel = model.Data.IsSpecified
? (DataModel)model.Data.Value
@@ -49,9 +49,9 @@ namespace Discord.WebSocket
Data = SocketCommandBaseData.Create(client, dataModel, model.Id, guildId);
}
internal new static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel)
internal new static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel, SocketUser user)
{
var entity = new SocketCommandBase(client, model, channel);
var entity = new SocketCommandBase(client, model, channel, user);
entity.Update(model);
return entity;
}

View File

@@ -5,6 +5,7 @@ using Model = Discord.API.Interaction;
using DataModel = Discord.API.ApplicationCommandInteractionData;
using System.IO;
using System.Collections.Generic;
using Discord.Net;
namespace Discord.WebSocket
{
@@ -72,17 +73,23 @@ namespace Discord.WebSocket
public bool IsValidToken
=> InteractionHelper.CanRespondOrFollowup(this);
internal SocketInteraction(DiscordSocketClient client, ulong id, ISocketMessageChannel channel)
/// <inheritdoc/>
public bool IsDMInteraction { get; private set; }
private ulong? _channelId;
internal SocketInteraction(DiscordSocketClient client, ulong id, ISocketMessageChannel channel, SocketUser user)
: base(client, id)
{
Channel = channel;
User = user;
CreatedAt = client.UseInteractionSnowflakeDate
? SnowflakeUtils.FromSnowflake(Id)
: DateTime.UtcNow;
}
internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel)
internal static SocketInteraction Create(DiscordSocketClient client, Model model, ISocketMessageChannel channel, SocketUser user)
{
if (model.Type == InteractionType.ApplicationCommand)
{
@@ -95,27 +102,31 @@ namespace Discord.WebSocket
return dataModel.Type switch
{
ApplicationCommandType.Slash => SocketSlashCommand.Create(client, model, channel),
ApplicationCommandType.Message => SocketMessageCommand.Create(client, model, channel),
ApplicationCommandType.User => SocketUserCommand.Create(client, model, channel),
ApplicationCommandType.Slash => SocketSlashCommand.Create(client, model, channel, user),
ApplicationCommandType.Message => SocketMessageCommand.Create(client, model, channel, user),
ApplicationCommandType.User => SocketUserCommand.Create(client, model, channel, user),
_ => null
};
}
if (model.Type == InteractionType.MessageComponent)
return SocketMessageComponent.Create(client, model, channel);
return SocketMessageComponent.Create(client, model, channel, user);
if (model.Type == InteractionType.ApplicationCommandAutocomplete)
return SocketAutocompleteInteraction.Create(client, model, channel);
return SocketAutocompleteInteraction.Create(client, model, channel, user);
if (model.Type == InteractionType.ModalSubmit)
return SocketModal.Create(client, model, channel);
return SocketModal.Create(client, model, channel, user);
return null;
}
internal virtual void Update(Model model)
{
IsDMInteraction = !model.GuildId.IsSpecified;
_channelId = model.ChannelId.ToNullable();
Data = model.Data.IsSpecified
? model.Data.Value
: null;
@@ -123,18 +134,6 @@ namespace Discord.WebSocket
Version = model.Version;
Type = model.Type;
if (User == null)
{
if (model.Member.IsSpecified && model.GuildId.IsSpecified)
{
User = SocketGuildUser.Create(Discord.State.GetGuild(model.GuildId.Value), Discord.State, model.Member.Value);
}
else
{
User = SocketGlobalUser.Create(Discord, Discord.State, model.User.Value);
}
}
UserLocale = model.UserLocale.IsSpecified
? model.UserLocale.Value
: null;
@@ -399,6 +398,28 @@ namespace Discord.WebSocket
public abstract Task RespondWithModalAsync(Modal modal, RequestOptions options = null);
#endregion
/// <summary>
/// Attepts to get the channel this interaction was executed in.
/// </summary>
/// <param name="options">The request options for this <see langword="async"/> request.</param>
/// <returns>
/// A task that represents the asynchronous operation of fetching the channel.
/// </returns>
public async ValueTask<IMessageChannel> GetChannelAsync(RequestOptions options = null)
{
if (Channel != null)
return Channel;
if (!_channelId.HasValue)
return null;
try
{
return (IMessageChannel)await Discord.GetChannelAsync(_channelId.Value, options).ConfigureAwait(false);
}
catch(HttpException ex) when (ex.DiscordCode == DiscordErrorCode.MissingPermissions) { return null; } // bot can't view that channel, return null instead of throwing.
}
#region IDiscordInteraction
/// <inheritdoc/>
IUser IDiscordInteraction.User => User;