including of admins

This commit is contained in:
2021-02-23 12:00:44 +06:00
parent a667878e3f
commit 9561ee1dbe
5 changed files with 87 additions and 8 deletions

View File

@@ -16,32 +16,62 @@ import dev.inmo.tgbotapi.extensions.api.send.sendTextMessage
import dev.inmo.tgbotapi.extensions.behaviour_builder.*
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitBaseInlineQuery
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitDataCallbackQuery
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand
import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onNewChatMembers
import dev.inmo.tgbotapi.extensions.utils.*
import dev.inmo.tgbotapi.extensions.utils.formatting.buildEntities
import dev.inmo.tgbotapi.extensions.utils.formatting.regular
import dev.inmo.tgbotapi.extensions.utils.shortcuts.executeUnsafe
import dev.inmo.tgbotapi.libraries.cache.admins.AdminsCacheAPI
import dev.inmo.tgbotapi.libraries.cache.admins.adminsPlugin
import dev.inmo.tgbotapi.requests.DeleteMessage
import dev.inmo.tgbotapi.types.BotCommand
import dev.inmo.tgbotapi.types.MessageEntity.textsources.mention
import dev.inmo.tgbotapi.types.User
import dev.inmo.tgbotapi.types.chat.ChatPermissions
import dev.inmo.tgbotapi.types.chat.LeftRestrictionsChatPermissions
import dev.inmo.tgbotapi.types.chat.abstracts.Chat
import dev.inmo.tgbotapi.types.chat.abstracts.PublicChat
import dev.inmo.tgbotapi.types.dice.SlotMachineDiceAnimationType
import dev.inmo.tgbotapi.types.message.abstracts.Message
import dev.inmo.tgbotapi.types.message.abstracts.*
import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.toList
import kotlinx.serialization.Serializable
import org.jetbrains.exposed.sql.Database
private const val enableAutoDeleteCommands = "captcha_auto_delete_commands_on"
private const val disableAutoDeleteCommands = "captcha_auto_delete_commands_off"
private suspend fun AdminsCacheAPI.verifyMessageFromAdmin(message: CommonMessage<*>) = when (message) {
is CommonGroupContentMessage<*> -> getChatAdmins(message.chat.id) ?.any { it.user.id == message.user.id } == true
is AnonymousGroupContentMessage<*> -> true
else -> false
}
@Serializable
class CaptchaBotPlugin : Plugin {
override suspend fun getCommands(): List<BotCommand> = listOf(
BotCommand(
enableAutoDeleteCommands,
"Enable auto removing of commands addressed to captcha plugin"
),
BotCommand(
disableAutoDeleteCommands,
"Disable auto removing of commands addressed to captcha plugin"
)
)
override suspend fun BehaviourContext.invoke(
database: Database,
params: Map<String, Any>
) {
val repo = CaptchaChatsSettingsRepo(database)
val adminsAPI = params.adminsPlugin ?.adminsAPI(database)
suspend fun Chat.settings() = repo.getById(id) ?: repo.create(ChatSettings(id)).first()
onNewChatMembers(
additionalFilter = {
it.chat.asPublicChat() != null
@@ -59,7 +89,7 @@ class CaptchaBotPlugin : Plugin {
permissions = ChatPermissions()
)
}
val settings = repo.getById(it.chat.id) ?: repo.create(ChatSettings(it.chat.id)).firstOrNull() ?: return@onNewChatMembers
val settings = it.chat.settings() ?: return@onNewChatMembers
val userBanDateTime = eventDateTime + settings.checkTimeSpan
val authorized = Channel<User>(newUsers.size)
val messagesToDelete = Channel<Message>(Channel.UNLIMITED)
@@ -128,5 +158,46 @@ class CaptchaBotPlugin : Plugin {
executeUnsafe(DeleteMessage(message.chat.id, message.messageId), retries = 0)
}
}
if (adminsAPI != null) {
suspend fun <T : MessageContent> CommonMessage<T>.doAfterVerification(block: suspend () -> Unit) {
val chat = chat
if (chat is PublicChat) {
val verified = adminsAPI.verifyMessageFromAdmin(this)
if (verified) {
block()
}
}
}
onCommand(
enableAutoDeleteCommands,
requireOnlyCommandInMessage = false
) { message ->
message.doAfterVerification {
val settings = message.chat.settings()
repo.update(
message.chat.id,
settings.copy(autoRemoveCommands = true)
)
deleteMessage(message)
}
}
onCommand(
disableAutoDeleteCommands,
requireOnlyCommandInMessage = false
) { message ->
message.doAfterVerification {
val settings = message.chat.settings()
repo.update(
message.chat.id,
settings.copy(autoRemoveCommands = false)
)
}
}
}
}
}

View File

@@ -17,6 +17,7 @@ class CaptchaChatsSettingsRepo(
private val chatIdColumn = long("chatId")
private val checkTimeSecondsColumn = integer("checkTime")
private val solveCaptchaTextColumn = text("solveCaptchaText")
private val autoRemoveCommandsColumn = bool("autoRemoveCommands")
override val primaryKey = PrimaryKey(chatIdColumn)
@@ -30,19 +31,22 @@ class CaptchaChatsSettingsRepo(
it[chatIdColumn] = value.chatId.chatId
it[checkTimeSecondsColumn] = value.checkTime
it[solveCaptchaTextColumn] = value.captchaText
it[autoRemoveCommandsColumn] = value.autoRemoveCommands
}
override fun update(id: ChatId, value: ChatSettings, it: UpdateStatement) {
if (id.chatId == value.chatId.chatId) {
it[checkTimeSecondsColumn] = value.checkTime
it[solveCaptchaTextColumn] = value.captchaText
it[autoRemoveCommandsColumn] = value.autoRemoveCommands
}
}
override fun InsertStatement<Number>.asObject(value: ChatSettings): ChatSettings = ChatSettings(
get(chatIdColumn).toChatId(),
get(checkTimeSecondsColumn),
get(solveCaptchaTextColumn)
get(solveCaptchaTextColumn),
get(autoRemoveCommandsColumn)
)
override val selectById: SqlExpressionBuilder.(ChatId) -> Op<Boolean> = { chatIdColumn.eq(it.chatId) }
@@ -50,7 +54,8 @@ class CaptchaChatsSettingsRepo(
get() = ChatSettings(
get(chatIdColumn).toChatId(),
get(checkTimeSecondsColumn),
get(solveCaptchaTextColumn)
get(solveCaptchaTextColumn),
get(autoRemoveCommandsColumn)
)
init {

View File

@@ -10,7 +10,8 @@ import kotlinx.serialization.Transient
data class ChatSettings(
val chatId: ChatId,
val checkTime: Seconds = 60,
val captchaText: String = "solve next captcha:"
val captchaText: String = "solve next captcha:",
val autoRemoveCommands: Boolean = false
) {
@Transient
val checkTimeSpan = TimeSpan(checkTime * 1000.0)