mirror of
https://github.com/InsanusMokrassar/TelegramBotApiLibraries.git
synced 2024-12-22 16:47:16 +00:00
rework of plagubot part of admins plugin
This commit is contained in:
parent
bb7fb985e3
commit
53630d4864
@ -28,7 +28,7 @@ private class SetChatAdminsRepoAction(
|
|||||||
override val toReturn: Continuation<Unit>
|
override val toReturn: Continuation<Unit>
|
||||||
) : RepoActions<Unit>()
|
) : RepoActions<Unit>()
|
||||||
|
|
||||||
class DefaultAdminsCacheAPIRepo(
|
class DefaultAdminsCacheAPIRepoImpl(
|
||||||
private val adminsRepo: KeyValuesRepo<ChatId, AdministratorChatMember>,
|
private val adminsRepo: KeyValuesRepo<ChatId, AdministratorChatMember>,
|
||||||
private val updatesRepo: KeyValueRepo<ChatId, MilliSeconds>,
|
private val updatesRepo: KeyValueRepo<ChatId, MilliSeconds>,
|
||||||
private val scope: CoroutineScope
|
private val scope: CoroutineScope
|
||||||
@ -60,3 +60,9 @@ class DefaultAdminsCacheAPIRepo(
|
|||||||
actor.trySend(GetUpdateDateTimeRepoAction(chatId, it))
|
actor.trySend(GetUpdateDateTimeRepoAction(chatId, it))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun DefaultAdminsCacheAPIRepo(
|
||||||
|
adminsRepo: KeyValuesRepo<ChatId, AdministratorChatMember>,
|
||||||
|
updatesRepo: KeyValueRepo<ChatId, MilliSeconds>,
|
||||||
|
scope: CoroutineScope
|
||||||
|
) = DefaultAdminsCacheAPIRepoImpl(adminsRepo, updatesRepo, scope)
|
||||||
|
@ -5,20 +5,18 @@ import dev.inmo.micro_utils.repos.exposed.onetomany.ExposedKeyValuesRepo
|
|||||||
import dev.inmo.micro_utils.repos.mappers.withMapper
|
import dev.inmo.micro_utils.repos.mappers.withMapper
|
||||||
import dev.inmo.tgbotapi.bot.TelegramBot
|
import dev.inmo.tgbotapi.bot.TelegramBot
|
||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
|
||||||
import dev.inmo.tgbotapi.libraries.cache.admins.micro_utils.DefaultAdminsCacheAPIRepo
|
import dev.inmo.tgbotapi.libraries.cache.admins.micro_utils.DefaultAdminsCacheAPIRepoImpl
|
||||||
import dev.inmo.tgbotapi.libraries.cache.admins.micro_utils.DynamicAdminsCacheSettingsAPI
|
import dev.inmo.tgbotapi.libraries.cache.admins.micro_utils.DynamicAdminsCacheSettingsAPI
|
||||||
import dev.inmo.tgbotapi.types.*
|
import dev.inmo.tgbotapi.types.*
|
||||||
import dev.inmo.tgbotapi.types.chat.member.*
|
import dev.inmo.tgbotapi.types.chat.member.*
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.serialization.*
|
import kotlinx.serialization.*
|
||||||
import kotlinx.serialization.cbor.Cbor
|
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
import kotlinx.serialization.modules.SerializersModule
|
import kotlinx.serialization.modules.SerializersModule
|
||||||
import kotlinx.serialization.modules.polymorphic
|
import kotlinx.serialization.modules.polymorphic
|
||||||
import org.jetbrains.exposed.sql.Database
|
import org.jetbrains.exposed.sql.Database
|
||||||
import org.jetbrains.exposed.sql.statements.api.ExposedBlob
|
|
||||||
|
|
||||||
private val serializationFormat = Json {
|
val telegramAdminsSerializationFormat = Json {
|
||||||
ignoreUnknownKeys = true
|
ignoreUnknownKeys = true
|
||||||
serializersModule = SerializersModule {
|
serializersModule = SerializersModule {
|
||||||
polymorphic(AdministratorChatMember::class) {
|
polymorphic(AdministratorChatMember::class) {
|
||||||
@ -35,7 +33,7 @@ fun AdminsCacheAPI(
|
|||||||
scope: CoroutineScope
|
scope: CoroutineScope
|
||||||
) : AdminsCacheAPI = DefaultAdminsCacheAPI(
|
) : AdminsCacheAPI = DefaultAdminsCacheAPI(
|
||||||
bot,
|
bot,
|
||||||
DefaultAdminsCacheAPIRepo(
|
DefaultAdminsCacheAPIRepoImpl(
|
||||||
ExposedKeyValuesRepo(
|
ExposedKeyValuesRepo(
|
||||||
database,
|
database,
|
||||||
{ long("chatId") },
|
{ long("chatId") },
|
||||||
@ -43,9 +41,9 @@ fun AdminsCacheAPI(
|
|||||||
"AdminsTable"
|
"AdminsTable"
|
||||||
).withMapper<ChatId, AdministratorChatMember, Identifier, String>(
|
).withMapper<ChatId, AdministratorChatMember, Identifier, String>(
|
||||||
keyFromToTo = { chatId },
|
keyFromToTo = { chatId },
|
||||||
valueFromToTo = { serializationFormat.encodeToString(this) },
|
valueFromToTo = { telegramAdminsSerializationFormat.encodeToString(this) },
|
||||||
keyToToFrom = { toChatId() },
|
keyToToFrom = { toChatId() },
|
||||||
valueToToFrom = { serializationFormat.decodeFromString(this) }
|
valueToToFrom = { telegramAdminsSerializationFormat.decodeFromString(this) }
|
||||||
),
|
),
|
||||||
ExposedKeyValueRepo(
|
ExposedKeyValueRepo(
|
||||||
database,
|
database,
|
||||||
@ -68,9 +66,9 @@ fun AdminsCacheAPI(
|
|||||||
"DynamicAdminsCacheSettingsAPI"
|
"DynamicAdminsCacheSettingsAPI"
|
||||||
).withMapper<ChatId, AdminsCacheSettings, Identifier, String>(
|
).withMapper<ChatId, AdminsCacheSettings, Identifier, String>(
|
||||||
keyFromToTo = { chatId },
|
keyFromToTo = { chatId },
|
||||||
valueFromToTo = { serializationFormat.encodeToString(this) },
|
valueFromToTo = { telegramAdminsSerializationFormat.encodeToString(this) },
|
||||||
keyToToFrom = { toChatId() },
|
keyToToFrom = { toChatId() },
|
||||||
valueToToFrom = { serializationFormat.decodeFromString(this) }
|
valueToToFrom = { telegramAdminsSerializationFormat.decodeFromString(this) }
|
||||||
),
|
),
|
||||||
scope
|
scope
|
||||||
)
|
)
|
||||||
|
@ -1,17 +1,24 @@
|
|||||||
package dev.inmo.tgbotapi.libraries.cache.admins
|
package dev.inmo.tgbotapi.libraries.cache.admins
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.repos.exposed.keyvalue.ExposedKeyValueRepo
|
||||||
|
import dev.inmo.micro_utils.repos.exposed.onetomany.ExposedKeyValuesRepo
|
||||||
|
import dev.inmo.micro_utils.repos.mappers.withMapper
|
||||||
import dev.inmo.plagubot.Plugin
|
import dev.inmo.plagubot.Plugin
|
||||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContext
|
||||||
import dev.inmo.tgbotapi.types.ChatId
|
import dev.inmo.tgbotapi.libraries.cache.admins.micro_utils.DefaultAdminsCacheAPIRepoImpl
|
||||||
|
import dev.inmo.tgbotapi.libraries.cache.admins.micro_utils.DynamicAdminsCacheSettingsAPI
|
||||||
|
import dev.inmo.tgbotapi.types.*
|
||||||
|
import dev.inmo.tgbotapi.types.chat.member.AdministratorChatMember
|
||||||
|
import kotlinx.coroutines.*
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.*
|
||||||
import kotlinx.coroutines.sync.Mutex
|
import kotlinx.coroutines.sync.Mutex
|
||||||
import kotlinx.coroutines.sync.withLock
|
import kotlinx.coroutines.sync.withLock
|
||||||
import kotlinx.serialization.Serializable
|
import kotlinx.serialization.*
|
||||||
import kotlinx.serialization.Transient
|
|
||||||
import kotlinx.serialization.json.JsonObject
|
import kotlinx.serialization.json.JsonObject
|
||||||
import org.jetbrains.exposed.sql.Database
|
import org.jetbrains.exposed.sql.Database
|
||||||
import org.koin.core.Koin
|
import org.koin.core.Koin
|
||||||
import org.koin.core.module.Module
|
import org.koin.core.module.Module
|
||||||
|
import org.koin.core.qualifier.named
|
||||||
import org.koin.core.scope.Scope
|
import org.koin.core.scope.Scope
|
||||||
|
|
||||||
val Scope.adminsPlugin: AdminsPlugin?
|
val Scope.adminsPlugin: AdminsPlugin?
|
||||||
@ -28,6 +35,7 @@ class AdminsPlugin : Plugin {
|
|||||||
private val databaseToAdminsCacheAPI = mutableMapOf<Database, MutableStateFlow<AdminsCacheAPI?>>()
|
private val databaseToAdminsCacheAPI = mutableMapOf<Database, MutableStateFlow<AdminsCacheAPI?>>()
|
||||||
private val mutex = Mutex()
|
private val mutex = Mutex()
|
||||||
|
|
||||||
|
@Deprecated("Will be removed soon due to its redundancy")
|
||||||
suspend fun adminsAPI(database: Database): AdminsCacheAPI {
|
suspend fun adminsAPI(database: Database): AdminsCacheAPI {
|
||||||
val flow = mutex.withLock {
|
val flow = mutex.withLock {
|
||||||
databaseToAdminsCacheAPI.getOrPut(database){ MutableStateFlow(null) }
|
databaseToAdminsCacheAPI.getOrPut(database){ MutableStateFlow(null) }
|
||||||
@ -37,16 +45,59 @@ class AdminsPlugin : Plugin {
|
|||||||
|
|
||||||
override fun Module.setupDI(database: Database, params: JsonObject) {
|
override fun Module.setupDI(database: Database, params: JsonObject) {
|
||||||
single { this@AdminsPlugin }
|
single { this@AdminsPlugin }
|
||||||
|
val scopeQualifier = named("admins plugin scope")
|
||||||
|
single(scopeQualifier) { CoroutineScope(Dispatchers.IO + SupervisorJob()) }
|
||||||
|
single<DefaultAdminsCacheAPIRepo> {
|
||||||
|
DefaultAdminsCacheAPIRepoImpl(
|
||||||
|
ExposedKeyValuesRepo(
|
||||||
|
database,
|
||||||
|
{ long("chatId") },
|
||||||
|
{ text("member") },
|
||||||
|
"AdminsTable"
|
||||||
|
).withMapper<ChatId, AdministratorChatMember, Identifier, String>(
|
||||||
|
keyFromToTo = { chatId },
|
||||||
|
valueFromToTo = { telegramAdminsSerializationFormat.encodeToString(this) },
|
||||||
|
keyToToFrom = { toChatId() },
|
||||||
|
valueToToFrom = { telegramAdminsSerializationFormat.decodeFromString(this) }
|
||||||
|
),
|
||||||
|
ExposedKeyValueRepo(
|
||||||
|
database,
|
||||||
|
{ long("chatId") },
|
||||||
|
{ long("datetime") },
|
||||||
|
"AdminsUpdatesTimesTable"
|
||||||
|
).withMapper<ChatId, Long, Identifier, Long>(
|
||||||
|
keyFromToTo = { chatId },
|
||||||
|
valueFromToTo = { this },
|
||||||
|
keyToToFrom = { toChatId() },
|
||||||
|
valueToToFrom = { this }
|
||||||
|
),
|
||||||
|
get(scopeQualifier)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
single<AdminsCacheSettingsAPI> {
|
||||||
|
DynamicAdminsCacheSettingsAPI(
|
||||||
|
ExposedKeyValueRepo(
|
||||||
|
database,
|
||||||
|
{ long("chatId") },
|
||||||
|
{ text("settings") },
|
||||||
|
"DynamicAdminsCacheSettingsAPI"
|
||||||
|
).withMapper<ChatId, AdminsCacheSettings, Identifier, String>(
|
||||||
|
keyFromToTo = { chatId },
|
||||||
|
valueFromToTo = { telegramAdminsSerializationFormat.encodeToString(this) },
|
||||||
|
keyToToFrom = { toChatId() },
|
||||||
|
valueToToFrom = { telegramAdminsSerializationFormat.decodeFromString(this) }
|
||||||
|
),
|
||||||
|
get(scopeQualifier)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
single { DefaultAdminsCacheAPI(get(), get(), get()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun BehaviourContext.setupBotPlugin(koin: Koin) {
|
override suspend fun BehaviourContext.setupBotPlugin(koin: Koin) {
|
||||||
with(koin) {
|
with(koin) {
|
||||||
mutex.withLock {
|
activateAdminsChangesListening(
|
||||||
val flow = databaseToAdminsCacheAPI.getOrPut(koin.get()){ MutableStateFlow(null) }
|
get()
|
||||||
if (flow.value == null) {
|
)
|
||||||
flow.value = AdminsCacheAPI(koin.get())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user