Skip to content

Commit

Permalink
Implement smarter rest resolvable interaction data. Fixes discord-net…
Browse files Browse the repository at this point in the history
  • Loading branch information
quinchs committed Nov 22, 2021
1 parent 3c96381 commit 1cfa704
Show file tree
Hide file tree
Showing 9 changed files with 49 additions and 26 deletions.
17 changes: 17 additions & 0 deletions src/Discord.Net.Rest/Entities/Channels/RestChannel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,23 @@ ChannelType.PrivateThread or
_ => new RestChannel(discord, model.Id),
};
}
internal static RestChannel Create(BaseDiscordClient discord, Model model, IGuild guild)
{
return model.Type switch
{
ChannelType.News or
ChannelType.Text or
ChannelType.Voice or
ChannelType.Stage or
ChannelType.NewsThread or
ChannelType.PrivateThread or
ChannelType.PublicThread
=> RestGuildChannel.Create(discord, guild, model),
ChannelType.DM or ChannelType.Group => CreatePrivate(discord, model) as RestChannel,
ChannelType.Category => RestCategoryChannel.Create(discord, guild, model),
_ => new RestChannel(discord, model.Id),
};
}
/// <exception cref="InvalidOperationException">Unexpected channel type.</exception>
internal static IRestPrivateChannel CreatePrivate(BaseDiscordClient discord, Model model)
{
Expand Down
19 changes: 13 additions & 6 deletions src/Discord.Net.Rest/Entities/Channels/RestGuildChannel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,20 @@ internal static RestGuildChannel Create(BaseDiscordClient discord, IGuild guild,
internal override void Update(Model model)
{
Name = model.Name.Value;
Position = model.Position.Value;

var overwrites = model.PermissionOverwrites.Value;
var newOverwrites = ImmutableArray.CreateBuilder<Overwrite>(overwrites.Length);
for (int i = 0; i < overwrites.Length; i++)
newOverwrites.Add(overwrites[i].ToEntity());
_overwrites = newOverwrites.ToImmutable();
if (model.Position.IsSpecified)
{
Position = model.Position.Value;
}

if (model.PermissionOverwrites.IsSpecified)
{
var overwrites = model.PermissionOverwrites.Value;
var newOverwrites = ImmutableArray.CreateBuilder<Overwrite>(overwrites.Length);
for (int i = 0; i < overwrites.Length; i++)
newOverwrites.Add(overwrites[i].ToEntity());
_overwrites = newOverwrites.ToImmutable();
}
}

/// <inheritdoc />
Expand Down
8 changes: 6 additions & 2 deletions src/Discord.Net.Rest/Entities/Channels/RestVoiceChannel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,12 @@ internal override void Update(Model model)
{
base.Update(model);
CategoryId = model.CategoryId;
Bitrate = model.Bitrate.Value;
UserLimit = model.UserLimit.Value != 0 ? model.UserLimit.Value : (int?)null;

if(model.Bitrate.IsSpecified)
Bitrate = model.Bitrate.Value;

if(model.UserLimit.IsSpecified)
UserLimit = model.UserLimit.Value != 0 ? model.UserLimit.Value : (int?)null;
}

/// <inheritdoc />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,6 @@ internal RestCommandBase(DiscordRestClient client, Model model)
internal override async Task UpdateAsync(DiscordRestClient client, Model model)
{
await base.UpdateAsync(client, model).ConfigureAwait(false);

var data = model.Data.IsSpecified
? (DataModel)model.Data.Value
: null;

if(Data == null)
{
Data = await RestCommandBaseData.CreateAsync(client, data, Guild, Channel).ConfigureAwait(false);
}
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,14 @@ internal RestCommandBaseData(BaseDiscordClient client, Model model)
{
}

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

internal virtual async Task UpdateAsync(DiscordRestClient client, Model model, IGuild guild, IRestMessageChannel channel)
internal virtual async Task UpdateAsync(DiscordRestClient client, Model model, RestGuild guild, IRestMessageChannel channel)
{
Name = model.Name;
if (model.Resolved.IsSpecified && ResolvableData == null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ internal readonly Dictionary<ulong, RestRole> Roles
internal readonly Dictionary<ulong, RestMessage> Messages
= new Dictionary<ulong, RestMessage>();

internal async Task PopulateAsync(DiscordRestClient discord, IGuild guild, IRestMessageChannel channel, T model)
internal async Task PopulateAsync(DiscordRestClient discord, RestGuild guild, IRestMessageChannel channel, T model)
{
var resolved = model.Resolved.Value;

Expand All @@ -35,11 +35,13 @@ internal async Task PopulateAsync(DiscordRestClient discord, IGuild guild, IRest

if (resolved.Channels.IsSpecified)
{
//var channels = await guild.GetChannelsAsync().ConfigureAwait(false);
var channels = await guild.GetChannelsAsync().ConfigureAwait(false);

foreach (var channelModel in resolved.Channels.Value)
{
var restChannel = RestChannel.Create(discord, channelModel.Value);
var restChannel = channels.FirstOrDefault(x => x.Id == channelModel.Value.Id);

restChannel.Update(channelModel.Value);

Channels.Add(ulong.Parse(channelModel.Key), restChannel);
}
Expand All @@ -49,6 +51,8 @@ internal async Task PopulateAsync(DiscordRestClient discord, IGuild guild, IRest
{
foreach (var member in resolved.Members.Value)
{
// 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);

GuildMembers.Add(ulong.Parse(member.Key), restMember);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ 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, IGuild guild, IRestMessageChannel channel)
internal new static async Task<RestMessageCommandData> CreateAsync(DiscordRestClient client, Model model, RestGuild guild, IRestMessageChannel channel)
{
var entity = new RestMessageCommandData(client, model);
await entity.UpdateAsync(client, model, guild, channel).ConfigureAwait(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ 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, IGuild guild, IRestMessageChannel channel)
internal new static async Task<RestUserCommandData> CreateAsync(DiscordRestClient client, Model model, RestGuild guild, IRestMessageChannel channel)
{
var entity = new RestUserCommandData(client, model);
await entity.UpdateAsync(client, model, guild, channel).ConfigureAwait(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ 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, IGuild guild, IRestMessageChannel channel)
internal static new async Task<RestSlashCommandData> CreateAsync(DiscordRestClient client, Model model, RestGuild guild, IRestMessageChannel channel)
{
var entity = new RestSlashCommandData(client, model);
await entity.UpdateAsync(client, model, guild, channel).ConfigureAwait(false);
return entity;
}
internal override async Task UpdateAsync(DiscordRestClient client, Model model, IGuild guild, IRestMessageChannel channel)
internal override async Task UpdateAsync(DiscordRestClient client, Model model, RestGuild guild, IRestMessageChannel channel)
{
await base.UpdateAsync(client, model, guild, channel).ConfigureAwait(false);

Expand Down

0 comments on commit 1cfa704

Please sign in to comment.