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

com.github.insanusmokrassar.AutoPostTelegramBot.plugins.scheduler.commands.GetSchedulesCommand.kt Maven / Gradle / Ivy

package com.github.insanusmokrassar.AutoPostTelegramBot.plugins.scheduler.commands

import com.github.insanusmokrassar.AutoPostTelegramBot.base.database.tables.PostsMessagesTable
import com.github.insanusmokrassar.AutoPostTelegramBot.base.plugins.commonLogger
import com.github.insanusmokrassar.AutoPostTelegramBot.plugins.scheduler.PostsSchedulesTable
import com.github.insanusmokrassar.AutoPostTelegramBot.utils.*
import com.github.insanusmokrassar.AutoPostTelegramBot.utils.commands.Command
import com.github.insanusmokrassar.AutoPostTelegramBot.utils.extensions.*
import com.pengrad.telegrambot.TelegramBot
import com.pengrad.telegrambot.model.Message
import com.pengrad.telegrambot.request.ForwardMessage
import com.pengrad.telegrambot.request.SendMessage
import kotlinx.coroutines.experimental.delay
import kotlinx.coroutines.experimental.launch
import java.lang.ref.WeakReference

class GetSchedulesCommand(
    private val postsSchedulesTable: PostsSchedulesTable,
    private val botWR: WeakReference,
    private val sourceChatId: Long
) : Command() {
    override val commandRegex: Regex = Regex("^/getPublishSchedule(( ${periodRegex.pattern})|( \\d+))?$")

    override fun onCommand(updateId: Int, message: Message) {
        val bot = botWR.get() ?: return

        val chatId = message.from() ?.id() ?: message.chat().id()

        launch {
            try {
                bot.executeBlocking(
                    SendMessage(
                        chatId,
                        "Let me prepare data"
                    )
                )
            } catch (e: Exception) {
                commonLogger.throwing(
                    this::class.java.simpleName,
                    "sending message \"Prepare data\" to user",
                    e
                )
                return@launch
            }

            val arg: String? = message.text().indexOf(" ").let {
                if (it > -1) {
                    message.text().substring(it + 1)
                } else {
                    null
                }
            }

            val posts = arg ?.let {
                _ ->
                arg.toIntOrNull() ?.let {
                    count ->
                    postsSchedulesTable.registeredPostsTimes().sortedBy {
                        it.second
                    }.let {
                        if (it.size <= count) {
                            it
                        } else {
                            it.subList(0, count)
                        }
                    }
                } ?: arg.parseDateTimes().asPairs().flatMap {
                    (from, to) ->
                    val asFutureFrom = from.asFuture
                    val asFutureTo = to.asFutureFor(asFutureFrom)
                    postsSchedulesTable.registeredPostsTimes(asFutureFrom to asFutureTo)
                }
            } ?: postsSchedulesTable.registeredPostsTimes()

            posts.let {
                if (it.isEmpty()) {
                    bot.executeAsync(
                        SendMessage(
                            chatId,
                            "Nothing to show, schedule queue is empty"
                        )
                    )
                } else {
                    it.forEach {
                        (postId, time) ->
                        bot.executeBlocking(
                            ForwardMessage(
                                chatId,
                                sourceChatId,
                                PostsMessagesTable.getMessagesOfPost(postId).firstOrNull() ?.messageId ?: return@forEach
                            )
                        )
                        bot.executeBlocking(
                            SendMessage(
                                chatId,
                                "Post time: $time"
                            )
                        )
                        delay(1000)
                    }
                }
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy