| @@ -0,0 +1,42 @@ | |||||
| namespace Discord; | |||||
| /// <summary> | |||||
| /// Represents public flags for a guild member. | |||||
| /// </summary> | |||||
| public enum GuildUserFlags | |||||
| { | |||||
| /// <summary> | |||||
| /// Member has no flags set. | |||||
| /// </summary> | |||||
| None = 0, | |||||
| /// <summary> | |||||
| /// Member has leave and rejoined the guild. | |||||
| /// </summary> | |||||
| /// <remarks> | |||||
| /// Cannot be modified. | |||||
| /// </remarks> | |||||
| DidRejoin = 1 << 0, | |||||
| /// <summary> | |||||
| /// Member has completed onboarding. | |||||
| /// </summary> | |||||
| /// <remarks> | |||||
| /// Cannot be modified. | |||||
| /// </remarks> | |||||
| CompletedOnboarding = 1 << 1, | |||||
| /// <summary> | |||||
| /// Member bypasses guild verification requirements. | |||||
| /// </summary> | |||||
| BypassesVerification = 1 << 2, | |||||
| /// <summary> | |||||
| /// Member has started onboarding. | |||||
| /// </summary> | |||||
| /// <remarks> | |||||
| /// Cannot be modified. | |||||
| /// </remarks> | |||||
| StartedOnboarding = 1 << 3, | |||||
| } | |||||
| @@ -82,5 +82,13 @@ namespace Discord | |||||
| /// <see langword="null"/> or a time in the past to clear a currently existing timeout. | /// <see langword="null"/> or a time in the past to clear a currently existing timeout. | ||||
| /// </remarks> | /// </remarks> | ||||
| public Optional<DateTimeOffset?> TimedOutUntil { get; set; } | public Optional<DateTimeOffset?> TimedOutUntil { get; set; } | ||||
| /// <summary> | |||||
| /// Gets or sets the flags of the guild member. | |||||
| /// </summary> | |||||
| /// <remarks> | |||||
| /// Not all flags can be modified and are reserved for Discord. | |||||
| /// </remarks> | |||||
| public Optional<GuildUserFlags> Flags { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -111,6 +111,11 @@ namespace Discord | |||||
| /// </returns> | /// </returns> | ||||
| DateTimeOffset? TimedOutUntil { get; } | DateTimeOffset? TimedOutUntil { get; } | ||||
| /// <summary> | |||||
| /// Gets the public flags for this guild member. | |||||
| /// </summary> | |||||
| GuildUserFlags Flags { get; } | |||||
| /// <summary> | /// <summary> | ||||
| /// Gets the level permissions granted to this user to a given channel. | /// Gets the level permissions granted to this user to a given channel. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -25,5 +25,8 @@ namespace Discord.API | |||||
| public Optional<DateTimeOffset?> PremiumSince { get; set; } | public Optional<DateTimeOffset?> PremiumSince { get; set; } | ||||
| [JsonProperty("communication_disabled_until")] | [JsonProperty("communication_disabled_until")] | ||||
| public Optional<DateTimeOffset?> TimedOutUntil { get; set; } | public Optional<DateTimeOffset?> TimedOutUntil { get; set; } | ||||
| [JsonProperty("flags")] | |||||
| public GuildUserFlags Flags { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -18,5 +18,8 @@ namespace Discord.API.Rest | |||||
| public Optional<ulong?> ChannelId { get; set; } | public Optional<ulong?> ChannelId { get; set; } | ||||
| [JsonProperty("communication_disabled_until")] | [JsonProperty("communication_disabled_until")] | ||||
| public Optional<DateTimeOffset?> TimedOutUntil { get; set; } | public Optional<DateTimeOffset?> TimedOutUntil { get; set; } | ||||
| [JsonProperty("flags")] | |||||
| public Optional<GuildUserFlags> Flags { get; set; } | |||||
| } | } | ||||
| } | } | ||||
| @@ -38,6 +38,10 @@ namespace Discord.Rest | |||||
| public ulong GuildId { get; } | public ulong GuildId { get; } | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public bool? IsPending { get; private set; } | public bool? IsPending { get; private set; } | ||||
| /// <inheritdoc /> | |||||
| public GuildUserFlags Flags { get; private set; } | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public int Hierarchy | public int Hierarchy | ||||
| { | { | ||||
| @@ -114,6 +118,7 @@ namespace Discord.Rest | |||||
| _timedOutTicks = model.TimedOutUntil.Value?.UtcTicks; | _timedOutTicks = model.TimedOutUntil.Value?.UtcTicks; | ||||
| if (model.Pending.IsSpecified) | if (model.Pending.IsSpecified) | ||||
| IsPending = model.Pending.Value; | IsPending = model.Pending.Value; | ||||
| Flags = model.Flags; | |||||
| } | } | ||||
| private void UpdateRoles(ulong[] roleIds) | private void UpdateRoles(ulong[] roleIds) | ||||
| { | { | ||||
| @@ -71,6 +71,8 @@ namespace Discord.Rest | |||||
| DateTimeOffset? IGuildUser.TimedOutUntil => null; | DateTimeOffset? IGuildUser.TimedOutUntil => null; | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| GuildPermissions IGuildUser.GuildPermissions => GuildPermissions.Webhook; | GuildPermissions IGuildUser.GuildPermissions => GuildPermissions.Webhook; | ||||
| /// <inheritdoc /> | |||||
| GuildUserFlags IGuildUser.Flags => GuildUserFlags.None; | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| ChannelPermissions IGuildUser.GetPermissions(IGuildChannel channel) => Permissions.ToChannelPerms(channel, GuildPermissions.Webhook.RawValue); | ChannelPermissions IGuildUser.GetPermissions(IGuildChannel channel) => Permissions.ToChannelPerms(channel, GuildPermissions.Webhook.RawValue); | ||||
| @@ -40,7 +40,8 @@ namespace Discord.Rest | |||||
| Deaf = args.Deaf, | Deaf = args.Deaf, | ||||
| Mute = args.Mute, | Mute = args.Mute, | ||||
| Nickname = args.Nickname, | Nickname = args.Nickname, | ||||
| TimedOutUntil = args.TimedOutUntil | |||||
| TimedOutUntil = args.TimedOutUntil, | |||||
| Flags = args.Flags | |||||
| }; | }; | ||||
| if (args.Channel.IsSpecified) | if (args.Channel.IsSpecified) | ||||
| @@ -71,6 +71,8 @@ namespace Discord.WebSocket | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public bool? IsPending { get; private set; } | public bool? IsPending { get; private set; } | ||||
| /// <inheritdoc /> | |||||
| public GuildUserFlags Flags { get; private set; } | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public DateTimeOffset? JoinedAt => DateTimeUtils.FromTicks(_joinedAtTicks); | public DateTimeOffset? JoinedAt => DateTimeUtils.FromTicks(_joinedAtTicks); | ||||
| @@ -179,6 +181,8 @@ namespace Discord.WebSocket | |||||
| _timedOutTicks = model.TimedOutUntil.Value?.UtcTicks; | _timedOutTicks = model.TimedOutUntil.Value?.UtcTicks; | ||||
| if (model.Pending.IsSpecified) | if (model.Pending.IsSpecified) | ||||
| IsPending = model.Pending.Value; | IsPending = model.Pending.Value; | ||||
| Flags = model.Flags; | |||||
| } | } | ||||
| internal void Update(ClientState state, PresenceModel model, bool updatePresence) | internal void Update(ClientState state, PresenceModel model, bool updatePresence) | ||||
| { | { | ||||
| @@ -126,6 +126,10 @@ namespace Discord.WebSocket | |||||
| public bool IsVideoing | public bool IsVideoing | ||||
| => GuildUser.IsVideoing; | => GuildUser.IsVideoing; | ||||
| /// <inheritdoc/> | |||||
| public GuildUserFlags Flags | |||||
| => GuildUser.Flags; | |||||
| /// <inheritdoc/> | /// <inheritdoc/> | ||||
| public DateTimeOffset? RequestToSpeakTimestamp | public DateTimeOffset? RequestToSpeakTimestamp | ||||
| => GuildUser.RequestToSpeakTimestamp; | => GuildUser.RequestToSpeakTimestamp; | ||||
| @@ -84,6 +84,8 @@ namespace Discord.WebSocket | |||||
| int IGuildUser.Hierarchy => 0; | int IGuildUser.Hierarchy => 0; | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| GuildPermissions IGuildUser.GuildPermissions => GuildPermissions.Webhook; | GuildPermissions IGuildUser.GuildPermissions => GuildPermissions.Webhook; | ||||
| /// <inheritdoc /> | |||||
| GuildUserFlags IGuildUser.Flags => GuildUserFlags.None; | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| ChannelPermissions IGuildUser.GetPermissions(IGuildChannel channel) => Permissions.ToChannelPerms(channel, GuildPermissions.Webhook.RawValue); | ChannelPermissions IGuildUser.GetPermissions(IGuildChannel channel) => Permissions.ToChannelPerms(channel, GuildPermissions.Webhook.RawValue); | ||||