mirror of
https://github.com/InsanusMokrassar/CaptchaPlaguBotPlugin.git
synced 2025-01-03 22:40:04 +00:00
temporal progress
This commit is contained in:
parent
e375170567
commit
39c7b42778
@ -7,9 +7,9 @@ kotlin.incremental=true
|
||||
kotlin_version=1.6.21
|
||||
kotlin_coroutines_version=1.6.1
|
||||
kotlin_serialisation_runtime_version=1.3.3
|
||||
plagubot_version=1.0.0
|
||||
plagubot_version=1.0.1
|
||||
|
||||
micro_utils_version=0.10.4
|
||||
micro_utils_version=0.10.5
|
||||
tgbotapi_libraries_version=0.1.0
|
||||
|
||||
project_group=dev.inmo
|
||||
|
@ -106,35 +106,30 @@ class CaptchaBotPlugin : Plugin {
|
||||
|
||||
onNewChatMembers(
|
||||
initialFilter = {
|
||||
it.chat.asPublicChat() != null
|
||||
},
|
||||
subcontextUpdatesFilter = { m, u -> u.sourceChat() == m.chat },
|
||||
it.chat is GroupChat
|
||||
}
|
||||
) {
|
||||
launchSafelyWithoutExceptions {
|
||||
val settings = it.chat.settings()
|
||||
if (!settings.enabled) return@launchSafelyWithoutExceptions
|
||||
val settings = it.chat.settings()
|
||||
if (!settings.enabled) return@onNewChatMembers
|
||||
|
||||
safelyWithoutExceptions {
|
||||
if (settings.autoRemoveEvents) {
|
||||
deleteMessage(it)
|
||||
}
|
||||
safelyWithoutExceptions {
|
||||
if (settings.autoRemoveEvents) {
|
||||
deleteMessage(it)
|
||||
}
|
||||
val chat = it.chat.requireGroupChat()
|
||||
val newUsers = it.chatEvent.members
|
||||
newUsers.forEach { user ->
|
||||
restrictChatMember(
|
||||
chat,
|
||||
user,
|
||||
permissions = RestrictionsChatPermissions
|
||||
)
|
||||
}
|
||||
val defaultChatPermissions = (getChat(it.chat) as ExtendedGroupChat).permissions
|
||||
}
|
||||
val chat = it.chat.requireGroupChat()
|
||||
val newUsers = it.chatEvent.members
|
||||
newUsers.forEach { user ->
|
||||
restrictChatMember(
|
||||
chat,
|
||||
user,
|
||||
permissions = RestrictionsChatPermissions
|
||||
)
|
||||
}
|
||||
val defaultChatPermissions = (getChat(it.chat) as ExtendedGroupChat).permissions
|
||||
|
||||
createSubContextAndDoWithUpdatesFilter(stopOnCompletion = false) {
|
||||
launch {
|
||||
settings.captchaProvider.apply { doAction(it.date, chat, newUsers, defaultChatPermissions) }
|
||||
}
|
||||
}
|
||||
with (settings.captchaProvider) {
|
||||
doAction(it.date, chat, newUsers, defaultChatPermissions)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3,19 +3,20 @@ package dev.inmo.plagubot.plugins.captcha.provider
|
||||
import com.benasher44.uuid.uuid4
|
||||
import com.soywiz.klock.DateTime
|
||||
import com.soywiz.klock.seconds
|
||||
import dev.inmo.micro_utils.coroutines.safelyWithResult
|
||||
import dev.inmo.micro_utils.coroutines.safelyWithoutExceptions
|
||||
import dev.inmo.micro_utils.coroutines.*
|
||||
import dev.inmo.plagubot.plugins.captcha.slotMachineReplyMarkup
|
||||
import dev.inmo.tgbotapi.extensions.api.answers.answerCallbackQuery
|
||||
import dev.inmo.tgbotapi.extensions.api.chat.members.*
|
||||
import dev.inmo.tgbotapi.extensions.api.deleteMessage
|
||||
import dev.inmo.tgbotapi.extensions.api.edit.ReplyMarkup.editMessageReplyMarkup
|
||||
import dev.inmo.tgbotapi.extensions.api.edit.reply_markup.editMessageReplyMarkup
|
||||
import dev.inmo.tgbotapi.extensions.api.send.sendDice
|
||||
import dev.inmo.tgbotapi.extensions.api.send.sendTextMessage
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.*
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitDataCallbackQuery
|
||||
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitMessageDataCallbackQuery
|
||||
import dev.inmo.tgbotapi.extensions.utils.asSlotMachineReelImage
|
||||
import dev.inmo.tgbotapi.extensions.utils.calculateSlotMachineResult
|
||||
import dev.inmo.tgbotapi.extensions.utils.extensions.raw.message
|
||||
import dev.inmo.tgbotapi.extensions.utils.formatting.*
|
||||
import dev.inmo.tgbotapi.extensions.utils.shortcuts.executeUnsafe
|
||||
import dev.inmo.tgbotapi.extensions.utils.types.buttons.InlineKeyboardMarkup
|
||||
@ -118,7 +119,9 @@ data class SlotMachineCaptchaProvider(
|
||||
launch {
|
||||
val clicked = arrayOf<String?>(null, null, null)
|
||||
while (leftToClick.isNotEmpty()) {
|
||||
val userClicked = waitDataCallbackQuery { if (user.id == it.id) this else null }.first()
|
||||
val userClicked = waitMessageDataCallbackQuery {
|
||||
if (user.id == it.id && this.message.messageId == sentDice.messageId) this else null
|
||||
}.first()
|
||||
if (userClicked.data == leftToClick.first()) {
|
||||
clicked[3 - leftToClick.size] = leftToClick.removeAt(0)
|
||||
if (clicked.contains(null)) {
|
||||
@ -179,52 +182,48 @@ data class SimpleCaptchaProvider(
|
||||
leftRestrictionsPermissions: ChatPermissions
|
||||
) {
|
||||
val userBanDateTime = eventDateTime + checkTimeSpan
|
||||
newUsers.mapNotNull {
|
||||
safelyWithoutExceptions {
|
||||
launch {
|
||||
createSubContextAndDoWithUpdatesFilter(stopOnCompletion = false) {
|
||||
val callbackData = uuid4().toString()
|
||||
val sentMessage = sendTextMessage(
|
||||
chat,
|
||||
buildEntities {
|
||||
+it.mention(it.firstName)
|
||||
regular(", $captchaText")
|
||||
},
|
||||
replyMarkup = InlineKeyboardMarkup(
|
||||
CallbackDataInlineKeyboardButton(buttonText, callbackData)
|
||||
)
|
||||
newUsers.map {
|
||||
launchSafelyWithoutExceptions {
|
||||
createSubContext(this).doInContext(stopOnCompletion = false) {
|
||||
val callbackData = uuid4().toString()
|
||||
val sentMessage = sendTextMessage(
|
||||
chat,
|
||||
buildEntities {
|
||||
+it.mention(it.firstName)
|
||||
regular(", $captchaText")
|
||||
},
|
||||
replyMarkup = InlineKeyboardMarkup(
|
||||
CallbackDataInlineKeyboardButton(buttonText, callbackData)
|
||||
)
|
||||
)
|
||||
|
||||
suspend fun removeRedundantMessages() {
|
||||
safelyWithoutExceptions {
|
||||
deleteMessage(sentMessage)
|
||||
suspend fun removeRedundantMessages() {
|
||||
safelyWithoutExceptions {
|
||||
deleteMessage(sentMessage)
|
||||
}
|
||||
}
|
||||
|
||||
val job = launchSafely {
|
||||
waitMessageDataCallbackQuery (
|
||||
filter = { query ->
|
||||
query.user.id == it.id && query.data == callbackData && query.message.messageId == sentMessage.messageId
|
||||
}
|
||||
}
|
||||
).first()
|
||||
|
||||
val job = parallel {
|
||||
waitDataCallbackQuery {
|
||||
if (it.id == user.id && this.data == callbackData) {
|
||||
this
|
||||
} else {
|
||||
null
|
||||
}
|
||||
}.first()
|
||||
|
||||
removeRedundantMessages()
|
||||
safelyWithoutExceptions { restrictChatMember(chat, it, permissions = leftRestrictionsPermissions) }
|
||||
stop()
|
||||
}
|
||||
|
||||
delay((userBanDateTime - eventDateTime).millisecondsLong)
|
||||
|
||||
if (job.isActive) {
|
||||
job.cancel()
|
||||
if (kick) {
|
||||
banUser(chat, it, leftRestrictionsPermissions)
|
||||
}
|
||||
}
|
||||
removeRedundantMessages()
|
||||
safelyWithoutExceptions { restrictChatMember(chat, it, permissions = leftRestrictionsPermissions) }
|
||||
stop()
|
||||
}
|
||||
|
||||
delay((userBanDateTime - eventDateTime).millisecondsLong)
|
||||
|
||||
if (job.isActive) {
|
||||
job.cancel()
|
||||
if (kick) {
|
||||
banUser(chat, it, leftRestrictionsPermissions)
|
||||
}
|
||||
}
|
||||
stop()
|
||||
}
|
||||
}
|
||||
}.joinAll()
|
||||
@ -354,21 +353,23 @@ data class ExpressionCaptchaProvider(
|
||||
}
|
||||
|
||||
var leftAttempts = attempts
|
||||
waitDataCallbackQuery {
|
||||
when {
|
||||
this.user.id != user.id -> null
|
||||
this.data != correctAnswer -> {
|
||||
leftAttempts--
|
||||
if (leftAttempts < 1) {
|
||||
this
|
||||
} else {
|
||||
answerCallbackQuery(this@waitDataCallbackQuery, leftRetriesText + leftAttempts)
|
||||
null
|
||||
}
|
||||
}
|
||||
else -> this
|
||||
waitMessageDataCallbackQuery (
|
||||
filter = { query ->
|
||||
query.user.id == user.id && query.message.messageId == sentMessage.messageId
|
||||
}
|
||||
}.first()
|
||||
) {
|
||||
if (this.data != correctAnswer) {
|
||||
leftAttempts--
|
||||
if (leftAttempts < 1) {
|
||||
this
|
||||
} else {
|
||||
answerCallbackQuery(this@waitMessageDataCallbackQuery, leftRetriesText + leftAttempts)
|
||||
null
|
||||
}
|
||||
} else {
|
||||
this
|
||||
}
|
||||
}.take(1)
|
||||
|
||||
banJob.cancel()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user