From a384ce02abcca096cb99d55f7ba9b52c2ec48148 Mon Sep 17 00:00:00 2001 From: Christopher F Date: Sat, 13 Jan 2018 23:20:04 -0500 Subject: [PATCH] Support listening/watching activity types This resolves #931 As part of this change, StreamingType has been refactored to realign with how Discord seems to define the 'type' field on activities now. StreamType is renamed to ActivityType, and the following properties have been changed: - NotStreaming -> Playing - Twitch -> Streaming Additionally, the StreamType property/parameter has been removed from StreamingGame, and moved up a scope to Game. Normal Games may now set their type, to line up with changes in Discord's official clients. --- .../Entities/Activities/ActivityType.cs | 10 ++++++++++ .../Entities/Activities/Game.cs | 4 +++- .../Entities/Activities/IActivity.cs | 9 ++------- .../Entities/Activities/StreamingGame.cs | 7 +++---- .../Entities/Users/StreamType.cs | 8 -------- src/Discord.Net.Rest/API/Common/Game.cs | 2 +- src/Discord.Net.WebSocket/BaseSocketClient.cs | 2 +- .../DiscordShardedClient.cs | 12 +++++------ .../DiscordSocketClient.cs | 20 +++++++++---------- .../Extensions/EntityExtensions.cs | 5 ++--- 10 files changed, 37 insertions(+), 42 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Activities/ActivityType.cs delete mode 100644 src/Discord.Net.Core/Entities/Users/StreamType.cs diff --git a/src/Discord.Net.Core/Entities/Activities/ActivityType.cs b/src/Discord.Net.Core/Entities/Activities/ActivityType.cs new file mode 100644 index 000000000..c7db7b247 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Activities/ActivityType.cs @@ -0,0 +1,10 @@ +namespace Discord +{ + public enum ActivityType + { + Playing = 0, + Streaming = 1, + Listening = 2, + Watching = 3 + } +} diff --git a/src/Discord.Net.Core/Entities/Activities/Game.cs b/src/Discord.Net.Core/Entities/Activities/Game.cs index f2b7e8eb6..fe32470ee 100644 --- a/src/Discord.Net.Core/Entities/Activities/Game.cs +++ b/src/Discord.Net.Core/Entities/Activities/Game.cs @@ -6,11 +6,13 @@ namespace Discord public class Game : IActivity { public string Name { get; internal set; } + public ActivityType Type { get; internal set; } internal Game() { } - public Game(string name) + public Game(string name, ActivityType type = ActivityType.Playing) { Name = name; + Type = type; } public override string ToString() => Name; diff --git a/src/Discord.Net.Core/Entities/Activities/IActivity.cs b/src/Discord.Net.Core/Entities/Activities/IActivity.cs index 0dcf34273..1f158217d 100644 --- a/src/Discord.Net.Core/Entities/Activities/IActivity.cs +++ b/src/Discord.Net.Core/Entities/Activities/IActivity.cs @@ -1,13 +1,8 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Discord +namespace Discord { public interface IActivity { string Name { get; } + ActivityType Type { get; } } } diff --git a/src/Discord.Net.Core/Entities/Activities/StreamingGame.cs b/src/Discord.Net.Core/Entities/Activities/StreamingGame.cs index 140024272..afbc24cd9 100644 --- a/src/Discord.Net.Core/Entities/Activities/StreamingGame.cs +++ b/src/Discord.Net.Core/Entities/Activities/StreamingGame.cs @@ -6,15 +6,14 @@ namespace Discord public class StreamingGame : Game { public string Url { get; internal set; } - public StreamType StreamType { get; internal set; } - public StreamingGame(string name, string url, StreamType streamType) + public StreamingGame(string name, string url) { Name = name; Url = url; - StreamType = streamType; + Type = ActivityType.Streaming; } - + public override string ToString() => Name; private string DebuggerDisplay => $"{Name} ({Url})"; } diff --git a/src/Discord.Net.Core/Entities/Users/StreamType.cs b/src/Discord.Net.Core/Entities/Users/StreamType.cs deleted file mode 100644 index 7622e3d6e..000000000 --- a/src/Discord.Net.Core/Entities/Users/StreamType.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Discord -{ - public enum StreamType - { - NotStreaming = 0, - Twitch = 1 - } -} diff --git a/src/Discord.Net.Rest/API/Common/Game.cs b/src/Discord.Net.Rest/API/Common/Game.cs index bfb861692..29e0d987d 100644 --- a/src/Discord.Net.Rest/API/Common/Game.cs +++ b/src/Discord.Net.Rest/API/Common/Game.cs @@ -12,7 +12,7 @@ namespace Discord.API [JsonProperty("url")] public Optional StreamUrl { get; set; } [JsonProperty("type")] - public Optional StreamType { get; set; } + public Optional Type { get; set; } [JsonProperty("details")] public Optional Details { get; set; } [JsonProperty("state")] diff --git a/src/Discord.Net.WebSocket/BaseSocketClient.cs b/src/Discord.Net.WebSocket/BaseSocketClient.cs index 2ab244aeb..5fa3cbff8 100644 --- a/src/Discord.Net.WebSocket/BaseSocketClient.cs +++ b/src/Discord.Net.WebSocket/BaseSocketClient.cs @@ -44,7 +44,7 @@ namespace Discord.WebSocket /// public abstract Task StopAsync(); public abstract Task SetStatusAsync(UserStatus status); - public abstract Task SetGameAsync(string name, string streamUrl = null, StreamType streamType = StreamType.NotStreaming); + public abstract Task SetGameAsync(string name, string streamUrl = null, ActivityType type = ActivityType.Playing); public abstract Task SetActivityAsync(IActivity activity); public abstract Task DownloadUsersAsync(IEnumerable guilds); diff --git a/src/Discord.Net.WebSocket/DiscordShardedClient.cs b/src/Discord.Net.WebSocket/DiscordShardedClient.cs index 4e99ae28d..fb78a201f 100644 --- a/src/Discord.Net.WebSocket/DiscordShardedClient.cs +++ b/src/Discord.Net.WebSocket/DiscordShardedClient.cs @@ -1,4 +1,4 @@ -using Discord.API; +using Discord.API; using Discord.Rest; using System; using System.Collections.Generic; @@ -238,13 +238,13 @@ namespace Discord.WebSocket for (int i = 0; i < _shards.Length; i++) await _shards[i].SetStatusAsync(status).ConfigureAwait(false); } - public override async Task SetGameAsync(string name, string streamUrl = null, StreamType streamType = StreamType.NotStreaming) + public override async Task SetGameAsync(string name, string streamUrl = null, ActivityType type = ActivityType.Playing) { IActivity activity = null; - if (streamUrl != null) - activity = new StreamingGame(name, streamUrl, streamType); - else if (name != null) - activity = new Game(name); + if (!string.IsNullOrEmpty(streamUrl)) + activity = new StreamingGame(name, streamUrl); + else if (!string.IsNullOrEmpty(name)) + activity = new Game(name, type); await SetActivityAsync(activity).ConfigureAwait(false); } public override async Task SetActivityAsync(IActivity activity) diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index cb3f23c57..c220c337b 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -1,4 +1,4 @@ -#pragma warning disable CS0618 +#pragma warning disable CS0618 using Discord.API; using Discord.API.Gateway; using Discord.Logging; @@ -326,12 +326,12 @@ namespace Discord.WebSocket _statusSince = null; await SendStatusAsync().ConfigureAwait(false); } - public override async Task SetGameAsync(string name, string streamUrl = null, StreamType streamType = StreamType.NotStreaming) + public override async Task SetGameAsync(string name, string streamUrl = null, ActivityType type = ActivityType.Playing) { if (!string.IsNullOrEmpty(streamUrl)) - Activity = new StreamingGame(name, streamUrl, streamType); + Activity = new StreamingGame(name, streamUrl); else if (!string.IsNullOrEmpty(name)) - Activity = new Game(name); + Activity = new Game(name, type); else Activity = null; await SendStatusAsync().ConfigureAwait(false); @@ -354,15 +354,13 @@ namespace Discord.WebSocket // Discord only accepts rich presence over RPC, don't even bother building a payload if (Activity is RichGame game) throw new NotSupportedException("Outgoing Rich Presences are not supported"); - else if (Activity is StreamingGame stream) - { - gameModel.StreamUrl = stream.Url; - gameModel.StreamType = stream.StreamType; - } - else if (Activity != null) + + if (Activity != null) { gameModel.Name = Activity.Name; - gameModel.StreamType = StreamType.NotStreaming; + gameModel.Type = Activity.Type; + if (Activity is StreamingGame streamGame) + gameModel.StreamUrl = streamGame.Url; } await ApiClient.SendStatusUpdateAsync( diff --git a/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs b/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs index c66163610..f85c89c71 100644 --- a/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs +++ b/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs @@ -27,11 +27,10 @@ { return new StreamingGame( model.Name, - model.StreamUrl.Value, - model.StreamType.Value.GetValueOrDefault()); + model.StreamUrl.Value); } // Normal Game - return new Game(model.Name); + return new Game(model.Name, model.Type.GetValueOrDefault() ?? ActivityType.Playing); } // (Small, Large)