diff --git a/src/main/kotlin/net/blockventuremc/core/coaster/Coaster.kt b/src/main/kotlin/net/blockventuremc/core/coaster/Coaster.kt deleted file mode 100644 index e554646..0000000 --- a/src/main/kotlin/net/blockventuremc/core/coaster/Coaster.kt +++ /dev/null @@ -1,5 +0,0 @@ -package net.blockventuremc.core.coaster - -data class Coaster( - val name: String, -) diff --git a/src/main/kotlin/net/blockventuremc/database/DatabaseManager.kt b/src/main/kotlin/net/blockventuremc/database/DatabaseManager.kt index aae21cf..5a5b105 100644 --- a/src/main/kotlin/net/blockventuremc/database/DatabaseManager.kt +++ b/src/main/kotlin/net/blockventuremc/database/DatabaseManager.kt @@ -4,6 +4,7 @@ import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariDataSource import dev.fruxz.ascend.tool.time.calendar.Calendar import net.blockventuremc.BlockVenture +import net.blockventuremc.database.functions.TableAchievements import net.blockventuremc.database.functions.TableUsers import org.jetbrains.exposed.sql.Database import org.jetbrains.exposed.sql.SchemaUtils @@ -27,7 +28,8 @@ internal object DatabaseManager { fun register() = smartTransaction { SchemaUtils.createMissingTablesAndColumns( - TableUsers + TableUsers, + TableAchievements ) } } diff --git a/src/main/kotlin/net/blockventuremc/database/functions/Achievements.kt b/src/main/kotlin/net/blockventuremc/database/functions/Achievements.kt new file mode 100644 index 0000000..47cee19 --- /dev/null +++ b/src/main/kotlin/net/blockventuremc/database/functions/Achievements.kt @@ -0,0 +1,41 @@ +package net.blockventuremc.database.functions + +import net.blockventuremc.database.model.DatabaseAchievement +import net.blockventuremc.database.smartTransaction +import net.blockventuremc.database.toCalendar +import net.blockventuremc.modules.archievements.model.Achievement +import org.jetbrains.exposed.sql.* +import org.jetbrains.exposed.sql.javatime.CurrentTimestamp +import org.jetbrains.exposed.sql.javatime.timestamp +import java.util.* + +object TableAchievements: Table("achievements") { + val userUUID = varchar("uuid", 45) + + val achievement = enumerationByName("achievement", 24, Achievement::class) + + val receivedAt = timestamp("receivedAt").defaultExpression(CurrentTimestamp()) + + override val primaryKey = PrimaryKey(userUUID, achievement) +} + +private fun mapToDatabaseAchievement(row: ResultRow): DatabaseAchievement = with(row) { + return DatabaseAchievement( + uuid = UUID.fromString(this[TableAchievements.userUUID]), + achievement = this[TableAchievements.achievement], + + receivedAt = this[TableAchievements.receivedAt].toCalendar() + ) +} + +fun addAchievementToUser(achievement: DatabaseAchievement) = smartTransaction { + TableAchievements.insert { + it[userUUID] = achievement.uuid.toString() + it[TableAchievements.achievement] = achievement.achievement + it[receivedAt] = achievement.receivedAt.javaInstant + } +} + +fun getAchievementOfUser(uuid: UUID, achievement: Achievement): DatabaseAchievement? = smartTransaction { + return@smartTransaction TableAchievements.selectAll().where { TableAchievements.userUUID eq uuid.toString() and (TableAchievements.achievement eq achievement) }.firstOrNull()?.let(::mapToDatabaseAchievement) +} \ No newline at end of file diff --git a/src/main/kotlin/net/blockventuremc/database/functions/Users.kt b/src/main/kotlin/net/blockventuremc/database/functions/Users.kt index a2e598f..eb31939 100644 --- a/src/main/kotlin/net/blockventuremc/database/functions/Users.kt +++ b/src/main/kotlin/net/blockventuremc/database/functions/Users.kt @@ -4,6 +4,7 @@ import net.blockventuremc.database.functions.TableUsers.userUUID import net.blockventuremc.database.model.DatabaseUser import net.blockventuremc.database.smartTransaction import net.blockventuremc.database.toCalendar +import net.blockventuremc.modules.archievements.model.Achievement import net.blockventuremc.modules.general.model.Languages import net.blockventuremc.modules.general.model.Ranks import org.jetbrains.exposed.sql.* diff --git a/src/main/kotlin/net/blockventuremc/database/model/DatabaseAchievement.kt b/src/main/kotlin/net/blockventuremc/database/model/DatabaseAchievement.kt new file mode 100644 index 0000000..3967427 --- /dev/null +++ b/src/main/kotlin/net/blockventuremc/database/model/DatabaseAchievement.kt @@ -0,0 +1,12 @@ +package net.blockventuremc.database.model + +import dev.fruxz.ascend.tool.time.calendar.Calendar +import net.blockventuremc.modules.archievements.model.Achievement +import java.util.* + +data class DatabaseAchievement( + val uuid: UUID, + val achievement: Achievement, + + val receivedAt: Calendar = Calendar.now() +) \ No newline at end of file diff --git a/src/main/kotlin/net/blockventuremc/modules/archievements/AchievementManager.kt b/src/main/kotlin/net/blockventuremc/modules/archievements/AchievementManager.kt new file mode 100644 index 0000000..475b869 --- /dev/null +++ b/src/main/kotlin/net/blockventuremc/modules/archievements/AchievementManager.kt @@ -0,0 +1,39 @@ +package net.blockventuremc.modules.archievements + +import dev.fruxz.ascend.extension.logging.getItsLogger +import dev.fruxz.stacked.extension.Title +import dev.fruxz.stacked.text +import net.blockventuremc.database.functions.addAchievementToUser +import net.blockventuremc.database.functions.getAchievementOfUser +import net.blockventuremc.database.model.DatabaseAchievement +import net.blockventuremc.extensions.sendMessagePrefixed +import net.blockventuremc.extensions.toDatabaseUser +import net.blockventuremc.extensions.translate +import net.blockventuremc.modules.archievements.model.Achievement +import org.bukkit.Bukkit +import java.util.* + +object AchievementManager { + private fun addAchievement(uuid: UUID, achievement: Achievement) { + + val player = Bukkit.getPlayer(uuid) ?: return + val title = player.toDatabaseUser().translate("achievement.${achievement.name.lowercase()}.title")?.message ?: achievement.title + val description = player.toDatabaseUser().translate("achievement.${achievement.name.lowercase()}.description")?.message ?: achievement.description + + player.showTitle(Title(text(title), text(description))) + + player.sendMessagePrefixed(player.toDatabaseUser().translate("achievement.achieved", mapOf("achievement" to title)) + ?.message ?: "Achievement achieved: $title") + + addAchievementToUser(DatabaseAchievement(uuid, achievement)) + + getItsLogger().info("Added achievement $title to ${player.name}") + + } + + fun addIfNotAchieved(uuid: UUID, achievement: Achievement) { + if (getAchievementOfUser(uuid, achievement) == null) { + addAchievement(uuid, achievement) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/net/blockventuremc/modules/archievements/events/FirstJoinEvent.kt b/src/main/kotlin/net/blockventuremc/modules/archievements/events/FirstJoinEvent.kt new file mode 100644 index 0000000..ebe756c --- /dev/null +++ b/src/main/kotlin/net/blockventuremc/modules/archievements/events/FirstJoinEvent.kt @@ -0,0 +1,15 @@ +package net.blockventuremc.modules.archievements.events + +import net.blockventuremc.modules.archievements.AchievementManager +import net.blockventuremc.modules.archievements.model.Achievement +import org.bukkit.event.EventHandler +import org.bukkit.event.EventPriority +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerJoinEvent + +class FirstJoinEvent: Listener { + @EventHandler(priority = EventPriority.LOWEST) + fun onFirstJoin(event: PlayerJoinEvent) { + AchievementManager.addIfNotAchieved(event.player.uniqueId, Achievement.FirstJoin) + } +} \ No newline at end of file diff --git a/src/main/kotlin/net/blockventuremc/modules/archievements/model/Achievement.kt b/src/main/kotlin/net/blockventuremc/modules/archievements/model/Achievement.kt new file mode 100644 index 0000000..f27265c --- /dev/null +++ b/src/main/kotlin/net/blockventuremc/modules/archievements/model/Achievement.kt @@ -0,0 +1,6 @@ +package net.blockventuremc.modules.archievements.model + +// IMPORTANT: title, description are only for fallbacks +enum class Achievement(val title: String, val description: String) { + FirstJoin("First Join", "Join the server for the first time"), +} \ No newline at end of file diff --git a/src/main/resources/translations/en-US.json b/src/main/resources/translations/en-US.json index f467cc8..15f499e 100644 --- a/src/main/resources/translations/en-US.json +++ b/src/main/resources/translations/en-US.json @@ -3,5 +3,8 @@ "fly_mode_toggled": "Fly mode is now %enabled%.", "fly_mode_toggled_by": "Fly mode of %player% is now %enabled%.", "onlinetime": "Your online time is %onlinetime%.", - "no_permission.club_member": "This command is only available to Club Members." + "no_permission.club_member": "This command is only available to Club Members.", + "achievement.achieved": "You have achieved the achievement %achievement%.", + "achievement.firstjoin.title": "Welcome to the server!", + "achievement.firstjoin.description": "You have joined the server for the first time." } \ No newline at end of file