From 9e8b8975899710d1f882929007eadd279b68febb Mon Sep 17 00:00:00 2001 From: RogueException Date: Tue, 28 Jun 2016 20:05:57 -0300 Subject: [PATCH] Added ISelfUser.ModifyStatusAsync --- src/Discord.Net/API/DiscordAPIClient.cs | 9 ++++++ .../API/Gateway/StatusUpdateParams.cs | 12 +++++++ .../API/Rest/ModifyPresenceParams.cs | 8 +++++ src/Discord.Net/Entities/Users/ISelfUser.cs | 1 + src/Discord.Net/Entities/Users/SelfUser.cs | 31 ++++++++++++++++++- 5 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/Discord.Net/API/Gateway/StatusUpdateParams.cs create mode 100644 src/Discord.Net/API/Rest/ModifyPresenceParams.cs diff --git a/src/Discord.Net/API/DiscordAPIClient.cs b/src/Discord.Net/API/DiscordAPIClient.cs index c2a439b06..55f0cc009 100644 --- a/src/Discord.Net/API/DiscordAPIClient.cs +++ b/src/Discord.Net/API/DiscordAPIClient.cs @@ -394,6 +394,15 @@ namespace Discord.API { await SendGatewayAsync(GatewayOpCode.Heartbeat, lastSeq, options: options).ConfigureAwait(false); } + public async Task SendStatusUpdateAsync(long? idleSince, Game game, RequestOptions options = null) + { + var args = new StatusUpdateParams + { + IdleSince = idleSince, + Game = game + }; + await SendGatewayAsync(GatewayOpCode.StatusUpdate, args, options: options).ConfigureAwait(false); + } public async Task SendRequestMembersAsync(IEnumerable guildIds, RequestOptions options = null) { await SendGatewayAsync(GatewayOpCode.RequestGuildMembers, new RequestMembersParams { GuildIds = guildIds, Query = "", Limit = 0 }, options: options).ConfigureAwait(false); diff --git a/src/Discord.Net/API/Gateway/StatusUpdateParams.cs b/src/Discord.Net/API/Gateway/StatusUpdateParams.cs new file mode 100644 index 000000000..29a525674 --- /dev/null +++ b/src/Discord.Net/API/Gateway/StatusUpdateParams.cs @@ -0,0 +1,12 @@ +using Newtonsoft.Json; + +namespace Discord.API.Gateway +{ + public class StatusUpdateParams + { + [JsonProperty("idle_since"), Int53] + public long? IdleSince { get; set; } + [JsonProperty("game")] + public Game Game { get; set; } + } +} diff --git a/src/Discord.Net/API/Rest/ModifyPresenceParams.cs b/src/Discord.Net/API/Rest/ModifyPresenceParams.cs new file mode 100644 index 000000000..6c6579e4d --- /dev/null +++ b/src/Discord.Net/API/Rest/ModifyPresenceParams.cs @@ -0,0 +1,8 @@ +namespace Discord.API.Rest +{ + public class ModifyPresenceParams + { + public Optional Status { get; set; } + public Optional Game { get; set; } + } +} diff --git a/src/Discord.Net/Entities/Users/ISelfUser.cs b/src/Discord.Net/Entities/Users/ISelfUser.cs index 40f43b019..b6803ccf6 100644 --- a/src/Discord.Net/Entities/Users/ISelfUser.cs +++ b/src/Discord.Net/Entities/Users/ISelfUser.cs @@ -14,5 +14,6 @@ namespace Discord bool IsMfaEnabled { get; } Task ModifyAsync(Action func); + Task ModifyStatusAsync(Action func); } } \ No newline at end of file diff --git a/src/Discord.Net/Entities/Users/SelfUser.cs b/src/Discord.Net/Entities/Users/SelfUser.cs index 393a1ad3a..0e696aea4 100644 --- a/src/Discord.Net/Entities/Users/SelfUser.cs +++ b/src/Discord.Net/Entities/Users/SelfUser.cs @@ -6,11 +6,18 @@ using Model = Discord.API.User; namespace Discord { internal class SelfUser : User, ISelfUser - { + { + private long _idleSince; + private UserStatus _status; + private Game _game; + public string Email { get; private set; } public bool IsVerified { get; private set; } public bool IsMfaEnabled { get; private set; } + public override UserStatus Status => _status; + public override Game Game => _game; + public override DiscordClient Discord { get; } public SelfUser(DiscordClient discord, Model model) @@ -49,5 +56,27 @@ namespace Discord var model = await Discord.ApiClient.ModifySelfAsync(args).ConfigureAwait(false); Update(model, UpdateSource.Rest); } + public async Task ModifyStatusAsync(Action func) + { + if (func == null) throw new NullReferenceException(nameof(func)); + + var args = new ModifyPresenceParams(); + func(args); + + var game = args.Game.GetValueOrDefault(_game); + var status = args.Status.GetValueOrDefault(_status); + + long idleSince = _idleSince; + if (status == UserStatus.Idle && _status != UserStatus.Idle) + idleSince = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); + var apiGame = new API.Game { Name = game.Name, StreamType = game.StreamType, StreamUrl = game.StreamUrl }; + + await Discord.ApiClient.SendStatusUpdateAsync(status == UserStatus.Idle ? _idleSince : (long?)null, apiGame).ConfigureAwait(false); + + //Save values + _idleSince = idleSince; + _game = game; + _status = status; + } } }