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);