apiDiscordRoutes fix.

- add guidChannels.
This commit is contained in:
dalbodeule 2024-08-15 07:13:37 +09:00
parent c87eeaa9e8
commit 1a3282d46c
No known key found for this signature in database
GPG Key ID: EFA860D069C9FA65
2 changed files with 50 additions and 3 deletions

View File

@ -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())

View File

@ -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<List<GuildRole>>()
}
private suspend fun fetchGuildChannels(guildId: String): List<GuildChannel> {
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<List<GuildChannel>>()
}
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<GuildRole> = emptyList(),
var roles: List<GuildRole>,
var channel: List<GuildChannel>
)