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..327f1d4 --- /dev/null +++ b/src/main/kotlin/live/einfachgustaf/smp/teams/TeamsFeature.kt @@ -0,0 +1,36 @@ +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 simple = servicesManager.getSimple(TeamManager::class) + + simple!!.createTeam( + name = "Default Team", + shortName = "DT", + owner = UUID.randomUUID(), + color = "#FFFFFF" + ) + } + + 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..00174e4 --- /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 + ): 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 new file mode 100644 index 0000000..0356c81 --- /dev/null +++ b/src/main/kotlin/live/einfachgustaf/smp/teams/impl/TeamManagerImpl.kt @@ -0,0 +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 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? = transaction { + val exists = TeamTable.select( + (TeamTable.name eq name) or (TeamTable.shortName eq shortName) + ).count() > 0 + + if (exists) return@transaction null + + 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 new file mode 100644 index 0000000..708f517 --- /dev/null +++ b/src/main/kotlin/live/einfachgustaf/smp/teams/tables/MemberTable.kt @@ -0,0 +1,10 @@ +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 new file mode 100644 index 0000000..c8ef8ff --- /dev/null +++ b/src/main/kotlin/live/einfachgustaf/smp/teams/tables/TeamTable.kt @@ -0,0 +1,13 @@ +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") + override val primaryKey = PrimaryKey(id) +} \ No newline at end of file