Skip to content

Commit

Permalink
Achievement system (#47)
Browse files Browse the repository at this point in the history
* chore: remove useless file

* feat: first implementation of Achievement

* fix: logger

* fix: set better pritority

* fix: wrong column in map

* fix: rename column to receivedAt

* feat: translate

* fix: primary key

* fix: add fallback note

---------

Co-authored-by: Liam Sage <[email protected]>
  • Loading branch information
InvalidJoker and CoasterFreakDE committed Apr 24, 2024
1 parent 95a6733 commit baed7ab
Show file tree
Hide file tree
Showing 9 changed files with 121 additions and 7 deletions.
5 changes: 0 additions & 5 deletions src/main/kotlin/net/blockventuremc/core/coaster/Coaster.kt

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -27,7 +28,8 @@ internal object DatabaseManager {

fun register() = smartTransaction {
SchemaUtils.createMissingTablesAndColumns(
TableUsers
TableUsers,
TableAchievements
)
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.*
Expand Down
Original file line number Diff line number Diff line change
@@ -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()
)
Original file line number Diff line number Diff line change
@@ -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)
}
}
}
Original file line number Diff line number Diff line change
@@ -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)
}
}
Original file line number Diff line number Diff line change
@@ -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"),
}
5 changes: 4 additions & 1 deletion src/main/resources/translations/en-US.json
Original file line number Diff line number Diff line change
Expand Up @@ -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 <color:#ea8685>Club Members</color>."
"no_permission.club_member": "This command is only available to <color:#ea8685>Club Members</color>.",
"achievement.achieved": "You have achieved the achievement <color:#f78fb3>%achievement%</color>.",
"achievement.firstjoin.title": "Welcome to the server!",
"achievement.firstjoin.description": "You have joined the server for the first time."
}

0 comments on commit baed7ab

Please sign in to comment.