diff --git a/DisCatSharp/Enums/Interaction/ButtonStyle.cs b/DisCatSharp/Enums/Interaction/ButtonStyle.cs index 88d518b19..32e022381 100644 --- a/DisCatSharp/Enums/Interaction/ButtonStyle.cs +++ b/DisCatSharp/Enums/Interaction/ButtonStyle.cs @@ -1,50 +1,55 @@ // This file is part of the DisCatSharp project. // // Copyright (c) 2021 AITSYS // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. namespace DisCatSharp.Enums { /// /// Represents a button's style/color. /// public enum ButtonStyle : int { /// /// Blurple button. /// Primary = 1, /// /// Grey button. /// Secondary = 2, /// /// Green button. /// Success = 3, /// /// Red button. /// Danger = 4, + + /// + /// Link Button. + /// + Link = 5 } } diff --git a/DisCatSharp/Net/Serialization/DiscordComponentJsonConverter.cs b/DisCatSharp/Net/Serialization/DiscordComponentJsonConverter.cs index ff96a2063..7e22aba1c 100644 --- a/DisCatSharp/Net/Serialization/DiscordComponentJsonConverter.cs +++ b/DisCatSharp/Net/Serialization/DiscordComponentJsonConverter.cs @@ -1,89 +1,100 @@ // This file is part of the DisCatSharp project. // // Copyright (c) 2021 AITSYS // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. using System; using DisCatSharp.Entities; using DisCatSharp.Enums; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace DisCatSharp.Net.Serialization { /// /// Represents a discord component json converter. /// internal sealed class DiscordComponentJsonConverter : JsonConverter { /// /// Whether the converter can write. /// public override bool CanWrite => false; /// /// Writes the json. /// /// The writer. /// The value. /// The serializer. public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) => throw new NotImplementedException(); /// /// Reads the json. /// /// The reader. /// The object type. /// The existing value. /// The serializer. public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; var job = JObject.Load(reader); var type = job["type"]?.ToObject(); + var style = job["style"]?.ToObject(); if (type == null) throw new ArgumentException($"Value {reader} does not have a component type specifier"); - var cmp = type switch + DiscordComponent cmp; + if (type is ComponentType.Button && style is not null) { - ComponentType.ActionRow => new DiscordActionRowComponent(), - ComponentType.Button => new DiscordButtonComponent(), - ComponentType.Select => new DiscordSelectComponent(), - ComponentType.InputText => new DiscordTextComponent(), - _ => new DiscordComponent() { Type = type.Value } - }; - + cmp = style switch + { + ButtonStyle.Link => new DiscordLinkButtonComponent(), + _ => new DiscordButtonComponent() + }; + } + else + { + cmp = type switch + { + ComponentType.ActionRow => new DiscordActionRowComponent(), + ComponentType.Select => new DiscordSelectComponent(), + ComponentType.InputText => new DiscordTextComponent(), + _ => new DiscordComponent() { Type = type.Value } + }; + } // Populate the existing component with the values in the JObject. This avoids a recursive JsonConverter loop using var jreader = job.CreateReader(); serializer.Populate(jreader, cmp); return cmp; } /// /// Whether the json can convert. /// /// The object type. public override bool CanConvert(Type objectType) => typeof(DiscordComponent).IsAssignableFrom(objectType); } }