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)
{