mirror of
				https://github.com/InsanusMokrassar/TelegramBotApiLibraries.git
				synced 2025-10-30 19:50:16 +00:00 
			
		
		
		
	Compare commits
	
		
			6 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| ee9f524fc6 | |||
| 950eebea06 | |||
| 7845b7cc5f | |||
| 539515da43 | |||
| 3695ab7936 | |||
| ab802df7d1 | 
| @@ -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")) | ||||
|         } | ||||
|     override suspend fun lastUpdate(chatId: ChatId): DateTime? = suspendCoroutine { | ||||
|         actor.trySend(GetUpdateDateTimeRepoAction(chatId, it)) | ||||
|         return deferred.await() | ||||
|     } | ||||
|     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