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