From b48c6df99db3482e34a0cdab924ea0859e5b7aae Mon Sep 17 00:00:00 2001 From: Chris Johnston Date: Fri, 11 Jan 2019 03:21:25 -0800 Subject: [PATCH] Add implementation of activity flags, and extension method to check flag --- .../Entities/Activities/ActivityFlags.cs | 19 ++++++++++++ .../Entities/Users/UserFlags.cs | 31 +++++++++++++++++++ .../Extensions/ActivityExtensions.cs | 17 ++++++++++ .../Extensions/UserExtensions.cs | 3 ++ src/Discord.Net.Rest/API/Common/Game.cs | 2 ++ src/Discord.Net.Rest/API/Common/User.cs | 6 +++- .../Entities/Users/RestUser.cs | 4 +++ .../Entities/Users/SocketGuildUser.cs | 1 + .../Entities/Users/SocketUser.cs | 15 +++++++++ .../Extensions/EntityExtensions.cs | 8 +++-- 10 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 src/Discord.Net.Core/Entities/Activities/ActivityFlags.cs create mode 100644 src/Discord.Net.Core/Entities/Users/UserFlags.cs create mode 100644 src/Discord.Net.Core/Extensions/ActivityExtensions.cs diff --git a/src/Discord.Net.Core/Entities/Activities/ActivityFlags.cs b/src/Discord.Net.Core/Entities/Activities/ActivityFlags.cs new file mode 100644 index 000000000..69e47dc40 --- /dev/null +++ b/src/Discord.Net.Core/Entities/Activities/ActivityFlags.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + [Flags] + public enum ActivityFlag + { + Instance = 1, + Join = 0b10, + Spectate = 0b100, + JoinRequest = 0b1000, + Sync = 0b10000, + Play = 0b100000 + } +} diff --git a/src/Discord.Net.Core/Entities/Users/UserFlags.cs b/src/Discord.Net.Core/Entities/Users/UserFlags.cs new file mode 100644 index 000000000..54b16676e --- /dev/null +++ b/src/Discord.Net.Core/Entities/Users/UserFlags.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + [Flags] + public enum UserFlag + { + /// + /// Default value for flags, when none are given to an account. + /// + None = 0, + /// + /// Flag given to Discord staff. + /// + Staff = 0b1, + /// + /// Flag given to Discord partners. + /// + Partner = 0b10, + HypeSquadEvents = 0b100, + BugHunter = 0b1000, + HypeSquadBravery = 0b100_0000, + HypeSquadBrilliance = 0b1000_0000, + HypeSquadBalance = 0b1_0000_0000, + EarlySupporter = 0b10_0000_0000, + } +} diff --git a/src/Discord.Net.Core/Extensions/ActivityExtensions.cs b/src/Discord.Net.Core/Extensions/ActivityExtensions.cs new file mode 100644 index 000000000..ba968140b --- /dev/null +++ b/src/Discord.Net.Core/Extensions/ActivityExtensions.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Discord +{ + /// + /// Extension methods for the types. + /// + public static class ActivityExtensions + { + public static bool CheckFlag(this IActivity activity, ActivityFlag flag) + => (activity.Flags & (int)flag) >= (int)flag; + } +} diff --git a/src/Discord.Net.Core/Extensions/UserExtensions.cs b/src/Discord.Net.Core/Extensions/UserExtensions.cs index f98bf7227..cff3d1a09 100644 --- a/src/Discord.Net.Core/Extensions/UserExtensions.cs +++ b/src/Discord.Net.Core/Extensions/UserExtensions.cs @@ -160,5 +160,8 @@ namespace Discord /// public static Task BanAsync(this IGuildUser user, int pruneDays = 0, string reason = null, RequestOptions options = null) => user.Guild.AddBanAsync(user, pruneDays, reason, options); + + public static bool CheckUserFlag(this IUser user, UserFlag flag) + => (user.Flags & (int)flag) >= (int)flag; } } diff --git a/src/Discord.Net.Rest/API/Common/Game.cs b/src/Discord.Net.Rest/API/Common/Game.cs index 4cde8444a..09c74b1dc 100644 --- a/src/Discord.Net.Rest/API/Common/Game.cs +++ b/src/Discord.Net.Rest/API/Common/Game.cs @@ -33,6 +33,8 @@ namespace Discord.API public Optional SyncId { get; set; } [JsonProperty("session_id")] public Optional SessionId { get; set; } + [JsonProperty("Flags")] + public Optional Flags { get; set; } [OnError] internal void OnError(StreamingContext context, ErrorContext errorContext) diff --git a/src/Discord.Net.Rest/API/Common/User.cs b/src/Discord.Net.Rest/API/Common/User.cs index d49d24623..1a124ea6e 100644 --- a/src/Discord.Net.Rest/API/Common/User.cs +++ b/src/Discord.Net.Rest/API/Common/User.cs @@ -1,4 +1,4 @@ -#pragma warning disable CS1591 +#pragma warning disable CS1591 using Newtonsoft.Json; namespace Discord.API @@ -23,5 +23,9 @@ namespace Discord.API public Optional Email { get; set; } [JsonProperty("mfa_enabled")] public Optional MfaEnabled { get; set; } + [JsonProperty("flags")] + public Optional Flags { get; set; } + [JsonProperty("premium_type")] + public Optional PremiumType { get; set; } } } diff --git a/src/Discord.Net.Rest/Entities/Users/RestUser.cs b/src/Discord.Net.Rest/Entities/Users/RestUser.cs index 6bfa9bcf3..29cfcd3aa 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestUser.cs @@ -63,6 +63,10 @@ namespace Discord.Rest IsBot = model.Bot.Value; if (model.Username.IsSpecified) Username = model.Username.Value; + if (model.Flags.IsSpecified) + Flags = model.Flags.Value; + if (model.PremiumType.IsSpecified) + PremiumType = model.PremiumType.Value; } /// diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index 659a2eeea..47d9f93b7 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -194,5 +194,6 @@ namespace Discord.WebSocket //IVoiceState /// IVoiceChannel IVoiceState.VoiceChannel => VoiceChannel; + } } diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs index 4832e7311..ead657da6 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketUser.cs @@ -38,6 +38,11 @@ namespace Discord.WebSocket public IActivity Activity => Presence.Activity; /// public UserStatus Status => Presence.Status; + /// + public int Flags { get; internal set; } + /// + public PremiumType? PremiumType { get; internal set; } + /// /// Gets mutual guilds shared with this user. /// @@ -75,6 +80,16 @@ namespace Discord.WebSocket Username = model.Username.Value; hasChanges = true; } + if (model.Flags.IsSpecified && model.Flags.Value != Flags) + { + Flags = model.Flags.Value; + hasChanges = true; + } + if (model.PremiumType.IsSpecified && model.PremiumType.Value != PremiumType) + { + PremiumType = model.PremiumType.Value; + hasChanges = true; + } return hasChanges; } diff --git a/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs b/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs index e8dc4b5f0..f97f59746 100644 --- a/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs +++ b/src/Discord.Net.WebSocket/Extensions/EntityExtensions.cs @@ -25,7 +25,8 @@ namespace Discord.WebSocket Artists = model.State.GetValueOrDefault()?.Split(';').Select(x=>x?.Trim()).ToImmutableArray(), Duration = timestamps?.End - timestamps?.Start, AlbumArtUrl = albumArtId != null ? CDN.GetSpotifyAlbumArtUrl(albumArtId) : null, - Type = ActivityType.Listening + Type = ActivityType.Listening, + Flags = model.Flags.GetValueOrDefault() }; } @@ -44,14 +45,15 @@ namespace Discord.WebSocket LargeAsset = assets?[1], Party = model.Party.IsSpecified ? model.Party.Value.ToEntity() : null, Secrets = model.Secrets.IsSpecified ? model.Secrets.Value.ToEntity() : null, - Timestamps = model.Timestamps.IsSpecified ? model.Timestamps.Value.ToEntity() : null + Timestamps = model.Timestamps.IsSpecified ? model.Timestamps.Value.ToEntity() : null, + Flags = model.Flags.GetValueOrDefault() }; } // Stream Game if (model.StreamUrl.IsSpecified) { return new StreamingGame( - model.Name, + model.Name, model.StreamUrl.Value); } // Normal Game