internal async Task PopulateAsync(DiscordRestClient discord, RestGuild guild, IRestMessageChannel channel, T model) { var resolved = model.Resolved.Value; if (resolved.Users.IsSpecified) { foreach (var user in resolved.Users.Value) { var restUser = RestUser.Create(discord, user.Value); Users.Add(ulong.Parse(user.Key), restUser); } } if (resolved.Channels.IsSpecified) { var channels = await guild.GetChannelsAsync().ConfigureAwait(false); foreach (var channelModel in resolved.Channels.Value) { var restChannel = channels.FirstOrDefault(x => x.Id == channelModel.Value.Id); restChannel.Update(channelModel.Value); Channels.Add(ulong.Parse(channelModel.Key), restChannel); } } if (resolved.Members.IsSpecified) { 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); } } if (resolved.Roles.IsSpecified) { foreach (var role in resolved.Roles.Value) { var restRole = RestRole.Create(discord, guild, role.Value); Roles.Add(ulong.Parse(role.Key), restRole); } } if (resolved.Messages.IsSpecified) { foreach (var msg in resolved.Messages.Value) { channel ??= (IRestMessageChannel)(Channels.FirstOrDefault(x => x.Key == msg.Value.ChannelId).Value ?? await discord.GetChannelAsync(msg.Value.ChannelId).ConfigureAwait(false)); RestUser author; if (msg.Value.Author.IsSpecified) { author = RestUser.Create(discord, msg.Value.Author.Value); } else { author = RestGuildUser.Create(discord, guild, msg.Value.Member.Value); } var message = RestMessage.Create(discord, channel, author, msg.Value); Messages.Add(message.Id, message); } } if (resolved.Attachments.IsSpecified) { foreach (var attachment in resolved.Attachments.Value) { var discordAttachment = Attachment.Create(attachment.Value); Attachments.Add(ulong.Parse(attachment.Key), discordAttachment); } } }
internal override void Update(Model model) { base.Update(model); if (model.IsTextToSpeech.IsSpecified) { _isTTS = model.IsTextToSpeech.Value; } if (model.Pinned.IsSpecified) { _isPinned = model.Pinned.Value; } if (model.EditedTimestamp.IsSpecified) { _editedTimestampTicks = model.EditedTimestamp.Value?.UtcTicks; } if (model.MentionEveryone.IsSpecified) { _isMentioningEveryone = model.MentionEveryone.Value; } if (model.Flags.IsSpecified) { _isSuppressed = model.Flags.Value.HasFlag(API.MessageFlags.Suppressed); } if (model.RoleMentions.IsSpecified) { _roleMentionIds = model.RoleMentions.Value.ToImmutableArray(); } if (model.Attachments.IsSpecified) { var value = model.Attachments.Value; if (value.Length > 0) { var attachments = ImmutableArray.CreateBuilder <Attachment>(value.Length); for (int i = 0; i < value.Length; i++) { attachments.Add(Attachment.Create(value[i])); } _attachments = attachments.ToImmutable(); } else { _attachments = ImmutableArray.Create <Attachment>(); } } if (model.Embeds.IsSpecified) { var value = model.Embeds.Value; if (value.Length > 0) { var embeds = ImmutableArray.CreateBuilder <Embed>(value.Length); for (int i = 0; i < value.Length; i++) { embeds.Add(value[i].ToEntity()); } _embeds = embeds.ToImmutable(); } else { _embeds = ImmutableArray.Create <Embed>(); } } if (model.UserMentions.IsSpecified) { var value = model.UserMentions.Value; if (value.Length > 0) { var newMentions = ImmutableArray.CreateBuilder <RestUser>(value.Length); for (int i = 0; i < value.Length; i++) { var val = value[i]; if (val.Object != null) { newMentions.Add(RestUser.Create(Discord, val.Object)); } } _userMentions = newMentions.ToImmutable(); } } if (model.Content.IsSpecified) { var text = model.Content.Value; var guildId = (Channel as IGuildChannel)?.GuildId; var guild = guildId != null ? (Discord as IDiscordClient).GetGuildAsync(guildId.Value, CacheMode.CacheOnly).Result : null; _tags = MessageHelper.ParseTags(text, null, guild, _userMentions); model.Content = text; } }
internal override void Update(Model model) { base.Update(model); if (model.IsTextToSpeech.IsSpecified) { _isTTS = model.IsTextToSpeech.Value; } if (model.Pinned.IsSpecified) { _isPinned = model.Pinned.Value; } if (model.EditedTimestamp.IsSpecified) { _editedTimestampTicks = model.EditedTimestamp.Value?.UtcTicks; } if (model.MentionEveryone.IsSpecified) { _isMentioningEveryone = model.MentionEveryone.Value; } if (model.RoleMentions.IsSpecified) { _roleMentionIds = model.RoleMentions.Value.ToImmutableArray(); } if (model.Attachments.IsSpecified) { var value = model.Attachments.Value; if (value.Length > 0) { var attachments = ImmutableArray.CreateBuilder <Attachment>(value.Length); for (int i = 0; i < value.Length; i++) { attachments.Add(Attachment.Create(value[i])); } _attachments = attachments.ToImmutable(); } else { _attachments = ImmutableArray.Create <Attachment>(); } } if (model.Embeds.IsSpecified) { var value = model.Embeds.Value; if (value.Length > 0) { var embeds = ImmutableArray.CreateBuilder <Embed>(value.Length); for (int i = 0; i < value.Length; i++) { embeds.Add(value[i].ToEntity()); } _embeds = embeds.ToImmutable(); } else { _embeds = ImmutableArray.Create <Embed>(); } } var guildId = (Channel as IGuildChannel)?.GuildId; var guild = guildId != null ? (Discord as IDiscordClient).GetGuildAsync(guildId.Value, CacheMode.CacheOnly).Result : null; if (model.Content.IsSpecified) { var text = model.Content.Value; _tags = MessageHelper.ParseTags(text, null, guild, MentionedUsers); model.Content = text; } if (model.ReferencedMessage.IsSpecified && model.ReferencedMessage.Value != null) { var refMsg = model.ReferencedMessage.Value; IUser refMsgAuthor = MessageHelper.GetAuthor(Discord, guild, refMsg.Author.Value, refMsg.WebhookId.ToNullable()); _referencedMessage = RestUserMessage.Create(Discord, Channel, refMsgAuthor, refMsg); } if (model.StickerItems.IsSpecified) { var value = model.StickerItems.Value; if (value.Length > 0) { var stickers = ImmutableArray.CreateBuilder <StickerItem>(value.Length); for (int i = 0; i < value.Length; i++) { stickers.Add(new StickerItem(Discord, value[i])); } _stickers = stickers.ToImmutable(); } else { _stickers = ImmutableArray.Create <StickerItem>(); } } }