diff --git a/BusinessConnectionsBot/README.md b/BusinessConnectionsBot/README.md new file mode 100644 index 0000000..2461998 --- /dev/null +++ b/BusinessConnectionsBot/README.md @@ -0,0 +1,9 @@ +# BusinessConnectionBotBot + +When bot connected or disconnected to the business chat, it will notify this chat + +## Launch + +```bash +../gradlew run --args="BOT_TOKEN" +``` diff --git a/BusinessConnectionsBot/build.gradle b/BusinessConnectionsBot/build.gradle new file mode 100644 index 0000000..14a48e1 --- /dev/null +++ b/BusinessConnectionsBot/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="BusinessConnectionsBotKt" + + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + + implementation "dev.inmo:tgbotapi:$telegram_bot_api_version" +} diff --git a/BusinessConnectionsBot/src/main/kotlin/BusinessConnectionsBot.kt b/BusinessConnectionsBot/src/main/kotlin/BusinessConnectionsBot.kt new file mode 100644 index 0000000..49f79a1 --- /dev/null +++ b/BusinessConnectionsBot/src/main/kotlin/BusinessConnectionsBot.kt @@ -0,0 +1,85 @@ +import dev.inmo.kslog.common.KSLog +import dev.inmo.kslog.common.LogLevel +import dev.inmo.kslog.common.defaultMessageFormatter +import dev.inmo.kslog.common.setDefaultKSLog +import dev.inmo.tgbotapi.extensions.api.bot.getMe +import dev.inmo.tgbotapi.extensions.api.get.getBusinessConnection +import dev.inmo.tgbotapi.extensions.api.send.reply +import dev.inmo.tgbotapi.extensions.api.send.send +import dev.inmo.tgbotapi.extensions.behaviour_builder.telegramBotWithBehaviourAndLongPolling +import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.* +import dev.inmo.tgbotapi.extensions.utils.ifBusinessContentMessage +import dev.inmo.tgbotapi.types.ChatId +import dev.inmo.tgbotapi.types.business_connection.BusinessConnectionId +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock + +suspend fun main(args: Array) { + val botToken = args.first() + val isDebug = args.getOrNull(1) == "debug" + + if (isDebug) { + setDefaultKSLog( + KSLog { level: LogLevel, tag: String?, message: Any, throwable: Throwable? -> + println(defaultMessageFormatter(level, tag, message, throwable)) + } + ) + } + + val businessConnectionsChats = mutableMapOf() + val businessConnectionsChatsMutex = Mutex() + + telegramBotWithBehaviourAndLongPolling(botToken, CoroutineScope(Dispatchers.IO)) { + val me = getMe() + println(me) + + onBusinessConnectionEnabled { + businessConnectionsChatsMutex.withLock { + businessConnectionsChats[it.id] = it.userChatId + } + send(it.userChatId, "Business connection ${it.businessConnectionId.string} has been enabled") + } + onBusinessConnectionDisabled { + businessConnectionsChatsMutex.withLock { + businessConnectionsChats.remove(it.id) + } + send(it.userChatId, "Business connection ${it.businessConnectionId.string} has been disabled") + } + + onContentMessage { + it.ifBusinessContentMessage { + val sent = execute(it.content.createResend(it.from.id)) + if (it.sentByBusinessConnectionOwner) { + reply(sent, "You have sent this message to the ${it.businessConnectionId.string} related chat") + } else { + reply(sent, "User have sent this message to you in the ${it.businessConnectionId.string} related chat") + } + } + } + onEditedContentMessage { + it.ifBusinessContentMessage { + val sent = execute(it.content.createResend(it.from.id)) + if (it.sentByBusinessConnectionOwner) { + reply(sent, "You have edited this message in the ${it.businessConnectionId.string} related chat") + } else { + reply(sent, "User have edited this message to you in the ${it.businessConnectionId.string} related chat") + } + } + } + onBusinessMessagesDeleted { + var businessConnectionOwnerChat = businessConnectionsChatsMutex.withLock { + businessConnectionsChats[it.businessConnectionId] + } + if (businessConnectionOwnerChat == null) { + val businessConnection = getBusinessConnection(it.businessConnectionId) + businessConnectionsChatsMutex.withLock { + businessConnectionsChats[businessConnection.businessConnectionId] = businessConnection.userChatId + } + businessConnectionOwnerChat = businessConnection.userChatId + } + send(businessConnectionOwnerChat, "There are several removed messages in chat ${it.chat.id}: ${it.messageIds}") + } + }.second.join() +} \ No newline at end of file diff --git a/UserChatShared/src/main/kotlin/UserChatShared.kt b/UserChatShared/src/main/kotlin/UserChatShared.kt index c55102a..817e61a 100644 --- a/UserChatShared/src/main/kotlin/UserChatShared.kt +++ b/UserChatShared/src/main/kotlin/UserChatShared.kt @@ -1,3 +1,7 @@ +import dev.inmo.kslog.common.KSLog +import dev.inmo.kslog.common.LogLevel +import dev.inmo.kslog.common.defaultMessageFormatter +import dev.inmo.kslog.common.setDefaultKSLog import dev.inmo.micro_utils.coroutines.runCatchingSafely import dev.inmo.tgbotapi.bot.ktor.telegramBot import dev.inmo.tgbotapi.extensions.api.bot.setMyCommands @@ -18,6 +22,15 @@ import dev.inmo.tgbotapi.utils.row suspend fun main(args: Array) { val botToken = args.first() + val isDebug = args.getOrNull(1) == "debug" + + if (isDebug) { + setDefaultKSLog( + KSLog { level: LogLevel, tag: String?, message: Any, throwable: Throwable? -> + println(defaultMessageFormatter(level, tag, message, throwable)) + } + ) + } val bot = telegramBot(botToken) diff --git a/settings.gradle b/settings.gradle index a5231ca..57b91bf 100644 --- a/settings.gradle +++ b/settings.gradle @@ -47,3 +47,5 @@ include ":ReactionsInfoBot" include ":LinkPreviewsBot" include ":BoostsInfoBot" + +include ":BusinessConnectionsBot"