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

76 lines
3.0 KiB
Kotlin
Raw Normal View History

2021-02-22 12:11:12 +00:00
package dev.inmo.tgbotapi.libraries.cache.admins
import com.soywiz.klock.DateTime
import dev.inmo.tgbotapi.bot.TelegramBot
import dev.inmo.tgbotapi.extensions.api.bot.getMe
2022-09-10 12:54:25 +00:00
import dev.inmo.tgbotapi.extensions.api.chat.members.getChatMember
import dev.inmo.tgbotapi.types.*
2022-05-22 05:56:30 +00:00
import dev.inmo.tgbotapi.types.chat.ExtendedBot
import dev.inmo.tgbotapi.types.chat.member.AdministratorChatMember
2021-03-30 16:36:19 +00:00
import dev.inmo.tgbotapi.types.message.abstracts.*
2021-02-22 12:11:12 +00:00
import kotlinx.serialization.Serializable
interface DefaultAdminsCacheAPIRepo {
2022-11-10 15:25:31 +00:00
suspend fun getChatAdmins(chatId: IdChatIdentifier): List<AdministratorChatMember>?
suspend fun setChatAdmins(chatId: IdChatIdentifier, chatMembers: List<AdministratorChatMember>)
suspend fun lastUpdate(chatId: IdChatIdentifier): DateTime?
2021-02-22 12:11:12 +00:00
}
@Serializable
class DefaultAdminsCacheAPI(
private val bot: TelegramBot,
private val repo: DefaultAdminsCacheAPIRepo,
private val settingsAPI: AdminsCacheSettingsAPI
) : AdminsCacheAPI {
private lateinit var botInfo: ExtendedBot
private suspend fun getBotInfo(): ExtendedBot = try {
botInfo
} catch (e: Throwable) {
bot.getMe().also { botInfo = it }
}
2022-11-10 15:25:31 +00:00
override suspend fun getChatAdmins(chatId: IdChatIdentifier): List<AdministratorChatMember>? {
2021-02-22 12:11:12 +00:00
val settings = settingsAPI.getChatSettings(chatId)
val lastUpdate = repo.lastUpdate(chatId)
return when {
settings == null -> null
2022-09-10 12:54:25 +00:00
settings.refreshOnCacheCalls &&
2021-02-22 12:11:12 +00:00
(lastUpdate == null || (DateTime.now() - lastUpdate).seconds > settings.refreshSeconds) -> {
bot.updateAdmins(chatId, repo, getBotInfo())
2021-02-22 12:11:12 +00:00
}
else -> repo.getChatAdmins(chatId) ?: bot.updateAdmins(chatId, repo, getBotInfo())
2021-02-22 12:11:12 +00:00
}
}
2022-11-10 15:25:31 +00:00
override suspend fun isAdmin(chatId: IdChatIdentifier, userId: UserId): Boolean {
2022-09-10 12:54:25 +00:00
val settings = settingsAPI.getChatSettings(chatId)
val lastUpdate = repo.lastUpdate(chatId)
return when {
settings == null -> return false
settings.refreshOnCacheCalls && (lastUpdate == null || (DateTime.now() - lastUpdate).seconds > settings.refreshSeconds) -> {
bot.updateAdmins(chatId, repo, getBotInfo())
}
else -> {
val chatAdmins = repo.getChatAdmins(chatId)
if (chatAdmins == null) {
return bot.getChatMember(chatId, userId) is AdministratorChatMember
}
chatAdmins
}
}.any { it.user.id == userId }
}
2021-03-30 16:36:19 +00:00
override suspend fun sentByAdmin(groupContentMessage: GroupContentMessage<*>): Boolean {
return when (groupContentMessage) {
is AnonymousGroupContentMessage -> true
is CommonGroupContentMessage -> isAdmin(
groupContentMessage.chat.id,
groupContentMessage.user.id
)
else -> false
}
}
2021-02-22 12:11:12 +00:00
override suspend fun settings(): AdminsCacheSettingsAPI = settingsAPI
}