Browse Source

Fix gateway interactions not running without bot scope. (#2217)

* Init

* Implement public channelId
tags/3.5.0
Armano den Boef GitHub 3 years ago
parent
commit
8522447c27
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 9 deletions
  1. +7
    -3
      src/Discord.Net.WebSocket/DiscordSocketClient.cs
  2. +16
    -6
      src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs

+ 7
- 3
src/Discord.Net.WebSocket/DiscordSocketClient.cs View File

@@ -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.
}
}
}


+ 16
- 6
src/Discord.Net.WebSocket/Entities/Interaction/SocketInteraction.cs View File

@@ -19,13 +19,25 @@ namespace Discord.WebSocket
/// Gets the <see cref="ISocketMessageChannel"/> this interaction was used in.
/// </summary>
/// <remarks>
/// 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 <see langword="null"/>.
/// </remarks>
public ISocketMessageChannel Channel { get; private set; }

/// <summary>
/// Gets the ID of the channel this interaction was used in.
/// </summary>
/// <remarks>
/// This property is exposed in cases where the bot scope is not provided, so the channel entity cannot be retrieved.
/// <br />
/// To get the channel, you can call <see cref="GetChannelAsync(RequestOptions)"/>
/// as this method makes a request for a <see cref="RestChannel"/> if nothing was found in cache.
/// </remarks>
public ulong? ChannelId { get; private set; }

/// <summary>
/// Gets the <see cref="SocketUser"/> who triggered this interaction.
/// This property will be <see langword="null"/> if the bot scope isn't used.
/// </summary>
public SocketUser User { get; private set; }

@@ -62,8 +74,6 @@ namespace Discord.WebSocket
/// <inheritdoc/>
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.
}


Loading…
Cancel
Save