From 4a690b09a5731846e34ea224a90439d167b8c66f Mon Sep 17 00:00:00 2001 From: Misha133 Date: Mon, 23 Jan 2023 21:16:59 +0300 Subject: [PATCH] implement `GuildUserFlags` --- .../Entities/Users/GuildUserFlags.cs | 42 +++++++++++++++++++ .../Entities/Users/GuildUserProperties.cs | 8 ++++ .../Entities/Users/IGuildUser.cs | 5 +++ .../API/Common/GuildMember.cs | 3 ++ .../API/Rest/ModifyGuildMemberParams.cs | 3 ++ .../Entities/Users/RestGuildUser.cs | 5 +++ .../Entities/Users/RestWebhookUser.cs | 2 + .../Entities/Users/UserHelper.cs | 3 +- .../Entities/Users/SocketGuildUser.cs | 4 ++ .../Entities/Users/SocketThreadUser.cs | 4 ++ .../Entities/Users/SocketWebhookUser.cs | 2 + 11 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 src/Discord.Net.Core/Entities/Users/GuildUserFlags.cs diff --git a/src/Discord.Net.Core/Entities/Users/GuildUserFlags.cs b/src/Discord.Net.Core/Entities/Users/GuildUserFlags.cs new file mode 100644 index 000000000..0b0cbb59e --- /dev/null +++ b/src/Discord.Net.Core/Entities/Users/GuildUserFlags.cs @@ -0,0 +1,42 @@ +namespace Discord; + + +/// +/// Represents public flags for a guild member. +/// +public enum GuildUserFlags +{ + /// + /// Member has no flags set. + /// + None = 0, + + /// + /// Member has leave and rejoined the guild. + /// + /// + /// Cannot be modified. + /// + DidRejoin = 1 << 0, + + /// + /// Member has completed onboarding. + /// + /// + /// Cannot be modified. + /// + CompletedOnboarding = 1 << 1, + + /// + /// Member bypasses guild verification requirements. + /// + BypassesVerification = 1 << 2, + + /// + /// Member has started onboarding. + /// + /// + /// Cannot be modified. + /// + StartedOnboarding = 1 << 3, +} diff --git a/src/Discord.Net.Core/Entities/Users/GuildUserProperties.cs b/src/Discord.Net.Core/Entities/Users/GuildUserProperties.cs index 5411f5ebf..83ee377e4 100644 --- a/src/Discord.Net.Core/Entities/Users/GuildUserProperties.cs +++ b/src/Discord.Net.Core/Entities/Users/GuildUserProperties.cs @@ -82,5 +82,13 @@ namespace Discord /// or a time in the past to clear a currently existing timeout. /// public Optional TimedOutUntil { get; set; } + + /// + /// Gets or sets the flags of the guild member. + /// + /// + /// Not all flags can be modified and are reserved for Discord. + /// + public Optional Flags { get; set; } } } diff --git a/src/Discord.Net.Core/Entities/Users/IGuildUser.cs b/src/Discord.Net.Core/Entities/Users/IGuildUser.cs index 9703eafe7..572bfc490 100644 --- a/src/Discord.Net.Core/Entities/Users/IGuildUser.cs +++ b/src/Discord.Net.Core/Entities/Users/IGuildUser.cs @@ -111,6 +111,11 @@ namespace Discord /// DateTimeOffset? TimedOutUntil { get; } + /// + /// Gets the public flags for this guild member. + /// + GuildUserFlags Flags { get; } + /// /// Gets the level permissions granted to this user to a given channel. /// diff --git a/src/Discord.Net.Rest/API/Common/GuildMember.cs b/src/Discord.Net.Rest/API/Common/GuildMember.cs index cd3101224..3bdf0d6b1 100644 --- a/src/Discord.Net.Rest/API/Common/GuildMember.cs +++ b/src/Discord.Net.Rest/API/Common/GuildMember.cs @@ -25,5 +25,8 @@ namespace Discord.API public Optional PremiumSince { get; set; } [JsonProperty("communication_disabled_until")] public Optional TimedOutUntil { get; set; } + + [JsonProperty("flags")] + public GuildUserFlags Flags { get; set; } } } diff --git a/src/Discord.Net.Rest/API/Rest/ModifyGuildMemberParams.cs b/src/Discord.Net.Rest/API/Rest/ModifyGuildMemberParams.cs index eb7c944d1..ad2b91f20 100644 --- a/src/Discord.Net.Rest/API/Rest/ModifyGuildMemberParams.cs +++ b/src/Discord.Net.Rest/API/Rest/ModifyGuildMemberParams.cs @@ -18,5 +18,8 @@ namespace Discord.API.Rest public Optional ChannelId { get; set; } [JsonProperty("communication_disabled_until")] public Optional TimedOutUntil { get; set; } + + [JsonProperty("flags")] + public Optional Flags { get; set; } } } diff --git a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs index 6c311b6b5..e1f871fdf 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestGuildUser.cs @@ -38,6 +38,10 @@ namespace Discord.Rest public ulong GuildId { get; } /// public bool? IsPending { get; private set; } + + /// + public GuildUserFlags Flags { get; private set; } + /// public int Hierarchy { @@ -114,6 +118,7 @@ namespace Discord.Rest _timedOutTicks = model.TimedOutUntil.Value?.UtcTicks; if (model.Pending.IsSpecified) IsPending = model.Pending.Value; + Flags = model.Flags; } private void UpdateRoles(ulong[] roleIds) { diff --git a/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs b/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs index 3fa88649a..10d237135 100644 --- a/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs +++ b/src/Discord.Net.Rest/Entities/Users/RestWebhookUser.cs @@ -71,6 +71,8 @@ namespace Discord.Rest DateTimeOffset? IGuildUser.TimedOutUntil => null; /// GuildPermissions IGuildUser.GuildPermissions => GuildPermissions.Webhook; + /// + GuildUserFlags IGuildUser.Flags => GuildUserFlags.None; /// ChannelPermissions IGuildUser.GetPermissions(IGuildChannel channel) => Permissions.ToChannelPerms(channel, GuildPermissions.Webhook.RawValue); diff --git a/src/Discord.Net.Rest/Entities/Users/UserHelper.cs b/src/Discord.Net.Rest/Entities/Users/UserHelper.cs index 393effb2e..66fd53269 100644 --- a/src/Discord.Net.Rest/Entities/Users/UserHelper.cs +++ b/src/Discord.Net.Rest/Entities/Users/UserHelper.cs @@ -40,7 +40,8 @@ namespace Discord.Rest Deaf = args.Deaf, Mute = args.Mute, Nickname = args.Nickname, - TimedOutUntil = args.TimedOutUntil + TimedOutUntil = args.TimedOutUntil, + Flags = args.Flags }; if (args.Channel.IsSpecified) diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs index 051687b78..c1dc58eb2 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketGuildUser.cs @@ -71,6 +71,8 @@ namespace Discord.WebSocket /// public bool? IsPending { get; private set; } + /// + public GuildUserFlags Flags { get; private set; } /// public DateTimeOffset? JoinedAt => DateTimeUtils.FromTicks(_joinedAtTicks); @@ -179,6 +181,8 @@ namespace Discord.WebSocket _timedOutTicks = model.TimedOutUntil.Value?.UtcTicks; if (model.Pending.IsSpecified) IsPending = model.Pending.Value; + + Flags = model.Flags; } internal void Update(ClientState state, PresenceModel model, bool updatePresence) { diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs index 6eddd876d..290681d4d 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketThreadUser.cs @@ -126,6 +126,10 @@ namespace Discord.WebSocket public bool IsVideoing => GuildUser.IsVideoing; + /// + public GuildUserFlags Flags + => GuildUser.Flags; + /// public DateTimeOffset? RequestToSpeakTimestamp => GuildUser.RequestToSpeakTimestamp; diff --git a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs index 2b2c259c5..326334978 100644 --- a/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs +++ b/src/Discord.Net.WebSocket/Entities/Users/SocketWebhookUser.cs @@ -84,6 +84,8 @@ namespace Discord.WebSocket int IGuildUser.Hierarchy => 0; /// GuildPermissions IGuildUser.GuildPermissions => GuildPermissions.Webhook; + /// + GuildUserFlags IGuildUser.Flags => GuildUserFlags.None; /// ChannelPermissions IGuildUser.GetPermissions(IGuildChannel channel) => Permissions.ToChannelPerms(channel, GuildPermissions.Webhook.RawValue);