diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs
index f33d89047..b2da962ab 100644
--- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs
+++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs
@@ -2331,7 +2331,7 @@ namespace Discord.WebSocket
SocketUser user = data.User.IsSpecified
? State.GetOrAddUser(data.User.Value.Id, (_) => SocketGlobalUser.Create(this, State, data.User.Value))
- : guild.AddOrUpdateUser(data.Member.Value);
+ : guild?.AddOrUpdateUser(data.Member.Value); // null if the bot scope isn't set, so the guild cannot be retrieved.
SocketChannel channel = null;
if(data.ChannelId.IsSpecified)
@@ -2346,8 +2346,12 @@ namespace Discord.WebSocket
}
else
{
- await UnknownChannelAsync(type, data.ChannelId.Value).ConfigureAwait(false);
- return;
+ if (guild != null) // The guild id is set, but the guild cannot be found as the bot scope is not set.
+ {
+ await UnknownChannelAsync(type, data.ChannelId.Value).ConfigureAwait(false);
+ return;
+ }
+ // The channel isnt required when responding to an interaction, so we can leave the channel null.
}
}
}
diff --git a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs
index 8b5bd9c32..5b2da04f5 100644
--- a/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs
+++ b/src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs
@@ -19,13 +19,25 @@ namespace Discord.WebSocket
/// Gets the this interaction was used in.
///
///
- /// If the channel isn't cached or the bot doesn't have access to it then
+ /// If the channel isn't cached, the bot scope isn't used, or the bot doesn't have access to it then
/// this property will be .
///
public ISocketMessageChannel Channel { get; private set; }
+ ///
+ /// Gets the ID of the channel this interaction was used in.
+ ///
+ ///
+ /// This property is exposed in cases where the bot scope is not provided, so the channel entity cannot be retrieved.
+ ///
+ /// To get the channel, you can call
+ /// as this method makes a request for a if nothing was found in cache.
+ ///
+ public ulong? ChannelId { get; private set; }
+
///
/// Gets the who triggered this interaction.
+ /// This property will be if the bot scope isn't used.
///
public SocketUser User { get; private set; }
@@ -62,8 +74,6 @@ namespace Discord.WebSocket
///
public bool IsDMInteraction { get; private set; }
- private ulong? _channelId;
-
internal SocketInteraction(DiscordSocketClient client, ulong id, ISocketMessageChannel channel, SocketUser user)
: base(client, id)
{
@@ -111,7 +121,7 @@ namespace Discord.WebSocket
{
IsDMInteraction = !model.GuildId.IsSpecified;
- _channelId = model.ChannelId.ToNullable();
+ ChannelId = model.ChannelId.ToNullable();
Data = model.Data.IsSpecified
? model.Data.Value
@@ -396,12 +406,12 @@ namespace Discord.WebSocket
if (Channel != null)
return Channel;
- if (!_channelId.HasValue)
+ if (!ChannelId.HasValue)
return null;
try
{
- return (IMessageChannel)await Discord.GetChannelAsync(_channelId.Value, options).ConfigureAwait(false);
+ 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.
}