TelegramBotApiLibraries/cache/admins/micro_utils/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/admins/micro_utils/DefaultAdminsCacheAPI.kt

92 lines
3.7 KiB
Kotlin
Raw Normal View History

2021-02-22 12:11:12 +00:00
package dev.inmo.tgbotapi.libraries.cache.admins.micro_utils
import com.soywiz.klock.DateTime
2022-09-18 20:42:10 +00:00
import dev.inmo.micro_utils.coroutines.*
2021-02-22 12:11:12 +00:00
import dev.inmo.micro_utils.repos.*
import dev.inmo.tgbotapi.libraries.cache.admins.DefaultAdminsCacheAPIRepo
import dev.inmo.tgbotapi.types.*
2022-05-22 05:56:30 +00:00
import dev.inmo.tgbotapi.types.chat.member.AdministratorChatMember
2022-09-18 20:42:10 +00:00
import kotlinx.coroutines.CompletableDeferred
2021-02-22 12:11:12 +00:00
import kotlinx.coroutines.CoroutineScope
2022-09-18 20:42:10 +00:00
import kotlinx.coroutines.channels.*
2021-02-22 12:11:12 +00:00
import kotlin.coroutines.*
private sealed class RepoActions<T> {
2022-09-18 20:42:10 +00:00
abstract val deferred: CompletableDeferred<T>
2021-02-22 12:11:12 +00:00
}
private class GetUpdateDateTimeRepoAction(
val chatId: ChatId,
2022-09-18 20:42:10 +00:00
override val deferred: CompletableDeferred<DateTime?>
2021-02-22 12:11:12 +00:00
) : RepoActions<DateTime?>()
private class GetChatAdminsRepoAction(
val chatId: ChatId,
2022-09-18 20:42:10 +00:00
override val deferred: CompletableDeferred<List<AdministratorChatMember>?>
2021-02-22 12:11:12 +00:00
) : RepoActions<List<AdministratorChatMember>?>()
private class SetChatAdminsRepoAction(
val chatId: ChatId,
val newValue: List<AdministratorChatMember>,
2022-09-18 20:42:10 +00:00
override val deferred: CompletableDeferred<Unit>
2021-02-22 12:11:12 +00:00
) : RepoActions<Unit>()
class DefaultAdminsCacheAPIRepoImpl(
2021-02-22 12:11:12 +00:00
private val adminsRepo: KeyValuesRepo<ChatId, AdministratorChatMember>,
private val updatesRepo: KeyValueRepo<ChatId, MilliSeconds>,
private val scope: CoroutineScope
) : DefaultAdminsCacheAPIRepo {
2022-09-18 20:42:10 +00:00
private val actor = scope.actorAsync<RepoActions<*>>(Channel.UNLIMITED) {
safelyWithoutExceptions(
{ e ->
it.deferred.completeExceptionally(e)
}
) {
2021-02-22 12:11:12 +00:00
when (it) {
2022-09-18 20:42:10 +00:00
is GetUpdateDateTimeRepoAction -> it.deferred.complete(
2021-02-22 12:11:12 +00:00
updatesRepo.get(it.chatId) ?.let { DateTime(it.toDouble()) }
)
2022-09-18 20:42:10 +00:00
is GetChatAdminsRepoAction -> it.deferred.complete(adminsRepo.getAll(it.chatId))
2021-02-22 12:11:12 +00:00
is SetChatAdminsRepoAction -> {
adminsRepo.clear(it.chatId)
adminsRepo.set(it.chatId, it.newValue)
updatesRepo.set(it.chatId, DateTime.now().unixMillisLong)
2022-09-18 20:42:10 +00:00
it.deferred.complete(Unit)
2021-02-22 12:11:12 +00:00
}
}
}
}
2022-09-18 20:42:10 +00:00
override suspend fun getChatAdmins(chatId: ChatId): List<AdministratorChatMember>? {
val deferred = CompletableDeferred<List<AdministratorChatMember>?>()
actor.trySend(
GetChatAdminsRepoAction(chatId, deferred)
).onFailure {
deferred.completeExceptionally(it ?: IllegalStateException("Something went wrong when tried to add getChatAdmins action"))
}
return deferred.await()
2021-02-22 12:11:12 +00:00
}
2022-09-10 12:54:25 +00:00
2022-09-18 20:42:10 +00:00
override suspend fun setChatAdmins(chatId: ChatId, chatMembers: List<AdministratorChatMember>) {
val deferred = CompletableDeferred<Unit>()
actor.trySend(
SetChatAdminsRepoAction(chatId, chatMembers, deferred)
).onFailure {
deferred.completeExceptionally(it ?: IllegalStateException("Something went wrong when tried to add setChatAdmins action"))
}
return deferred.await()
2021-02-22 12:11:12 +00:00
}
2022-09-18 20:42:10 +00:00
override suspend fun lastUpdate(chatId: ChatId): DateTime? {
val deferred = CompletableDeferred<DateTime?>()
actor.trySend(
GetUpdateDateTimeRepoAction(chatId, deferred)
).onFailure {
deferred.completeExceptionally(it ?: IllegalStateException("Something went wrong when tried to add lastUpdate action"))
}
return deferred.await()
2021-02-22 12:11:12 +00:00
}
}
fun DefaultAdminsCacheAPIRepo(
adminsRepo: KeyValuesRepo<ChatId, AdministratorChatMember>,
updatesRepo: KeyValueRepo<ChatId, MilliSeconds>,
scope: CoroutineScope
) = DefaultAdminsCacheAPIRepoImpl(adminsRepo, updatesRepo, scope)