Search code examples
c#wpfembeddiscord

Add a field to a c# embedded discord message


In my Wpf C# Document I needed to find a way to send embedded messages to a webhook, I found some examples on the internet and put them into my file. Although this, I still couldn't find how to add fields to the embedded message, here is the code:

public class Json
{
    // 'Username' value
    [JsonProperty("username")]
    public string username { get; set; }
    // 'Avatar' value
    [JsonProperty("avatar_url")]
    // 'Content' value --> Always empty because we are using embed
    public string avatarurl { get; set; }
    [JsonProperty("content")]
    public string content { get; set; }
    // 'Embed' array value
    [JsonProperty("embeds")]
    public List<Embed> embeds { get; set; }
}

/*
   Json class to compile the single embed
   Action: n/a
*/
public class Embed
{
    [JsonProperty("author")]
    public Author author { get; set; }
    [JsonProperty("title")]
    public string title { get; set; }
    [JsonProperty("url")]
    public string url { get; set; }
    [JsonProperty("description")]
    public string description { get; set; }
    [JsonProperty("color")]
    public int color { get; set; }
    [JsonProperty("fields")]
    public List<Fields> fields { get; set; }
    [JsonProperty("thumbnail")]
    public Thumbnail thumbnail { get; set; }
    [JsonProperty("image")]
    public Image image { get; set; }
    [JsonProperty("footer")]
    public Footer footer { get; set; }

}

/*
   Json class to compile the author in an embed
   Action: n/a
*/
public class Author
{
    [JsonProperty("name")]
    public string name { get; set; }
    [JsonProperty("url")]
    public string url { get; set; }
    [JsonProperty("icon_url")]
    public string iconurl { get; set; }
}


/*
   Json class to compile the fields in an embed
   Action: n/a
*/


/*
   Json class to compile the thumbnail in an embed
   Action: n/a
*/
public class Thumbnail
{
    [JsonProperty("url")]
    public string url { get; set; }
}

/*
   Json class to compile the image in an embed
   Action: n/a
*/
public class Image
{
    [JsonProperty("url")]
    public string url { get; set; }
}

/*
   Json class to compile the footer in an embed
   Action: n/a
*/
public class Footer
{
    [JsonProperty("text")]
    public string text { get; set; }
    [JsonProperty("icon_url")]
    public string iconurl { get; set; }
}

/*
   Json class to compile the config
   Action: CONFIG
*/
public class Config
{
    [JsonProperty("webhook_url")]
    public string webhook { get; set; }
    [JsonProperty("json")]
    public Json json { get; set; }
}
public class Fields
{
}

Then, in a EmbedBuilder.cs class I have:

public class EmbedBuilder
{
    /*
        Builds the JSON according to the local values
        Action: COMPILE/EXECUTE
    */
    public static void buildEmbed()
    {
        Json json = new Json()
        {
            embeds = new List<Embed>()
            {
                new Embed
                {
                    author = new Author
                    {
                        name = "",
                        iconurl = "",
                    },
                    title = "",
                    url = "",
                    color = 14957895,
                    description = "",
                    thumbnail = new Thumbnail
                    {
                        url = "",
                    },
                    image = new Image
                    {
                        url = ""
                    },
                    footer = new Footer
                    {
                        text = "",
                        iconurl = "",
                    }
                }
            }

        };
        // Call the HTTP client and execute request
        HTTP.MakeRequest(Properties.Settings.Default.discordhook, Newtonsoft.Json.JsonConvert.SerializeObject(json));

    }

    /*
        Compiles the local values into the format provided in Json.cs. Must have run the webhook once (soon will be dynamic)
        Action: COMPILE/SAVE
    */
    public static string saveEmbed()
    {
        // Make a new config
        Config json = new Config()
        {
            webhook = Properties.Settings.Default.discordhook,
            json = new Json
            {
                embeds = new List<Embed>()
                {
                    new Embed
                    {
                        author = new Author
                        {
                            name = "",
                            iconurl = "",
                        },
                        title = "",
                        url = "",
                        color = ,
                        description = "",
                        thumbnail = new Thumbnail
                        {
                            url = "",
                        },
                        image = new Image
                        {
                            url = ""
                        },
                        footer = new Footer
                        {
                            text = "",
                            iconurl = "",
                        }
                    }
                }
            }
        };
        // Return a serialized value
        return JsonConvert.SerializeObject(json);

    }
}

How would I be able to add a discord embedded field to my message, here is a picture of one: enter image description here

That is just an example that I found on the internet and I'm not specifically looking for how to create the same thing exactly, just on how to add a field.


Solution

  • I managed to do it after some research on the discord developer portal regarding embeds (https://birdie0.github.io/discord-webhooks-guide/structure/embed/fields.html). The main problems was that I didn't set it as an array, here would be the correct code:

    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace WpfApp1
    {
    
    /*
       Json class to compile the full embed
       Action: n/a
    */
    public class Json
    {
        // 'Username' value
        [JsonProperty("username")]
        public string username { get; set; }
        // 'Avatar' value
        [JsonProperty("avatar_url")]
        // 'Content' value --> Always empty because we are using embed
        public string avatarurl { get; set; }
        [JsonProperty("content")]
        public string content { get; set; }
        // 'Embed' array value
        [JsonProperty("embeds")]
        public List<Embed> embeds { get; set; }
    }
    
    /*
       Json class to compile the single embed
       Action: n/a
    */
    public class Embed
    {
        [JsonProperty("author")]
        public Author author { get; set; }
        [JsonProperty("title")]
        public string title { get; set; }
        [JsonProperty("url")]
        public string url { get; set; }
        [JsonProperty("description")]
        public string description { get; set; }
        [JsonProperty("color")]
        public int color { get; set; }
        [JsonProperty("fields")]
        public List<Field> fields { get; set; }
        [JsonProperty("thumbnail")]
        public Thumbnail thumbnail { get; set; }
        [JsonProperty("image")]
        public Image image { get; set; }
        [JsonProperty("footer")]
        public Footer footer { get; set; }
    
    }
    
    /*
       Json class to compile the author in an embed
       Action: n/a
    */
    public class Author
    {
        [JsonProperty("name")]
        public string name { get; set; }
        [JsonProperty("url")]
        public string url { get; set; }
        [JsonProperty("icon_url")]
        public string iconurl { get; set; }
    }
    
    
    /*
       Json class to compile the fields in an embed
       Action: n/a
    */
    
    
    /*
       Json class to compile the thumbnail in an embed
       Action: n/a
    */
    public class Thumbnail
    {
        [JsonProperty("url")]
        public string url { get; set; }
    }
    
    /*
       Json class to compile the image in an embed
       Action: n/a
    */
    public class Image
    {
        [JsonProperty("url")]
        public string url { get; set; }
    }
    
    /*
       Json class to compile the footer in an embed
       Action: n/a
    */
    public class Footer
    {
        [JsonProperty("text")]
        public string text { get; set; }
        [JsonProperty("icon_url")]
        public string iconurl { get; set; }
    }
    
    /*
       Json class to compile the config
       Action: CONFIG
    */
    public class Config
    {
        [JsonProperty("webhook_url")]
        public string webhook { get; set; }
        [JsonProperty("json")]
        public Json json { get; set; }
    }
    public class Field
    {
        [JsonProperty("name")]
        public string name { get; set; }
    
        [JsonProperty("value")]
        public string value { get; set; }
    
        [JsonProperty("inline")]
        public bool inline { get; set; }
    }
    }