11package failchat.twitch
22
33import failchat.chat.badge.ImageBadge
4- import mu.KLogging
4+ import kotlinx.coroutines.sync.Mutex
5+ import kotlinx.coroutines.sync.withLock
56
67/* *
78 * The [TwitchApiClient] wrapper that:
@@ -14,41 +15,53 @@ class TokenAwareTwitchApiClient(
1415 private val tokenContainer : HelixTokenContainer
1516) {
1617
17- private companion object : KLogging ()
18+ private val mutex = Mutex () // forbid parallel execution to prevent multiple tokens generation in the same time
1819
1920 suspend fun getUserId (userName : String ): Long {
20- return doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
21- twitchApiClient.getUserId(userName, it)
21+ return mutex.withLock {
22+ doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
23+ twitchApiClient.getUserId(userName, it)
24+ }
2225 }
2326 }
2427
2528 suspend fun getViewersCount (userName : String ): Int {
26- return doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
27- twitchApiClient.getViewersCount(userName, it)
29+ return mutex.withLock {
30+ doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
31+ twitchApiClient.getViewersCount(userName, it)
32+ }
2833 }
2934 }
3035
3136 suspend fun getGlobalEmoticons (): List <TwitchEmoticon > {
32- return doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
33- twitchApiClient.getGlobalEmoticons(it)
37+ return mutex.withLock {
38+ doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
39+ twitchApiClient.getGlobalEmoticons(it)
40+ }
3441 }
3542 }
3643
3744 suspend fun getFirstLiveChannelName (): String {
38- return doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
39- twitchApiClient.getFirstLiveChannelName(it)
45+ return mutex.withLock {
46+ doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
47+ twitchApiClient.getFirstLiveChannelName(it)
48+ }
4049 }
4150 }
4251
4352 suspend fun getGlobalBadges (): Map <TwitchBadgeId , ImageBadge > {
44- return doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
45- twitchApiClient.getGlobalBadges(it)
53+ return mutex.withLock {
54+ doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
55+ twitchApiClient.getGlobalBadges(it)
56+ }
4657 }
4758 }
4859
4960 suspend fun getChannelBadges (channelId : Long ): Map <TwitchBadgeId , ImageBadge > {
50- return doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
51- twitchApiClient.getChannelBadges(channelId, it)
61+ return mutex.withLock {
62+ doWithRetryOnAuthError(twitchApiClient, clientSecret, tokenContainer) {
63+ twitchApiClient.getChannelBadges(channelId, it)
64+ }
5265 }
5366 }
5467}
0 commit comments