From e2349831b3289951c66273e260c9ef2d048807da Mon Sep 17 00:00:00 2001 From: BartArys Date: Fri, 27 Nov 2020 18:08:32 +0100 Subject: [PATCH] Add endpoint to search members https://github.com/discord/discord-api-docs/pull/1577 --- .../kordlib/core/behavior/GuildBehavior.kt | 27 ++++++++++++++++++- .../com/gitlab/kordlib/rest/route/Route.kt | 5 ++++ .../kordlib/rest/service/GuildService.kt | 13 +++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/core/src/main/kotlin/com/gitlab/kordlib/core/behavior/GuildBehavior.kt b/core/src/main/kotlin/com/gitlab/kordlib/core/behavior/GuildBehavior.kt index 734b1fb3f9a7..c3dae6eef434 100644 --- a/core/src/main/kotlin/com/gitlab/kordlib/core/behavior/GuildBehavior.kt +++ b/core/src/main/kotlin/com/gitlab/kordlib/core/behavior/GuildBehavior.kt @@ -2,8 +2,11 @@ package com.gitlab.kordlib.core.behavior import com.gitlab.kordlib.cache.api.query import com.gitlab.kordlib.common.annotation.DeprecatedSinceKord +import com.gitlab.kordlib.common.annotation.KordExperimental +import com.gitlab.kordlib.common.entity.DiscordUser import com.gitlab.kordlib.common.entity.Snowflake import com.gitlab.kordlib.common.entity.optional.Optional +import com.gitlab.kordlib.common.entity.optional.unwrap import com.gitlab.kordlib.common.exception.RequestException import com.gitlab.kordlib.core.Kord import com.gitlab.kordlib.core.cache.data.* @@ -150,7 +153,7 @@ interface GuildBehavior : Entity, Strategizable { */ val voiceStates: Flow get() = kord.cache - .query { idEq( VoiceStateData::guildId, id) } + .query { idEq(VoiceStateData::guildId, id) } .asFlow() .map { VoiceState(it, kord) } @@ -249,6 +252,28 @@ interface GuildBehavior : Entity, Strategizable { */ suspend fun getMember(userId: Snowflake): Member = supplier.getMember(id, userId) + /** + * Requests to get up to [limit] members whose [Member.username] or [Member.nickname] match the [query]. + * The [limit] accepts a maximum value of `1000` and a minimum of `1`. + * + * This property is not resolvable through cache and will always use the [RestClient] instead. + * + * The returned flow is lazily executed, any [RequestException] will be thrown on + * [terminal operators](https://kotlinlang.org/docs/reference/coroutines/flow.html#terminal-flow-operators) instead. + * + * This function is not part of the officially documented Discord API and may be removed/altered/stop working in the future. + */ + @KordExperimental + suspend fun getMembers(query: String, limit: Int = 1000): Flow = flow { + kord.rest.guild.getGuildMembers(id, query, limit).forEach { + emit(Member( + MemberData.from(userId = it.user.unwrap(DiscordUser::id)!!, guildId = id, it), + UserData.from(it.user.value!!), + kord + )) + } + } + /** * Requests to get the [Member] represented by the [userId], * returns null if the [Member] isn't present. diff --git a/rest/src/main/kotlin/com/gitlab/kordlib/rest/route/Route.kt b/rest/src/main/kotlin/com/gitlab/kordlib/rest/route/Route.kt index b0c2905c3359..e6a811ada775 100644 --- a/rest/src/main/kotlin/com/gitlab/kordlib/rest/route/Route.kt +++ b/rest/src/main/kotlin/com/gitlab/kordlib/rest/route/Route.kt @@ -1,6 +1,7 @@ package com.gitlab.kordlib.rest.route import com.gitlab.kordlib.common.annotation.DeprecatedSinceKord +import com.gitlab.kordlib.common.annotation.KordExperimental import com.gitlab.kordlib.common.annotation.KordPreview import com.gitlab.kordlib.common.entity.* import com.gitlab.kordlib.rest.json.optional @@ -183,6 +184,10 @@ sealed class Route( object GuildMembersGet : Route>(HttpMethod.Get, "/guilds/$GuildId/members", ListSerializer(DiscordGuildMember.serializer())) + @KordExperimental + object GuildMembersSearchGet //https://github.com/discord/discord-api-docs/pull/1577 + : Route>(HttpMethod.Get, "/guilds/$GuildId/members/search", ListSerializer(DiscordGuildMember.serializer())) + object GuildMemberPut : Route(HttpMethod.Put, "/guilds/$GuildId/members/$UserId", DiscordGuildMember.serializer().optional) diff --git a/rest/src/main/kotlin/com/gitlab/kordlib/rest/service/GuildService.kt b/rest/src/main/kotlin/com/gitlab/kordlib/rest/service/GuildService.kt index 14cca4802b84..2d7dd791ab26 100644 --- a/rest/src/main/kotlin/com/gitlab/kordlib/rest/service/GuildService.kt +++ b/rest/src/main/kotlin/com/gitlab/kordlib/rest/service/GuildService.kt @@ -1,6 +1,7 @@ package com.gitlab.kordlib.rest.service import com.gitlab.kordlib.common.annotation.DeprecatedSinceKord +import com.gitlab.kordlib.common.annotation.KordExperimental import com.gitlab.kordlib.common.entity.* import com.gitlab.kordlib.rest.builder.ban.BanCreateBuilder import com.gitlab.kordlib.rest.builder.channel.* @@ -104,6 +105,18 @@ class GuildService(requestHandler: RequestHandler) : RestService(requestHandler) parameter("limit", "$limit") } + /** + * Requests members with a username or nickname matching [query]. + * + * @param limit limits the maximum amount of members returned. Max `1000`, defaults to `1`. + */ + @KordExperimental + suspend fun getGuildMembers(guildId: Snowflake, query: String, limit: Int = 1) = call(Route.GuildMembersSearchGet) { + keys[Route.GuildId] = guildId + parameter("query", query) + parameter("limit", "$limit") + } + suspend fun addGuildMember(guildId: Snowflake, userId: Snowflake, token: String, builder: MemberAddBuilder.() -> Unit) = call(Route.GuildMemberPut) { keys[Route.GuildId] = guildId keys[Route.UserId] = userId