Fix: NRE with rest interactions & no api call (again) (#2922)
* init * add better error message in this case
This commit is contained in:
@@ -27,20 +27,20 @@ namespace Discord.Rest
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
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;
|
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;
|
Name = model.Name;
|
||||||
if (model.Resolved.IsSpecified && ResolvableData == null)
|
if (model.Resolved.IsSpecified && ResolvableData == null)
|
||||||
{
|
{
|
||||||
ResolvableData = new RestResolvableData<Model>();
|
ResolvableData = new RestResolvableData<Model>();
|
||||||
return ResolvableData.PopulateAsync(client, guild, channel, model, doApiCall);
|
return ResolvableData.PopulateAsync(client, guild, guildId, channel, model, doApiCall);
|
||||||
}
|
}
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ namespace Discord.Rest
|
|||||||
internal readonly Dictionary<ulong, Attachment> Attachments
|
internal readonly Dictionary<ulong, Attachment> Attachments
|
||||||
= new Dictionary<ulong, Attachment>();
|
= 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;
|
var resolved = model.Resolved.Value;
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ namespace Discord.Rest
|
|||||||
{
|
{
|
||||||
// pull the adjacent user model
|
// pull the adjacent user model
|
||||||
member.Value.User = resolved.Users.Value.FirstOrDefault(x => x.Key == member.Key).Value;
|
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);
|
GuildMembers.Add(ulong.Parse(member.Key), restMember);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ namespace Discord.Rest
|
|||||||
? (DataModel)model.Data.Value
|
? (DataModel)model.Data.Value
|
||||||
: null;
|
: 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
|
//IMessageCommandInteraction
|
||||||
|
|||||||
@@ -28,10 +28,10 @@ namespace Discord.Rest
|
|||||||
internal RestMessageCommandData(DiscordRestClient client, Model model)
|
internal RestMessageCommandData(DiscordRestClient client, Model model)
|
||||||
: base(client, 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);
|
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;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ namespace Discord.Rest
|
|||||||
? (DataModel)model.Data.Value
|
? (DataModel)model.Data.Value
|
||||||
: null;
|
: 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
|
//IUserCommandInteractionData
|
||||||
|
|||||||
@@ -26,10 +26,10 @@ namespace Discord.Rest
|
|||||||
internal RestUserCommandData(DiscordRestClient client, Model model)
|
internal RestUserCommandData(DiscordRestClient client, Model model)
|
||||||
: base(client, 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);
|
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;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ namespace Discord.Rest
|
|||||||
? (DataModel)model.Data.Value
|
? (DataModel)model.Data.Value
|
||||||
: null;
|
: 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
|
//ISlashCommandInteraction
|
||||||
|
|||||||
@@ -14,15 +14,15 @@ namespace Discord.Rest
|
|||||||
internal RestSlashCommandData(DiscordRestClient client, Model model)
|
internal RestSlashCommandData(DiscordRestClient client, Model model)
|
||||||
: base(client, 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);
|
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;
|
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
|
Options = model.Options.IsSpecified
|
||||||
? model.Options.Value.Select(x => new RestSlashCommandDataOption(this, x)).ToImmutableArray()
|
? model.Options.Value.Select(x => new RestSlashCommandDataOption(this, x)).ToImmutableArray()
|
||||||
|
|||||||
@@ -91,7 +91,9 @@ namespace Discord.Rest
|
|||||||
{
|
{
|
||||||
if (guild is not null)
|
if (guild is not null)
|
||||||
Guild = guild;
|
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)
|
internal static RestGuildUser Create(BaseDiscordClient discord, IGuild guild, Model model, ulong? guildId = null)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user