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);
}
}