mirror of
https://github.com/InsanusMokrassar/TelegramBotApiLibraries.git
synced 2024-12-22 16:47:16 +00:00
commit
87bd39544d
@ -7,8 +7,8 @@ import dev.inmo.tgbotapi.types.message.abstracts.GroupContentMessage
|
||||
import dev.inmo.tgbotapi.types.message.abstracts.Message
|
||||
|
||||
interface AdminsCacheAPI {
|
||||
suspend fun getChatAdmins(chatId: ChatId): List<AdministratorChatMember>?
|
||||
suspend fun isAdmin(chatId: ChatId, userId: UserId): Boolean = getChatAdmins(chatId) ?.any {
|
||||
suspend fun getChatAdmins(chatId: IdChatIdentifier): List<AdministratorChatMember>?
|
||||
suspend fun isAdmin(chatId: IdChatIdentifier, userId: UserId): Boolean = getChatAdmins(chatId) ?.any {
|
||||
it.user.id == userId
|
||||
} == true
|
||||
suspend fun sentByAdmin(groupContentMessage: GroupContentMessage<*>): Boolean
|
||||
|
@ -1,7 +1,7 @@
|
||||
package dev.inmo.tgbotapi.libraries.cache.admins
|
||||
|
||||
import com.soywiz.klock.minutes
|
||||
import dev.inmo.tgbotapi.types.ChatId
|
||||
import dev.inmo.tgbotapi.types.IdChatIdentifier
|
||||
import dev.inmo.tgbotapi.types.Seconds
|
||||
import kotlinx.coroutines.flow.SharedFlow
|
||||
import kotlinx.serialization.Serializable
|
||||
@ -23,22 +23,22 @@ data class AdminsCacheSettings(
|
||||
}
|
||||
|
||||
interface AdminsCacheSettingsAPI {
|
||||
suspend fun getChatSettings(chatId: ChatId): AdminsCacheSettings?
|
||||
suspend fun getChatSettings(chatId: IdChatIdentifier): AdminsCacheSettings?
|
||||
}
|
||||
|
||||
interface MutableAdminsCacheSettingsAPI : AdminsCacheSettingsAPI {
|
||||
val chatSettingsUpdatedFlow: SharedFlow<Pair<ChatId, AdminsCacheSettings>>
|
||||
val chatSettingsUpdatedFlow: SharedFlow<Pair<IdChatIdentifier, AdminsCacheSettings>>
|
||||
|
||||
suspend fun setChatSettings(chatId: ChatId, settings: AdminsCacheSettings)
|
||||
suspend fun setChatSettings(chatId: IdChatIdentifier, settings: AdminsCacheSettings)
|
||||
}
|
||||
|
||||
fun AdminsCacheSettingsAPI.asMutable(): MutableAdminsCacheSettingsAPI? = this as? MutableAdminsCacheSettingsAPI
|
||||
|
||||
@Serializable
|
||||
class StaticAdminsCacheSettingsAPI(
|
||||
private val settings: Map<ChatId, AdminsCacheSettings>
|
||||
private val settings: Map<IdChatIdentifier, AdminsCacheSettings>
|
||||
) : AdminsCacheSettingsAPI {
|
||||
override suspend fun getChatSettings(chatId: ChatId): AdminsCacheSettings? = settings[chatId]
|
||||
override suspend fun getChatSettings(chatId: IdChatIdentifier): AdminsCacheSettings? = settings[chatId]
|
||||
}
|
||||
|
||||
|
||||
|
@ -7,7 +7,7 @@ import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onChatMe
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.ByChatChatMemberUpdatedMarkerFactory
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.marker_factories.MarkerFactory
|
||||
import dev.inmo.tgbotapi.types.ChatId
|
||||
import dev.inmo.tgbotapi.types.IdChatIdentifier
|
||||
import dev.inmo.tgbotapi.types.chat.member.AdministratorChatMember
|
||||
import dev.inmo.tgbotapi.types.chat.member.ChatMemberUpdated
|
||||
import dev.inmo.tgbotapi.types.update.abstracts.Update
|
||||
@ -35,7 +35,7 @@ suspend fun BehaviourContext.activateAdminsChangesListening(
|
||||
|
||||
suspend fun BehaviourContext.activateAdminsChangesListening(
|
||||
repo: DefaultAdminsCacheAPIRepo,
|
||||
allowedChats: List<ChatId>
|
||||
allowedChats: List<IdChatIdentifier>
|
||||
) = activateAdminsChangesListening(
|
||||
repo,
|
||||
{
|
||||
|
@ -2,19 +2,19 @@ package dev.inmo.tgbotapi.libraries.cache.admins
|
||||
|
||||
import dev.inmo.tgbotapi.abstracts.FromUser
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.SimpleFilter
|
||||
import dev.inmo.tgbotapi.types.ChatId
|
||||
import dev.inmo.tgbotapi.types.IdChatIdentifier
|
||||
import dev.inmo.tgbotapi.types.UserId
|
||||
import dev.inmo.tgbotapi.types.message.abstracts.Message
|
||||
|
||||
fun AdminsChecker(
|
||||
adminsCacheAPI: AdminsCacheAPI
|
||||
): SimpleFilter<Pair<ChatId, UserId>> = SimpleFilter {
|
||||
): SimpleFilter<Pair<IdChatIdentifier, UserId>> = SimpleFilter {
|
||||
adminsCacheAPI.isAdmin(it.first, it.second)
|
||||
}
|
||||
|
||||
fun <T> AdminsChecker(
|
||||
adminsCacheAPI: AdminsCacheAPI,
|
||||
mapper: (T) -> Pair<ChatId, UserId>
|
||||
mapper: (T) -> Pair<IdChatIdentifier, UserId>
|
||||
): SimpleFilter<T> {
|
||||
val baseChecker = AdminsChecker(adminsCacheAPI)
|
||||
|
||||
@ -31,7 +31,7 @@ fun MessageAdminsChecker(
|
||||
|
||||
fun AdminsChecker(
|
||||
adminsCacheAPI: AdminsCacheAPI,
|
||||
chatId: ChatId
|
||||
chatId: IdChatIdentifier
|
||||
) = SimpleFilter<FromUser> {
|
||||
adminsCacheAPI.isAdmin(chatId, it.from.id)
|
||||
}
|
||||
|
@ -11,9 +11,9 @@ import dev.inmo.tgbotapi.types.message.abstracts.*
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
interface DefaultAdminsCacheAPIRepo {
|
||||
suspend fun getChatAdmins(chatId: ChatId): List<AdministratorChatMember>?
|
||||
suspend fun setChatAdmins(chatId: ChatId, chatMembers: List<AdministratorChatMember>)
|
||||
suspend fun lastUpdate(chatId: ChatId): DateTime?
|
||||
suspend fun getChatAdmins(chatId: IdChatIdentifier): List<AdministratorChatMember>?
|
||||
suspend fun setChatAdmins(chatId: IdChatIdentifier, chatMembers: List<AdministratorChatMember>)
|
||||
suspend fun lastUpdate(chatId: IdChatIdentifier): DateTime?
|
||||
}
|
||||
|
||||
@Serializable
|
||||
@ -29,7 +29,7 @@ class DefaultAdminsCacheAPI(
|
||||
bot.getMe().also { botInfo = it }
|
||||
}
|
||||
|
||||
override suspend fun getChatAdmins(chatId: ChatId): List<AdministratorChatMember>? {
|
||||
override suspend fun getChatAdmins(chatId: IdChatIdentifier): List<AdministratorChatMember>? {
|
||||
val settings = settingsAPI.getChatSettings(chatId)
|
||||
val lastUpdate = repo.lastUpdate(chatId)
|
||||
return when {
|
||||
@ -42,7 +42,7 @@ class DefaultAdminsCacheAPI(
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun isAdmin(chatId: ChatId, userId: UserId): Boolean {
|
||||
override suspend fun isAdmin(chatId: IdChatIdentifier, userId: UserId): Boolean {
|
||||
val settings = settingsAPI.getChatSettings(chatId)
|
||||
val lastUpdate = repo.lastUpdate(chatId)
|
||||
return when {
|
||||
|
@ -1,6 +1,6 @@
|
||||
package dev.inmo.tgbotapi.libraries.cache.admins
|
||||
|
||||
import dev.inmo.tgbotapi.types.ChatId
|
||||
import dev.inmo.tgbotapi.types.IdChatIdentifier
|
||||
import dev.inmo.tgbotapi.types.UserId
|
||||
import dev.inmo.tgbotapi.types.message.abstracts.*
|
||||
|
||||
@ -13,7 +13,7 @@ suspend inline fun AdminsCacheAPI.isAdmin(message: Message) = when (message) {
|
||||
suspend inline fun AdminsCacheAPI.verifyMessageFromAdmin(message: Message) = isAdmin(message)
|
||||
|
||||
suspend inline fun <R : Any> AdminsCacheAPI.doIfAdmin(
|
||||
chatId: ChatId,
|
||||
chatId: IdChatIdentifier,
|
||||
userId: UserId,
|
||||
block: () -> R
|
||||
) = if(isAdmin(chatId, userId)) {
|
||||
|
@ -3,12 +3,12 @@ package dev.inmo.tgbotapi.libraries.cache.admins
|
||||
import dev.inmo.tgbotapi.bot.TelegramBot
|
||||
import dev.inmo.tgbotapi.extensions.api.bot.getMe
|
||||
import dev.inmo.tgbotapi.extensions.api.chat.get.getChatAdministrators
|
||||
import dev.inmo.tgbotapi.types.ChatId
|
||||
import dev.inmo.tgbotapi.types.IdChatIdentifier
|
||||
import dev.inmo.tgbotapi.types.chat.ExtendedBot
|
||||
import dev.inmo.tgbotapi.types.chat.member.AdministratorChatMember
|
||||
|
||||
internal suspend fun TelegramBot.updateAdmins(
|
||||
chatId: ChatId,
|
||||
chatId: IdChatIdentifier,
|
||||
repo: DefaultAdminsCacheAPIRepo,
|
||||
botInfo: ExtendedBot? = null
|
||||
): List<AdministratorChatMember> {
|
||||
|
@ -15,22 +15,22 @@ private sealed class RepoActions<T> {
|
||||
abstract val deferred: CompletableDeferred<T>
|
||||
}
|
||||
private class GetUpdateDateTimeRepoAction(
|
||||
val chatId: ChatId,
|
||||
val chatId: IdChatIdentifier,
|
||||
override val deferred: CompletableDeferred<DateTime?>
|
||||
) : RepoActions<DateTime?>()
|
||||
private class GetChatAdminsRepoAction(
|
||||
val chatId: ChatId,
|
||||
val chatId: IdChatIdentifier,
|
||||
override val deferred: CompletableDeferred<List<AdministratorChatMember>?>
|
||||
) : RepoActions<List<AdministratorChatMember>?>()
|
||||
private class SetChatAdminsRepoAction(
|
||||
val chatId: ChatId,
|
||||
val chatId: IdChatIdentifier,
|
||||
val newValue: List<AdministratorChatMember>,
|
||||
override val deferred: CompletableDeferred<Unit>
|
||||
) : RepoActions<Unit>()
|
||||
|
||||
class DefaultAdminsCacheAPIRepoImpl(
|
||||
private val adminsRepo: KeyValuesRepo<ChatId, AdministratorChatMember>,
|
||||
private val updatesRepo: KeyValueRepo<ChatId, MilliSeconds>,
|
||||
private val adminsRepo: KeyValuesRepo<IdChatIdentifier, AdministratorChatMember>,
|
||||
private val updatesRepo: KeyValueRepo<IdChatIdentifier, MilliSeconds>,
|
||||
private val scope: CoroutineScope
|
||||
) : DefaultAdminsCacheAPIRepo {
|
||||
private val actor = scope.actorAsync<RepoActions<*>>(Channel.UNLIMITED) {
|
||||
@ -54,7 +54,7 @@ class DefaultAdminsCacheAPIRepoImpl(
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun getChatAdmins(chatId: ChatId): List<AdministratorChatMember>? {
|
||||
override suspend fun getChatAdmins(chatId: IdChatIdentifier): List<AdministratorChatMember>? {
|
||||
val deferred = CompletableDeferred<List<AdministratorChatMember>?>()
|
||||
actor.trySend(
|
||||
GetChatAdminsRepoAction(chatId, deferred)
|
||||
@ -64,7 +64,7 @@ class DefaultAdminsCacheAPIRepoImpl(
|
||||
return deferred.await()
|
||||
}
|
||||
|
||||
override suspend fun setChatAdmins(chatId: ChatId, chatMembers: List<AdministratorChatMember>) {
|
||||
override suspend fun setChatAdmins(chatId: IdChatIdentifier, chatMembers: List<AdministratorChatMember>) {
|
||||
val deferred = CompletableDeferred<Unit>()
|
||||
actor.trySend(
|
||||
SetChatAdminsRepoAction(chatId, chatMembers, deferred)
|
||||
@ -73,7 +73,7 @@ class DefaultAdminsCacheAPIRepoImpl(
|
||||
}
|
||||
return deferred.await()
|
||||
}
|
||||
override suspend fun lastUpdate(chatId: ChatId): DateTime? {
|
||||
override suspend fun lastUpdate(chatId: IdChatIdentifier): DateTime? {
|
||||
val deferred = CompletableDeferred<DateTime?>()
|
||||
actor.trySend(
|
||||
GetUpdateDateTimeRepoAction(chatId, deferred)
|
||||
@ -85,7 +85,7 @@ class DefaultAdminsCacheAPIRepoImpl(
|
||||
}
|
||||
|
||||
fun DefaultAdminsCacheAPIRepo(
|
||||
adminsRepo: KeyValuesRepo<ChatId, AdministratorChatMember>,
|
||||
updatesRepo: KeyValueRepo<ChatId, MilliSeconds>,
|
||||
adminsRepo: KeyValuesRepo<IdChatIdentifier, AdministratorChatMember>,
|
||||
updatesRepo: KeyValueRepo<IdChatIdentifier, MilliSeconds>,
|
||||
scope: CoroutineScope
|
||||
) = DefaultAdminsCacheAPIRepoImpl(adminsRepo, updatesRepo, scope)
|
||||
|
@ -3,22 +3,22 @@ package dev.inmo.tgbotapi.libraries.cache.admins.micro_utils
|
||||
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
|
||||
import dev.inmo.micro_utils.repos.*
|
||||
import dev.inmo.tgbotapi.libraries.cache.admins.*
|
||||
import dev.inmo.tgbotapi.types.ChatId
|
||||
import dev.inmo.tgbotapi.types.IdChatIdentifier
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.flow.*
|
||||
|
||||
class DynamicAdminsCacheSettingsAPI(
|
||||
private val repo: KeyValueRepo<ChatId, AdminsCacheSettings>,
|
||||
private val repo: KeyValueRepo<IdChatIdentifier, AdminsCacheSettings>,
|
||||
private val scope: CoroutineScope
|
||||
) : AdminsCacheSettingsAPI, MutableAdminsCacheSettingsAPI {
|
||||
override val chatSettingsUpdatedFlow: SharedFlow<Pair<ChatId, AdminsCacheSettings>>
|
||||
override val chatSettingsUpdatedFlow: SharedFlow<Pair<IdChatIdentifier, AdminsCacheSettings>>
|
||||
get() = repo.onNewValue.shareIn(scope, SharingStarted.Eagerly)
|
||||
|
||||
override suspend fun setChatSettings(chatId: ChatId, settings: AdminsCacheSettings) {
|
||||
override suspend fun setChatSettings(chatId: IdChatIdentifier, settings: AdminsCacheSettings) {
|
||||
repo.set(chatId, settings)
|
||||
}
|
||||
|
||||
override suspend fun getChatSettings(chatId: ChatId): AdminsCacheSettings {
|
||||
override suspend fun getChatSettings(chatId: IdChatIdentifier): AdminsCacheSettings {
|
||||
val settings = repo.get(chatId)
|
||||
return if (settings == null) {
|
||||
val newSettings = AdminsCacheSettings()
|
||||
@ -28,4 +28,4 @@ class DynamicAdminsCacheSettingsAPI(
|
||||
settings
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ fun TelegramBot.createAdminsCacheAPI(
|
||||
{ long("chatId") },
|
||||
{ text("member") },
|
||||
"AdminsTable"
|
||||
).withMapper<ChatId, AdministratorChatMember, Identifier, String>(
|
||||
).withMapper<IdChatIdentifier, AdministratorChatMember, Identifier, String>(
|
||||
keyFromToTo = { chatId },
|
||||
valueFromToTo = { telegramAdminsSerializationFormat.encodeToString(AdministratorChatMember.serializer(), this) },
|
||||
keyToToFrom = { toChatId() },
|
||||
@ -49,7 +49,7 @@ fun TelegramBot.createAdminsCacheAPI(
|
||||
{ long("chatId") },
|
||||
{ long("datetime") },
|
||||
"AdminsUpdatesTimesTable"
|
||||
).withMapper<ChatId, Long, Identifier, Long>(
|
||||
).withMapper<IdChatIdentifier, Long, Identifier, Long>(
|
||||
keyFromToTo = { chatId },
|
||||
valueFromToTo = { this },
|
||||
keyToToFrom = { toChatId() },
|
||||
@ -63,7 +63,7 @@ fun TelegramBot.createAdminsCacheAPI(
|
||||
{ long("chatId") },
|
||||
{ text("settings") },
|
||||
"DynamicAdminsCacheSettingsAPI"
|
||||
).withMapper<ChatId, AdminsCacheSettings, Identifier, String>(
|
||||
).withMapper<IdChatIdentifier, AdminsCacheSettings, Identifier, String>(
|
||||
keyFromToTo = { chatId },
|
||||
valueFromToTo = { telegramAdminsSerializationFormat.encodeToString(AdminsCacheSettings.serializer() , this) },
|
||||
keyToToFrom = { toChatId() },
|
||||
|
@ -55,7 +55,7 @@ class AdminsPlugin : Plugin {
|
||||
{ long("chatId") },
|
||||
{ text("member") },
|
||||
"AdminsTable"
|
||||
).withMapper<ChatId, AdministratorChatMember, Identifier, String>(
|
||||
).withMapper<IdChatIdentifier, AdministratorChatMember, Identifier, String>(
|
||||
keyFromToTo = { chatId },
|
||||
valueFromToTo = { telegramAdminsSerializationFormat.encodeToString(this) },
|
||||
keyToToFrom = { toChatId() },
|
||||
@ -66,7 +66,7 @@ class AdminsPlugin : Plugin {
|
||||
{ long("chatId") },
|
||||
{ long("datetime") },
|
||||
"AdminsUpdatesTimesTable"
|
||||
).withMapper<ChatId, Long, Identifier, Long>(
|
||||
).withMapper<IdChatIdentifier, Long, Identifier, Long>(
|
||||
keyFromToTo = { chatId },
|
||||
valueFromToTo = { this },
|
||||
keyToToFrom = { toChatId() },
|
||||
@ -82,7 +82,7 @@ class AdminsPlugin : Plugin {
|
||||
{ long("chatId") },
|
||||
{ text("settings") },
|
||||
"DynamicAdminsCacheSettingsAPI"
|
||||
).withMapper<ChatId, AdminsCacheSettings, Identifier, String>(
|
||||
).withMapper<IdChatIdentifier, AdminsCacheSettings, Identifier, String>(
|
||||
keyFromToTo = { chatId },
|
||||
valueFromToTo = { telegramAdminsSerializationFormat.encodeToString(this) },
|
||||
keyToToFrom = { toChatId() },
|
||||
|
@ -4,7 +4,7 @@ import dev.inmo.tgbotapi.bot.TelegramBot
|
||||
import dev.inmo.tgbotapi.requests.DownloadFileStream
|
||||
import dev.inmo.tgbotapi.requests.get.GetFile
|
||||
import dev.inmo.tgbotapi.requests.send.media.*
|
||||
import dev.inmo.tgbotapi.types.ChatId
|
||||
import dev.inmo.tgbotapi.types.IdChatIdentifier
|
||||
import dev.inmo.tgbotapi.types.media.*
|
||||
import dev.inmo.tgbotapi.types.message.content.MediaContent
|
||||
import dev.inmo.tgbotapi.types.message.content.MessageContent
|
||||
@ -13,7 +13,7 @@ import io.ktor.utils.io.core.Input
|
||||
|
||||
class DefaultMessageContentCache<K>(
|
||||
private val bot: TelegramBot,
|
||||
private val filesRefreshingChatId: ChatId,
|
||||
private val filesRefreshingChatId: IdChatIdentifier,
|
||||
private val simpleMessageContentCache: MessagesSimpleCache<K>,
|
||||
private val mediaFileActualityChecker: MediaFileActualityChecker = MediaFileActualityChecker.WithDelay(
|
||||
MediaFileActualityChecker.Default(filesRefreshingChatId)
|
||||
@ -111,7 +111,7 @@ class DefaultMessageContentCache<K>(
|
||||
companion object {
|
||||
operator fun invoke(
|
||||
bot: TelegramBot,
|
||||
filesRefreshingChatId: ChatId,
|
||||
filesRefreshingChatId: IdChatIdentifier,
|
||||
simpleMessageContentCache: MessagesSimpleCache<String> = InMemoryMessagesSimpleCache(),
|
||||
mediaFileActualityChecker: MediaFileActualityChecker = MediaFileActualityChecker.WithDelay(
|
||||
MediaFileActualityChecker.Default(filesRefreshingChatId)
|
||||
|
@ -6,6 +6,7 @@ import dev.inmo.tgbotapi.bot.TelegramBot
|
||||
import dev.inmo.tgbotapi.requests.DeleteMessage
|
||||
import dev.inmo.tgbotapi.requests.abstracts.FileId
|
||||
import dev.inmo.tgbotapi.types.ChatId
|
||||
import dev.inmo.tgbotapi.types.IdChatIdentifier
|
||||
import dev.inmo.tgbotapi.types.MilliSeconds
|
||||
import dev.inmo.tgbotapi.types.message.content.MediaContent
|
||||
|
||||
@ -14,7 +15,7 @@ fun interface MediaFileActualityChecker {
|
||||
suspend fun TelegramBot.saved(mediaContent: MediaContent) {}
|
||||
|
||||
class Default(
|
||||
private val checkingChatId: ChatId
|
||||
private val checkingChatId: IdChatIdentifier
|
||||
) : MediaFileActualityChecker {
|
||||
override suspend fun TelegramBot.isActual(mediaContent: MediaContent): Boolean {
|
||||
return runCatching {
|
||||
|
@ -8,15 +8,15 @@ android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
|
||||
|
||||
kotlin_version=1.7.20
|
||||
kotlin_version=1.7.21
|
||||
kotlin_serialisation_core_version=1.4.1
|
||||
|
||||
github_release_plugin_version=2.4.1
|
||||
|
||||
tgbotapi_version=4.0.0
|
||||
micro_utils_version=0.14.0
|
||||
tgbotapi_version=4.1.0
|
||||
micro_utils_version=0.14.1
|
||||
exposed_version=0.40.1
|
||||
plagubot_version=3.0.0
|
||||
plagubot_version=3.1.0
|
||||
|
||||
# Dokka
|
||||
|
||||
@ -25,4 +25,4 @@ dokka_version=1.7.20
|
||||
# Project data
|
||||
|
||||
group=dev.inmo
|
||||
version=0.6.0
|
||||
version=0.6.1
|
||||
|
Loading…
Reference in New Issue
Block a user