From 1a3282d46c7427f645ba9badf88fc8bdc6032bdb Mon Sep 17 00:00:00 2001 From: dalbodeule <11470513+dalbodeule@users.noreply.github.com> Date: Thu, 15 Aug 2024 07:13:37 +0900 Subject: [PATCH] apiDiscordRoutes fix. - add guidChannels. --- .../space/mori/chzzk_bot/webserver/Main.kt | 25 ++++++++++++++++- .../webserver/utils/DiscordGuildCache.kt | 28 +++++++++++++++++-- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/Main.kt b/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/Main.kt index b656826..8ae4410 100644 --- a/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/Main.kt +++ b/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/Main.kt @@ -132,7 +132,7 @@ val server = embeddedServer(Netty, port = 8080, ) { DiscordGuildCache.addGuild(guilds.associate { println("${it.id} ${it.name}") - it.id to Guild(it.id, it.name, it.icon, it.banner, it.roles ?: emptyList()) + it.id to Guild(it.id, it.name, it.icon, it.banner, it.roles ?: emptyList(), emptyList()) }) redirects[principal.state]?.let { redirect -> @@ -296,6 +296,29 @@ data class GuildRole( val mentionable: Boolean, ) +enum class ChannelType(val value: Int) { + GUILD_TEXT(0), + DM(1), + GUILD_VOICE(2), + GROUP_DM(3), + GUILD_CATEGORY(4), + GUILD_ANNOUNCEMENT(5), + ANNOUNCEMENT_THREAD(10), + PUBLIC_THREAD(11), + PRIVATE_THREAD(12), + GUILD_STAGE_VOICE(13), + GUILD_DIRECTORY(14), + GUILD_FORUM(15), + GUILD_MEDIA(16) +} + +@Serializable +data class GuildChannel( + val id: String, + val type: ChannelType, + val name: String? +) + suspend fun getDiscordUser(accessToken: String): DiscordMeAPI? { if(DiscordRatelimits.isLimited()) { delay(DiscordRatelimits.getRateReset()) diff --git a/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/utils/DiscordGuildCache.kt b/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/utils/DiscordGuildCache.kt index 537eb97..ba13fef 100644 --- a/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/utils/DiscordGuildCache.kt +++ b/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/utils/DiscordGuildCache.kt @@ -10,6 +10,7 @@ import kotlinx.coroutines.sync.withLock import kotlinx.serialization.Serializable import space.mori.chzzk_bot.common.utils.logger import space.mori.chzzk_bot.webserver.DiscordGuildListAPI +import space.mori.chzzk_bot.webserver.GuildChannel import space.mori.chzzk_bot.webserver.GuildRole import space.mori.chzzk_bot.webserver.dotenv import java.time.Instant @@ -32,6 +33,9 @@ object DiscordGuildCache { if(guild?.guild?.roles?.isEmpty() == true) { guild.guild.roles = fetchGuildRoles(guildId) } + if(guild?.guild?.channel?.isEmpty() == true) { + guild.guild.channel = fetchGuildChannels(guildId) + } } } return cache[guildId]?.guild @@ -83,6 +87,25 @@ object DiscordGuildCache { return result.body>() } + private suspend fun fetchGuildChannels(guildId: String): List { + if(DiscordRatelimits.isLimited()) { + delay(DiscordRatelimits.getRateReset()) + } + val result = applicationHttpClient.get("https://discord.com/api/guilds/${guildId}/channels") { + headers { + append(HttpHeaders.Authorization, "Bot ${dotenv["DISCORD_TOKEN"]}") + } + } + + val rateLimit = result.headers["X-RateLimit-Limit"]?.toIntOrNull() + val remaining = result.headers["X-RateLimit-Remaining"]?.toIntOrNull() + val resetAfter = result.headers["X-RateLimit-Reset-After"]?.toDoubleOrNull()?.toLong()?.plus(1L) + + DiscordRatelimits.setRateLimit(rateLimit, remaining, resetAfter) + + return result.body>() + } + private suspend fun fetchAllGuilds() { var lastGuildId: String? = null while (true) { @@ -94,7 +117,7 @@ object DiscordGuildCache { guilds.forEach { cache[it.id] = CachedGuilds( - Guild(it.id, it.name, it.icon, it.banner, it.roles ?: emptyList()), + Guild(it.id, it.name, it.icon, it.banner, it.roles ?: emptyList(), emptyList()), Instant.now().plusSeconds(EXP_SECONDS), true ) @@ -127,5 +150,6 @@ data class Guild( val name: String, val icon: String?, val banner: String?, - var roles: List = emptyList(), + var roles: List, + var channel: List ) \ No newline at end of file