internal override void Update(ClientState state, Model model) { base.Update(state, model); SocketGuild guild = (Channel as SocketGuildChannel)?.Guild; 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) { _roleMentions = model.RoleMentions.Value.Select(x => guild.GetRole(x)).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 <SocketUser>(value.Length); for (int i = 0; i < value.Length; i++) { var val = value[i]; if (val.Object != null) { var user = Channel.GetUserAsync(val.Object.Id, CacheMode.CacheOnly).GetAwaiter().GetResult() as SocketUser; if (user != null) { newMentions.Add(user); } else { newMentions.Add(SocketUnknownUser.Create(Discord, state, val.Object)); } } } _userMentions = newMentions.ToImmutable(); } } if (model.Content.IsSpecified) { var text = model.Content.Value; _tags = MessageHelper.ParseTags(text, Channel, guild, _userMentions); model.Content = text; } if (model.ReferencedMessage.IsSpecified && model.ReferencedMessage.Value != null) { var refMsg = model.ReferencedMessage.Value; ulong? webhookId = refMsg.WebhookId.ToNullable(); SocketUser refMsgAuthor = null; if (refMsg.Author.IsSpecified) { if (guild != null) { if (webhookId != null) { refMsgAuthor = SocketWebhookUser.Create(guild, state, refMsg.Author.Value, webhookId.Value); } else { refMsgAuthor = guild.GetUser(refMsg.Author.Value.Id); } } else { refMsgAuthor = (Channel as SocketChannel).GetUser(refMsg.Author.Value.Id); } if (refMsgAuthor == null) { refMsgAuthor = SocketUnknownUser.Create(Discord, state, refMsg.Author.Value); } } else { // Message author wasn't specified in the payload, so create a completely anonymous unknown user refMsgAuthor = new SocketUnknownUser(Discord, id: 0); } _referencedMessage = SocketUserMessage.Create(Discord, state, refMsgAuthor, Channel, refMsg); } if (model.Stickers.IsSpecified) { var value = model.Stickers.Value; if (value.Length > 0) { var stickers = ImmutableArray.CreateBuilder <Sticker>(value.Length); for (int i = 0; i < value.Length; i++) { stickers.Add(Sticker.Create(value[i])); } _stickers = stickers.ToImmutable(); } else { _stickers = ImmutableArray.Create <Sticker>(); } } }