From 8d8321c61c4d5cf7a5c7dee7855cfa1b837456d6 Mon Sep 17 00:00:00 2001 From: Marlon <72864666+DinoMarlir@users.noreply.github.com> Date: Mon, 21 Jul 2025 17:41:09 +0200 Subject: [PATCH 1/3] add teams --- .../live/einfachgustaf/smp/Entrypoint.kt | 2 ++ .../einfachgustaf/smp/teams/TeamsFeature.kt | 35 +++++++++++++++++++ .../einfachgustaf/smp/teams/api/SMPTeam.kt | 17 +++++++++ .../smp/teams/api/TeamManager.kt | 18 ++++++++++ .../smp/teams/impl/TeamManagerImpl.kt | 22 ++++++++++++ .../smp/teams/tables/MemberTable.kt | 8 +++++ .../smp/teams/tables/TeamTable.kt | 12 +++++++ 7 files changed, 114 insertions(+) create mode 100644 src/main/kotlin/live/einfachgustaf/smp/teams/TeamsFeature.kt create mode 100644 src/main/kotlin/live/einfachgustaf/smp/teams/api/SMPTeam.kt create mode 100644 src/main/kotlin/live/einfachgustaf/smp/teams/api/TeamManager.kt create mode 100644 src/main/kotlin/live/einfachgustaf/smp/teams/impl/TeamManagerImpl.kt create mode 100644 src/main/kotlin/live/einfachgustaf/smp/teams/tables/MemberTable.kt create mode 100644 src/main/kotlin/live/einfachgustaf/smp/teams/tables/TeamTable.kt diff --git a/src/main/kotlin/live/einfachgustaf/smp/Entrypoint.kt b/src/main/kotlin/live/einfachgustaf/smp/Entrypoint.kt index 3818d4a..07cc96f 100644 --- a/src/main/kotlin/live/einfachgustaf/smp/Entrypoint.kt +++ b/src/main/kotlin/live/einfachgustaf/smp/Entrypoint.kt @@ -4,6 +4,7 @@ import live.einfachgustaf.smp.core.database.DatabaseConnector import live.einfachgustaf.smp.core.feature.FeatureContext import live.einfachgustaf.smp.core.feature.FeatureManager import live.einfachgustaf.smp.features.SpawnFeature +import live.einfachgustaf.smp.teams.TeamsFeature import live.einfachgustaf.smp.utils.registerSimple import live.einfachgustaf.smp.utils.servicesManager import org.bukkit.plugin.ServicePriority @@ -20,6 +21,7 @@ class Entrypoint: JavaPlugin() { featureManager = FeatureManager(FeatureContext(this)).apply { // register all features register(SpawnFeature()) + register(TeamsFeature()) } databaseConnector = DatabaseConnector(this) diff --git a/src/main/kotlin/live/einfachgustaf/smp/teams/TeamsFeature.kt b/src/main/kotlin/live/einfachgustaf/smp/teams/TeamsFeature.kt new file mode 100644 index 0000000..c811c10 --- /dev/null +++ b/src/main/kotlin/live/einfachgustaf/smp/teams/TeamsFeature.kt @@ -0,0 +1,35 @@ +package live.einfachgustaf.smp.teams + +import live.einfachgustaf.smp.core.feature.Feature +import live.einfachgustaf.smp.core.feature.FeatureContext +import live.einfachgustaf.smp.teams.api.TeamManager +import live.einfachgustaf.smp.teams.impl.TeamManagerImpl +import live.einfachgustaf.smp.teams.tables.MemberTable +import live.einfachgustaf.smp.teams.tables.TeamTable +import live.einfachgustaf.smp.utils.getSimple +import live.einfachgustaf.smp.utils.registerSimple +import live.einfachgustaf.smp.utils.servicesManager +import org.jetbrains.exposed.v1.jdbc.SchemaUtils +import org.jetbrains.exposed.v1.jdbc.transactions.transaction +import java.util.UUID + +class TeamsFeature(override val name: String = "Teams") : Feature { + + override fun enable(context: FeatureContext) { + transaction { + SchemaUtils.create(TeamTable, MemberTable) + } + + servicesManager.registerSimple(TeamManagerImpl()) + + val manager = servicesManager.getSimple(TeamManager::class) + + manager!!.createTeam( + "test", + "test", + UUID.randomUUID() + ) + } + + override fun disable() = Unit +} \ No newline at end of file diff --git a/src/main/kotlin/live/einfachgustaf/smp/teams/api/SMPTeam.kt b/src/main/kotlin/live/einfachgustaf/smp/teams/api/SMPTeam.kt new file mode 100644 index 0000000..02be690 --- /dev/null +++ b/src/main/kotlin/live/einfachgustaf/smp/teams/api/SMPTeam.kt @@ -0,0 +1,17 @@ +package live.einfachgustaf.smp.teams.api + +import java.util.UUID + +data class SMPTeam( + val id: Int, + val name: String, + val shortName: String, + val owner: UUID, + var color: String, + var maxPlayers: Int +) { + + fun update(): Boolean { + TODO("not yet implemented") + } +} \ No newline at end of file diff --git a/src/main/kotlin/live/einfachgustaf/smp/teams/api/TeamManager.kt b/src/main/kotlin/live/einfachgustaf/smp/teams/api/TeamManager.kt new file mode 100644 index 0000000..1e19202 --- /dev/null +++ b/src/main/kotlin/live/einfachgustaf/smp/teams/api/TeamManager.kt @@ -0,0 +1,18 @@ +package live.einfachgustaf.smp.teams.api + +import java.util.UUID + +interface TeamManager { + + fun createTeam( + name: String, + shortName: String, + owner: UUID, + color: String = "#FFFFFF" + ): Int? + + fun updateTeam( + id: Int, + team: SMPTeam + ) +} \ No newline at end of file diff --git a/src/main/kotlin/live/einfachgustaf/smp/teams/impl/TeamManagerImpl.kt b/src/main/kotlin/live/einfachgustaf/smp/teams/impl/TeamManagerImpl.kt new file mode 100644 index 0000000..12cc921 --- /dev/null +++ b/src/main/kotlin/live/einfachgustaf/smp/teams/impl/TeamManagerImpl.kt @@ -0,0 +1,22 @@ +package live.einfachgustaf.smp.teams.impl + +import live.einfachgustaf.smp.teams.api.SMPTeam +import live.einfachgustaf.smp.teams.api.TeamManager +import java.util.UUID + +class TeamManagerImpl: TeamManager { + + override fun createTeam( + name: String, + shortName: String, + owner: UUID, + color: String + ): Int? { + TODO("Not yet implemented") + } + + override fun updateTeam(id: Int, team: SMPTeam) { + TODO("Not yet implemented") + } + +} \ No newline at end of file diff --git a/src/main/kotlin/live/einfachgustaf/smp/teams/tables/MemberTable.kt b/src/main/kotlin/live/einfachgustaf/smp/teams/tables/MemberTable.kt new file mode 100644 index 0000000..c92d8c7 --- /dev/null +++ b/src/main/kotlin/live/einfachgustaf/smp/teams/tables/MemberTable.kt @@ -0,0 +1,8 @@ +package live.einfachgustaf.smp.teams.tables + +import org.jetbrains.exposed.v1.core.Table + +object MemberTable : Table("smp_team_members") { + val uuid = uuid("uuid").uniqueIndex() + val teamId = integer("team_id").references(TeamTable.id) +} \ No newline at end of file diff --git a/src/main/kotlin/live/einfachgustaf/smp/teams/tables/TeamTable.kt b/src/main/kotlin/live/einfachgustaf/smp/teams/tables/TeamTable.kt new file mode 100644 index 0000000..2b868e0 --- /dev/null +++ b/src/main/kotlin/live/einfachgustaf/smp/teams/tables/TeamTable.kt @@ -0,0 +1,12 @@ +package live.einfachgustaf.smp.teams.tables + +import org.jetbrains.exposed.v1.core.Table + +object TeamTable : Table("smp_teams") { + val id = integer("id").autoIncrement() // primary key + val name = varchar("name", 32).uniqueIndex() + val shortName = varchar("short_name", 4).uniqueIndex() + val owner = uuid("owner") + val color = varchar("color", 7) // as hex value + val maxPlayers = integer("max_players") +} \ No newline at end of file From fc6618acc6a491bcb4219fdd200ec9a9a76bd25e Mon Sep 17 00:00:00 2001 From: Marlon <72864666+DinoMarlir@users.noreply.github.com> Date: Mon, 21 Jul 2025 17:55:46 +0200 Subject: [PATCH 2/3] Remove test team creation from TeamsFeature Eliminated the code that created a test team during feature initialization. This cleans up the TeamsFeature setup and prevents unintended test data from being generated. --- .../live/einfachgustaf/smp/teams/TeamsFeature.kt | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/main/kotlin/live/einfachgustaf/smp/teams/TeamsFeature.kt b/src/main/kotlin/live/einfachgustaf/smp/teams/TeamsFeature.kt index c811c10..a01b3cc 100644 --- a/src/main/kotlin/live/einfachgustaf/smp/teams/TeamsFeature.kt +++ b/src/main/kotlin/live/einfachgustaf/smp/teams/TeamsFeature.kt @@ -2,16 +2,13 @@ package live.einfachgustaf.smp.teams import live.einfachgustaf.smp.core.feature.Feature import live.einfachgustaf.smp.core.feature.FeatureContext -import live.einfachgustaf.smp.teams.api.TeamManager import live.einfachgustaf.smp.teams.impl.TeamManagerImpl import live.einfachgustaf.smp.teams.tables.MemberTable import live.einfachgustaf.smp.teams.tables.TeamTable -import live.einfachgustaf.smp.utils.getSimple import live.einfachgustaf.smp.utils.registerSimple import live.einfachgustaf.smp.utils.servicesManager import org.jetbrains.exposed.v1.jdbc.SchemaUtils import org.jetbrains.exposed.v1.jdbc.transactions.transaction -import java.util.UUID class TeamsFeature(override val name: String = "Teams") : Feature { @@ -21,14 +18,6 @@ class TeamsFeature(override val name: String = "Teams") : Feature { } servicesManager.registerSimple(TeamManagerImpl()) - - val manager = servicesManager.getSimple(TeamManager::class) - - manager!!.createTeam( - "test", - "test", - UUID.randomUUID() - ) } override fun disable() = Unit From bb60a48ea94931b1b82654cfcf36db25c41fe6a7 Mon Sep 17 00:00:00 2001 From: Marlon <72864666+DinoMarlir@users.noreply.github.com> Date: Mon, 21 Jul 2025 21:16:15 +0200 Subject: [PATCH 3/3] implement database --- .../einfachgustaf/smp/teams/TeamsFeature.kt | 14 +++++- .../smp/teams/api/TeamManager.kt | 2 +- .../smp/teams/impl/TeamManagerImpl.kt | 49 ++++++++++++++++--- .../smp/teams/tables/MemberTable.kt | 2 + .../smp/teams/tables/TeamTable.kt | 1 + 5 files changed, 59 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/live/einfachgustaf/smp/teams/TeamsFeature.kt b/src/main/kotlin/live/einfachgustaf/smp/teams/TeamsFeature.kt index a01b3cc..327f1d4 100644 --- a/src/main/kotlin/live/einfachgustaf/smp/teams/TeamsFeature.kt +++ b/src/main/kotlin/live/einfachgustaf/smp/teams/TeamsFeature.kt @@ -2,13 +2,16 @@ package live.einfachgustaf.smp.teams import live.einfachgustaf.smp.core.feature.Feature import live.einfachgustaf.smp.core.feature.FeatureContext +import live.einfachgustaf.smp.teams.api.TeamManager import live.einfachgustaf.smp.teams.impl.TeamManagerImpl import live.einfachgustaf.smp.teams.tables.MemberTable import live.einfachgustaf.smp.teams.tables.TeamTable +import live.einfachgustaf.smp.utils.getSimple import live.einfachgustaf.smp.utils.registerSimple import live.einfachgustaf.smp.utils.servicesManager import org.jetbrains.exposed.v1.jdbc.SchemaUtils import org.jetbrains.exposed.v1.jdbc.transactions.transaction +import java.util.UUID class TeamsFeature(override val name: String = "Teams") : Feature { @@ -17,7 +20,16 @@ class TeamsFeature(override val name: String = "Teams") : Feature { SchemaUtils.create(TeamTable, MemberTable) } - servicesManager.registerSimple(TeamManagerImpl()) + servicesManager.registerSimple(TeamManagerImpl()) + + val simple = servicesManager.getSimple(TeamManager::class) + + simple!!.createTeam( + name = "Default Team", + shortName = "DT", + owner = UUID.randomUUID(), + color = "#FFFFFF" + ) } override fun disable() = Unit diff --git a/src/main/kotlin/live/einfachgustaf/smp/teams/api/TeamManager.kt b/src/main/kotlin/live/einfachgustaf/smp/teams/api/TeamManager.kt index 1e19202..00174e4 100644 --- a/src/main/kotlin/live/einfachgustaf/smp/teams/api/TeamManager.kt +++ b/src/main/kotlin/live/einfachgustaf/smp/teams/api/TeamManager.kt @@ -14,5 +14,5 @@ interface TeamManager { fun updateTeam( id: Int, team: SMPTeam - ) + ): Boolean } \ No newline at end of file diff --git a/src/main/kotlin/live/einfachgustaf/smp/teams/impl/TeamManagerImpl.kt b/src/main/kotlin/live/einfachgustaf/smp/teams/impl/TeamManagerImpl.kt index 12cc921..0356c81 100644 --- a/src/main/kotlin/live/einfachgustaf/smp/teams/impl/TeamManagerImpl.kt +++ b/src/main/kotlin/live/einfachgustaf/smp/teams/impl/TeamManagerImpl.kt @@ -1,22 +1,57 @@ package live.einfachgustaf.smp.teams.impl +import live.einfachgustaf.smp.teams.tables.TeamTable +import java.util.UUID import live.einfachgustaf.smp.teams.api.SMPTeam import live.einfachgustaf.smp.teams.api.TeamManager -import java.util.UUID +import org.jetbrains.exposed.v1.core.SqlExpressionBuilder.eq +import org.jetbrains.exposed.v1.core.SqlExpressionBuilder.neq +import org.jetbrains.exposed.v1.core.and +import org.jetbrains.exposed.v1.core.or +import org.jetbrains.exposed.v1.jdbc.select +import org.jetbrains.exposed.v1.jdbc.transactions.transaction +import org.jetbrains.exposed.v1.jdbc.update +import org.jetbrains.exposed.v1.jdbc.insert class TeamManagerImpl: TeamManager { - + override fun createTeam( name: String, shortName: String, owner: UUID, color: String - ): Int? { - TODO("Not yet implemented") - } + ): Int? = transaction { + val exists = TeamTable.select( + (TeamTable.name eq name) or (TeamTable.shortName eq shortName) + ).count() > 0 + + if (exists) return@transaction null - override fun updateTeam(id: Int, team: SMPTeam) { - TODO("Not yet implemented") + val id = TeamTable.insert { + it[TeamTable.name] = name + it[TeamTable.shortName] = shortName + it[TeamTable.owner] = owner + it[TeamTable.color] = color + it[TeamTable.maxPlayers] = 20 // TODO: config for default max players + }[TeamTable.id] + + id } + override fun updateTeam(id: Int, team: SMPTeam): Boolean = transaction { + val exists = TeamTable.select( + ((TeamTable.name eq team.name) or (TeamTable.shortName eq team.shortName)) and (TeamTable.id neq id) + ).count() > 0 + + if (exists) return@transaction false + + val updatedRows = TeamTable.update({ TeamTable.id eq id }) { + it[TeamTable.name] = team.name + it[TeamTable.shortName] = team.shortName + it[TeamTable.owner] = team.owner + it[TeamTable.color] = team.color + it[TeamTable.maxPlayers] = team.maxPlayers + } + updatedRows > 0 + } } \ No newline at end of file diff --git a/src/main/kotlin/live/einfachgustaf/smp/teams/tables/MemberTable.kt b/src/main/kotlin/live/einfachgustaf/smp/teams/tables/MemberTable.kt index c92d8c7..708f517 100644 --- a/src/main/kotlin/live/einfachgustaf/smp/teams/tables/MemberTable.kt +++ b/src/main/kotlin/live/einfachgustaf/smp/teams/tables/MemberTable.kt @@ -3,6 +3,8 @@ package live.einfachgustaf.smp.teams.tables import org.jetbrains.exposed.v1.core.Table object MemberTable : Table("smp_team_members") { + val id = integer("id").autoIncrement() // primary key val uuid = uuid("uuid").uniqueIndex() val teamId = integer("team_id").references(TeamTable.id) + override val primaryKey = PrimaryKey(id) } \ No newline at end of file diff --git a/src/main/kotlin/live/einfachgustaf/smp/teams/tables/TeamTable.kt b/src/main/kotlin/live/einfachgustaf/smp/teams/tables/TeamTable.kt index 2b868e0..c8ef8ff 100644 --- a/src/main/kotlin/live/einfachgustaf/smp/teams/tables/TeamTable.kt +++ b/src/main/kotlin/live/einfachgustaf/smp/teams/tables/TeamTable.kt @@ -9,4 +9,5 @@ object TeamTable : Table("smp_teams") { val owner = uuid("owner") val color = varchar("color", 7) // as hex value val maxPlayers = integer("max_players") + override val primaryKey = PrimaryKey(id) } \ No newline at end of file