Compare commits

...

7 Commits

5 changed files with 43 additions and 63 deletions

View File

@ -1,9 +1,10 @@
[versions]
kotlin = "1.7.10"
plagubot = "2.2.0"
kslog = "0.5.1"
plagubot-commands = "0.3.2"
plagubot = "2.3.3"
kslog = "0.5.2"
plagubot-commands = "0.3.4"
tgbotapi-libraries = "0.5.4"
[libraries]
@ -11,6 +12,7 @@ kotlin = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin"
plagubot = { module = "dev.inmo:plagubot.bot", version.ref = "plagubot" }
plagubot-plugin = { module = "dev.inmo:plagubot.plugin", version.ref = "plagubot" }
plagubot-commands = { module = "dev.inmo:plagubot.plugins.commands", version.ref = "plagubot-commands" }
tgbotapi-libraries-admins = { module = "dev.inmo:tgbotapi.libraries.cache.admins.plagubot", version.ref = "tgbotapi-libraries" }
kslog = { module = "dev.inmo:kslog", version.ref = "kslog" }
# Libs for classpath

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@ -24,4 +24,5 @@ dependencies {
api libs.plagubot.plugin
api libs.kslog
api libs.plagubot.commands
api libs.tgbotapi.libraries.admins
}

View File

@ -1,11 +0,0 @@
import dev.inmo.tgbotapi.bot.TelegramBot
import dev.inmo.tgbotapi.extensions.api.chat.get.getChatAdministrators
import dev.inmo.tgbotapi.types.chat.GroupChat
import dev.inmo.tgbotapi.types.chat.User
suspend fun TelegramBot.userIsAdmin(user: User, chat: GroupChat): Boolean {
val chatAdmins = getChatAdministrators(chat)
val chatAdminsIds = chatAdmins.map { adminMember -> adminMember.user.id }
return user.id in chatAdminsIds
}

View File

@ -1,36 +1,37 @@
import db.WelcomeTable
import dev.inmo.kslog.common.e
import dev.inmo.kslog.common.logger
import dev.inmo.kslog.common.w
import dev.inmo.micro_utils.coroutines.runCatchingSafely
import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions
import dev.inmo.plagubot.Plugin
import dev.inmo.plagubot.plugins.commands.full
import dev.inmo.tgbotapi.bot.exceptions.RequestException
import dev.inmo.tgbotapi.extensions.api.answers.answer
import dev.inmo.tgbotapi.extensions.api.chat.get.getChatAdministrators
import dev.inmo.tgbotapi.extensions.api.edit.edit
import dev.inmo.tgbotapi.extensions.api.send.*
import dev.inmo.tgbotapi.extensions.api.send.reply
import dev.inmo.tgbotapi.extensions.api.send.send
import dev.inmo.tgbotapi.extensions.behaviour_builder.*
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitContentMessage
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitMessageDataCallbackQuery
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.*
import dev.inmo.tgbotapi.extensions.utils.*
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onNewChatMembers
import dev.inmo.tgbotapi.extensions.utils.extensions.sameChat
import dev.inmo.tgbotapi.extensions.utils.extensions.sameMessage
import dev.inmo.tgbotapi.extensions.utils.formatting.*
import dev.inmo.tgbotapi.extensions.utils.types.buttons.*
import dev.inmo.tgbotapi.extensions.utils.ifCommonGroupContentMessage
import dev.inmo.tgbotapi.extensions.utils.types.buttons.dataButton
import dev.inmo.tgbotapi.extensions.utils.types.buttons.flatInlineKeyboard
import dev.inmo.tgbotapi.libraries.cache.admins.AdminsCacheAPI
import dev.inmo.tgbotapi.types.BotCommand
import dev.inmo.tgbotapi.types.MilliSeconds
import dev.inmo.tgbotapi.types.chat.GroupChat
import dev.inmo.tgbotapi.types.commands.BotCommandScope
import dev.inmo.tgbotapi.types.message.abstracts.CommonGroupContentMessage
import dev.inmo.tgbotapi.types.message.content.MessageContent
import dev.inmo.tgbotapi.types.message.content.TextContent
import dev.inmo.tgbotapi.utils.*
import kotlinx.coroutines.*
import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.first
import kotlinx.serialization.Serializable
import kotlinx.serialization.json.*
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject
import model.ChatSettings
import org.jetbrains.exposed.sql.Database
import org.koin.core.Koin
@ -72,24 +73,24 @@ class WelcomePlugin : Plugin {
}
private suspend fun BehaviourContext.handleWelcomeCommand(
adminsCacheAPI: AdminsCacheAPI,
welcomeTable: WelcomeTable,
config: Config,
groupMessage: CommonGroupContentMessage<MessageContent>
) {
val user = groupMessage.user
if (userIsAdmin(user, groupMessage.chat)) {
val sentMessage = sendMessage(
if (adminsCacheAPI.isAdmin(groupMessage.chat.id, user.id)) {
val sentMessage = send(
user,
buildEntities {
regular("Ok, send me the message which should be used as welcome message for chat ")
underline(groupMessage.chat.title)
},
replyMarkup = flatInlineKeyboard {
dataButton("Unset", unsetData)
dataButton("Cancel", cancelData)
}
)
) {
regular("Ok, send me the message which should be used as welcome message for chat ")
underline(groupMessage.chat.title)
}
oneOf(
parallel {
@ -97,7 +98,7 @@ class WelcomePlugin : Plugin {
it.data == unsetData && it.message.sameMessage(sentMessage)
}.first()
val answerEntities = buildEntities {
edit(sentMessage) {
if (welcomeTable.unset(groupMessage.chat.id)) {
regular("Welcome message has been removed for chat ")
underline(groupMessage.chat.title)
@ -107,11 +108,6 @@ class WelcomePlugin : Plugin {
}
}
edit(
sentMessage,
answerEntities
)
answer(query)
},
parallel {
@ -120,12 +116,11 @@ class WelcomePlugin : Plugin {
}.first()
edit(
sentMessage,
buildEntities {
regular("You have cancelled change of welcome message for chat ")
underline(groupMessage.chat.title)
}
)
sentMessage
) {
regular("You have cancelled change of welcome message for chat ")
underline(groupMessage.chat.title)
}
answer(query)
},
@ -142,7 +137,7 @@ class WelcomePlugin : Plugin {
)
)
val entities = buildEntities {
reply(message) {
if (success) {
regular("Welcome message has been changed for chat ")
underline(groupMessage.chat.title)
@ -153,17 +148,13 @@ class WelcomePlugin : Plugin {
underline(groupMessage.chat.title)
}
}
reply(
message,
entities
)
},
parallel {
while (isActive) {
delay(config.recheckOfAdmin)
if (!userIsAdmin(user, groupMessage.chat)) {
edit(sentMessage, "Sorry, but you are not admin in chat ${groupMessage.chat.title} more")
if (adminsCacheAPI.isAdmin(groupMessage.chat.id, user.id)) {
edit(sentMessage, "Sorry, but you are not admin in chat ${groupMessage.chat.title} anymore")
break
}
}
@ -179,14 +170,15 @@ class WelcomePlugin : Plugin {
val config = koin.get<Config>()
val welcomeTable = koin.get<WelcomeTable>()
val adminsCacheAPI = koin.get<AdminsCacheAPI>()
onCommand(
"welcome",
initialFilter = { it.chat is GroupChat }
) {
it.whenCommonGroupContentMessage { groupMessage ->
it.ifCommonGroupContentMessage { groupMessage ->
launch {
handleWelcomeCommand(welcomeTable, config, groupMessage)
handleWelcomeCommand(adminsCacheAPI, welcomeTable, config, groupMessage)
}
}
}
@ -198,15 +190,11 @@ class WelcomePlugin : Plugin {
return@onNewChatMembers
}
try {
reply(
it,
chatSettings.sourceChatId,
chatSettings.sourceMessageId
)
} catch (e: RequestException) {
welcomeTable.unset(it.chat.id)
}
reply(
it,
chatSettings.sourceChatId,
chatSettings.sourceMessageId
)
}
}