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 83f9438..537eb97 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 @@ -29,6 +29,9 @@ object DiscordGuildCache { if(guild == null || guild.timestamp.plusSeconds(EXP_SECONDS).isBefore(now) || !guild.isBotAvailable) { fetchAllGuilds() } + if(guild?.guild?.roles?.isEmpty() == true) { + guild.guild.roles = fetchGuildRoles(guildId) + } } } return cache[guildId]?.guild @@ -61,6 +64,25 @@ object DiscordGuildCache { return result.body>() } + private suspend fun fetchGuildRoles(guildId: String): List { + if(DiscordRatelimits.isLimited()) { + delay(DiscordRatelimits.getRateReset()) + } + val result = applicationHttpClient.get("https://discord.com/api/guilds/${guildId}/roles") { + 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) { @@ -105,5 +127,5 @@ data class Guild( val name: String, val icon: String?, val banner: String?, - val roles: List = emptyList(), + var roles: List = emptyList(), ) \ No newline at end of file