Skip to content

Commit

Permalink
Implement gradient colored role
Browse files Browse the repository at this point in the history
  • Loading branch information
gehongyan committed Feb 24, 2023
1 parent 52aec27 commit 9414b94
Show file tree
Hide file tree
Showing 9 changed files with 149 additions and 3 deletions.
16 changes: 16 additions & 0 deletions src/Kook.Net.Core/Entities/Roles/ColorType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace Kook;

/// <summary>
/// Represents the type of color a role has.
/// </summary>
public enum ColorType : ushort
{
/// <summary>
/// The color is a solid color.
/// </summary>
Solid = 1,
/// <summary>
/// The color is a gradient.
/// </summary>
Gradient = 2
}
26 changes: 26 additions & 0 deletions src/Kook.Net.Core/Entities/Roles/GradientColor.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
namespace Kook;

/// <summary>
/// Represents a gradient color.
/// </summary>
public struct GradientColor
{
public GradientColor(Color left, Color right)
{
Left = left;
Right = right;
}

/// <summary>
/// The left color of the gradient.
/// </summary>
public Color Left { get; }

/// <summary>
/// The right color of the gradient.
/// </summary>
public Color Right { get; }

public static implicit operator (Color Left, Color Right)(GradientColor gradient) => (gradient.Left, gradient.Right);
public static implicit operator GradientColor((Color Left, Color Right) gradient) => new(gradient.Left, gradient.Right);
}
15 changes: 15 additions & 0 deletions src/Kook.Net.Core/Entities/Roles/IRole.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,21 @@ public interface IRole : IEntity<uint>, IDeletable, IMentionable, IComparable<IR
/// </returns>
Color Color { get; }
/// <summary>
/// Gets the type of the color given to users of this role.
/// </summary>
/// <returns>
/// A <see cref="ColorType"/> struct representing the color type of this role.
/// </returns>
ColorType ColorType { get; }
/// <summary>
/// Gets the gradient color given to users of this role.
/// </summary>
/// <returns>
/// A <see cref="GradientColor"/> struct representing the gradient color of this role;
/// <c>null</c> if the role does not have a gradient color.
/// </returns>
GradientColor? GradientColor { get; }
/// <summary>
/// Gets this role's position relative to other roles in the same guild.
/// </summary>
/// <returns>
Expand Down
7 changes: 7 additions & 0 deletions src/Kook.Net.Rest/API/Common/Role.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@ internal class Role
[JsonConverter(typeof(RawValueColorConverter))]
public Color Color { get; set; }

[JsonPropertyName("color_type")]
public ColorType ColorType { get; set; }

[JsonPropertyName("color_map")]
[JsonConverter(typeof(NullableGradientColorConverter))]
public GradientColor? GradientColor { get; set; }

[JsonPropertyName("position")]
public int Position { get; set; }

Expand Down
8 changes: 7 additions & 1 deletion src/Kook.Net.Rest/Entities/Roles/RestRole.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ public class RestRole : RestEntity<uint>, IRole
/// <inheritdoc />
public Color Color { get; private set; }
/// <inheritdoc />
public ColorType ColorType { get; private set; }
/// <inheritdoc />
public GradientColor? GradientColor { get; private set; }
/// <inheritdoc />
public bool IsHoisted { get; private set; }
/// <inheritdoc />
public bool IsMentionable { get; private set; }
Expand Down Expand Up @@ -61,10 +65,12 @@ internal void Update(Model model)
{
Name = model.Name;
Type = model.Type;
Color = model.Color;
ColorType = model.ColorType;
GradientColor = model.GradientColor;
IsHoisted = model.Hoist == 1;
IsMentionable = model.Mentionable == 1;
Position = model.Position;
Color = model.Color;
Permissions = new GuildPermissions(model.Permissions);
}

Expand Down
70 changes: 70 additions & 0 deletions src/Kook.Net.Rest/Net/Converters/NullableGradientColorConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
using System.Text.Json;
using System.Text.Json.Serialization;

namespace Kook.Net.Converters;

internal class NullableGradientColorConverter : JsonConverter<GradientColor?>
{
/// <inheritdoc />
public override GradientColor? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.StartObject)
{
reader.Read();
if (reader.TokenType != JsonTokenType.PropertyName)
throw new JsonException($"{nameof(NullableGradientColorConverter)} expects property name token, but got {reader.TokenType}");
string propertyName = reader.GetString();
if (propertyName != "color_list")
throw new JsonException($"{nameof(NullableGradientColorConverter)} expects property name 'color_list', but got {propertyName}");
reader.Read();
if (reader.TokenType != JsonTokenType.StartArray)
throw new JsonException($"{nameof(NullableGradientColorConverter)} expects start array token, but got {reader.TokenType}");
reader.Read();
if (reader.TokenType != JsonTokenType.Number)
throw new JsonException($"{nameof(NullableGradientColorConverter)} expects number token, but got {reader.TokenType}");
var left = reader.GetUInt32();
reader.Read();
if (reader.TokenType != JsonTokenType.Number)
throw new JsonException($"{nameof(NullableGradientColorConverter)} expects number token, but got {reader.TokenType}");
var right = reader.GetUInt32();
reader.Read();
if (reader.TokenType != JsonTokenType.EndArray)
throw new JsonException($"{nameof(NullableGradientColorConverter)} expects end array token, but got {reader.TokenType}");
reader.Read();
if (reader.TokenType != JsonTokenType.EndObject)
throw new JsonException($"{nameof(NullableGradientColorConverter)} expects end object token, but got {reader.TokenType}");
return new GradientColor(new Color(left), new Color(right));
}

if (reader.TokenType == JsonTokenType.StartArray)
{
reader.Read();
if (reader.TokenType != JsonTokenType.EndArray)
throw new JsonException($"{nameof(NullableGradientColorConverter)} expects end array token, but got {reader.TokenType}");
return null;
}

throw new JsonException(
$"{nameof(NullableGradientColorConverter)} expects start object or start array token, but got {reader.TokenType}");
}

/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, GradientColor? value, JsonSerializerOptions options)
{
if (value.HasValue)
{
writer.WriteStartObject();
writer.WritePropertyName("color_list");
writer.WriteStartArray();
writer.WriteNumberValue(value.Value.Left);
writer.WriteNumberValue(value.Value.Right);
writer.WriteEndArray();
writer.WriteEndObject();
}
else
{
writer.WriteStartArray();
writer.WriteEndArray();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace Kook.Net.Converters;

public class NullableNumberBooleanConverter : JsonConverter<bool?>
internal class NullableNumberBooleanConverter : JsonConverter<bool?>
{
public override bool? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
Expand Down
2 changes: 1 addition & 1 deletion src/Kook.Net.Rest/Net/Converters/NumberBooleanConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace Kook.Net.Converters;

public class NumberBooleanConverter : JsonConverter<bool>
internal class NumberBooleanConverter : JsonConverter<bool>
{
public override bool Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
Expand Down
6 changes: 6 additions & 0 deletions src/Kook.Net.WebSocket/Entities/Roles/SocketRole.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ public class SocketRole : SocketEntity<uint>, IRole
/// <inheritdoc />
public Color Color { get; private set; }
/// <inheritdoc />
public ColorType ColorType { get; private set; }
/// <inheritdoc />
public GradientColor? GradientColor { get; private set; }
/// <inheritdoc />
public int Position { get; private set; }
/// <inheritdoc />
public bool IsHoisted { get; private set; }
Expand Down Expand Up @@ -64,6 +68,8 @@ internal void Update(ClientState state, Model model)
Name = model.Name;
Type = model.Type;
Color = model.Color;
ColorType = model.ColorType;
GradientColor = model.GradientColor;
Position = model.Position;
IsHoisted = model.Hoist switch
{
Expand Down

0 comments on commit 9414b94

Please sign in to comment.