From 5cc3f4f054b758c7555e551874e9af13f5cd71a9 Mon Sep 17 00:00:00 2001 From: Misha133 Date: Wed, 8 Jan 2025 00:22:25 +0300 Subject: [PATCH] refactor & updates --- .../Guilds/MemberSearchPropertiesV2.cs | 171 +++++++++++++----- .../API/Common/GuildMemberSearchResponse.cs | 2 +- ...MemberData.cs => SupplementalGuildUser.cs} | 2 +- .../API/Rest/SearchGuildMembersParamsV2.cs | 43 +++-- src/Discord.Net.Rest/DiscordRestApiClient.cs | 6 +- .../Entities/Guilds/GuildHelper.cs | 158 +--------------- .../Extensions/MemberSearchExtensions.cs | 43 +++++ 7 files changed, 200 insertions(+), 225 deletions(-) rename src/Discord.Net.Rest/API/Common/{GuildSearchMemberData.cs => SupplementalGuildUser.cs} (91%) create mode 100644 src/Discord.Net.Rest/Extensions/MemberSearchExtensions.cs diff --git a/src/Discord.Net.Core/Entities/Guilds/MemberSearchPropertiesV2.cs b/src/Discord.Net.Core/Entities/Guilds/MemberSearchPropertiesV2.cs index 476f3a8247..c42578e9f8 100644 --- a/src/Discord.Net.Core/Entities/Guilds/MemberSearchPropertiesV2.cs +++ b/src/Discord.Net.Core/Entities/Guilds/MemberSearchPropertiesV2.cs @@ -13,7 +13,12 @@ public class MemberSearchPropertiesV2 /// /// Gets or sets the after property for the search. /// - public MemberSearchPropertiesV2After After { get; set; } + public MemberSearchPaginationFilter After { get; set; } + + /// + /// Gets or sets the before property for the search. + /// + public MemberSearchPaginationFilter Before { get; set; } /// /// Gets or sets the sort type for the search. @@ -23,19 +28,19 @@ public class MemberSearchPropertiesV2 /// /// Gets or sets the and query for the search. /// - public MemberSearchV2QueryParams? AndQuery { get; set; } + public MemberSearchFilter? AndQuery { get; set; } /// /// Gets or sets the or query for the search. /// - public MemberSearchV2QueryParams? OrQuery { get; set; } + public MemberSearchFilter? OrQuery { get; set; } } /// /// Represents the after property for searching members in a guild. /// -public struct MemberSearchPropertiesV2After +public struct MemberSearchPaginationFilter { /// /// Gets or sets the user ID to search after. @@ -47,24 +52,26 @@ public struct MemberSearchPropertiesV2After /// public long GuildJoinedAt { get; set; } - public MemberSearchPropertiesV2After(ulong userId, long guildJoinedAt) + public MemberSearchPaginationFilter(ulong userId, long guildJoinedAt) { UserId = userId; GuildJoinedAt = guildJoinedAt; } - public MemberSearchPropertiesV2After(ulong userId, DateTimeOffset guildJoinedAt) + public MemberSearchPaginationFilter(ulong userId, DateTimeOffset guildJoinedAt) { UserId = userId; GuildJoinedAt = guildJoinedAt.ToUnixTimeMilliseconds(); } + + public MemberSearchPaginationFilter() { } } /// /// Represents the query parameters for searching members in a guild. /// -public struct MemberSearchV2QueryParams +public struct MemberSearchFilter { /// /// Gets or sets the safety signal search properties. @@ -74,27 +81,60 @@ public struct MemberSearchV2QueryParams /// /// Gets or sets the role IDs to search for. /// - public MemberSearchV2QueryProperties? RoleIds { get; set; } + /// + /// Only and are supported. + /// + public MemberSearchSnowflakeQuery? RoleIds { get; set; } /// /// Gets or sets the range to search for the user ID. /// - public MemberSearchV2RangeProperties? UserId { get; set; } + /// + /// Only and are supported. + /// + public MemberSearchSnowflakeQuery? UserId { get; set; } /// /// Gets or sets the range to search for the user's guild joined at timestamp. /// - public MemberSearchV2RangeProperties? GuildJoinedAt { get; set; } + /// + /// Only is supported. + /// + public MemberSearchIntQuery? GuildJoinedAt { get; set; } /// /// Gets or sets the source invite code to search for. /// - public MemberSearchV2QueryProperties? SourceInviteCode { get; set; } + /// + /// Only is supported. + /// + public MemberSearchStringQuery? SourceInviteCode { get; set; } /// /// Gets or sets the join source type to search for. /// - public MemberSearchV2QueryProperties? JoinSourceType { get; set; } + /// + /// Only is supported. + /// + public MemberSearchIntQuery? JoinSourceType { get; set; } + + /// + /// Gets or sets whether the member left and rejoined the guild. + /// + public bool? DidRejoin { get; set; } + + /// + /// Gets or sets whether the member has not yet passed the guild's member verification requirements. + /// + public bool? IsPending { get; set; } + + /// + /// Gets or sets the usernames to match against. + /// + /// + /// Only is supported. + /// + public MemberSearchStringQuery? Usernames { get; set; } } @@ -106,12 +146,12 @@ public struct MemberSearchV2SafetySignalsProperties /// /// Gets or sets the unusual DM activity until property for the search. /// - public MemberSearchV2SafetySignalProperties? UnusualDmActivityUntil { get; set; } + public MemberSearchIntQuery? UnusualDmActivityUntil { get; set; } /// /// Gets or sets the communication disabled until property for the search. /// - public MemberSearchV2SafetySignalProperties? CommunicationDisabledUntil { get; set; } + public MemberSearchIntQuery? CommunicationDisabledUntil { get; set; } /// /// Gets or sets the unusual account activity property for the search. @@ -124,60 +164,93 @@ public struct MemberSearchV2SafetySignalsProperties public bool? AutomodQuarantinedUsername { get; set; } } - /// -/// Represents the query properties for searching members in a guild. +/// Represents the range properties for searching members in a guild. /// -public readonly struct MemberSearchV2QueryProperties +public struct MemberSearchV2Range { /// - /// Gets the and query for the search. + /// Gets or sets the less than property for the search. /// - public Dictionary AndQuery { get; } + public long? LessThanOrEqual { get; set; } /// - /// Gets the or query for the search. + /// Gets or sets the greater than property for the search. /// - public Dictionary OrQuery { get; } - - public MemberSearchV2QueryProperties(Dictionary andQuery, Dictionary orQuery) - { - AndQuery = andQuery.Select(x => new KeyValuePair(x.Key, x.Value)).ToDictionary(x => x.Key, y => y.Value); - OrQuery = orQuery.Select(x => new KeyValuePair(x.Key, x.Value)).ToDictionary(x => x.Key, y => y.Value); - } - - public MemberSearchV2QueryProperties(Dictionary andQuery, Dictionary orQuery) - { - AndQuery = andQuery.Select(x => new KeyValuePair(x.Key, x.Value)).ToDictionary(x => x.Key, y => y.Value); - OrQuery = orQuery.Select(x => new KeyValuePair(x.Key, x.Value)).ToDictionary(x => x.Key, y => y.Value); - } + public long? GreaterThanOrEqual { get; set; } } -/// -/// Represents the safety signal properties for searching members in a guild. -/// -public struct MemberSearchV2SafetySignalProperties +public interface IMemberSearchQuery { /// /// Gets or sets the range for the search. /// - public MemberSearchV2RangeProperties Range { get; set; } -} - + MemberSearchV2Range? Range { get; } -/// -/// Represents the range properties for searching members in a guild. -/// -public struct MemberSearchV2RangeProperties -{ /// - /// Gets or sets the less than property for the search. + /// Gets the AND query for the search. /// - public long? LessThanOrEqual { get; set; } + IEnumerable AndQuery { get; } /// - /// Gets or sets the greater than property for the search. + /// Gets the OR query for the search. /// - public long? GreaterThanOrEqual { get; set; } + IEnumerable OrQuery { get; } +} + +public struct MemberSearchStringQuery : IMemberSearchQuery +{ + /// + public MemberSearchV2Range? Range { get; set; } + + /// + public IEnumerable AndQuery { get; set; } + + /// + public IEnumerable OrQuery { get; set; } + + /// + IEnumerable IMemberSearchQuery.AndQuery => AndQuery; + + /// + IEnumerable IMemberSearchQuery.OrQuery => OrQuery; +} + + +public struct MemberSearchIntQuery : IMemberSearchQuery +{ + /// + public MemberSearchV2Range? Range { get; set; } + + /// + public IEnumerable AndQuery { get; set; } + + /// + public IEnumerable OrQuery { get; set; } + + /// + IEnumerable IMemberSearchQuery.AndQuery => AndQuery.Select(x => (object)x); + + /// + IEnumerable IMemberSearchQuery.OrQuery => OrQuery.Select(x => (object)x); +} + + +public struct MemberSearchSnowflakeQuery : IMemberSearchQuery +{ + /// + public MemberSearchV2Range? Range { get; set; } + + /// + public IEnumerable AndQuery { get; set; } + + /// + public IEnumerable OrQuery { get; set; } + + /// + IEnumerable IMemberSearchQuery.AndQuery => AndQuery.Select(x => (object)x); + + /// + IEnumerable IMemberSearchQuery.OrQuery => OrQuery.Select(x => (object)x); } diff --git a/src/Discord.Net.Rest/API/Common/GuildMemberSearchResponse.cs b/src/Discord.Net.Rest/API/Common/GuildMemberSearchResponse.cs index 46b866c65c..00eca80e54 100644 --- a/src/Discord.Net.Rest/API/Common/GuildMemberSearchResponse.cs +++ b/src/Discord.Net.Rest/API/Common/GuildMemberSearchResponse.cs @@ -8,7 +8,7 @@ internal class GuildMemberSearchResponse public ulong GuildId { get; set; } [JsonProperty("members")] - public GuildSearchMemberData[] Members { get; set; } + public SupplementalGuildUser[] Members { get; set; } [JsonProperty("page_result_count")] public int PageResultCount { get; set; } diff --git a/src/Discord.Net.Rest/API/Common/GuildSearchMemberData.cs b/src/Discord.Net.Rest/API/Common/SupplementalGuildUser.cs similarity index 91% rename from src/Discord.Net.Rest/API/Common/GuildSearchMemberData.cs rename to src/Discord.Net.Rest/API/Common/SupplementalGuildUser.cs index ad77db14ed..db044d99af 100644 --- a/src/Discord.Net.Rest/API/Common/GuildSearchMemberData.cs +++ b/src/Discord.Net.Rest/API/Common/SupplementalGuildUser.cs @@ -2,7 +2,7 @@ namespace Discord.API; -internal class GuildSearchMemberData +internal class SupplementalGuildUser { [JsonProperty("member")] public GuildMember Member { get; set; } diff --git a/src/Discord.Net.Rest/API/Rest/SearchGuildMembersParamsV2.cs b/src/Discord.Net.Rest/API/Rest/SearchGuildMembersParamsV2.cs index 709e854233..2575b4f679 100644 --- a/src/Discord.Net.Rest/API/Rest/SearchGuildMembersParamsV2.cs +++ b/src/Discord.Net.Rest/API/Rest/SearchGuildMembersParamsV2.cs @@ -9,19 +9,22 @@ internal class SearchGuildMembersParamsV2 public Optional Limit { get; set; } [JsonProperty("and_query")] - public Optional AndQuery { get; set; } + public Optional AndQuery { get; set; } [JsonProperty("or_query")] - public Optional OrQuery { get; set; } + public Optional OrQuery { get; set; } [JsonProperty("after")] - public Optional After { get; set; } + public Optional After { get; set; } + + [JsonProperty("before")] + public Optional Before { get; set; } [JsonProperty("sort")] public Optional Sort { get; set; } } -internal class SearchParamsAfter +internal class MemberSearchPaginationFilter { [JsonProperty("guild_joined_at")] public long GuildJoinedAt { get; set; } @@ -30,7 +33,7 @@ internal class SearchParamsAfter public ulong UserId { get; set; } } -internal class SearchQueryParams +internal class MemberSearchFilter { [JsonProperty("safety_signals")] public Optional SafetySignals { get; set; } @@ -39,34 +42,46 @@ internal class SearchQueryParams public Optional RoleIds { get; set; } [JsonProperty("user_id")] - public Optional UserId { get; set; } + public Optional UserId { get; set; } [JsonProperty("guild_joined_at")] - public Optional GuildJoinedAt { get; set; } + public Optional GuildJoinedAt { get; set; } [JsonProperty("source_invite_code")] public Optional SourceInviteCode { get; set; } [JsonProperty("join_source_type")] public Optional JoinSourceType { get; set; } + + [JsonProperty("did_rejoin")] + public Optional DidRejoin { get; set; } + + [JsonProperty("is_pending")] + public Optional IsPending { get; set; } + + [JsonProperty("usernames")] + public Optional Usernames { get; set; } } internal class SearchQueryProperties { [JsonProperty("and_query")] - public Optional> AndQuery { get; set; } + public Optional> AndQuery { get; set; } [JsonProperty("or_query")] - public Optional> OrQuery { get; set; } + public Optional> OrQuery { get; set; } + + [JsonProperty("range")] + public Optional Range { get; set; } } internal class SafetySignalsProperties { [JsonProperty("unusual_dm_activity_until")] - public Optional UnusualDMActivityUntil { get; set; } + public Optional UnusualDMActivityUntil { get; set; } [JsonProperty("communication_disabled_until")] - public Optional CommunicationDisabledUntil { get; set; } + public Optional CommunicationDisabledUntil { get; set; } [JsonProperty("unusual_account_activity")] public Optional UnusualAccountActivity { get; set; } @@ -75,12 +90,6 @@ internal class SafetySignalsProperties public Optional AutomodQuarantinedUsername { get; set; } } -internal class SafetySignalProperties -{ - [JsonProperty("range")] - public SearchRangeProperties Until { get; set; } -} - internal class SearchRangeProperties { [JsonProperty("gte")] diff --git a/src/Discord.Net.Rest/DiscordRestApiClient.cs b/src/Discord.Net.Rest/DiscordRestApiClient.cs index 58bded37cc..9cb5992374 100644 --- a/src/Discord.Net.Rest/DiscordRestApiClient.cs +++ b/src/Discord.Net.Rest/DiscordRestApiClient.cs @@ -2047,13 +2047,15 @@ public Task> SearchGuildMembersAsync(ulong guil return SendAsync>("GET", endpoint, ids, options: options); } - public Task SearchGuildMembersAsyncV2(ulong guildId, SearchGuildMembersParamsV2 args, RequestOptions options = null) + public async Task SearchGuildMembersAsyncV2(ulong guildId, SearchGuildMembersParamsV2 args, RequestOptions options = null) { Preconditions.NotEqual(guildId, 0, nameof(guildId)); options = RequestOptions.CreateOrClone(options); var ids = new BucketIds(guildId: guildId); - return SendJsonAsync("POST", () => $"guilds/{guildId}/members-search", args, ids, options: options); + var response = await SendJsonAsync("POST", () => $"guilds/{guildId}/members-search", args, ids, options: options); + + return response; } #endregion diff --git a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs index ac9dce1207..a5ba8e4d01 100644 --- a/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs +++ b/src/Discord.Net.Rest/Entities/Guilds/GuildHelper.cs @@ -779,166 +779,14 @@ public static async Task SearchUsersAsyncV2(IGuild guild, Ba Limit = limit, After = args is null ? null - : new SearchParamsAfter + : new API.Rest.MemberSearchPaginationFilter { UserId = args.After.UserId, GuildJoinedAt = args.After.GuildJoinedAt }, Sort = args?.Sort ?? Optional.Unspecified, - OrQuery = args is null - ? Optional.Unspecified - : args.OrQuery is null - ? Optional.Unspecified - : new SearchQueryParams - { - GuildJoinedAt = args.OrQuery.Value.GuildJoinedAt is null - ? Optional.Unspecified - : new SearchRangeProperties - { - GreaterThanOrEqual = args.OrQuery.Value.GuildJoinedAt.Value.GreaterThanOrEqual is null - ? Optional.Unspecified - : args.OrQuery.Value.GuildJoinedAt.Value.GreaterThanOrEqual.Value, - LessThanOrEqual = args.OrQuery.Value.GuildJoinedAt.Value.LessThanOrEqual is null - ? Optional.Unspecified - : args.OrQuery.Value.GuildJoinedAt.Value.LessThanOrEqual.Value, - }, - JoinSourceType = args.OrQuery.Value.JoinSourceType is null - ? Optional.Unspecified - : new SearchQueryProperties - { - AndQuery = args.OrQuery.Value.JoinSourceType.Value.AndQuery ?? Optional>.Unspecified, - OrQuery = args.OrQuery.Value.JoinSourceType.Value.OrQuery ?? Optional>.Unspecified - }, - RoleIds = args.OrQuery.Value.RoleIds is null - ? Optional.Unspecified - : new SearchQueryProperties - { - AndQuery = args.OrQuery.Value.RoleIds.Value.AndQuery ?? Optional>.Unspecified, - OrQuery = args.OrQuery.Value.RoleIds.Value.OrQuery ?? Optional>.Unspecified - }, - SourceInviteCode = args.OrQuery.Value.SourceInviteCode is null - ? Optional.Unspecified - : new SearchQueryProperties - { - AndQuery = args.OrQuery.Value.SourceInviteCode.Value.AndQuery ?? Optional>.Unspecified, - OrQuery = args.OrQuery.Value.SourceInviteCode.Value.OrQuery ?? Optional>.Unspecified - }, - SafetySignals = args.OrQuery.Value.SafetySignals is null - ? Optional.Unspecified - : new SafetySignalsProperties - { - AutomodQuarantinedUsername = args.OrQuery.Value.SafetySignals.Value.AutomodQuarantinedUsername is null - ? Optional.Unspecified - : args.OrQuery.Value.SafetySignals.Value.AutomodQuarantinedUsername.Value, - UnusualAccountActivity = args.OrQuery.Value.SafetySignals.Value.UnusualAccountActivity is null - ? Optional.Unspecified - : args.OrQuery.Value.SafetySignals.Value.UnusualAccountActivity.Value, - CommunicationDisabledUntil = args.OrQuery.Value.SafetySignals.Value.CommunicationDisabledUntil is null - ? Optional.Unspecified - : new SafetySignalProperties - { - Until = new SearchRangeProperties - { - GreaterThanOrEqual = args.OrQuery.Value.SafetySignals.Value.CommunicationDisabledUntil.Value.Range.GreaterThanOrEqual ?? Optional.Unspecified, - LessThanOrEqual = args.OrQuery.Value.SafetySignals.Value.CommunicationDisabledUntil.Value.Range.LessThanOrEqual ?? Optional.Unspecified, - } - }, - UnusualDMActivityUntil = args.OrQuery.Value.SafetySignals.Value.UnusualDmActivityUntil is null - ? Optional.Unspecified - : new SafetySignalProperties - { - Until = new SearchRangeProperties - { - GreaterThanOrEqual = args.OrQuery.Value.SafetySignals.Value.UnusualDmActivityUntil.Value.Range.GreaterThanOrEqual ?? Optional.Unspecified, - LessThanOrEqual = args.OrQuery.Value.SafetySignals.Value.UnusualDmActivityUntil.Value.Range.LessThanOrEqual ?? Optional.Unspecified, - } - }, - }, - UserId = args.OrQuery.Value.UserId is null - ? Optional.Unspecified - : new SearchRangeProperties - { - LessThanOrEqual = args.OrQuery.Value.UserId.Value.LessThanOrEqual ?? Optional.Unspecified, - GreaterThanOrEqual = args.OrQuery.Value.UserId.Value.GreaterThanOrEqual ?? Optional.Unspecified, - }, - }, - AndQuery = args is null - ? Optional.Unspecified - : args.AndQuery is null - ? Optional.Unspecified - : new SearchQueryParams - { - GuildJoinedAt = args.AndQuery.Value.GuildJoinedAt is null - ? Optional.Unspecified - : new SearchRangeProperties - { - GreaterThanOrEqual = args.AndQuery.Value.GuildJoinedAt.Value.GreaterThanOrEqual is null - ? Optional.Unspecified - : args.AndQuery.Value.GuildJoinedAt.Value.GreaterThanOrEqual.Value, - LessThanOrEqual = args.AndQuery.Value.GuildJoinedAt.Value.LessThanOrEqual is null - ? Optional.Unspecified - : args.AndQuery.Value.GuildJoinedAt.Value.LessThanOrEqual.Value, - }, - JoinSourceType = args.AndQuery.Value.JoinSourceType is null - ? Optional.Unspecified - : new SearchQueryProperties - { - AndQuery = args.AndQuery.Value.JoinSourceType.Value.AndQuery ?? Optional>.Unspecified, - OrQuery = args.AndQuery.Value.JoinSourceType.Value.OrQuery ?? Optional>.Unspecified - }, - RoleIds = args.AndQuery.Value.RoleIds is null - ? Optional.Unspecified - : new SearchQueryProperties - { - AndQuery = args.AndQuery.Value.RoleIds.Value.AndQuery ?? Optional>.Unspecified, - OrQuery = args.AndQuery.Value.RoleIds.Value.OrQuery ?? Optional>.Unspecified - }, - SourceInviteCode = args.AndQuery.Value.SourceInviteCode is null - ? Optional.Unspecified - : new SearchQueryProperties - { - AndQuery = args.AndQuery.Value.SourceInviteCode.Value.AndQuery ?? Optional>.Unspecified, - OrQuery = args.AndQuery.Value.SourceInviteCode.Value.OrQuery ?? Optional>.Unspecified - }, - SafetySignals = args.AndQuery.Value.SafetySignals is null - ? Optional.Unspecified - : new SafetySignalsProperties - { - AutomodQuarantinedUsername = args.AndQuery.Value.SafetySignals.Value.AutomodQuarantinedUsername is null - ? Optional.Unspecified - : args.AndQuery.Value.SafetySignals.Value.AutomodQuarantinedUsername.Value, - UnusualAccountActivity = args.AndQuery.Value.SafetySignals.Value.UnusualAccountActivity is null - ? Optional.Unspecified - : args.AndQuery.Value.SafetySignals.Value.UnusualAccountActivity.Value, - CommunicationDisabledUntil = args.AndQuery.Value.SafetySignals.Value.CommunicationDisabledUntil is null - ? Optional.Unspecified - : new SafetySignalProperties - { - Until = new SearchRangeProperties - { - GreaterThanOrEqual = args.AndQuery.Value.SafetySignals.Value.CommunicationDisabledUntil.Value.Range.GreaterThanOrEqual ?? Optional.Unspecified, - LessThanOrEqual = args.AndQuery.Value.SafetySignals.Value.CommunicationDisabledUntil.Value.Range.LessThanOrEqual ?? Optional.Unspecified, - } - }, - UnusualDMActivityUntil = args.AndQuery.Value.SafetySignals.Value.UnusualDmActivityUntil is null - ? Optional.Unspecified - : new SafetySignalProperties - { - Until = new SearchRangeProperties - { - GreaterThanOrEqual = args.AndQuery.Value.SafetySignals.Value.UnusualDmActivityUntil.Value.Range.GreaterThanOrEqual ?? Optional.Unspecified, - LessThanOrEqual = args.AndQuery.Value.SafetySignals.Value.UnusualDmActivityUntil.Value.Range.LessThanOrEqual ?? Optional.Unspecified, - } - }, - }, - UserId = args.AndQuery.Value.UserId is null - ? Optional.Unspecified - : new SearchRangeProperties - { - LessThanOrEqual = args.AndQuery.Value.UserId.Value.LessThanOrEqual ?? Optional.Unspecified, - GreaterThanOrEqual = args.AndQuery.Value.UserId.Value.GreaterThanOrEqual ?? Optional.Unspecified, - }, - }, + OrQuery = args?.OrQuery?.ToModel() ?? Optional.Unspecified, + AndQuery = args?.AndQuery?.ToModel() ?? Optional.Unspecified }; var model = await client.ApiClient.SearchGuildMembersAsyncV2(guild.Id, apiArgs, options); diff --git a/src/Discord.Net.Rest/Extensions/MemberSearchExtensions.cs b/src/Discord.Net.Rest/Extensions/MemberSearchExtensions.cs new file mode 100644 index 0000000000..e50eee9952 --- /dev/null +++ b/src/Discord.Net.Rest/Extensions/MemberSearchExtensions.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; + +namespace Discord.Rest; + +internal static class MemberSearchExtensions +{ + internal static API.Rest.SearchQueryProperties ToModel(this IMemberSearchQuery props) + => new () + { + Range = props.Range.HasValue + ? new API.Rest.SearchRangeProperties + { + GreaterThanOrEqual = props.Range.Value.GreaterThanOrEqual.HasValue ? props.Range.Value.GreaterThanOrEqual.Value : Optional.Unspecified, + LessThanOrEqual = props.Range.Value.LessThanOrEqual.HasValue ? props.Range.Value.LessThanOrEqual.Value : Optional.Unspecified + } + : Optional.Unspecified, + AndQuery = props.AndQuery is not null ? new Optional>(props.AndQuery) : Optional>.Unspecified, + OrQuery = props.OrQuery is not null ? new Optional>(props.OrQuery) : Optional>.Unspecified + }; + + internal static API.Rest.SafetySignalsProperties ToModel(this MemberSearchV2SafetySignalsProperties props) + => new() + { + AutomodQuarantinedUsername = props.AutomodQuarantinedUsername ?? Optional.Unspecified, + UnusualAccountActivity = props.UnusualAccountActivity ?? Optional.Unspecified, + CommunicationDisabledUntil = props.CommunicationDisabledUntil?.ToModel() ?? Optional.Unspecified, + UnusualDMActivityUntil = props.UnusualDmActivityUntil?.ToModel() ?? Optional.Unspecified, + }; + + internal static API.Rest.MemberSearchFilter ToModel(this MemberSearchFilter props) + => new() + { + DidRejoin = props.DidRejoin ?? Optional.Unspecified, + IsPending = props.IsPending ?? Optional.Unspecified, + JoinSourceType = props.JoinSourceType?.ToModel() ?? Optional.Unspecified, + GuildJoinedAt = props.GuildJoinedAt?.ToModel() ?? Optional.Unspecified, + RoleIds = props.RoleIds?.ToModel() ?? Optional.Unspecified, + SourceInviteCode = props.SourceInviteCode?.ToModel() ?? Optional.Unspecified, + SafetySignals = props.SafetySignals?.ToModel() ?? Optional.Unspecified, + UserId = props.UserId?.ToModel() ?? Optional.Unspecified, + Usernames = props.Usernames?.ToModel() ?? Optional.Unspecified + }; +}