From 662146c4446e893df30c7c2ee0adbc1b5b8a1e20 Mon Sep 17 00:00:00 2001 From: Christopher F Date: Mon, 28 Aug 2017 19:45:54 -0400 Subject: [PATCH] Add model conversions for outgoing+incoming rich presences --- src/Discord.Net.Rest/API/Common/GameAssets.cs | 8 ++-- .../DiscordSocketClient.cs | 46 ++++++++++++++++++- .../Extensions/EntityExtensions.cs | 33 ++++++++++++- 3 files changed, 81 insertions(+), 6 deletions(-) diff --git a/src/Discord.Net.Rest/API/Common/GameAssets.cs b/src/Discord.Net.Rest/API/Common/GameAssets.cs index 9e999ef8d..b5928a8ab 100644 --- a/src/Discord.Net.Rest/API/Common/GameAssets.cs +++ b/src/Discord.Net.Rest/API/Common/GameAssets.cs @@ -5,12 +5,12 @@ namespace Discord.API internal class GameAssets { [JsonProperty("small_text")] - public Optional SmallText { get; } + public Optional SmallText { get; set; } [JsonProperty("small_image")] - public Optional SmallImage { get; } + public Optional SmallImage { get; set; } [JsonProperty("large_image")] - public Optional LargeText { get; } + public Optional LargeText { get; set; } [JsonProperty("large_text")] - public Optional LargeImage { get; } + public Optional LargeImage { get; set; } } } \ No newline at end of file diff --git a/src/Discord.Net.WebSocket/DiscordSocketClient.cs b/src/Discord.Net.WebSocket/DiscordSocketClient.cs index d152bbc03..e5564ba3f 100644 --- a/src/Discord.Net.WebSocket/DiscordSocketClient.cs +++ b/src/Discord.Net.WebSocket/DiscordSocketClient.cs @@ -334,6 +334,12 @@ namespace Discord.WebSocket Game = null; await SendStatusAsync().ConfigureAwait(false); } + + public async Task SetGameAsync(Game game) + { + Game = game; + await SendStatusAsync().ConfigureAwait(false); + } private async Task SendStatusAsync() { if (CurrentUser == null) @@ -346,11 +352,49 @@ namespace Discord.WebSocket GameModel gameModel; if (game != null) { + var assets = game.Value.Assets.HasValue + ? new API.GameAssets() + { + SmallText = game.Value.Assets.Value.SmallText, + SmallImage = game.Value.Assets.Value.SmallImage, + LargeText = game.Value.Assets.Value.LargeText, + LargeImage = game.Value.Assets.Value.LargeImage, + } + : Optional.Create(); + var party = game.Value.Party.HasValue + ? new API.GameParty + { + Id = game.Value.Party.Value.Id, + Size = game.Value.Party.Value.Size + } + : Optional.Create(); + var secrets = game.Value.Secrets.HasValue + ? new API.GameSecrets() + { + Join = game.Value.Secrets.Value.Join, + Match = game.Value.Secrets.Value.Match, + Spectate = game.Value.Secrets.Value.Spectate + } + : Optional.Create(); + var timestamps = game.Value.Timestamps.HasValue + ? new API.GameTimestamps + { + Start = game.Value.Timestamps.Value.Start, + End = game.Value.Timestamps.Value.End + } + : Optional.Create(); gameModel = new API.Game { Name = game.Value.Name, StreamType = game.Value.StreamType, - StreamUrl = game.Value.StreamUrl + StreamUrl = game.Value.StreamUrl, + Details = game.Value.Details, + State = game.Value.State, + ApplicationId = game.Value.ApplicationId ?? Optional.Create(), + Assets = assets, + Party = party, + Secrets = secrets, + Timestamps = timestamps, }; } else diff --git a/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs b/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs index 636ef68f4..be62fec5a 100644 --- a/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs +++ b/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs @@ -6,7 +6,38 @@ { return new Game(model.Name, model.StreamUrl.GetValueOrDefault(null), - model.StreamType.GetValueOrDefault(null) ?? StreamType.NotStreaming); + model.StreamType.GetValueOrDefault(null) ?? StreamType.NotStreaming, + model.Details.GetValueOrDefault(), + model.State.GetValueOrDefault(), + model.ApplicationId.ToNullable(), + model.Assets.GetValueOrDefault(null)?.ToEntity(), + model.Party.GetValueOrDefault(null)?.ToEntity(), + model.Secrets.GetValueOrDefault(null)?.ToEntity(), + model.Timestamps.GetValueOrDefault(null)?.ToEntity() + ); + } + + public static GameAssets ToEntity(this API.GameAssets model) + { + return new GameAssets(model.SmallText.GetValueOrDefault(), + model.SmallImage.GetValueOrDefault(), + model.LargeText.GetValueOrDefault(), + model.LargeImage.GetValueOrDefault()); + } + + public static GameParty ToEntity(this API.GameParty model) + { + return new GameParty(model.Size, model.Id); + } + + public static GameSecrets ToEntity(this API.GameSecrets model) + { + return new GameSecrets(model.Match, model.Join, model.Spectate); + } + + public static GameTimestamps ToEntity(this API.GameTimestamps model) + { + return new GameTimestamps(model.Start, model.End); } } }