From 3efd3463a3d7b0fa356ec6c141df7fec902c1d9e Mon Sep 17 00:00:00 2001 From: McModder Date: Thu, 29 Aug 2024 22:38:41 +0300 Subject: [PATCH 1/5] Add MemberUpdatedWatcherBot example utilizing new 18.0.0 extensions --- MemberUpdatedWatcherBot/README.md | 10 +++ MemberUpdatedWatcherBot/build.gradle | 21 ++++++ .../src/main/kotlin/MemberUpdatedWatcher.kt | 68 +++++++++++++++++++ gradle.properties | 2 +- settings.gradle | 2 + 5 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 MemberUpdatedWatcherBot/README.md create mode 100644 MemberUpdatedWatcherBot/build.gradle create mode 100644 MemberUpdatedWatcherBot/src/main/kotlin/MemberUpdatedWatcher.kt diff --git a/MemberUpdatedWatcherBot/README.md b/MemberUpdatedWatcherBot/README.md new file mode 100644 index 0000000..3f53d94 --- /dev/null +++ b/MemberUpdatedWatcherBot/README.md @@ -0,0 +1,10 @@ +# MemberUpdatedWatcherBot + +This bot will watch for some ChatMemberUpdated events using new extensions from 18.0.0 + + +## Launch + +```bash +../gradlew run --args="BOT_TOKEN" +``` diff --git a/MemberUpdatedWatcherBot/build.gradle b/MemberUpdatedWatcherBot/build.gradle new file mode 100644 index 0000000..e851296 --- /dev/null +++ b/MemberUpdatedWatcherBot/build.gradle @@ -0,0 +1,21 @@ +buildscript { + repositories { + mavenCentral() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +apply plugin: 'kotlin' +apply plugin: 'application' + +mainClassName="MemberUpdatedWatcherKt" + + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + + implementation "dev.inmo:tgbotapi:$telegram_bot_api_version" +} diff --git a/MemberUpdatedWatcherBot/src/main/kotlin/MemberUpdatedWatcher.kt b/MemberUpdatedWatcherBot/src/main/kotlin/MemberUpdatedWatcher.kt new file mode 100644 index 0000000..0480d2d --- /dev/null +++ b/MemberUpdatedWatcherBot/src/main/kotlin/MemberUpdatedWatcher.kt @@ -0,0 +1,68 @@ +import dev.inmo.tgbotapi.extensions.api.* +import dev.inmo.tgbotapi.extensions.api.bot.* +import dev.inmo.tgbotapi.extensions.api.send.* +import dev.inmo.tgbotapi.extensions.behaviour_builder.* +import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.* +import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.* +import dev.inmo.tgbotapi.extensions.utils.* +import dev.inmo.tgbotapi.types.chat.member.* +import dev.inmo.tgbotapi.utils.* + + +@OptIn(PreviewFeature::class) +suspend fun main(args: Array) { + val token = args.first() + + val bot = telegramBot(token) + + bot.buildBehaviourWithLongPolling { + val me = getMe() + val filterSelfUpdates = SimpleFilter { + it.newChatMemberState.user.id == me.id + } + + onChatMemberJoined(initialFilter = filterSelfUpdates) { + println("Bot was added to chat") + sendMessage(it.chat.id, "I was added to chat. Please grant me admin permissions to make me able to watch other users' events") + } + + onChatMemberGotPromoted(initialFilter = filterSelfUpdates) { + println("Bot was granted admin permissions") + sendMessage(it.chat.id, "I was promoted to admin. I now can watch other users' events") + } + + onChatMemberGotDemoted(initialFilter = filterSelfUpdates) { + println("Admin permissions were revoked") + sendMessage(it.chat.id, "I'm no longer an admin. Admin permissions are required to watch other users' events") + } + + onChatMemberJoined { + val member = it.newChatMemberState.user + println("${member.firstName} joined the chat: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") + sendMessage(it.chat.id, "Welcome ${member.firstName}") + } + + onChatMemberLeft { + val member = it.newChatMemberState.user + println("${member.firstName} left the chat: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") + sendMessage(it.chat.id, "Goodbye ${member.firstName}") + } + + onChatMemberGotPromoted { + val newState = it.newChatMemberState.requireAdministratorChatMember() + println("${newState.user.firstName} got promoted to ${newState.customTitle ?: "Admin"}: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") + sendMessage(it.chat.id, "${newState.user.firstName} is now an ${newState.customTitle ?: "Admin"}") + } + + onChatMemberGotDemoted { + val member = it.newChatMemberState.user + println("${member.firstName} got demoted: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") + sendMessage(it.chat.id, "${member.firstName} is now got demoted back to member") + } + + onChatMemberGotPromotionChanged { + val member = it.newChatMemberState.requireAdministratorChatMember() + println("${member.user.firstName} has the permissions changed: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") + } + }.join() +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 3f64379..2df6e42 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ kotlin.daemon.jvmargs=-Xmx3g -Xms500m kotlin_version=2.0.10 -telegram_bot_api_version=17.0.0 +telegram_bot_api_version=18.0.0 micro_utils_version=0.22.0 serialization_version=1.7.1 ktor_version=2.3.11 diff --git a/settings.gradle b/settings.gradle index 637922f..698fbac 100644 --- a/settings.gradle +++ b/settings.gradle @@ -53,3 +53,5 @@ include ":BusinessConnectionsBot" include ":StarTransactionsBot" include ":CustomBot" + +include ":MemberUpdatedWatcherBot" From a62a14a59901b05dc7a7611a9c2e45aed0e0cb63 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 30 Aug 2024 18:40:39 +0600 Subject: [PATCH 2/5] migration onto 18.0.0 --- RightsChangerBot/src/main/kotlin/RightsChanger.kt | 2 +- gradle.properties | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/RightsChangerBot/src/main/kotlin/RightsChanger.kt b/RightsChangerBot/src/main/kotlin/RightsChanger.kt index 9c3cb17..a6c1ba3 100644 --- a/RightsChangerBot/src/main/kotlin/RightsChanger.kt +++ b/RightsChangerBot/src/main/kotlin/RightsChanger.kt @@ -106,7 +106,7 @@ suspend fun main(args: Array) { suspend fun BehaviourContext.getUserChatPermissions(chatId: ChatId, userId: UserId): ChatPermissions? { val chatMember = getChatMember(chatId, userId) - return chatMember.restrictedChatMemberOrNull() ?: chatMember.whenMemberChatMember { + return chatMember.restrictedMemberChatMemberOrNull() ?: chatMember.whenMemberChatMember { getChat(chatId).extendedGroupChatOrNull() ?.permissions } } diff --git a/gradle.properties b/gradle.properties index 3f64379..3ab8ef8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,8 +5,8 @@ org.gradle.jvmargs=-Xmx3148m kotlin.daemon.jvmargs=-Xmx3g -Xms500m -kotlin_version=2.0.10 -telegram_bot_api_version=17.0.0 -micro_utils_version=0.22.0 -serialization_version=1.7.1 -ktor_version=2.3.11 +kotlin_version=2.0.20 +telegram_bot_api_version=18.0.0 +micro_utils_version=0.22.1 +serialization_version=1.7.2 +ktor_version=2.3.12 From 777604e5a03e69c7e95eb9589937e3b13a7dad30 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 30 Aug 2024 19:06:38 +0600 Subject: [PATCH 3/5] update new samples --- .../src/main/kotlin/MemberUpdatedWatcher.kt | 45 +++++++++++++------ 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/MemberUpdatedWatcherBot/src/main/kotlin/MemberUpdatedWatcher.kt b/MemberUpdatedWatcherBot/src/main/kotlin/MemberUpdatedWatcher.kt index 0480d2d..37a28e4 100644 --- a/MemberUpdatedWatcherBot/src/main/kotlin/MemberUpdatedWatcher.kt +++ b/MemberUpdatedWatcherBot/src/main/kotlin/MemberUpdatedWatcher.kt @@ -1,3 +1,4 @@ +import dev.inmo.kslog.common.* import dev.inmo.tgbotapi.extensions.api.* import dev.inmo.tgbotapi.extensions.api.bot.* import dev.inmo.tgbotapi.extensions.api.send.* @@ -13,56 +14,72 @@ import dev.inmo.tgbotapi.utils.* suspend fun main(args: Array) { val token = args.first() + val isDebug = args.any { it == "debug" } + + if (isDebug) { + setDefaultKSLog( + KSLog { level: LogLevel, tag: String?, message: Any, throwable: Throwable? -> + println(defaultMessageFormatter(level, tag, message, throwable)) + } + ) + } + + val internalLogger = KSLog { level: LogLevel, tag: String?, message: Any, throwable: Throwable? -> + println(defaultMessageFormatter(level, tag ?: "ChatMemberUpdates", message, throwable)) + } + val bot = telegramBot(token) bot.buildBehaviourWithLongPolling { val me = getMe() val filterSelfUpdates = SimpleFilter { - it.newChatMemberState.user.id == me.id + it.member.id == me.id } + // This bot updates onChatMemberJoined(initialFilter = filterSelfUpdates) { - println("Bot was added to chat") + internalLogger.i("Bot was added to chat") sendMessage(it.chat.id, "I was added to chat. Please grant me admin permissions to make me able to watch other users' events") } onChatMemberGotPromoted(initialFilter = filterSelfUpdates) { - println("Bot was granted admin permissions") + internalLogger.i("Bot was granted admin permissions") sendMessage(it.chat.id, "I was promoted to admin. I now can watch other users' events") } onChatMemberGotDemoted(initialFilter = filterSelfUpdates) { - println("Admin permissions were revoked") + internalLogger.i("Admin permissions were revoked") sendMessage(it.chat.id, "I'm no longer an admin. Admin permissions are required to watch other users' events") } + // All users updates onChatMemberJoined { - val member = it.newChatMemberState.user - println("${member.firstName} joined the chat: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") + val member = it.member + internalLogger.i("${member.firstName} joined the chat: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") sendMessage(it.chat.id, "Welcome ${member.firstName}") } onChatMemberLeft { - val member = it.newChatMemberState.user - println("${member.firstName} left the chat: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") + val member = it.member + internalLogger.i("${member.firstName} left the chat: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") sendMessage(it.chat.id, "Goodbye ${member.firstName}") } onChatMemberGotPromoted { - val newState = it.newChatMemberState.requireAdministratorChatMember() - println("${newState.user.firstName} got promoted to ${newState.customTitle ?: "Admin"}: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") + val newState = it.newChatMemberState.administratorChatMemberOrThrow() + internalLogger.i("${newState.user.firstName} got promoted to ${newState.customTitle ?: "Admin"}: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") sendMessage(it.chat.id, "${newState.user.firstName} is now an ${newState.customTitle ?: "Admin"}") } onChatMemberGotDemoted { - val member = it.newChatMemberState.user - println("${member.firstName} got demoted: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") + val member = it.member + internalLogger.i("${member.firstName} got demoted: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") sendMessage(it.chat.id, "${member.firstName} is now got demoted back to member") } onChatMemberGotPromotionChanged { - val member = it.newChatMemberState.requireAdministratorChatMember() - println("${member.user.firstName} has the permissions changed: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") + val member = it.newChatMemberState.administratorChatMemberOrThrow() + internalLogger.i("${member.user.firstName} has the permissions changed: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") } }.join() } \ No newline at end of file From 0ec543d5c5cdd75be5c1b857c9447eb8e00f8549 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Fri, 30 Aug 2024 23:32:29 +0600 Subject: [PATCH 4/5] update sample of MemberUpdatedWatcher bot --- .../src/main/kotlin/MemberUpdatedWatcher.kt | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/MemberUpdatedWatcherBot/src/main/kotlin/MemberUpdatedWatcher.kt b/MemberUpdatedWatcherBot/src/main/kotlin/MemberUpdatedWatcher.kt index 37a28e4..91362a2 100644 --- a/MemberUpdatedWatcherBot/src/main/kotlin/MemberUpdatedWatcher.kt +++ b/MemberUpdatedWatcherBot/src/main/kotlin/MemberUpdatedWatcher.kt @@ -3,6 +3,8 @@ import dev.inmo.tgbotapi.extensions.api.* import dev.inmo.tgbotapi.extensions.api.bot.* import dev.inmo.tgbotapi.extensions.api.send.* import dev.inmo.tgbotapi.extensions.behaviour_builder.* +import dev.inmo.tgbotapi.extensions.behaviour_builder.filters.chatMemberGotRestrictedFilter +import dev.inmo.tgbotapi.extensions.behaviour_builder.filters.chatMemberGotRestrictionsChangedFilter import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.* import dev.inmo.tgbotapi.extensions.behaviour_builder.utils.* import dev.inmo.tgbotapi.extensions.utils.* @@ -39,47 +41,58 @@ suspend fun main(args: Array) { // This bot updates onChatMemberJoined(initialFilter = filterSelfUpdates) { internalLogger.i("Bot was added to chat") - sendMessage(it.chat.id, "I was added to chat. Please grant me admin permissions to make me able to watch other users' events") + send(it.chat.id, "I was added to chat. Please grant me admin permissions to make me able to watch other users' events") } onChatMemberGotPromoted(initialFilter = filterSelfUpdates) { internalLogger.i("Bot was granted admin permissions") - sendMessage(it.chat.id, "I was promoted to admin. I now can watch other users' events") + send(it.chat.id, "I was promoted to admin. I now can watch other users' events") } onChatMemberGotDemoted(initialFilter = filterSelfUpdates) { internalLogger.i("Admin permissions were revoked") - sendMessage(it.chat.id, "I'm no longer an admin. Admin permissions are required to watch other users' events") + send(it.chat.id, "I'm no longer an admin. Admin permissions are required to watch other users' events") } // All users updates onChatMemberJoined { val member = it.member internalLogger.i("${member.firstName} joined the chat: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") - sendMessage(it.chat.id, "Welcome ${member.firstName}") + send(it.chat.id, "Welcome ${member.firstName}") } onChatMemberLeft { val member = it.member internalLogger.i("${member.firstName} left the chat: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") - sendMessage(it.chat.id, "Goodbye ${member.firstName}") + send(it.chat.id, "Goodbye ${member.firstName}") } onChatMemberGotPromoted { val newState = it.newChatMemberState.administratorChatMemberOrThrow() internalLogger.i("${newState.user.firstName} got promoted to ${newState.customTitle ?: "Admin"}: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") - sendMessage(it.chat.id, "${newState.user.firstName} is now an ${newState.customTitle ?: "Admin"}") + send(it.chat.id, "${newState.user.firstName} is now an ${newState.customTitle ?: "Admin"}") } onChatMemberGotDemoted { val member = it.member internalLogger.i("${member.firstName} got demoted: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") - sendMessage(it.chat.id, "${member.firstName} is now got demoted back to member") + send(it.chat.id, "${member.firstName} is now got demoted back to member") } onChatMemberGotPromotionChanged { - val member = it.newChatMemberState.administratorChatMemberOrThrow() - internalLogger.i("${member.user.firstName} has the permissions changed: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}") + val member = it.member + val message = "${member.firstName} has the permissions changed: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}" + internalLogger.i(message) + send(it.chat.id, message) + } + + onChatMemberUpdated( + initialFilter = chatMemberGotRestrictedFilter + chatMemberGotRestrictionsChangedFilter, + ) { + val member = it.member + val message = "${member.firstName} has the permissions changed: ${it.oldChatMemberState::class.simpleName} => ${it.newChatMemberState::class.simpleName}" + internalLogger.i(message) + send(it.chat.id, message) } }.join() } \ No newline at end of file From 023b810d07633c9bb8fc9970c908dd8b181690bd Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Mon, 2 Sep 2024 01:24:11 +0600 Subject: [PATCH 5/5] update micro_utils dependency --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 3ab8ef8..95178f2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,6 +7,6 @@ kotlin.daemon.jvmargs=-Xmx3g -Xms500m kotlin_version=2.0.20 telegram_bot_api_version=18.0.0 -micro_utils_version=0.22.1 +micro_utils_version=0.22.2 serialization_version=1.7.2 ktor_version=2.3.12