Skip to content

Commit

Permalink
Fix: NRE with rest interactions & no api call (again) (#2922)
Browse files Browse the repository at this point in the history
* init

* add better error message in this case
  • Loading branch information
quinchs committed May 11, 2024
1 parent 3054505 commit 83fdc89
Show file tree
Hide file tree
Showing 9 changed files with 20 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,20 +27,20 @@ internal RestCommandBaseData(BaseDiscordClient client, Model model)
{
}

internal static async Task<RestCommandBaseData> CreateAsync(DiscordRestClient client, Model model, RestGuild guild, IRestMessageChannel channel, bool doApiCall)
internal static async Task<RestCommandBaseData> CreateAsync(DiscordRestClient client, Model model, RestGuild guild, ulong? guildId, IRestMessageChannel channel, bool doApiCall)
{
var entity = new RestCommandBaseData(client, model);
await entity.UpdateAsync(client, model, guild, channel, doApiCall).ConfigureAwait(false);
await entity.UpdateAsync(client, model, guild, guildId, channel, doApiCall).ConfigureAwait(false);
return entity;
}

internal virtual Task UpdateAsync(DiscordRestClient client, Model model, RestGuild guild, IRestMessageChannel channel, bool doApiCall)
internal virtual Task UpdateAsync(DiscordRestClient client, Model model, RestGuild guild, ulong? guildId, IRestMessageChannel channel, bool doApiCall)
{
Name = model.Name;
if (model.Resolved.IsSpecified && ResolvableData == null)
{
ResolvableData = new RestResolvableData<Model>();
return ResolvableData.PopulateAsync(client, guild, channel, model, doApiCall);
return ResolvableData.PopulateAsync(client, guild, guildId, channel, model, doApiCall);
}
return Task.CompletedTask;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ internal class RestResolvableData<T> where T : API.IResolvable
internal readonly Dictionary<ulong, Attachment> Attachments
= new Dictionary<ulong, Attachment>();

internal async Task PopulateAsync(DiscordRestClient discord, RestGuild guild, IRestMessageChannel channel, T model, bool doApiCall)
internal async Task PopulateAsync(DiscordRestClient discord, RestGuild guild, ulong? guildId, IRestMessageChannel channel, T model, bool doApiCall)
{
var resolved = model.Resolved.Value;

Expand Down Expand Up @@ -67,7 +67,7 @@ internal async Task PopulateAsync(DiscordRestClient discord, RestGuild guild, IR
{
// pull the adjacent user model
member.Value.User = resolved.Users.Value.FirstOrDefault(x => x.Key == member.Key).Value;
var restMember = RestGuildUser.Create(discord, guild, member.Value);
var restMember = RestGuildUser.Create(discord, guild, member.Value, guildId);

GuildMembers.Add(ulong.Parse(member.Key), restMember);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ internal override async Task UpdateAsync(DiscordRestClient client, Model model,
? (DataModel)model.Data.Value
: null;

Data = await RestMessageCommandData.CreateAsync(client, dataModel, Guild, Channel, doApiCall).ConfigureAwait(false);
Data = await RestMessageCommandData.CreateAsync(client, dataModel, Guild, model.GuildId.ToNullable(), Channel, doApiCall).ConfigureAwait(false);
}

//IMessageCommandInteraction
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ public override IReadOnlyCollection<IApplicationCommandInteractionDataOption> Op
internal RestMessageCommandData(DiscordRestClient client, Model model)
: base(client, model) { }

internal new static async Task<RestMessageCommandData> CreateAsync(DiscordRestClient client, Model model, RestGuild guild, IRestMessageChannel channel, bool doApiCall)
internal new static async Task<RestMessageCommandData> CreateAsync(DiscordRestClient client, Model model, RestGuild guild, ulong? guildId, IRestMessageChannel channel, bool doApiCall)
{
var entity = new RestMessageCommandData(client, model);
await entity.UpdateAsync(client, model, guild, channel, doApiCall).ConfigureAwait(false);
await entity.UpdateAsync(client, model, guild, guildId, channel, doApiCall).ConfigureAwait(false);
return entity;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ internal override async Task UpdateAsync(DiscordRestClient client, Model model,
? (DataModel)model.Data.Value
: null;

Data = await RestUserCommandData.CreateAsync(client, dataModel, Guild, Channel, doApiCall).ConfigureAwait(false);
Data = await RestUserCommandData.CreateAsync(client, dataModel, Guild, model.GuildId.ToNullable(), Channel, doApiCall).ConfigureAwait(false);
}

//IUserCommandInteractionData
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ public override IReadOnlyCollection<IApplicationCommandInteractionDataOption> Op
internal RestUserCommandData(DiscordRestClient client, Model model)
: base(client, model) { }

internal new static async Task<RestUserCommandData> CreateAsync(DiscordRestClient client, Model model, RestGuild guild, IRestMessageChannel channel, bool doApiCall)
internal new static async Task<RestUserCommandData> CreateAsync(DiscordRestClient client, Model model, RestGuild guild, ulong? guildId, IRestMessageChannel channel, bool doApiCall)
{
var entity = new RestUserCommandData(client, model);
await entity.UpdateAsync(client, model, guild, channel, doApiCall).ConfigureAwait(false);
await entity.UpdateAsync(client, model, guild, guildId, channel, doApiCall).ConfigureAwait(false);
return entity;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ internal override async Task UpdateAsync(DiscordRestClient client, Model model,
? (DataModel)model.Data.Value
: null;

Data = await RestSlashCommandData.CreateAsync(client, dataModel, Guild, Channel, doApiCall).ConfigureAwait(false);
Data = await RestSlashCommandData.CreateAsync(client, dataModel, Guild, model.GuildId.ToNullable(), Channel, doApiCall).ConfigureAwait(false);
}

//ISlashCommandInteraction
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ public class RestSlashCommandData : RestCommandBaseData<RestSlashCommandDataOpti
internal RestSlashCommandData(DiscordRestClient client, Model model)
: base(client, model) { }

internal static new async Task<RestSlashCommandData> CreateAsync(DiscordRestClient client, Model model, RestGuild guild, IRestMessageChannel channel, bool doApiCall)
internal new static async Task<RestSlashCommandData> CreateAsync(DiscordRestClient client, Model model, RestGuild guild, ulong? guildId, IRestMessageChannel channel, bool doApiCall)
{
var entity = new RestSlashCommandData(client, model);
await entity.UpdateAsync(client, model, guild, channel, doApiCall).ConfigureAwait(false);
await entity.UpdateAsync(client, model, guild, guildId, channel, doApiCall).ConfigureAwait(false);
return entity;
}
internal override async Task UpdateAsync(DiscordRestClient client, Model model, RestGuild guild, IRestMessageChannel channel, bool doApiCall)
internal override async Task UpdateAsync(DiscordRestClient client, Model model, RestGuild guild, ulong? guildId, IRestMessageChannel channel, bool doApiCall)
{
await base.UpdateAsync(client, model, guild, channel, doApiCall).ConfigureAwait(false);
await base.UpdateAsync(client, model, guild, guildId, channel, doApiCall).ConfigureAwait(false);

Options = model.Options.IsSpecified
? model.Options.Value.Select(x => new RestSlashCommandDataOption(this, x)).ToImmutableArray()
Expand Down
4 changes: 3 additions & 1 deletion src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,9 @@ internal RestGuildUser(BaseDiscordClient discord, IGuild guild, ulong id, ulong?
{
if (guild is not null)
Guild = guild;
GuildId = guildId ?? Guild.Id;

// kind of dangerous if the callee fucks up the 'guildId' parameter.
GuildId = guildId ?? Guild?.Id ?? throw new ArgumentNullException(nameof(guild), $"Expected either {nameof(guild)} or {nameof(guildId)} to be non-null");
}
internal static RestGuildUser Create(BaseDiscordClient discord, IGuild guild, Model model, ulong? guildId = null)
{
Expand Down

0 comments on commit 83fdc89

Please sign in to comment.