public override bool TryWrite(ref ResizableMemory <byte> remaining, EntityOrId <T> value, PropertyMap propMap = null) { if (value.Object == null) { return(_idConverter.TryWrite(ref remaining, value.Id, propMap)); } else { return(_entityConverter.TryWrite(ref remaining, value.Object, propMap)); } }
public override bool TryRead(ref ReadOnlySpan <byte> remaining, out EntityOrId <T> result, PropertyMap propMap = null) { result = default; switch (JsonReader.GetTokenType(ref remaining)) { case JsonTokenType.Number: if (!_idConverter.TryRead(ref remaining, out var idValue, propMap)) { return(false); } result = new EntityOrId <T>(idValue); return(true); default: if (!_entityConverter.TryRead(ref remaining, out var entityValue, propMap)) { return(false); } result = new EntityOrId <T>(entityValue); return(true); } }
internal override void Update(ClientState state, Model model) { base.Update(state, 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.Attachments.IsSpecified) { API.AttachmentJson[] value = model.Attachments.Value; if (value.Length > 0) { ImmutableArray <Attachment> .Builder 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) { API.EmbedJson[] value = model.Embeds.Value; if (value.Length > 0) { ImmutableArray <Embed> .Builder 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.Stickers.IsSpecified) { StickerJson[] value = model.Stickers.Value; if (value.Length > 0) { ImmutableArray <MessageSticker> .Builder stickers = ImmutableArray.CreateBuilder <MessageSticker>(value.Length); for (int i = 0; i < value.Length; i++) { stickers.Add(value[i].ToEntity()); } _stickers = stickers.ToImmutable(); } else { _stickers = ImmutableArray.Create <MessageSticker>(); } } IReadOnlyCollection <IUser> mentions = ImmutableArray.Create <SocketUnknownUser>(); //Is passed to ParseTags to get real mention collection if (model.UserMentions.IsSpecified) { EntityOrId <UserJson>[] value = model.UserMentions.Value; if (value.Length > 0) { ImmutableArray <SocketUnknownUser> .Builder newMentions = ImmutableArray.CreateBuilder <SocketUnknownUser>(value.Length); for (int i = 0; i < value.Length; i++) { EntityOrId <UserJson> val = value[i]; if (val.Object != null) { newMentions.Add(SocketUnknownUser.Create(Discord, state, val.Object)); } } mentions = newMentions.ToImmutable(); } } if (model.Content.IsSpecified) { string text = model.Content.Value; SocketGuild guild = (Channel as SocketGuildChannel)?.Guild; _tags = MessageHelper.ParseTags(text, Channel, guild, mentions); model.Content = text; } }
public override bool CanWrite(EntityOrId <T> value, PropertyMap propMap) => !propMap.ExcludeDefault || value.Object != default || value.Id != default;
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.Attachments.IsSpecified) { API.AttachmentJson[] value = model.Attachments.Value; if (value.Length > 0) { ImmutableArray <Attachment> .Builder 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) { API.EmbedJson[] value = model.Embeds.Value; if (value.Length > 0) { ImmutableArray <Embed> .Builder 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.Stickers.IsSpecified) { StickerJson[] value = model.Stickers.Value; if (value.Length > 0) { ImmutableArray <MessageSticker> .Builder stickers = ImmutableArray.CreateBuilder <MessageSticker>(value.Length); for (int i = 0; i < value.Length; i++) { stickers.Add(value[i].ToEntity()); } _stickers = stickers.ToImmutable(); } else { _stickers = ImmutableArray.Create <MessageSticker>(); } } ImmutableArray <IUser> mentions = ImmutableArray.Create <IUser>(); if (model.UserMentions.IsSpecified) { EntityOrId <UserJson>[] value = model.UserMentions.Value; if (value.Length > 0) { ImmutableArray <IUser> .Builder newMentions = ImmutableArray.CreateBuilder <IUser>(value.Length); for (int i = 0; i < value.Length; i++) { EntityOrId <UserJson> val = value[i]; if (val.Object != null) { newMentions.Add(RestUser.Create(Discord, val.Object)); } } mentions = newMentions.ToImmutable(); } } if (model.Content.IsSpecified) { string text = model.Content.Value; ulong? guildId = (Channel as IGuildChannel)?.GuildId; IGuild guild = guildId != null ? (Discord as IDiscordClient).GetGuildAsync(guildId.Value, CacheMode.CacheOnly).Result : null; _tags = MessageHelper.ParseTags(text, null, guild, mentions); model.Content = text; } }