Skip to content

Commit

Permalink
Add figurittas's options localization (because I forgor), allow viewi…
Browse files Browse the repository at this point in the history
…ng other user's albums
  • Loading branch information
MrPowerGamerBR committed May 2, 2024
1 parent bbd6544 commit 162841b
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import net.perfectdreams.loritta.morenitta.interactions.modals.ModalContext
import net.perfectdreams.loritta.morenitta.utils.LorittaUser
import net.perfectdreams.loritta.morenitta.utils.extensions.await
import java.util.*
import java.util.concurrent.CompletableFuture

/**
* Context of the executed command
Expand Down Expand Up @@ -49,6 +50,22 @@ class ComponentContext(
return hook.editOriginal(messageEditData).await()
}

/**
* Edits the message in an async manner
*
* The edit is "async" because the job is submitted instead of awaited, useful if you want to edit the message while doing other work in parallel
*/
inline fun editMessageAsync(action: InlineMessage<*>.() -> (Unit)) = editMessageAsync(MessageEditBuilder { apply(action) }.build())

/**
* Edits the message in an async manner
*
* The edit is "async" because the job is submitted instead of awaited, useful if you want to edit the message while doing other work in parallel
*/
fun editMessageAsync(messageEditData: MessageEditData): CompletableFuture<InteractionHook> {
return event.editMessage(messageEditData).submit()
}

/**
* Invalidates the component callback
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import dev.minn.jda.ktx.messages.MessageEdit
import kotlinx.serialization.json.Json
import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle
import net.perfectdreams.loritta.cinnamon.discord.interactions.commands.styled
import net.perfectdreams.loritta.cinnamon.discord.utils.LoadingEmojis
import net.perfectdreams.loritta.cinnamon.discord.utils.SonhosUtils
import net.perfectdreams.loritta.cinnamon.discord.utils.SonhosUtils.appendUserHaventGotDailyTodayOrUpsellSonhosBundles
import net.perfectdreams.loritta.cinnamon.emotes.Emotes
Expand All @@ -21,6 +22,7 @@ import net.perfectdreams.loritta.morenitta.interactions.UnleashedContext
import net.perfectdreams.loritta.morenitta.interactions.commands.LorittaSlashCommandExecutor
import net.perfectdreams.loritta.morenitta.interactions.commands.SlashCommandArguments
import net.perfectdreams.loritta.morenitta.loricoolcards.StickerAlbumTemplate
import net.perfectdreams.loritta.morenitta.utils.extensions.toJDA
import net.perfectdreams.loritta.serializable.StoredLoriCoolCardsBoughtBoosterPackSonhosTransaction
import net.perfectdreams.loritta.serializable.UserId
import org.jetbrains.exposed.sql.*
Expand Down Expand Up @@ -63,6 +65,12 @@ class LoriCoolCardsBuyStickersExecutor(val loritta: LorittaBot, private val lori
}
}
is BuyStickersPreResult.Success -> {
val buyBoosterPackButton = UnleashedButton.of(
ButtonStyle.PRIMARY,
context.i18nContext.get(I18N_PREFIX.BuyAndOpenBoosterPack(result.template.sonhosPrice)),
Emotes.Scissors
)

context.reply(false) {
embed {
title = "${Emotes.LoriCoolSticker} Pacote de Figurinhas"
Expand All @@ -74,13 +82,15 @@ class LoriCoolCardsBuyStickersExecutor(val loritta: LorittaBot, private val lori
actionRow(
loritta.interactivityManager.buttonForUser(
context.user,
ButtonStyle.PRIMARY,
context.i18nContext.get(I18N_PREFIX.BuyAndOpenBoosterPack(result.template.sonhosPrice)),
{
this.loriEmoji = Emotes.Scissors
}
buyBoosterPackButton
) {
val hook = it.deferEdit()
val future = it.editMessageAsync {
actionRow(
buyBoosterPackButton
.withEmoji(LoadingEmojis.random().toJDA())
.asDisabled()
)
}

val result = loritta.transaction {
// First we will get the active cards event
Expand Down Expand Up @@ -205,6 +215,8 @@ class LoriCoolCardsBuyStickersExecutor(val loritta: LorittaBot, private val lori
BuyStickersResult.Success(cards.size, unmodifiableCountBeforeAddingCards, selectedCardsWithMetadata, alreadyStickedCardsCount)
}

val hook = future.await()

when (result) {
BuyStickersResult.EventUnavailable -> {
context.reply(true) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ class LoriCoolCardsCommand(private val loritta: LorittaBot) : SlashCommandDeclar

inner class LoriCoolCardsViewExecutor : LorittaSlashCommandExecutor() {
inner class Options : ApplicationCommandOptions() {
val cardId = string("card_id", TodoFixThisData) {
val cardId = string("sticker_id", I18N_PREFIX.View.Options.Sticker.Text) {
autocomplete {
val now = Instant.now()
val focusedOptionValue = it.event.focusedOption.value
Expand Down Expand Up @@ -296,8 +296,8 @@ class LoriCoolCardsCommand(private val loritta: LorittaBot) : SlashCommandDeclar

inner class LoriCoolCardsGiveStickersExecutor : LorittaSlashCommandExecutor() {
inner class Options : ApplicationCommandOptions() {
val user = user("user", TodoFixThisData)
val cardId = string("card_id", TodoFixThisData) {
val user = user("user", I18N_PREFIX.Give.Options.User.Text)
val cardId = string("sticker_id", I18N_PREFIX.Give.Options.Sticker.Text) {
autocomplete {
val now = Instant.now()
val focusedOptionValue = it.event.focusedOption.value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import net.perfectdreams.loritta.cinnamon.pudding.tables.loricoolcards.LoriCoolC
import net.perfectdreams.loritta.cinnamon.pudding.tables.loricoolcards.LoriCoolCardsEvents
import net.perfectdreams.loritta.cinnamon.pudding.tables.loricoolcards.LoriCoolCardsUserOwnedCards
import net.perfectdreams.loritta.common.utils.LorittaColors
import net.perfectdreams.loritta.common.utils.TodoFixThisData
import net.perfectdreams.loritta.i18n.I18nKeysData
import net.perfectdreams.loritta.morenitta.LorittaBot
import net.perfectdreams.loritta.morenitta.interactions.UnleashedContext
import net.perfectdreams.loritta.morenitta.interactions.commands.LorittaSlashCommandExecutor
Expand All @@ -19,8 +19,12 @@ import org.jetbrains.exposed.sql.select
import java.time.Instant

class LoriCoolCardsCompareStickersExecutor(val loritta: LorittaBot, private val loriCoolCardsCommand: LoriCoolCardsCommand) : LorittaSlashCommandExecutor() {
companion object {
private val I18N_PREFIX = I18nKeysData.Commands.Command.Loricoolcards.Compare
}

inner class Options : ApplicationCommandOptions() {
val user = user("user", TodoFixThisData)
val user = user("user", I18N_PREFIX.Options.User.Text)
}

override val options = Options()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,17 @@ import dev.minn.jda.ktx.coroutines.await
import dev.minn.jda.ktx.messages.InlineMessage
import dev.minn.jda.ktx.messages.MessageEdit
import kotlinx.serialization.json.Json
import net.dv8tion.jda.api.entities.User
import net.dv8tion.jda.api.interactions.components.buttons.ButtonStyle
import net.dv8tion.jda.api.utils.FileUpload
import net.dv8tion.jda.api.utils.MarkdownUtil
import net.perfectdreams.loritta.cinnamon.discord.interactions.commands.styled
import net.perfectdreams.loritta.cinnamon.discord.utils.LoadingEmojis
import net.perfectdreams.loritta.cinnamon.emotes.Emotes
import net.perfectdreams.loritta.cinnamon.pudding.tables.loricoolcards.LoriCoolCardsEventCards
import net.perfectdreams.loritta.cinnamon.pudding.tables.loricoolcards.LoriCoolCardsEvents
import net.perfectdreams.loritta.cinnamon.pudding.tables.loricoolcards.LoriCoolCardsUserOwnedCards
import net.perfectdreams.loritta.common.utils.TodoFixThisData
import net.perfectdreams.loritta.i18n.I18nKeysData
import net.perfectdreams.loritta.morenitta.LorittaBot
import net.perfectdreams.loritta.morenitta.interactions.UnleashedButton
import net.perfectdreams.loritta.morenitta.interactions.UnleashedContext
Expand All @@ -27,8 +29,13 @@ import org.jetbrains.exposed.sql.select
import java.time.Instant

class LoriCoolCardsViewAlbumExecutor(val loritta: LorittaBot, private val loriCoolCardsCommand: LoriCoolCardsCommand) : LorittaSlashCommandExecutor() {
companion object {
private val I18N_PREFIX = I18nKeysData.Commands.Command.Loricoolcards.Album
}

inner class Options : ApplicationCommandOptions() {
val page = optionalLong("page", TodoFixThisData)
val page = optionalLong("page", I18N_PREFIX.Options.Page.Text)
val user = optionalUser("user", I18N_PREFIX.Options.User.Text)
}

override val options = Options()
Expand All @@ -37,10 +44,12 @@ class LoriCoolCardsViewAlbumExecutor(val loritta: LorittaBot, private val loriCo
context.deferChannelMessage(false)

val pageLookup = args[options.page]?.toInt() ?: 1
val user = args[options.user]?.user ?: context.user

viewAlbum(
context,
pageLookup,
user
) {
context.reply(false) {
it.invoke(this)
Expand All @@ -51,6 +60,7 @@ class LoriCoolCardsViewAlbumExecutor(val loritta: LorittaBot, private val loriCo
suspend fun viewAlbum(
context: UnleashedContext,
pageLookup: Int,
userToBeViewed: User,
targetAlbumEdit: suspend (InlineMessage<*>.() -> (Unit)) -> (Unit)
) {
val now = Instant.now()
Expand All @@ -60,14 +70,20 @@ class LoriCoolCardsViewAlbumExecutor(val loritta: LorittaBot, private val loriCo
LoriCoolCardsEvents.endsAt greaterEq now and (LoriCoolCardsEvents.startsAt lessEq now)
}.firstOrNull() ?: return@transaction ViewAlbumResult.EventUnavailable

// First we need to check all cards that we have already sticked
// We will inner join because we need that info when generating the album
val totalStickers = LoriCoolCardsEventCards.select {
(LoriCoolCardsEventCards.event eq event[LoriCoolCardsEvents.id])
}.count()

// First we need to check all cards that we have already sticked
// We will inner join because we need that info when generating the album
val alreadyStickedCards = LoriCoolCardsUserOwnedCards.innerJoin(LoriCoolCardsEventCards).select {
LoriCoolCardsUserOwnedCards.sticked eq true and (LoriCoolCardsUserOwnedCards.event eq event[LoriCoolCardsEvents.id]) and (LoriCoolCardsUserOwnedCards.user eq context.user.idLong)
LoriCoolCardsUserOwnedCards.sticked eq true and (LoriCoolCardsUserOwnedCards.event eq event[LoriCoolCardsEvents.id]) and (LoriCoolCardsUserOwnedCards.user eq userToBeViewed.idLong)
}.toList()

// The stickers will be sticked when the user clicks to stick the sticker
return@transaction ViewAlbumResult.Success(Json.decodeFromString(event[LoriCoolCardsEvents.template]), alreadyStickedCards)
return@transaction ViewAlbumResult.Success(Json.decodeFromString(event[LoriCoolCardsEvents.template]), alreadyStickedCards, totalStickers)
}

when (result) {
Expand Down Expand Up @@ -113,8 +129,30 @@ class LoriCoolCardsViewAlbumExecutor(val loritta: LorittaBot, private val loriCo
// Get the page that we want to render
val album = loritta.loriCoolCardsManager.generateAlbumPreview(template, result.alreadyStickedCards, pageCombo)
targetAlbumEdit.invoke {
content = "Páginas ${pageCombo.pageLeft} e ${pageCombo.pageRight}"
files += FileUpload.fromData(album, "album.png").setDescription("Página ${pageCombo.pageLeft} e ${pageCombo.pageRight} do Álbum de Figurinhas de ${context.user.name}")
styled(
MarkdownUtil.bold(
context.i18nContext.get(
if (context.user == userToBeViewed)
I18N_PREFIX.YourAlbum
else
I18N_PREFIX.UserAlbum(userToBeViewed.asMention)
)
),
Emotes.LoriLurk
)

styled(
context.i18nContext.get(I18N_PREFIX.AlbumPages(pageCombo.pageLeft, pageCombo.pageRight)),
Emotes.LoriCoolSticker
)

styled(
context.i18nContext.get(I18N_PREFIX.StickedStickers(result.alreadyStickedCards.size, result.totalStickers)),
Emotes.LoriHanglooseRight
)

files += FileUpload.fromData(album, "album.png")
.setDescription("Página ${pageCombo.pageLeft} e ${pageCombo.pageRight} do Álbum de Figurinhas de ${context.user.name}")

actionRow(
if (pageCombo.pageLeft != 1) {
Expand All @@ -139,7 +177,7 @@ class LoriCoolCardsViewAlbumExecutor(val loritta: LorittaBot, private val loriCo

val hook = it.event.hook

viewAlbum(it, 1) {
viewAlbum(it, 1, userToBeViewed) {
editJob.await()

hook.editOriginal(
Expand Down Expand Up @@ -172,7 +210,7 @@ class LoriCoolCardsViewAlbumExecutor(val loritta: LorittaBot, private val loriCo

val hook = it.event.hook

viewAlbum(it, pageLookup - 2) {
viewAlbum(it, pageLookup - 2, userToBeViewed) {
editJob.await()

hook.editOriginal(
Expand Down Expand Up @@ -205,7 +243,7 @@ class LoriCoolCardsViewAlbumExecutor(val loritta: LorittaBot, private val loriCo

val hook = it.event.hook

viewAlbum(it, pageLookup + 2) {
viewAlbum(it, pageLookup + 2, userToBeViewed) {
editJob.await()

hook.editOriginal(
Expand Down Expand Up @@ -236,7 +274,7 @@ class LoriCoolCardsViewAlbumExecutor(val loritta: LorittaBot, private val loriCo

val hook = it.event.hook

viewAlbum(it, template.pages.last().pageRight) {
viewAlbum(it, template.pages.last().pageRight, userToBeViewed) {
editJob.await()

hook.editOriginal(
Expand All @@ -255,6 +293,6 @@ class LoriCoolCardsViewAlbumExecutor(val loritta: LorittaBot, private val loriCo

sealed class ViewAlbumResult {
data object EventUnavailable : ViewAlbumResult()
class Success(val template: StickerAlbumTemplate, val alreadyStickedCards: List<ResultRow>) : ViewAlbumResult()
class Success(val template: StickerAlbumTemplate, val alreadyStickedCards: List<ResultRow>, val totalStickers: Long) : ViewAlbumResult()
}
}
24 changes: 23 additions & 1 deletion resources/languages/pt/commands/loricoolcards.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ view:
stickerPage: "**Página:** Página {page,number}"
stickerFront: "Figurinha (Frente)"
stickerAnimated: "Figurinha (Animada)"
options:
sticker:
text: "A figurinha que você quer ver as informações sobre ela"

stick:
label: "colar"
Expand All @@ -34,14 +37,33 @@ album:
label: "album"
description: "Ver as páginas do seu álbum de figurinhas"

yourAlbum: "Seu Álbum de Figurinhas"
userAlbum: "Álbum de Figurinhas de {user}"
albumPages: "Páginas {pageLeft,number} e {pageRight,number}"
stickedStickers: "**Figurinhas Coladas:** {totalAlbumCompletionCount,number}/{albumCardsCount,number} figurinhas"

options:
page:
text: "A página do álbum de figurinhas que você quer ver"
user:
text: "O usuário que você quer ver o progresso do álbum de figurinhas dele"

give:
label: "dar"
description: "Dá uma figurinha que você tem no seu inventário para outra pessoa"
options:
user:
text: "A pessoa que irá receber a figurinha que você quer dar"
sticker:
text: "A figurinha que será dada para a outra pessoa"

stats:
label: "stats"
description: "Estatísticas sobre o Evento de Figurinhas"

compare:
label: "comparar"
description: "Compara quais figurinhas você tem e que a outra pessoa precisa, e vice-versa"
description: "Compara quais figurinhas você tem e que a outra pessoa precisa, e vice-versa"
options:
user:
text: "O usuário que você deseja comparar as suas figurinhas com as dele"

0 comments on commit 162841b

Please sign in to comment.