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

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

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

import com.github.insanusmokrassar.AutoPostTelegramBot.base.database.exceptions.NoRowFoundException
import com.github.insanusmokrassar.AutoPostTelegramBot.base.database.tables.PostsTable
import com.github.insanusmokrassar.AutoPostTelegramBot.plugins.rating.database.PostsLikesMessagesTable
import com.github.insanusmokrassar.AutoPostTelegramBot.plugins.rating.database.PostsLikesTable
import com.github.insanusmokrassar.AutoPostTelegramBot.plugins.rating.refreshRegisteredMessage
import com.github.insanusmokrassar.AutoPostTelegramBot.realMessagesListener
import com.github.insanusmokrassar.AutoPostTelegramBot.utils.CallbackQueryReceiver
import com.github.insanusmokrassar.AutoPostTelegramBot.utils.extensions.*
import com.github.insanusmokrassar.IObjectK.exceptions.ReadException
import com.github.insanusmokrassar.IObjectKRealisations.toIObject
import com.pengrad.telegrambot.TelegramBot
import com.pengrad.telegrambot.model.CallbackQuery
import com.pengrad.telegrambot.model.request.ParseMode
import com.pengrad.telegrambot.request.SendMessage
import java.lang.ref.WeakReference

private const val enableIdentifier = "enableRatings"

fun makeEnableInline(postId: Int): String = "$enableIdentifier: $postId"
fun extractEnableInline(from: String): Int? = try {
    from.toIObject().get(enableIdentifier).toInt()
} catch (e: ReadException) {
    null
}

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

class EnableReceiver(
    bot: TelegramBot,
    sourceChatId: Long,
    postsLikesTable: PostsLikesTable,
    postsLikesMessagesTable: PostsLikesMessagesTable
) : CallbackQueryReceiver(bot) {
    private val awaitApprove = HashMap()

    init {
        val botWR = WeakReference(bot)
        realMessagesListener.broadcastChannel.subscribeChecking {
            message ->
            val userId = message.second.chat().id()

            val bot = botWR.get() ?: return@subscribeChecking false
            awaitApprove[userId] ?.let {
                if (extractEnableInline(message.second.text()) == it) {
                    awaitApprove.remove(userId)
                    refreshRegisteredMessage(
                        sourceChatId,
                        bot,
                        it,
                        postsLikesTable,
                        postsLikesMessagesTable
                    )

                    bot.executeAsync(
                        SendMessage(
                            userId,
                            "Rating was enabled"
                        ).parseMode(
                            ParseMode.Markdown
                        )
                    )
                }
            } ?:let {
                val forwardFrom = message.second.forwardFromChat()
                if (forwardFrom != null && forwardFrom.id() == sourceChatId) {
                    try {
                        val postId = PostsTable.findPost(
                            message.second.forwardFromMessageId()
                        )
                        bot.executeAsync(
                            SendMessage(
                                userId,
                                makeTextToApproveEnable(
                                    postId
                                )
                            ).parseMode(
                                ParseMode.Markdown
                            ),
                            onResponse = {
                                _, _ ->
                                awaitApprove[userId] = postId
                            }
                        )
                    } catch (e: NoRowFoundException) { }
                }
            }
            true
        }
    }

    override fun invoke(
        query: CallbackQuery,
        bot: TelegramBot?
    ) {
        bot ?: return
        extractDisableInline(query.data())?.let {
            awaitApprove[query.from().id().toLong()] = it
            bot.queryAnswer(
                query.id(),
                makeTextToApproveEnable(it),
                true
            )
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy