diff --git a/ResenderBot/ResenderBotLib/src/commonMain/kotlin/ResenderBot.kt b/ResenderBot/ResenderBotLib/src/commonMain/kotlin/ResenderBot.kt index 5791db6..1eb6d17 100644 --- a/ResenderBot/ResenderBotLib/src/commonMain/kotlin/ResenderBot.kt +++ b/ResenderBot/ResenderBotLib/src/commonMain/kotlin/ResenderBot.kt @@ -25,7 +25,9 @@ suspend fun activateResenderBot( ) { val chat = it.chat withTypingAction(chat) { - executeUnsafe(it.content.createResend(chat.id, replyToMessageId = it.messageId)) + executeUnsafe(it.content.createResend(chat.id, replyToMessageId = it.messageId)) { + it.forEach(print) + } } } onVisualGallery { diff --git a/StickerInfoBot/StickerInfoBotLib/build.gradle b/StickerInfoBot/StickerInfoBotLib/build.gradle new file mode 100644 index 0000000..1d40c3e --- /dev/null +++ b/StickerInfoBot/StickerInfoBotLib/build.gradle @@ -0,0 +1,33 @@ +buildscript { + repositories { + mavenCentral() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +plugins { + id "org.jetbrains.kotlin.multiplatform" +} + + +kotlin { + jvm() +// js(LEGACY) { + js(IR) { + browser() + binaries.executable() + } + + sourceSets { + commonMain { + dependencies { + implementation kotlin('stdlib') + + api "dev.inmo:tgbotapi:$telegram_bot_api_version" + } + } + } +} diff --git a/StickerInfoBot/StickerInfoBotLib/src/commonMain/kotlin/StickerInfoBot.kt b/StickerInfoBot/StickerInfoBotLib/src/commonMain/kotlin/StickerInfoBot.kt new file mode 100644 index 0000000..c6f4e08 --- /dev/null +++ b/StickerInfoBot/StickerInfoBotLib/src/commonMain/kotlin/StickerInfoBot.kt @@ -0,0 +1,71 @@ +import dev.inmo.micro_utils.coroutines.defaultSafelyWithoutExceptionHandler +import dev.inmo.micro_utils.coroutines.subscribeSafelyWithoutExceptions +import dev.inmo.tgbotapi.extensions.api.bot.getMe +import dev.inmo.tgbotapi.bot.ktor.telegramBot +import dev.inmo.tgbotapi.extensions.api.get.getCustomEmojiStickerOrNull +import dev.inmo.tgbotapi.extensions.api.get.getStickerSet +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.utils.formatting.* +import dev.inmo.tgbotapi.types.StickerType +import dev.inmo.tgbotapi.types.message.textsources.* +import dev.inmo.tgbotapi.types.stickers.StickerSet +import kotlinx.coroutines.* + +fun StickerSet.buildInfo() = buildEntities { + bold("StickerSet name: ") + "${name}\n" + bold("StickerSet title: ") + "${title}\n" + bold( + when (stickerType) { + StickerType.CustomEmoji -> "Custom emoji" + StickerType.Mask -> "Mask" + StickerType.Regular -> "Regular" + is StickerType.Unknown -> "Unknown type \"${stickerType.type}\"" + } + ) + " sticker set with title " + bold(title) + " and name " + bold(name) +} + +suspend fun activateStickerInfoBot( + token: String, + print: (Any) -> Unit +) { + val bot = telegramBot(token) + + print(bot.getMe()) + + defaultSafelyWithoutExceptionHandler = { + it.printStackTrace() + } + + bot.buildBehaviourWithLongPolling(CoroutineScope(currentCoroutineContext() + SupervisorJob())) { + onText { + withTypingAction(it.chat) { + it.content.textSources.mapNotNull { + if (it is CustomEmojiTextSource) { + getCustomEmojiStickerOrNull(it.customEmojiId) ?.stickerSetName + } else { + null + } + }.distinct().map { + getStickerSet(it) + }.distinct().flatMap { + it.buildInfo() + regular("\n") + }.separateForText().map { entities -> + reply(it, entities) + } + } + } + onSticker { + val stickerSetInfo = getStickerSet(it.content.media) + reply( + it, + stickerSetInfo.buildInfo() + ) + } + + allUpdatesFlow.subscribeSafelyWithoutExceptions(this) { + println(it) + } + }.join() +} diff --git a/StickerInfoBot/StickerInfoBotLib/src/jsMain/kotlin/StickerInfoBot.kt b/StickerInfoBot/StickerInfoBotLib/src/jsMain/kotlin/StickerInfoBot.kt new file mode 100644 index 0000000..5474eaf --- /dev/null +++ b/StickerInfoBot/StickerInfoBotLib/src/jsMain/kotlin/StickerInfoBot.kt @@ -0,0 +1,32 @@ +import kotlinx.browser.document +import kotlinx.coroutines.* +import org.w3c.dom.* + +private val scope = CoroutineScope(Dispatchers.Default) + +fun main() { + document.addEventListener( + "DOMContentLoaded", + { + val botsContainer = document.getElementById("bots_container") ?: return@addEventListener + + (document.getElementById("bot_token_form") as? HTMLFormElement) ?.onsubmit = { + (document.getElementById("bot_token") as? HTMLInputElement) ?.value ?.let { token -> + val botContainer = document.createElement("div") as HTMLDivElement + botsContainer.append(botContainer) + + val infoDiv = document.createElement("div") as HTMLDivElement + botContainer.append(infoDiv) + + scope.launch { + activateStickerInfoBot(token) { + infoDiv.innerHTML = it.toString() + } + } + } + + false + } + } + ) +} diff --git a/StickerInfoBot/StickerInfoBotLib/src/jsMain/resources/index.html b/StickerInfoBot/StickerInfoBotLib/src/jsMain/resources/index.html new file mode 100644 index 0000000..a329509 --- /dev/null +++ b/StickerInfoBot/StickerInfoBotLib/src/jsMain/resources/index.html @@ -0,0 +1,16 @@ + + +
+ +