All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.insanusmokrassar.AutoPostTelegramBot.plugins.rating.receivers.DisableReceiver.kt Maven / Gradle / Ivy

package com.github.insanusmokrassar.AutoPostTelegramBot.plugins.rating.receivers

import com.github.insanusmokrassar.AutoPostTelegramBot.allMessagesListener
import com.github.insanusmokrassar.AutoPostTelegramBot.plugins.rating.database.PostsLikesMessagesTable
import com.github.insanusmokrassar.AutoPostTelegramBot.plugins.rating.disableLikesForPost
import com.github.insanusmokrassar.AutoPostTelegramBot.utils.CallbackQueryReceivers.CallbackQueryReceiver
import com.github.insanusmokrassar.AutoPostTelegramBot.utils.extensions.subscribe
import com.github.insanusmokrassar.TelegramBotAPI.bot.RequestsExecutor
import com.github.insanusmokrassar.TelegramBotAPI.requests.answers.createAnswer
import com.github.insanusmokrassar.TelegramBotAPI.requests.send.SendMessage
import com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery.DataCallbackQuery
import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier
import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.MarkdownParseMode
import com.github.insanusmokrassar.TelegramBotAPI.types.UserId
import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.*
import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.TextContent
import com.github.insanusmokrassar.TelegramBotAPI.types.update.CallbackQueryUpdate
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.json.JSON

@Serializable
private data class DisableData(
    val disableRatings: Int
)

fun makeDisableInline(postId: Int): String = JSON.stringify(
    DisableData.serializer(),
    DisableData(postId)
)
fun extractDisableInline(from: String): Int? = try {
    JSON.parse(DisableData.serializer(), from).disableRatings
} catch (e: SerializationException) {
    null
}

private fun makeTextToApproveRemove(postId: Int) =
    "Please, write to me `${makeDisableInline(postId)}` if you want to disable ratings for this post"

private typealias UserIdPostId = Pair

class DisableReceiver(
    executor: RequestsExecutor,
    sourceChatId: ChatIdentifier,
    postsLikesMessagesTable: PostsLikesMessagesTable
) : CallbackQueryReceiver(executor) {
    private val awaitApprove = HashSet()

    init {
        allMessagesListener.subscribe { update ->
            val message = update.data
            val userId = (message as? FromUserMessage) ?.user ?.id ?: message.chat.id

            val bot = executorWR.get() ?: return@subscribe
            awaitApprove.firstOrNull { it.first == userId } ?.let { userIdPostId ->
                val postId = userIdPostId.second
                if (message is ContentMessage<*>) {
                    val content = message.content
                    when (content) {
                        is TextContent -> if (extractDisableInline(content.text) == postId) {
                            awaitApprove.remove(userIdPostId)
                            disableLikesForPost(
                                postId,
                                bot,
                                sourceChatId,
                                postsLikesMessagesTable
                            )

                            bot.execute(
                                SendMessage(
                                    userId,
                                    "Rating was disabled",
                                    parseMode = MarkdownParseMode
                                )
                            )
                        } else {
                            null
                        }
                        else -> null
                    }
                } else {
                    null
                }
            } ?: if (message is AbleToBeForwardedMessage) {
                val forwarded = message.forwarded
                val from = forwarded ?.from
                if (forwarded != null && from ?.id == sourceChatId) {
                    postsLikesMessagesTable.postIdByMessageId(
                        forwarded.messageId
                    ) ?.let { postId ->
                        bot.execute(
                            SendMessage(
                                userId,
                                makeTextToApproveRemove(
                                    postId
                                ),
                                parseMode = MarkdownParseMode
                            )
                        )
                        awaitApprove.add(userId to postId)
                    }
                }
            }
        }
    }

    override suspend fun invoke(update: CallbackQueryUpdate) {
        val query = update.data as? DataCallbackQuery ?: return
        extractDisableInline(query.data)?.let {
            val userId = query.user.id
            awaitApprove.add(userId to it)
            executorWR.get() ?.execute(
                query.createAnswer(
                    makeTextToApproveRemove(it),
                    true
                )
            )
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy