/// <summary> /// Serializes the provided instance of <paramref name="embedMetadata"/> and returns an updated version of <paramref name="uri"/> /// that contains the serialized string in the URI fragment. /// </summary> static private string StealthInto(string uri, IEmbedMetadata embedMetadata) { var oldUri = new Uri(uri); var existingFragmentData = HttpUtility.ParseQueryString(oldUri.Fragment); var newFragment = SerializeMetadata(embedMetadata, existingFragmentData); var newUriBuilder = new UriBuilder(uri) { Fragment = newFragment }; return(newUriBuilder.ToString()); }
/// <summary> /// Serializes the provided instance of <paramref name="embedMetadata"/> into a URL query string-ish representation. /// </summary> static private string SerializeMetadata(IEmbedMetadata embedMetadata, NameValueCollection existingFragmentData = null) { var fragmentData = existingFragmentData ?? new NameValueCollection(); var fragmentDict = new Dictionary <string, string>(); // Update it with the required values embedMetadata.SaveInto(fragmentDict); foreach (var(key, value) in fragmentDict) { fragmentData[key] = value; } fragmentData["_k"] = embedMetadata.EmbedKind; // Make a list of query pairs var keyValuePairs = new List <string>(); foreach (var key in fragmentData.AllKeys.OrderBy(k => k, StringComparer.OrdinalIgnoreCase)) { keyValuePairs.Add(Escape(key) + "=" + Escape(fragmentData[key])); } return(string.Join("&", keyValuePairs)); }
/// <summary> /// <para>Adjusts the embed under construction so that it includes recoverable representation of <paramref name="embedMetadata"/>.</para> /// <para>For optimal results, call this method after <see cref="EmbedBuilder.WithAuthor"/> or <see cref="EmbedBuilder.WithImageUrl"/>.</para> /// </summary> /// <param name="embedBuilder"></param> /// <param name="embedMetadata">The metadata to store inside the embed.</param> /// <returns></returns> static public EmbedBuilder WithMetadata(this EmbedBuilder embedBuilder, IEmbedMetadata embedMetadata) { if (embedBuilder.Author?.IconUrl is string authorIconUrl) { authorIconUrl = StealthInto(authorIconUrl, embedMetadata); return(embedBuilder.WithAuthor(embedBuilder.Author.Name, authorIconUrl, embedBuilder.Author.Url)); } else if (embedBuilder.ImageUrl is string imageUrl) { imageUrl = StealthInto(imageUrl, embedMetadata); return(embedBuilder.WithImageUrl(imageUrl)); } else { var metadataText = SerializeMetadata(embedMetadata); var oldFooterText = embedBuilder.Footer.Text; if (!string.IsNullOrEmpty(oldFooterText)) { oldFooterText = " " + oldFooterText; } return(embedBuilder.WithFooter(metadataText + oldFooterText)); } }