Skip to content

Commit

Permalink
context refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
AngryJKirk committed Dec 26, 2024
1 parent 661a7d2 commit 2f4b8bf
Show file tree
Hide file tree
Showing 80 changed files with 420 additions and 480 deletions.
Original file line number Diff line number Diff line change
@@ -1,22 +1,10 @@
package dev.storozhenko.familybot.common.extensions

import dev.storozhenko.familybot.BotConfig
import dev.storozhenko.familybot.core.models.telegram.stickers.Sticker
import dev.storozhenko.familybot.core.models.telegram.stickers.StickerPack
import dev.storozhenko.familybot.core.routers.models.ExecutorContext
import dev.storozhenko.familybot.core.telegram.FamilyBot
import io.github.oshai.kotlinlogging.KotlinLogging
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.delay
import org.telegram.telegrambots.meta.api.methods.groupadministration.GetChatAdministrators
import org.telegram.telegrambots.meta.api.methods.send.SendChatAction
import org.telegram.telegrambots.meta.api.methods.send.SendMessage
import org.telegram.telegrambots.meta.api.methods.send.SendSticker
import org.telegram.telegrambots.meta.api.methods.stickers.GetStickerSet
import org.telegram.telegrambots.meta.api.objects.InputFile
import org.telegram.telegrambots.meta.api.objects.Update
import org.telegram.telegrambots.meta.api.objects.User
import org.telegram.telegrambots.meta.api.objects.chatmember.ChatMember
import org.telegram.telegrambots.meta.api.objects.chatmember.ChatMemberAdministrator
Expand All @@ -25,64 +13,12 @@ import org.telegram.telegrambots.meta.api.objects.chatmember.ChatMemberLeft
import org.telegram.telegrambots.meta.api.objects.chatmember.ChatMemberMember
import org.telegram.telegrambots.meta.api.objects.chatmember.ChatMemberOwner
import org.telegram.telegrambots.meta.api.objects.chatmember.ChatMemberRestricted
import org.telegram.telegrambots.meta.api.objects.message.Message
import org.telegram.telegrambots.meta.generics.TelegramClient
import org.telegram.telegrambots.meta.api.objects.stickers.Sticker as TelegramSticker

object SenderLogger {
val log = KotlinLogging.logger { }
}

suspend fun TelegramClient.sendDeferred(
context: ExecutorContext,
text: Deferred<String>,
replyMessageId: Int? = null,
enableHtml: Boolean = false,
replyToUpdate: Boolean = false,
customization: SendMessage.() -> Unit = { },
shouldTypeBeforeSend: Boolean = false,
typeDelay: Pair<Int, Int> = 1000 to 2000,
): Message {
return sendInternal(
context.chat.idString,
context.testEnvironment,
context.update.message?.messageId,
context.update,
{ text.await() },
replyMessageId,
enableHtml,
replyToUpdate,
customization,
shouldTypeBeforeSend,
typeDelay,
)
}

suspend fun TelegramClient.send(
context: ExecutorContext,
text: String,
replyMessageId: Int? = null,
enableHtml: Boolean = false,
replyToUpdate: Boolean = false,
customization: SendMessage.() -> Unit = { },
shouldTypeBeforeSend: Boolean = false,
typeDelay: Pair<Int, Int> = 1000 to 2000,
): Message {
return sendInternal(
context.chat.idString,
context.testEnvironment,
context.update.message?.messageId,
context.update,
{ text },
replyMessageId,
enableHtml,
replyToUpdate,
customization,
shouldTypeBeforeSend,
typeDelay,
)
}

suspend fun TelegramClient.sendContextFree(
chatId: String,
text: String,
Expand All @@ -94,7 +30,8 @@ suspend fun TelegramClient.sendContextFree(
shouldTypeBeforeSend: Boolean = false,
typeDelay: Pair<Int, Int> = 1000 to 2000,
) {
sendInternal(
ExecutorContext.sendInternal(
this,
chatId,
botConfig.testEnvironment,
null,
Expand All @@ -109,107 +46,6 @@ suspend fun TelegramClient.sendContextFree(
)
}

private suspend fun TelegramClient.sendInternal(
chatId: String,
testEnvironment: Boolean,
messageId: Int? = null,
update: Update? = null,
text: suspend () -> String,
replyMessageId: Int? = null,
enableHtml: Boolean = false,
replyToUpdate: Boolean = false,
customization: SendMessage.() -> Unit = { },
shouldTypeBeforeSend: Boolean = false,
typeDelay: Pair<Int, Int> = 1000 to 2000,
): Message {
SenderLogger.log.info {
"Sending message, update=${update?.toJson() ?: "[N/A]"}, " +
"replyMessageId=$replyMessageId," +
"enableHtml=$enableHtml," +
"replyToUpdate=$replyToUpdate," +
"shouldTypeBeforeSend=$shouldTypeBeforeSend," +
"typeDelay=$typeDelay"
}
if (shouldTypeBeforeSend) {
execute(SendChatAction(chatId, "typing"))
if (testEnvironment.not()) {
delay(randomInt(typeDelay.first, typeDelay.second).toLong())
}
}
val textToSend = text()
SenderLogger.log.info { "Sending message, text=$textToSend" }
return textToSend
.chunked(3900)
.map {
SendMessage(chatId, textToSend)
.apply {
enableHtml(enableHtml)
if (replyMessageId != null) {
replyToMessageId = replyMessageId
}
if (replyToUpdate) {
replyToMessageId = messageId
}
customization()
}
}.map { message ->
SenderLogger.log.info { "Sending message: ${message.toJson()}" }
execute(message)
}.first()
}

suspend fun TelegramClient.sendSticker(
context: ExecutorContext,
sticker: Sticker,
replyToUpdate: Boolean = false,
): Message {
return sendStickerInternal(this, context, replyToUpdate, sticker.pack) {
find { it.emoji == sticker.stickerEmoji }
}
}

suspend fun TelegramClient.sendRandomSticker(
context: ExecutorContext,
stickerPack: StickerPack,
replyToUpdate: Boolean = false,
): Message {
return sendStickerInternal(this, context, replyToUpdate, stickerPack) {
random()
}
}

private val adminStatuses = setOf(ChatMemberAdministrator.STATUS, ChatMemberOwner.STATUS)

fun TelegramClient.isFromAdmin(context: ExecutorContext): Boolean {
if (context.isFromDeveloper) {
return true
}
val user = context.update.from()
return this
.execute(GetChatAdministrators(context.chat.idString))
.filter { chatMember -> chatMember.status in adminStatuses }
.any { admin -> admin.user().id == user.id }
}

private suspend fun sendStickerInternal(
client: TelegramClient,
context: ExecutorContext,
replyToUpdate: Boolean = false,
stickerPack: StickerPack,
stickerSelector: List<TelegramSticker>.() -> TelegramSticker?,
): Message {
val stickerId = coroutineScope {
async {
stickerSelector(client.execute(GetStickerSet(stickerPack.packName)).stickers)
}
}
val sendSticker = SendSticker(context.update.chatIdString(), InputFile(stickerId.await()?.fileId))
if (replyToUpdate) {
sendSticker.replyToMessageId = context.update.message.messageId
}
return client.execute(sendSticker)
}

fun ChatMember.user(): User {
return when (status) {
ChatMemberAdministrator.STATUS -> (this as ChatMemberAdministrator).user
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package dev.storozhenko.familybot.core.executors

import dev.storozhenko.familybot.common.extensions.send
import dev.storozhenko.familybot.common.extensions.sendRandomSticker
import dev.storozhenko.familybot.common.extensions.startOfDay
import dev.storozhenko.familybot.common.extensions.toUser
import dev.storozhenko.familybot.core.models.telegram.CommandByUser
Expand All @@ -20,9 +18,9 @@ abstract class SendRandomStickerExecutor(
return
}

context.client.send(context, getMessage())
context.send(getMessage())
delay(1000)
context.client.sendRandomSticker(context, getStickerPack())
context.sendRandomSticker(getStickerPack())
}

private fun isInvokedToday(user: User): Boolean {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package dev.storozhenko.familybot.core.models.telegram.stickers

enum class Sticker(val pack: StickerPack, val stickerEmoji: String) {
LEFT_ZIGA(StickerPack.FAMILY_PACK, "\uD83D\uDD90"),
RIGHT_ZIGA(StickerPack.FAMILY_PACK, "\uD83E\uDD1A"),
LEFT_HELLO(StickerPack.FAMILY_PACK, "\uD83D\uDD90"),
RIGHT_HELLO(StickerPack.FAMILY_PACK, "\uD83E\uDD1A"),
SWEET_DREAMS(StickerPack.FAMILY_PACK, "\uD83C\uDF19"),
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import dev.storozhenko.familybot.common.extensions.context
import dev.storozhenko.familybot.common.extensions.key
import dev.storozhenko.familybot.common.extensions.message
import dev.storozhenko.familybot.common.extensions.prettyFormat
import dev.storozhenko.familybot.common.extensions.send
import dev.storozhenko.familybot.common.extensions.toChat
import dev.storozhenko.familybot.common.extensions.toUser
import dev.storozhenko.familybot.core.executors.CommandExecutor
Expand Down Expand Up @@ -138,7 +137,7 @@ class Router(

private suspend fun disabledCommand(context: ExecutorContext) {
val phrase = context.phrase(Phrase.COMMAND_IS_OFF)
context.client.send(context, phrase)
context.send(phrase)
}

private fun isExecutorDisabled(executor: Executor, context: ExecutorContext): Boolean {
Expand Down
Loading

0 comments on commit 2f4b8bf

Please sign in to comment.