2022-08-20 16:26:38 +00:00
|
|
|
package dev.inmo.plaguposter.triggers.command
|
|
|
|
|
2022-09-14 20:15:35 +00:00
|
|
|
import com.benasher44.uuid.uuid4
|
2022-08-20 16:26:38 +00:00
|
|
|
import dev.inmo.micro_utils.fsm.common.State
|
|
|
|
import dev.inmo.plagubot.Plugin
|
2022-09-04 09:48:45 +00:00
|
|
|
import dev.inmo.plaguposter.common.SuccessfulSymbol
|
2022-10-11 05:38:50 +00:00
|
|
|
import dev.inmo.plagubot.plugins.inline.queries.models.Format
|
|
|
|
import dev.inmo.plagubot.plugins.inline.queries.models.OfferTemplate
|
|
|
|
import dev.inmo.plagubot.plugins.inline.queries.repos.InlineTemplatesRepo
|
2022-09-14 20:15:35 +00:00
|
|
|
import dev.inmo.plaguposter.posts.models.PostId
|
|
|
|
import dev.inmo.plaguposter.posts.panel.PanelButtonBuilder
|
|
|
|
import dev.inmo.plaguposter.posts.panel.PanelButtonsAPI
|
2022-08-20 16:26:38 +00:00
|
|
|
import dev.inmo.plaguposter.posts.repo.PostsRepo
|
|
|
|
import dev.inmo.plaguposter.posts.sending.PostPublisher
|
2022-09-06 18:23:14 +00:00
|
|
|
import dev.inmo.plaguposter.ratings.selector.Selector
|
2022-09-04 09:48:45 +00:00
|
|
|
import dev.inmo.tgbotapi.extensions.api.edit.edit
|
2022-08-20 16:26:38 +00:00
|
|
|
import dev.inmo.tgbotapi.extensions.api.send.reply
|
|
|
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.BehaviourContextWithFSM
|
2022-09-14 20:15:35 +00:00
|
|
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitMessageDataCallbackQuery
|
2022-08-20 16:26:38 +00:00
|
|
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand
|
2022-09-14 20:15:35 +00:00
|
|
|
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onMessageDataCallbackQuery
|
|
|
|
import dev.inmo.tgbotapi.extensions.utils.*
|
|
|
|
import dev.inmo.tgbotapi.extensions.utils.extensions.sameMessage
|
|
|
|
import dev.inmo.tgbotapi.extensions.utils.types.buttons.dataButton
|
|
|
|
import dev.inmo.tgbotapi.extensions.utils.types.buttons.flatInlineKeyboard
|
2022-08-20 16:26:38 +00:00
|
|
|
import dev.inmo.tgbotapi.types.ChatId
|
|
|
|
import dev.inmo.tgbotapi.types.MessageIdentifier
|
2022-09-14 20:15:35 +00:00
|
|
|
import dev.inmo.tgbotapi.types.buttons.InlineKeyboardButtons.CallbackDataInlineKeyboardButton
|
2022-09-04 09:48:45 +00:00
|
|
|
import dev.inmo.tgbotapi.types.message.textsources.regular
|
2022-09-14 20:15:35 +00:00
|
|
|
import kotlinx.coroutines.flow.first
|
2022-08-20 16:26:38 +00:00
|
|
|
import kotlinx.serialization.Serializable
|
|
|
|
import kotlinx.serialization.json.*
|
|
|
|
import org.jetbrains.exposed.sql.Database
|
|
|
|
import org.koin.core.Koin
|
|
|
|
import org.koin.core.module.Module
|
|
|
|
|
|
|
|
object Plugin : Plugin {
|
|
|
|
@Serializable
|
|
|
|
private data class PublishState(
|
|
|
|
override val context: ChatId,
|
|
|
|
val sourceMessageId: MessageIdentifier,
|
|
|
|
val messageInReply: MessageIdentifier
|
|
|
|
) : State
|
2022-09-14 20:15:35 +00:00
|
|
|
@Serializable
|
|
|
|
internal data class Config(
|
|
|
|
val panelButtonText: String? = "Publish"
|
|
|
|
)
|
2022-08-20 16:26:38 +00:00
|
|
|
override fun Module.setupDI(database: Database, params: JsonObject) {
|
2022-09-14 20:15:35 +00:00
|
|
|
params["publish_command"] ?.let { configJson ->
|
|
|
|
single { get<Json>().decodeFromJsonElement(Config.serializer(), configJson) }
|
|
|
|
}
|
2022-08-20 16:26:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
override suspend fun BehaviourContextWithFSM<State>.setupBotPlugin(koin: Koin) {
|
|
|
|
val postsRepo = koin.get<PostsRepo>()
|
|
|
|
val publisher = koin.get<PostPublisher>()
|
2022-09-06 18:23:14 +00:00
|
|
|
val selector = koin.getOrNull<Selector>()
|
2022-09-14 20:15:35 +00:00
|
|
|
val config = koin.getOrNull<Config>()
|
|
|
|
val panelApi = koin.getOrNull<PanelButtonsAPI>()
|
2022-08-20 16:26:38 +00:00
|
|
|
|
|
|
|
onCommand("publish_post") {
|
2022-09-09 14:38:06 +00:00
|
|
|
val messageInReply = it.replyTo ?.contentMessageOrNull() ?: run {
|
|
|
|
if (selector == null) {
|
|
|
|
reply(it, "You should reply some message of post to trigger it for posting")
|
2022-08-20 16:26:38 +00:00
|
|
|
|
2022-09-09 14:38:06 +00:00
|
|
|
return@onCommand
|
|
|
|
} else {
|
|
|
|
null
|
|
|
|
}
|
2022-08-20 16:26:38 +00:00
|
|
|
}
|
2022-09-09 14:38:06 +00:00
|
|
|
val postId = messageInReply ?.let {
|
2022-11-18 09:24:21 +00:00
|
|
|
postsRepo.getIdByChatAndMessage(messageInReply.chat.id, messageInReply.messageId) ?: let { _ ->
|
|
|
|
reply(
|
|
|
|
it,
|
|
|
|
"Unable to find any post related to the message in reply"
|
|
|
|
)
|
|
|
|
|
|
|
|
return@onCommand
|
|
|
|
}
|
2023-11-06 13:18:19 +00:00
|
|
|
} ?: selector ?.takeOneOrNull()
|
2022-08-20 16:26:38 +00:00
|
|
|
if (postId == null) {
|
|
|
|
reply(
|
|
|
|
it,
|
|
|
|
"Unable to find any post related to the message in reply"
|
|
|
|
)
|
|
|
|
|
|
|
|
return@onCommand
|
|
|
|
}
|
|
|
|
|
|
|
|
publisher.publish(postId)
|
2022-09-04 09:48:45 +00:00
|
|
|
|
|
|
|
edit(
|
2022-08-20 16:26:38 +00:00
|
|
|
it,
|
2022-09-04 09:48:45 +00:00
|
|
|
it.content.textSources + regular(SuccessfulSymbol)
|
2022-08-20 16:26:38 +00:00
|
|
|
)
|
|
|
|
}
|
2022-09-09 13:46:32 +00:00
|
|
|
|
|
|
|
koin.getOrNull<InlineTemplatesRepo>() ?.apply {
|
|
|
|
addTemplate(
|
|
|
|
OfferTemplate(
|
|
|
|
"Publish post",
|
2022-09-09 14:38:06 +00:00
|
|
|
listOf(Format("/publish_post")),
|
2022-09-09 13:46:32 +00:00
|
|
|
if (selector == null) {
|
|
|
|
"Require reply on post message"
|
|
|
|
} else {
|
|
|
|
"Publish post according to selector in system or post with message from reply"
|
|
|
|
}
|
|
|
|
)
|
|
|
|
)
|
|
|
|
}
|
2022-09-14 20:15:35 +00:00
|
|
|
|
|
|
|
panelApi ?.apply {
|
|
|
|
config ?.panelButtonText ?.let { text ->
|
|
|
|
add(
|
|
|
|
PanelButtonBuilder {
|
|
|
|
CallbackDataInlineKeyboardButton(
|
|
|
|
text,
|
|
|
|
"publish ${it.id.string}"
|
|
|
|
)
|
|
|
|
}
|
|
|
|
)
|
|
|
|
onMessageDataCallbackQuery(
|
|
|
|
initialFilter = {
|
|
|
|
it.data.startsWith("publish ")
|
|
|
|
}
|
|
|
|
) {
|
|
|
|
val postId = it.data.removePrefix("publish ").let(::PostId)
|
|
|
|
val post = postsRepo.getById(postId) ?: return@onMessageDataCallbackQuery
|
|
|
|
|
|
|
|
val publishData = uuid4().toString()
|
|
|
|
|
|
|
|
val edited = edit(
|
|
|
|
it.message,
|
|
|
|
replyMarkup = flatInlineKeyboard {
|
|
|
|
dataButton(SuccessfulSymbol, publishData)
|
|
|
|
RootPanelButtonBuilder.buildButton(post) ?.let(::add)
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
val pushedButton = waitMessageDataCallbackQuery().first {
|
|
|
|
it.message.sameMessage(edited)
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pushedButton.data == publishData) {
|
|
|
|
publisher.publish(postId)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-08-20 16:26:38 +00:00
|
|
|
}
|
|
|
|
}
|