Skip to content

Commit

Permalink
Merge pull request #19 from Astra-Interactive/better-menu
Browse files Browse the repository at this point in the history
- improve code quality
- fix modules
- fix gui mess
- split buttons into components
- fix timer
- add ability to open exact player auction
- better expired filter
  • Loading branch information
makeevrserg authored Jun 7, 2024
2 parents 641170a + 2ffaf11 commit c18db9f
Show file tree
Hide file tree
Showing 83 changed files with 1,759 additions and 834 deletions.
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@ Advantages:
| Command | Description | Permission |
|:----------------------------------|:------------------------------------------------|:------------------------|
|`/amarket` | Open market | astra_market.command |
|`/amarket open` | Open market | astra_market.command |
|`/amarket expired` | Open expired menu | astra_market.command |
|`/amarket open [PLAYER]` | Open market [of player] | astra_market.command |
|`/amarket expired [PLAYER]` | Open expired menu [of player] | astra_market.command |
|`/amarket players` | Open player list who have active slots | astra_market.command |
|`/amarket sell <price> <amount>` | Sell items on market | astra_market.sell |
| ️- | Allows player to sell up to N items at one time | astra_market.sell_max.N |
|`/amarketreload` | reload plugin | astra_market.reload |
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ makeevrserg.java.ktarget=21
# Project
makeevrserg.project.name=AstraMarket
makeevrserg.project.group=ru.astrainteractive.astramarket
makeevrserg.project.version.string=1.13.0-unstable
makeevrserg.project.version.string=1.14.0-unstable
makeevrserg.project.description=Market plugin for EmpireSMP
makeevrserg.project.developers=makeevrserg|Makeev Roman|[email protected]
makeevrserg.project.url=https://empireprojekt.ru
2 changes: 1 addition & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ minecraft-spigot = "1.20.5-R0.1-SNAPSHOT" # https://github.com/PaperMC/Paper
minecraft-papi = "2.11.6" # https://github.com/PlaceholderAPI/PlaceholderAPI
minecraft-protocollib = "5.1.0" # https://github.com/dmulloy2/ProtocolLib
minecraft-vault = "1.7.1" # https://github.com/MilkBowl/VaultAPI
minecraft-astralibs = "3.6.0" # https://github.com/Astra-Interactive/AstraLibs
minecraft-astralibs = "3.6.1" # https://github.com/Astra-Interactive/AstraLibs
minecraft-bstats = "3.0.2" # https://github.com/Bastian/bStats
minecraft-mockbukkit = "3.88.1" #https://github.com/MockBukkit/MockBukkit

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package ru.astrainteractive.astramarket.api.market

import ru.astrainteractive.astramarket.api.market.model.MarketSlot
import ru.astrainteractive.astramarket.api.market.model.PlayerAndSlots

interface MarketApi {
/**
Expand All @@ -20,13 +21,13 @@ interface MarketApi {
* @return slots with specified [MarketSlot.minecraftUuid]
* @throws Exception
*/
suspend fun getUserSlots(uuid: String, expired: Boolean): List<MarketSlot>?
suspend fun getUserSlots(uuid: String, isExpired: Boolean): List<MarketSlot>?

/**
* @return list of all slots
* @throws Exception
*/
suspend fun getSlots(expired: Boolean): List<MarketSlot>?
suspend fun getSlots(isExpired: Boolean): List<MarketSlot>?

/**
* @return slots where [MarketSlot.time] more than [millis]
Expand All @@ -51,4 +52,10 @@ interface MarketApi {
* @throws Exception
*/
suspend fun countPlayerSlots(uuid: String): Int?

/**
* @return uuid of player who currently have active/expired slots
* @throws Exception
*/
suspend fun findPlayersWithSlots(isExpired: Boolean): List<PlayerAndSlots>
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@ import ru.astrainteractive.astralibs.orm.Database
import ru.astrainteractive.astramarket.api.market.MarketApi
import ru.astrainteractive.astramarket.api.market.mapping.AuctionMapper
import ru.astrainteractive.astramarket.api.market.model.MarketSlot
import ru.astrainteractive.astramarket.api.market.model.PlayerAndSlots
import ru.astrainteractive.astramarket.db.market.entity.Auction
import ru.astrainteractive.astramarket.db.market.entity.AuctionTable
import ru.astrainteractive.klibs.mikro.core.dispatchers.KotlinDispatchers
import java.util.UUID
import kotlin.coroutines.CoroutineContext

internal class SqlMarketApi(
Expand Down Expand Up @@ -53,20 +55,20 @@ internal class SqlMarketApi(

override suspend fun getUserSlots(
uuid: String,
expired: Boolean
isExpired: Boolean
): List<MarketSlot>? = runCatchingWithContext(limitedIoDispatcher) {
AuctionTable.find(database, constructor = Auction) {
AuctionTable.minecraftUuid.eq(uuid).and(
AuctionTable.expired.eq(if (expired) 1 else 0)
AuctionTable.expired.eq(if (isExpired) 1 else 0)
)
}.map(auctionMapper::toDTO)
}.getOrNull()

override suspend fun getSlots(
expired: Boolean
isExpired: Boolean
): List<MarketSlot>? = runCatchingWithContext(limitedIoDispatcher) {
AuctionTable.find(database, constructor = Auction) {
AuctionTable.expired.eq(if (expired) 1 else 0)
AuctionTable.expired.eq(if (isExpired) 1 else 0)
}.map(auctionMapper::toDTO)
}.getOrNull()

Expand Down Expand Up @@ -103,4 +105,16 @@ internal class SqlMarketApi(
AuctionTable.minecraftUuid.eq(uuid)
}
}.getOrNull()

override suspend fun findPlayersWithSlots(isExpired: Boolean): List<PlayerAndSlots> {
return AuctionTable.all(database, Auction)
.map(auctionMapper::toDTO)
.groupBy(MarketSlot::minecraftUuid)
.map { (uuid, slots) ->
PlayerAndSlots(
minecraftUUID = UUID.fromString(uuid),
slots = slots
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package ru.astrainteractive.astramarket.api.market.model

import java.util.UUID

data class PlayerAndSlots(
val minecraftUUID: UUID,
val slots: List<MarketSlot>
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package ru.astrainteractive.astramarket.core

import kotlinx.serialization.Serializable
import kotlin.time.Duration.Companion.days

@Serializable
data class PluginConfig(
Expand Down Expand Up @@ -33,7 +34,7 @@ data class PluginConfig(
val maxPrice: Int = 1000000,
val taxPercent: Int = 0,
val announce: Boolean = true,
val maxTime: Long = 20L // 1*24*60*60*1000
val maxTimeSeconds: Long = 7.days.inWholeMilliseconds // 1*24*60*60*1000
)

@Serializable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ data class Translation(
val aauc: StringDesc.Raw = StringDesc.Raw("&#18dbd1Аукцион"),
@SerializedName("menu.expired")
val expired: StringDesc.Raw = StringDesc.Raw("&#18dbd1Истекшие"),
@SerializedName("menu.new")
val new: StringDesc.Raw = StringDesc.Raw("&#18dbd1Новые"),
@SerializedName("menu.next")
val next: StringDesc.Raw = StringDesc.Raw("&#18dbd1Дальше"),
@SerializedName("menu.sort")
Expand Down Expand Up @@ -60,6 +62,8 @@ data class Translation(
val broadcast: StringDesc.Raw = StringDesc.Raw(
"&#18dbd1Игрок &#d6a213%player% &#18dbd1выставил на /aauc новый предмет"
),
@SerializedName("menu.player.auctions_amount")
val auctionsAmount: StringDesc.Raw = StringDesc.Raw("&7Количество: %amount%"),
@SerializedName("auction.tab_completer.price")
val tabCompleterPrice: StringDesc.Raw = StringDesc.Raw("ЦЕНА"),
@SerializedName("auction.tab_completer.amount")
Expand Down Expand Up @@ -87,6 +91,8 @@ data class Translation(
val auctionBy: StringDesc.Raw = StringDesc.Raw("&7Выставил: &#d6a213%player_owner%"),
@SerializedName("auction.auction_created_ago")
val auctionCreatedAgo: StringDesc.Raw = StringDesc.Raw("&7Время: &#d6a213%time%"),
@SerializedName("auction.auction_last")
val auctionLast: StringDesc.Raw = StringDesc.Raw("&7Последний слот: &#d6a213%time%"),
@SerializedName("auction.auction_price")
val auctionPrice: StringDesc.Raw = StringDesc.Raw("&7Стоимость: &#d6a213%price%"),
@SerializedName("auction.sort.material_desc")
Expand All @@ -99,6 +105,10 @@ data class Translation(
val sortDateAsc: StringDesc.Raw = StringDesc.Raw("&#FFFFFFпо дате &#d6a213&l↓"),
@SerializedName("auction.sort.name_desc")
val sortNameDesc: StringDesc.Raw = StringDesc.Raw("&#FFFFFFпо имени &#d6a213&l↑"),
@SerializedName("auction.sort.amount_asc")
val sortAmountAsc: StringDesc.Raw = StringDesc.Raw("&#FFFFFFпо количеству &#d6a213&l↓"),
@SerializedName("auction.sort.amount_desc")
val sortAmountDesc: StringDesc.Raw = StringDesc.Raw("&#FFFFFFпо количеству &#d6a213&l↑"),
@SerializedName("auction.sort.name_asc")
val sortNameAsc: StringDesc.Raw = StringDesc.Raw("&#FFFFFFпо имени &#d6a213&l↓"),
@SerializedName("auction.sort.price_desc")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ru.astrainteractive.astramarket.data.bridge
package ru.astrainteractive.astramarket.market.data.bridge

import org.bukkit.Bukkit
import org.bukkit.Material
Expand All @@ -10,7 +10,7 @@ import ru.astrainteractive.astramarket.core.PluginPermission
import java.util.UUID

@Suppress("TooManyFunctions")
class BukkitAuctionsBridge(
internal class BukkitAuctionsBridge(
private val encoder: ObjectEncoder,
) : AuctionsBridge {
private fun MarketSlot.itemStack(serializer: ObjectEncoder): ItemStack {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package ru.astrainteractive.astramarket.data.bridge
package ru.astrainteractive.astramarket.market.data.bridge

import org.bukkit.Bukkit
import ru.astrainteractive.astralibs.kyori.KyoriComponentSerializer
import ru.astrainteractive.astralibs.string.StringDesc
import java.util.UUID

class BukkitPlayerInteractionBridge(
internal class BukkitPlayerInteractionBridge(
private val stringSerializer: KyoriComponentSerializer
) : PlayerInteractionBridge {
override fun sendTranslationMessage(uuid: UUID, message: () -> StringDesc.Raw) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package ru.astrainteractive.astramarket.data.di
package ru.astrainteractive.astramarket.market.data.di

import ru.astrainteractive.astralibs.encoding.encoder.ObjectEncoder
import ru.astrainteractive.astralibs.kyori.KyoriComponentSerializer
import ru.astrainteractive.astramarket.data.bridge.AuctionsBridge
import ru.astrainteractive.astramarket.data.bridge.BukkitAuctionsBridge
import ru.astrainteractive.astramarket.data.bridge.BukkitPlayerInteractionBridge
import ru.astrainteractive.astramarket.data.bridge.PlayerInteractionBridge
import ru.astrainteractive.astramarket.market.data.bridge.AuctionsBridge
import ru.astrainteractive.astramarket.market.data.bridge.BukkitAuctionsBridge
import ru.astrainteractive.astramarket.market.data.bridge.BukkitPlayerInteractionBridge
import ru.astrainteractive.astramarket.market.data.bridge.PlayerInteractionBridge
import ru.astrainteractive.klibs.kdi.Provider
import ru.astrainteractive.klibs.kdi.getValue

class BukkitSharedDataModule(
class BukkitMarketDataModule(
encoder: ObjectEncoder,
stringSerializer: KyoriComponentSerializer,
) : SharedDataModule {
) : MarketDataModule {
override val auctionBridge: AuctionsBridge by Provider {
BukkitAuctionsBridge(
encoder = encoder,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package ru.astrainteractive.astramarket.domain.di
package ru.astrainteractive.astramarket.market.domain.di

import ru.astrainteractive.astralibs.encoding.encoder.ObjectEncoder
import ru.astrainteractive.astramarket.domain.usecase.BukkitSortAuctionsUseCase
import ru.astrainteractive.astramarket.domain.usecase.SortAuctionsUseCase
import ru.astrainteractive.astramarket.market.domain.usecase.BukkitSortAuctionsUseCase
import ru.astrainteractive.astramarket.market.domain.usecase.SortAuctionsUseCase
import ru.astrainteractive.klibs.kdi.Provider
import ru.astrainteractive.klibs.kdi.getValue

class BukkitSharedDomainModule(encoder: ObjectEncoder) : PlatformSharedDomainModule {
class BukkitMarketDomainModule(encoder: ObjectEncoder) : PlatformMarketDomainModule {
override val sortAuctionsUseCase: SortAuctionsUseCase by Provider {
BukkitSortAuctionsUseCase(
encoder = encoder
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package ru.astrainteractive.astramarket.domain.usecase
package ru.astrainteractive.astramarket.market.domain.usecase

import org.bukkit.Bukkit
import org.bukkit.inventory.ItemStack
import ru.astrainteractive.astralibs.encoding.encoder.ObjectEncoder
import ru.astrainteractive.astramarket.api.market.model.MarketSlot
import ru.astrainteractive.astramarket.domain.model.AuctionSort
import ru.astrainteractive.astramarket.market.domain.model.AuctionSort
import java.util.UUID

class BukkitSortAuctionsUseCase(private val encoder: ObjectEncoder) : SortAuctionsUseCase {
internal class BukkitSortAuctionsUseCase(private val encoder: ObjectEncoder) : SortAuctionsUseCase {
private fun MarketSlot.itemStack(serializer: ObjectEncoder): ItemStack {
return serializer.fromByteArray(
item
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ru.astrainteractive.astramarket.data.bridge
package ru.astrainteractive.astramarket.market.data.bridge

import ru.astrainteractive.astramarket.api.market.model.MarketSlot
import java.util.UUID
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ru.astrainteractive.astramarket.data.bridge
package ru.astrainteractive.astramarket.market.data.bridge

import ru.astrainteractive.astralibs.string.StringDesc
import java.util.UUID
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ru.astrainteractive.astramarket.market.data.di

import ru.astrainteractive.astramarket.market.data.bridge.AuctionsBridge
import ru.astrainteractive.astramarket.market.data.bridge.PlayerInteractionBridge

interface MarketDataModule {
val auctionBridge: AuctionsBridge
val playerInteractionBridge: PlayerInteractionBridge
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package ru.astrainteractive.astramarket.market.di

import ru.astrainteractive.astramarket.core.di.CoreModule
import ru.astrainteractive.astramarket.di.ApiMarketModule
import ru.astrainteractive.astramarket.market.data.di.MarketDataModule
import ru.astrainteractive.astramarket.market.domain.di.MarketDomainModule
import ru.astrainteractive.astramarket.market.domain.di.PlatformMarketDomainModule
import ru.astrainteractive.astramarket.market.presentation.AuctionComponent
import ru.astrainteractive.astramarket.market.presentation.DefaultAuctionComponent
import ru.astrainteractive.astramarket.market.presentation.di.AuctionComponentDependencies
import ru.astrainteractive.klibs.kdi.Factory
import java.util.UUID

interface MarketModule {
val marketDomainModule: MarketDomainModule
fun createAuctionComponent(
playerUUID: UUID,
isExpired: Boolean,
targetPlayerUUID: UUID?
): AuctionComponent

class Default(
private val coreModule: CoreModule,
private val apiMarketModule: ApiMarketModule,
marketDataModuleFactory: Factory<MarketDataModule>,
platformMarketDomainModuleFactory: Factory<PlatformMarketDomainModule>
) : MarketModule {
override val marketDomainModule: MarketDomainModule by lazy {
MarketDomainModule.Default(
coreModule = coreModule,
apiMarketModule = apiMarketModule,
marketDataModuleFactory = marketDataModuleFactory,
platformMarketDomainModuleFactory = platformMarketDomainModuleFactory
)
}

override fun createAuctionComponent(
playerUUID: UUID,
isExpired: Boolean,
targetPlayerUUID: UUID?
): AuctionComponent {
val dependencies = AuctionComponentDependencies.Default(
coreModule = coreModule,
apiMarketModule = apiMarketModule,
marketDomainModule = marketDomainModule,
)
return DefaultAuctionComponent(
playerUUID = playerUUID,
targetPlayerUUID = targetPlayerUUID,
isExpired = isExpired,
dependencies = dependencies
)
}
}
}
Loading

0 comments on commit c18db9f

Please sign in to comment.