From ce9be7e47f44ed65a31198a401535c62c303ae16 Mon Sep 17 00:00:00 2001 From: dalbodeule <11470513+dalbodeule@users.noreply.github.com> Date: Thu, 15 Aug 2024 06:08:22 +0900 Subject: [PATCH 1/2] get guild roles with getGuilds. --- .../space/mori/chzzk_bot/webserver/Main.kt | 14 ++++++++--- .../webserver/routes/ApiDiscordRoutes.kt | 23 +++++++++++++++++-- .../webserver/utils/DiscordGuildCache.kt | 4 +++- 3 files changed, 35 insertions(+), 6 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 9a4b1b1..8a0d067 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 @@ -24,7 +24,6 @@ import kotlinx.serialization.Serializable import kotlinx.serialization.json.Json import space.mori.chzzk_bot.common.services.UserService import space.mori.chzzk_bot.webserver.routes.* -import space.mori.chzzk_bot.webserver.utils.CachedGuilds import space.mori.chzzk_bot.webserver.utils.DiscordGuildCache import space.mori.chzzk_bot.webserver.utils.DiscordRatelimits import space.mori.chzzk_bot.webserver.utils.Guild @@ -133,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.id to Guild(it.id, it.name, it.icon, it.banner, it.roles) }) redirects[principal.state]?.let { redirect -> @@ -285,7 +284,16 @@ data class DiscordGuildListAPI( val banner: String?, val owner: Boolean, val permissions: Int, - val features: List + val features: List, + val roles: List +) + +@Serializable +data class GuildRole( + val id: String, + val name: String, + val color: String, + val mentionable: Boolean, ) suspend fun getDiscordUser(accessToken: String): DiscordMeAPI? { diff --git a/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/routes/ApiDiscordRoutes.kt b/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/routes/ApiDiscordRoutes.kt index 690be95..594b093 100644 --- a/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/routes/ApiDiscordRoutes.kt +++ b/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/routes/ApiDiscordRoutes.kt @@ -40,7 +40,7 @@ fun Route.apiDiscordRoutes() { call.respond(HttpStatusCode.OK, guild) return@get } - get { + get("/guild/{gid}") { val session = call.sessions.get() if(session == null) { call.respond(HttpStatusCode.BadRequest, "Session is required") @@ -52,7 +52,26 @@ fun Route.apiDiscordRoutes() { return@get } - call.respond(HttpStatusCode.OK, DiscordGuildCache.getCachedGuilds(session.discordGuildList)) + + } + get { + val uid = call.parameters["gid"] + val session = call.sessions.get() + if(uid == null) { + call.respond(HttpStatusCode.BadRequest, "GID is required") + return@get + } + if(session == null) { + call.respond(HttpStatusCode.BadRequest, "Session is required") + return@get + } + val user = UserService.getUserWithNaverId(session.id) + if(user == null) { + call.respond(HttpStatusCode.BadRequest, "User does not exist") + return@get + } + + return@get } } 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 5e253d5..5ee9f5a 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.GuildRole import space.mori.chzzk_bot.webserver.dotenv import java.time.Instant import java.util.concurrent.ConcurrentHashMap @@ -70,7 +71,7 @@ object DiscordGuildCache { guilds.forEach { cache[it.id] = CachedGuilds( - Guild(it.id, it.name, it.icon, it.banner), + Guild(it.id, it.name, it.icon, it.banner, it.roles), Instant.now().plusSeconds(EXP_SECONDS), ) } @@ -101,4 +102,5 @@ data class Guild( val name: String, val icon: String?, val banner: String?, + val roles: List, ) \ No newline at end of file From 85d728df8ad3bdf26e92ccc6e23d5a3ccbc1e495 Mon Sep 17 00:00:00 2001 From: dalbodeule <11470513+dalbodeule@users.noreply.github.com> Date: Thu, 15 Aug 2024 06:11:48 +0900 Subject: [PATCH 2/2] get bot's guilds. --- .../mori/chzzk_bot/webserver/utils/DiscordGuildCache.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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 5ee9f5a..b339c84 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 @@ -22,10 +22,11 @@ object DiscordGuildCache { suspend fun getCachedGuilds(guildId: String): Guild? { val now = Instant.now() + val guild = cache[guildId] - if(cache.isEmpty() || !cache.containsKey(guildId) || cache[guildId]!!.timestamp.plusSeconds(EXP_SECONDS).isBefore(now)) { + if(guild == null || guild.timestamp.plusSeconds(EXP_SECONDS).isBefore(now) || !guild.isBotAvailable) { mutex.withLock { - if(cache.isEmpty() || !cache.containsKey(guildId) || cache[guildId]!!.timestamp.plusSeconds(EXP_SECONDS).isBefore(now)) { + if(guild == null || guild.timestamp.plusSeconds(EXP_SECONDS).isBefore(now) || !guild.isBotAvailable) { fetchAllGuilds() } } @@ -73,6 +74,7 @@ object DiscordGuildCache { cache[it.id] = CachedGuilds( Guild(it.id, it.name, it.icon, it.banner, it.roles), Instant.now().plusSeconds(EXP_SECONDS), + true ) } lastGuildId = guilds.last().id @@ -93,7 +95,8 @@ object DiscordGuildCache { data class CachedGuilds( val guild: Guild, - val timestamp: Instant = Instant.now() + val timestamp: Instant = Instant.now(), + val isBotAvailable: Boolean = false, ) @Serializable