Exemple #1
0
        /// <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());
        }
Exemple #2
0
        /// <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));
        }
Exemple #3
0
        /// <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));
            }
        }