diff --git a/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/ChzzkHandler.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/ChzzkHandler.kt index e4e15b7..5bffa10 100644 --- a/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/ChzzkHandler.kt +++ b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/chzzk/ChzzkHandler.kt @@ -7,10 +7,8 @@ import kotlinx.coroutines.launch import org.koin.java.KoinJavaComponent.inject import org.slf4j.Logger import org.slf4j.LoggerFactory -import space.mori.chzzk_bot.chatbot.chzzk.Connector.client as ChzzkClient import space.mori.chzzk_bot.chatbot.chzzk.Connector.getChannel import space.mori.chzzk_bot.chatbot.discord.Discord -import space.mori.chzzk_bot.chatbot.utils.refreshAccessToken import space.mori.chzzk_bot.common.events.* import space.mori.chzzk_bot.common.models.User import space.mori.chzzk_bot.common.services.LiveStatusService @@ -217,20 +215,28 @@ class UserHandler( if(user?.accessToken == null || user.refreshToken == null) { throw RuntimeException("AccessToken or RefreshToken is not valid.") } + try { - val tokens = ChzzkClient.refreshAccessToken(user.refreshToken!!) + client = Connector.getClient(user.accessToken!!, user.refreshToken!!) - client = Connector.getClient(tokens.first, tokens.second) - listener = ChzzkSessionBuilder(client).buildUserSession() + client.loginAsync().join() + client.refreshTokenAsync().join() - UserService.setRefreshToken(user, tokens.first, tokens.second) + UserService.setRefreshToken(user, client.loginResult.accessToken(), client.loginResult.refreshToken()) - listener.createAndConnectAsync().join() + listener = ChzzkSessionBuilder(client).buildUserSession() - listener.on(SessionChatMessageEvent::class.java) { - messageHandler.handle(it.message, user) + listener.createAndConnectAsync().join() + + messageHandler = MessageHandler(this@UserHandler) + + listener.on(SessionChatMessageEvent::class.java) { + messageHandler.handle(it.message, user) + } + } catch(e: Exception) { + logger.error("Exception(${user.username}): ${e.stackTraceToString()}") + throw RuntimeException("Exception: ${e.stackTraceToString()}") } - messageHandler = MessageHandler(this@UserHandler) } internal fun disable() { diff --git a/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/utils/accessTokenRefresh.kt b/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/utils/accessTokenRefresh.kt deleted file mode 100644 index c8eb9ac..0000000 --- a/chatbot/src/main/kotlin/space/mori/chzzk_bot/chatbot/utils/accessTokenRefresh.kt +++ /dev/null @@ -1,55 +0,0 @@ -package space.mori.chzzk_bot.chatbot.utils - -import com.google.gson.Gson -import okhttp3.OkHttpClient -import okhttp3.Request -import okhttp3.RequestBody.Companion.toRequestBody -import space.mori.chzzk_bot.common.utils.client -import xyz.r2turntrue.chzzk4j.ChzzkClient -import java.io.IOException - -val client = OkHttpClient.Builder() - .addNetworkInterceptor { chain -> - chain.proceed( - chain.request() - .newBuilder() - .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36") - .build() - ) - } - .build() -val gson = Gson() - -data class RefreshTokenResponse( - val accessToken: String, - val refreshToken: String, - val expiresIn: Int, - val tokenType: String = "Bearer", - val scope: String -) - -fun ChzzkClient.refreshAccessToken(refreshToken: String): Pair { - val url = "https://openapi.chzzk.naver.com/auth/v1/token" - val request = Request.Builder() - .url(url) - .header("Content-Type", "application/json") - .post(gson.toJson(mapOf( - "grantType" to "refresh_token", - "refreshToken" to refreshToken, - "clientId" to this.apiClientId, - "clientSecret" to this.apiSecret - )).toRequestBody()) - .build() - - client.newCall(request).execute().use { response -> - try { - if(!response.isSuccessful) throw IOException("Unexpected code ${response.code}") - val body = response.body?.string() - val data = gson.fromJson(body, RefreshTokenResponse::class.java) - - return Pair(data.accessToken, data.refreshToken) - } catch(e: Exception) { - throw e - } - } -} \ No newline at end of file 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 e8f256f..cafa8d5 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 @@ -199,7 +199,10 @@ val server = embeddedServer(Netty, port = 8080, ) { listOf() ) ) - user?.let { UserService.setRefreshToken(it, tokenResponse.content.accessToken, tokenResponse.content.refreshToken ?: "") } + user?.let { UserService.setRefreshToken(it, + tokenResponse.content.accessToken, + tokenResponse.content.refreshToken ?: "" + ) } call.respondRedirect(getFrontendURL("")) } } catch (e: Exception) { @@ -427,4 +430,4 @@ suspend fun getChzzkUser(accessToken: String): ChzzkApi { fun generateSecureRandomState(): String { return BigInteger(130, SecureRandom()).toString(32) -} \ No newline at end of file +} diff --git a/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/routes/ApiRoutes.kt b/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/routes/ApiRoutes.kt index 4d40900..b178732 100644 --- a/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/routes/ApiRoutes.kt +++ b/webserver/src/main/kotlin/space/mori/chzzk_bot/webserver/routes/ApiRoutes.kt @@ -40,12 +40,16 @@ fun Routing.apiRoutes() { val dispatcher: CoroutinesEventBus by inject(CoroutinesEventBus::class.java) suspend fun getChzzkUserWithId(uid: String): ChzzkUserReceiveEvent? { - val completableDeferred = CompletableDeferred< ChzzkUserReceiveEvent>() + val completableDeferred = CompletableDeferred() + dispatcher.subscribe(ChzzkUserReceiveEvent::class) { event -> + if (event.uid == uid) { + completableDeferred.complete(event) + } + } val user = withTimeoutOrNull(5000) { dispatcher.post(ChzzkUserFindEvent(uid)) completableDeferred.await() } - return user }