From 79a0ea9de30f3b539060d61c800c8764735f8d17 Mon Sep 17 00:00:00 2001 From: Chris Johnston Date: Sat, 9 Nov 2019 10:41:10 -0800 Subject: [PATCH] Feature: CustomStatusGame Activity (#1406) * Implement CustomStatusGame activity Adds the CustomStatusGame class, which is the activity corresponding to the custom status feature. * Remove unused import from Game.cs --- .../Entities/Activities/ActivityType.cs | 6 ++- .../Entities/Activities/CustomStatusGame.cs | 40 +++++++++++++++++++ src/Discord.Net.Rest/API/Common/Game.cs | 6 +++ .../Extensions/EntityExtensions.cs | 7 ++++ .../Extensions/EntityExtensions.cs | 15 +++++++ 5 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/Discord.Net.Core/Entities/Activities/CustomStatusGame.cs diff --git a/src/Discord.Net.Core/Entities/Activities/ActivityType.cs b/src/Discord.Net.Core/Entities/Activities/ActivityType.cs index b603e27a4..8c44f49e3 100644 --- a/src/Discord.Net.Core/Entities/Activities/ActivityType.cs +++ b/src/Discord.Net.Core/Entities/Activities/ActivityType.cs @@ -20,6 +20,10 @@ namespace Discord /// /// The user is watching some form of media. /// - Watching = 3 + Watching = 3, + /// + /// The user has set a custom status. + /// + CustomStatus = 4, } } diff --git a/src/Discord.Net.Core/Entities/Activities/CustomStatusGame.cs b/src/Discord.Net.Core/Entities/Activities/CustomStatusGame.cs new file mode 100644 index 000000000..7bd2664a2 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Activities/CustomStatusGame.cs @@ -0,0 +1,40 @@ +using System; +using System.Diagnostics; + +namespace Discord +{ + /// + /// A user's activity for their custom status. + /// + [DebuggerDisplay(@"{DebuggerDisplay,nq}")] + public class CustomStatusGame : Game + { + internal CustomStatusGame() { } + + /// + /// Gets the emote, if it is set. + /// + /// + /// An containing the or set by the user. + /// + public IEmote Emote { get; internal set; } + + /// + /// Gets the timestamp of when this status was created. + /// + /// + /// A containing the time when this status was created. + /// + public DateTimeOffset CreatedAt { get; internal set; } + + /// + /// Gets the state of the status. + /// + public string State { get; internal set; } + + public override string ToString() + => $"{Emote} {State}"; + + private string DebuggerDisplay => $"{Name}"; + } +} diff --git a/src/Discord.Net.Rest/API/Common/Game.cs b/src/Discord.Net.Rest/API/Common/Game.cs index 2ec1e3846..d3a618697 100644 --- a/src/Discord.Net.Rest/API/Common/Game.cs +++ b/src/Discord.Net.Rest/API/Common/Game.cs @@ -35,6 +35,12 @@ namespace Discord.API public Optional SessionId { get; set; } [JsonProperty("Flags")] public Optional Flags { get; set; } + [JsonProperty("id")] + public Optional Id { get; set; } + [JsonProperty("emoji")] + public Optional Emoji { get; set; } + [JsonProperty("created_at")] + public Optional CreatedAt { get; set; } [OnError] internal void OnError(StreamingContext context, ErrorContext errorContext) diff --git a/src/Discord.Net.Rest/Extensions/EntityExtensions.cs b/src/Discord.Net.Rest/Extensions/EntityExtensions.cs index 4d164df96..e265f991f 100644 --- a/src/Discord.Net.Rest/Extensions/EntityExtensions.cs +++ b/src/Discord.Net.Rest/Extensions/EntityExtensions.cs @@ -5,6 +5,13 @@ namespace Discord.Rest { internal static class EntityExtensions { + public static IEmote ToIEmote(this API.Emoji model) + { + if (model.Id.HasValue) + return model.ToEntity(); + return new Emoji(model.Name); + } + public static GuildEmote ToEntity(this API.Emoji model) => new GuildEmote(model.Id.Value, model.Name, diff --git a/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs b/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs index fd91ba987..bad72aaea 100644 --- a/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs +++ b/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs @@ -1,3 +1,5 @@ +using Discord.Rest; +using System; using System.Collections.Immutable; using System.Linq; @@ -7,6 +9,19 @@ namespace Discord.WebSocket { public static IActivity ToEntity(this API.Game model) { + // Custom Status Game + if (model.Id.IsSpecified) + { + return new CustomStatusGame() + { + Type = ActivityType.CustomStatus, + Name = model.Name, + State = model.State.IsSpecified ? model.State.Value : null, + Emote = model.Emoji.IsSpecified ? model.Emoji.Value.ToIEmote() : null, + CreatedAt = DateTimeOffset.FromUnixTimeMilliseconds(model.CreatedAt.Value), + }; + } + // Spotify Game if (model.SyncId.IsSpecified) {