mirror of
				https://github.com/InsanusMokrassar/TelegramBotApiLibraries.git
				synced 2025-11-04 06:00:24 +00:00 
			
		
		
		
	@@ -1,31 +1,31 @@
 | 
			
		||||
package dev.inmo.tgbotapi.libraries.cache.admins.micro_utils
 | 
			
		||||
 | 
			
		||||
import com.soywiz.klock.DateTime
 | 
			
		||||
import dev.inmo.micro_utils.coroutines.actor
 | 
			
		||||
import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions
 | 
			
		||||
import dev.inmo.micro_utils.coroutines.*
 | 
			
		||||
import dev.inmo.micro_utils.repos.*
 | 
			
		||||
import dev.inmo.tgbotapi.libraries.cache.admins.DefaultAdminsCacheAPIRepo
 | 
			
		||||
import dev.inmo.tgbotapi.types.*
 | 
			
		||||
import dev.inmo.tgbotapi.types.chat.member.AdministratorChatMember
 | 
			
		||||
import kotlinx.coroutines.CompletableDeferred
 | 
			
		||||
import kotlinx.coroutines.CoroutineScope
 | 
			
		||||
import kotlinx.coroutines.channels.Channel
 | 
			
		||||
import kotlinx.coroutines.channels.*
 | 
			
		||||
import kotlin.coroutines.*
 | 
			
		||||
 | 
			
		||||
private sealed class RepoActions<T> {
 | 
			
		||||
    abstract val toReturn: Continuation<T>
 | 
			
		||||
    abstract val deferred: CompletableDeferred<T>
 | 
			
		||||
}
 | 
			
		||||
private class GetUpdateDateTimeRepoAction(
 | 
			
		||||
    val chatId: ChatId,
 | 
			
		||||
    override val toReturn: Continuation<DateTime?>
 | 
			
		||||
    override val deferred: CompletableDeferred<DateTime?>
 | 
			
		||||
) : RepoActions<DateTime?>()
 | 
			
		||||
private class GetChatAdminsRepoAction(
 | 
			
		||||
    val chatId: ChatId,
 | 
			
		||||
    override val toReturn: Continuation<List<AdministratorChatMember>?>
 | 
			
		||||
    override val deferred: CompletableDeferred<List<AdministratorChatMember>?>
 | 
			
		||||
) : RepoActions<List<AdministratorChatMember>?>()
 | 
			
		||||
private class SetChatAdminsRepoAction(
 | 
			
		||||
    val chatId: ChatId,
 | 
			
		||||
    val newValue: List<AdministratorChatMember>,
 | 
			
		||||
    override val toReturn: Continuation<Unit>
 | 
			
		||||
    override val deferred: CompletableDeferred<Unit>
 | 
			
		||||
) : RepoActions<Unit>()
 | 
			
		||||
 | 
			
		||||
class DefaultAdminsCacheAPIRepoImpl(
 | 
			
		||||
@@ -33,32 +33,54 @@ class DefaultAdminsCacheAPIRepoImpl(
 | 
			
		||||
    private val updatesRepo: KeyValueRepo<ChatId, MilliSeconds>,
 | 
			
		||||
    private val scope: CoroutineScope
 | 
			
		||||
) : DefaultAdminsCacheAPIRepo {
 | 
			
		||||
    private val actor = scope.actor<RepoActions<*>>(Channel.UNLIMITED) {
 | 
			
		||||
        safelyWithoutExceptions {
 | 
			
		||||
    private val actor = scope.actorAsync<RepoActions<*>>(Channel.UNLIMITED) {
 | 
			
		||||
        safelyWithoutExceptions(
 | 
			
		||||
            { e ->
 | 
			
		||||
                it.deferred.completeExceptionally(e)
 | 
			
		||||
            }
 | 
			
		||||
        ) {
 | 
			
		||||
            when (it) {
 | 
			
		||||
                is GetUpdateDateTimeRepoAction -> it.toReturn.resume(
 | 
			
		||||
                is GetUpdateDateTimeRepoAction -> it.deferred.complete(
 | 
			
		||||
                    updatesRepo.get(it.chatId) ?.let { DateTime(it.toDouble()) }
 | 
			
		||||
                )
 | 
			
		||||
                is GetChatAdminsRepoAction -> it.toReturn.resume(adminsRepo.getAll(it.chatId))
 | 
			
		||||
                is GetChatAdminsRepoAction -> it.deferred.complete(adminsRepo.getAll(it.chatId))
 | 
			
		||||
                is SetChatAdminsRepoAction -> {
 | 
			
		||||
                    adminsRepo.clear(it.chatId)
 | 
			
		||||
                    adminsRepo.set(it.chatId, it.newValue)
 | 
			
		||||
                    updatesRepo.set(it.chatId, DateTime.now().unixMillisLong)
 | 
			
		||||
                    it.toReturn.resume(Unit)
 | 
			
		||||
                    it.deferred.complete(Unit)
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override suspend fun getChatAdmins(chatId: ChatId): List<AdministratorChatMember>? = suspendCoroutine {
 | 
			
		||||
        actor.trySend(GetChatAdminsRepoAction(chatId, it))
 | 
			
		||||
    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()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override suspend fun setChatAdmins(chatId: ChatId, chatMembers: List<AdministratorChatMember>) = suspendCoroutine<Unit> {
 | 
			
		||||
        actor.trySend(SetChatAdminsRepoAction(chatId, chatMembers, it))
 | 
			
		||||
    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()
 | 
			
		||||
    }
 | 
			
		||||
    override suspend fun lastUpdate(chatId: ChatId): DateTime? = suspendCoroutine {
 | 
			
		||||
        actor.trySend(GetUpdateDateTimeRepoAction(chatId, it))
 | 
			
		||||
    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()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,9 +40,9 @@ fun TelegramBot.createAdminsCacheAPI(
 | 
			
		||||
            "AdminsTable"
 | 
			
		||||
        ).withMapper<ChatId, AdministratorChatMember, Identifier, String>(
 | 
			
		||||
            keyFromToTo = { chatId },
 | 
			
		||||
            valueFromToTo = { telegramAdminsSerializationFormat.encodeToString(this) },
 | 
			
		||||
            valueFromToTo = { telegramAdminsSerializationFormat.encodeToString(AdministratorChatMember.serializer(), this) },
 | 
			
		||||
            keyToToFrom = { toChatId() },
 | 
			
		||||
            valueToToFrom = { telegramAdminsSerializationFormat.decodeFromString(this) }
 | 
			
		||||
            valueToToFrom = { telegramAdminsSerializationFormat.decodeFromString(AdministratorChatMember.serializer(), this) }
 | 
			
		||||
        ),
 | 
			
		||||
        ExposedKeyValueRepo(
 | 
			
		||||
            database,
 | 
			
		||||
@@ -65,9 +65,9 @@ fun TelegramBot.createAdminsCacheAPI(
 | 
			
		||||
            "DynamicAdminsCacheSettingsAPI"
 | 
			
		||||
        ).withMapper<ChatId, AdminsCacheSettings, Identifier, String>(
 | 
			
		||||
            keyFromToTo = { chatId },
 | 
			
		||||
            valueFromToTo = { telegramAdminsSerializationFormat.encodeToString(this) },
 | 
			
		||||
            valueFromToTo = { telegramAdminsSerializationFormat.encodeToString(AdminsCacheSettings.serializer() , this) },
 | 
			
		||||
            keyToToFrom = { toChatId() },
 | 
			
		||||
            valueToToFrom = { telegramAdminsSerializationFormat.decodeFromString(this) }
 | 
			
		||||
            valueToToFrom = { telegramAdminsSerializationFormat.decodeFromString(AdminsCacheSettings.serializer() , this) }
 | 
			
		||||
        ),
 | 
			
		||||
        scope
 | 
			
		||||
    )
 | 
			
		||||
 
 | 
			
		||||
@@ -11,10 +11,10 @@ kotlin_serialisation_core_version=1.4.0
 | 
			
		||||
 | 
			
		||||
github_release_plugin_version=2.4.1
 | 
			
		||||
 | 
			
		||||
tgbotapi_version=3.2.1
 | 
			
		||||
micro_utils_version=0.12.11
 | 
			
		||||
tgbotapi_version=3.2.6
 | 
			
		||||
micro_utils_version=0.12.13
 | 
			
		||||
exposed_version=0.39.2
 | 
			
		||||
plagubot_version=2.3.1
 | 
			
		||||
plagubot_version=2.3.3
 | 
			
		||||
 | 
			
		||||
# ANDROID
 | 
			
		||||
 | 
			
		||||
@@ -33,5 +33,5 @@ dokka_version=1.7.10
 | 
			
		||||
# Project data
 | 
			
		||||
 | 
			
		||||
group=dev.inmo
 | 
			
		||||
version=0.5.3
 | 
			
		||||
android_code_version=30
 | 
			
		||||
version=0.5.4
 | 
			
		||||
android_code_version=31
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user