diff --git a/src/main/kotlin/com/dansplugins/fiefs/Fiefs.kt b/src/main/kotlin/com/dansplugins/fiefs/Fiefs.kt index 35883ce..6e2312f 100644 --- a/src/main/kotlin/com/dansplugins/fiefs/Fiefs.kt +++ b/src/main/kotlin/com/dansplugins/fiefs/Fiefs.kt @@ -2,12 +2,15 @@ package com.dansplugins.fiefs import com.dansplugins.factionsystem.MedievalFactions import com.dansplugins.fiefs.command.fiefs.FiefsCommand +import com.dansplugins.fiefs.fief.FiefRepository import org.bstats.bukkit.Metrics import org.bukkit.plugin.java.JavaPlugin class Fiefs : JavaPlugin() { lateinit var medievalFactions: MedievalFactions + val fiefRepository = FiefRepository(this) + override fun onEnable() { saveDefaultConfig() config.options().copyDefaults(true) diff --git a/src/main/kotlin/com/dansplugins/fiefs/command/fiefs/FiefsCommand.kt b/src/main/kotlin/com/dansplugins/fiefs/command/fiefs/FiefsCommand.kt index d22a047..8cc8ff1 100644 --- a/src/main/kotlin/com/dansplugins/fiefs/command/fiefs/FiefsCommand.kt +++ b/src/main/kotlin/com/dansplugins/fiefs/command/fiefs/FiefsCommand.kt @@ -1,9 +1,10 @@ package com.dansplugins.fiefs.command.fiefs import com.dansplugins.fiefs.Fiefs +import com.dansplugins.fiefs.command.fiefs.create.FiefsCreateCommand import com.dansplugins.fiefs.command.fiefs.help.FiefsHelpCommand -import org.bukkit.ChatColor.AQUA -import org.bukkit.ChatColor.GREEN +import com.dansplugins.fiefs.command.fiefs.list.FiefsListCommand +import org.bukkit.ChatColor import org.bukkit.command.Command import org.bukkit.command.CommandExecutor import org.bukkit.command.CommandSender @@ -11,22 +12,28 @@ import org.bukkit.command.TabCompleter class FiefsCommand(private val plugin: Fiefs) : CommandExecutor, TabCompleter { private val helpCommand = FiefsHelpCommand(plugin) + private val createCommand = FiefsCreateCommand(plugin) + private val listCommand = FiefsListCommand(plugin) private val subcommands = listOf( - "help" + "help", + "create", + "list" ) override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean { return when (args.firstOrNull()?.lowercase()) { "help" -> helpCommand.onCommand(sender, command, label, args.drop(1).toTypedArray()) + "create" -> createCommand.onCommand(sender, command, label, args.drop(1).toTypedArray()) + "list" -> listCommand.onCommand(sender, command, label, args.drop(1).toTypedArray()) else -> { // send plugin information - sender.sendMessage("$AQUA" + "Fiefs v${plugin.description.version}") - sender.sendMessage("$AQUA" + "Author: ${plugin.description.authors}") - sender.sendMessage("$AQUA" + "Description: ${plugin.description.description}") + sender.sendMessage("${ChatColor.AQUA}Fiefs v${plugin.description.version}") + sender.sendMessage("${ChatColor.AQUA}Author: ${plugin.description.authors}") + sender.sendMessage("${ChatColor.AQUA}Description: ${plugin.description.description}") // send help message - sender.sendMessage("$GREEN" + "Type /fiefs help for a list of commands.") + sender.sendMessage("${ChatColor.GREEN}Type /fiefs help for a list of commands.") return true } } @@ -42,6 +49,8 @@ class FiefsCommand(private val plugin: Fiefs) : CommandExecutor, TabCompleter { 1 -> subcommands.filter { it.startsWith(args[0]) }.toMutableList() else -> when(args.first().lowercase()) { "help" -> helpCommand.onTabComplete(sender, command, alias, args.drop(1).toTypedArray()) + "create" -> createCommand.onTabComplete(sender, command, alias, args.drop(1).toTypedArray()) + "list" -> listCommand.onTabComplete(sender, command, alias, args.drop(1).toTypedArray()) else -> emptyList() } } diff --git a/src/main/kotlin/com/dansplugins/fiefs/command/fiefs/create/FiefsCreateCommand.kt b/src/main/kotlin/com/dansplugins/fiefs/command/fiefs/create/FiefsCreateCommand.kt new file mode 100644 index 0000000..8f71f90 --- /dev/null +++ b/src/main/kotlin/com/dansplugins/fiefs/command/fiefs/create/FiefsCreateCommand.kt @@ -0,0 +1,57 @@ +package com.dansplugins.fiefs.command.fiefs.create + +import com.dansplugins.fiefs.Fiefs +import com.dansplugins.fiefs.fief.Fief +import org.bukkit.ChatColor +import org.bukkit.command.Command +import org.bukkit.command.CommandExecutor +import org.bukkit.command.CommandSender +import org.bukkit.command.TabCompleter +import org.bukkit.entity.Player + +class FiefsCreateCommand(private val plugin: Fiefs) : CommandExecutor, TabCompleter { + override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean { + if (sender !is Player) { + sender.sendMessage("${ChatColor.RED}This command can only be run by a player.") + return false + } + val name = args.firstOrNull() + if (name == null) { + sender.sendMessage("${ChatColor.RED}Please specify a name for the fief.") + return false + } + if (plugin.fiefRepository.getFief(name) != null) { + sender.sendMessage("${ChatColor.RED}A fief with that name already exists.") + return false + } + + // player must be in a faction + val mfPlayer = plugin.medievalFactions.services.playerService.getPlayer(sender) + val faction = plugin.medievalFactions.services.factionService.getFaction(mfPlayer?.id ?: return false) + if (faction == null) { + sender.sendMessage("${ChatColor.RED}You must be in a faction to create a fief.") + return false + } + + // player must not be in a fief already + val playersFief = plugin.fiefRepository.getPlayersFief(mfPlayer.id) + if (playersFief != null) { + sender.sendMessage("${ChatColor.RED}You're already in a fief. You must leave it first.") + return false + } + + val newFief = Fief(name, mfPlayer.id, faction.id) + plugin.fiefRepository.addFief(newFief) + sender.sendMessage("${ChatColor.GREEN}Fief created.") + return true + } + + override fun onTabComplete( + sender: CommandSender, + command: Command, + alias: String, + args: Array + ): List { + return emptyList() + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/dansplugins/fiefs/command/fiefs/help/FiefsHelpCommand.kt b/src/main/kotlin/com/dansplugins/fiefs/command/fiefs/help/FiefsHelpCommand.kt index 3fcad97..816d6cb 100644 --- a/src/main/kotlin/com/dansplugins/fiefs/command/fiefs/help/FiefsHelpCommand.kt +++ b/src/main/kotlin/com/dansplugins/fiefs/command/fiefs/help/FiefsHelpCommand.kt @@ -1,7 +1,7 @@ package com.dansplugins.fiefs.command.fiefs.help import com.dansplugins.fiefs.Fiefs -import org.bukkit.ChatColor.AQUA +import org.bukkit.ChatColor import org.bukkit.command.Command import org.bukkit.command.CommandExecutor import org.bukkit.command.CommandSender @@ -10,8 +10,10 @@ import org.bukkit.command.TabCompleter class FiefsHelpCommand(private val plugin: Fiefs) : CommandExecutor, TabCompleter { override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean { // send list of commands - sender.sendMessage("${AQUA}=== Fiefs Commands ===") - sender.sendMessage("${AQUA}/fiefs help - Displays a list of useful commands.") + sender.sendMessage("${ChatColor.AQUA}=== Fiefs Commands ===") + sender.sendMessage("${ChatColor.AQUA}/fiefs help - Displays a list of useful commands.") + sender.sendMessage("${ChatColor.AQUA}/fiefs create - Creates a fief.") + sender.sendMessage("${ChatColor.AQUA}/fiefs list - Lists all fiefs.") return true } diff --git a/src/main/kotlin/com/dansplugins/fiefs/command/fiefs/list/FiefsListCommand.kt b/src/main/kotlin/com/dansplugins/fiefs/command/fiefs/list/FiefsListCommand.kt new file mode 100644 index 0000000..2e6549f --- /dev/null +++ b/src/main/kotlin/com/dansplugins/fiefs/command/fiefs/list/FiefsListCommand.kt @@ -0,0 +1,31 @@ +package com.dansplugins.fiefs.command.fiefs.list + +import com.dansplugins.fiefs.Fiefs +import org.bukkit.ChatColor +import org.bukkit.command.Command +import org.bukkit.command.CommandExecutor +import org.bukkit.command.CommandSender +import org.bukkit.command.TabCompleter + +class FiefsListCommand(private val plugin: Fiefs) : CommandExecutor, TabCompleter { + override fun onCommand(sender: CommandSender, command: Command, label: String, args: Array): Boolean { + if (plugin.fiefRepository.getFiefs().isEmpty()) { + sender.sendMessage("${ChatColor.RED}There are no fiefs.") + return false + } + sender.sendMessage("${ChatColor.AQUA}=== Fiefs ===") + for (fief in plugin.fiefRepository.getFiefs()) { + sender.sendMessage("${ChatColor.AQUA}" + fief.getName()) + } + return true + } + + override fun onTabComplete( + sender: CommandSender, + command: Command, + alias: String, + args: Array + ): List { + return emptyList() + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/dansplugins/fiefs/fief/Fief.kt b/src/main/kotlin/com/dansplugins/fiefs/fief/Fief.kt new file mode 100644 index 0000000..9df8b7b --- /dev/null +++ b/src/main/kotlin/com/dansplugins/fiefs/fief/Fief.kt @@ -0,0 +1,38 @@ +package com.dansplugins.fiefs.fief + +import com.dansplugins.factionsystem.faction.MfFactionId +import com.dansplugins.factionsystem.player.MfPlayerId +import java.util.UUID + +data class Fief(private val name: String, private val ownerMfPlayerId: MfPlayerId, private val mfFactionid: MfFactionId) { + private var id = MfFiefId.generate() + private var members: MutableList = mutableListOf() + + fun getId(): MfFiefId { + return id + } + + fun addMember(mfPlayerId: MfPlayerId) { + members.add(mfPlayerId) + } + + fun removeMember(mfPlayerId: MfPlayerId) { + members.remove(mfPlayerId) + } + + fun isMember(mfPlayerId: MfPlayerId): Boolean { + return members.contains(mfPlayerId) || ownerMfPlayerId == mfPlayerId + } + + fun getMembers(): List { + return members + } + + fun getOwnerId(): MfPlayerId { + return ownerMfPlayerId + } + + fun getName(): String { + return name + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/dansplugins/fiefs/fief/FiefRepository.kt b/src/main/kotlin/com/dansplugins/fiefs/fief/FiefRepository.kt new file mode 100644 index 0000000..d75d433 --- /dev/null +++ b/src/main/kotlin/com/dansplugins/fiefs/fief/FiefRepository.kt @@ -0,0 +1,79 @@ +package com.dansplugins.fiefs.fief + +import com.dansplugins.factionsystem.player.MfPlayerId +import com.dansplugins.fiefs.Fiefs +import java.util.* + +/** + * Stores all Fiefs in a list and provides methods for accessing and modifying the list. + */ +class FiefRepository(private val plugin: Fiefs) { + private val fiefs = mutableListOf() + + /** + * Adds a Fief to the list. + * @param fief The Fief to add. + */ + fun addFief(fief: Fief) { + fiefs.add(fief) + } + + /** + * Removes a Fief from the list. + * @param fief The Fief to remove. + */ + fun removeFief(fief: Fief) { + fiefs.remove(fief) + } + + /** + * Gets a Fief from the list. + * @param name The name of the Fief to get. + * @return The Fief with the given name. + */ + fun getFief(name: String): Fief? { + for (fief in fiefs) { + if (fief.getName() == name) { + return fief + } + } + return null + } + + /** + * Gets a Fief from the list. + * @param mfFiefId The ID of the Fief to get. + * @return The Fief with the given UUID. + */ + fun getFief(mfFiefId: MfFiefId): Fief? { + for (fief in fiefs) { + if (fief.getId() == mfFiefId) { + return fief + } + } + return null + } + + /** + * Gets a player's fief from the list. + * @param mfPlayerId The ID of the player whose fief to get. + * @return The Fief which the player is a member of. + * @return null if the player is not a member of any fief. + */ + fun getPlayersFief(mfPlayerId: MfPlayerId): Fief? { + for (fief in fiefs) { + if (fief.isMember(mfPlayerId)) { + return fief + } + } + return null + } + + /** + * Gets a list of all Fiefs. + * @return A list of all Fiefs. + */ + fun getFiefs(): List { + return fiefs + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/dansplugins/fiefs/fief/MfFiefId.kt b/src/main/kotlin/com/dansplugins/fiefs/fief/MfFiefId.kt new file mode 100644 index 0000000..e6631af --- /dev/null +++ b/src/main/kotlin/com/dansplugins/fiefs/fief/MfFiefId.kt @@ -0,0 +1,10 @@ +package com.dansplugins.fiefs.fief + +import java.util.* + +@JvmInline +value class MfFiefId(val value: String) { + companion object { + fun generate() = MfFiefId(UUID.randomUUID().toString()) + } +} \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index b771ac9..bf943f4 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -8,10 +8,16 @@ description: An expansion for Medieval Factions that allows faction members to c commands: fiefs: - description: The main command for Fiefs. - usage: /fiefs + description: The main command for Fiefs. Subcommands include:: help, create, list aliases: [fi] permissions: fiefs.help: - default: true \ No newline at end of file + default: true + description: Allows the player to view the help menu. + fiefs.create: + default: true + description: Allows the player to create a fief. + fiefs.list: + default: true + description: Allows the player to view a list of all fiefs. \ No newline at end of file diff --git a/src/test/kotlin/com/dansplugins/fiefs/command/TestFiefsCommand.kt b/src/test/kotlin/com/dansplugins/fiefs/command/TestFiefsCommand.kt new file mode 100644 index 0000000..db0e430 --- /dev/null +++ b/src/test/kotlin/com/dansplugins/fiefs/command/TestFiefsCommand.kt @@ -0,0 +1,43 @@ +package com.dansplugins.fiefs.command + +import com.dansplugins.fiefs.Fiefs +import com.dansplugins.fiefs.command.fiefs.FiefsCommand +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import org.bukkit.ChatColor +import org.bukkit.command.Command +import org.bukkit.command.CommandSender +import org.junit.jupiter.api.Test + +class TestFiefsCommand { + + private val mockPlugin = mockk() { + every { description.version } returns "1.0.0" + every { description.authors } returns listOf("Dan") + every { description.description } returns "A plugin about fiefs." + } + + @Test + fun testFiefsCommandNoArguments() { + // prepare + val mockSender = mockk() { + every { sendMessage(any()) } returns Unit + } + val mockCommand = mockk() + val args = emptyArray() + val label = "fiefs" + val fiefsCommand = FiefsCommand(mockPlugin) + + // execute + fiefsCommand.onCommand(mockSender, mockCommand, label, args) + + // verify + val expectedAuthors = mockPlugin.description.authors + val expectedDescription = mockPlugin.description.description + verify(exactly = 1) { mockSender.sendMessage("${ChatColor.AQUA}Fiefs v1.0.0") } + verify(exactly = 1) { mockSender.sendMessage("${ChatColor.AQUA}Author: $expectedAuthors") } + verify(exactly = 1) { mockSender.sendMessage("${ChatColor.AQUA}Description: $expectedDescription") } + verify(exactly = 1) { mockSender.sendMessage("${ChatColor.GREEN}Type /fiefs help for a list of commands.") } + } +} \ No newline at end of file diff --git a/src/test/kotlin/com/dansplugins/fiefs/fief/TestFief.kt b/src/test/kotlin/com/dansplugins/fiefs/fief/TestFief.kt new file mode 100644 index 0000000..4d90e85 --- /dev/null +++ b/src/test/kotlin/com/dansplugins/fiefs/fief/TestFief.kt @@ -0,0 +1,50 @@ +package com.dansplugins.fiefs.fief + +import com.dansplugins.factionsystem.faction.MfFactionId +import com.dansplugins.factionsystem.player.MfPlayerId +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import java.util.* + +class TestFief { + + @Test + fun testInitialization() { + val mfPlayerId = MfPlayerId("test") + val mfFactionId = MfFactionId("test") + val fief = Fief("testFief", mfPlayerId, mfFactionId) + assertEquals("testFief", fief.getName()) + assertEquals(mfPlayerId, fief.getOwnerId()) + assertEquals(0, fief.getMembers().size) + assertEquals(true, fief.isMember(mfPlayerId)) + } + + @Test + fun testAddMember() { + val mfPlayerId = MfPlayerId("test") + val mfFactionId = MfFactionId("test") + val fief = Fief("testFief", mfPlayerId, mfFactionId) + fief.addMember(mfPlayerId) + assertEquals(fief.getMembers().size, 1) + assertEquals(mfPlayerId, fief.getMembers()[0]) + } + + @Test + fun testRemoveMember() { + val mfPlayerId = MfPlayerId("test") + val mfFactionId = MfFactionId("test") + val fief = Fief("testFief", mfPlayerId, mfFactionId) + fief.addMember(mfPlayerId) + fief.removeMember(mfPlayerId) + assertEquals(0, fief.getMembers().size) + } + + @Test + fun testIsMember() { + val mfPlayerId = MfPlayerId("test") + val mfFactionId = MfFactionId("test") + val fief = Fief("testFief", mfPlayerId, mfFactionId) + fief.addMember(mfPlayerId) + assertEquals(true, fief.isMember(mfPlayerId)) + } +} \ No newline at end of file diff --git a/src/test/kotlin/com/dansplugins/fiefs/fief/TestFiefRepository.kt b/src/test/kotlin/com/dansplugins/fiefs/fief/TestFiefRepository.kt new file mode 100644 index 0000000..605627f --- /dev/null +++ b/src/test/kotlin/com/dansplugins/fiefs/fief/TestFiefRepository.kt @@ -0,0 +1,69 @@ +package com.dansplugins.fiefs.fief + +import com.dansplugins.factionsystem.faction.MfFactionId +import com.dansplugins.factionsystem.player.MfPlayerId +import com.dansplugins.fiefs.Fiefs +import io.mockk.mockk +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import java.util.* + +class TestFiefRepository { + + @Test + fun testInitialization() { + val mockPlugin = mockk() + val fiefRepository = FiefRepository(mockPlugin) + assertEquals(0, fiefRepository.getFiefs().size) + } + + @Test + fun testAddFief() { + val mockPlugin = mockk() + val fiefRepository = FiefRepository(mockPlugin) + val fief = Fief("testFief", MfPlayerId("test"), MfFactionId("test")) + fiefRepository.addFief(fief) + assertEquals(1, fiefRepository.getFiefs().size) + assertEquals(fief, fiefRepository.getFiefs()[0]) + } + + @Test + fun testRemoveFief() { + val mockPlugin = mockk() + val fiefRepository = FiefRepository(mockPlugin) + val fief = Fief("testFief", MfPlayerId("test"), MfFactionId("test")) + fiefRepository.addFief(fief) + fiefRepository.removeFief(fief) + assertEquals(0, fiefRepository.getFiefs().size) + } + + @Test + fun testGetFiefByName() { + val mockPlugin = mockk() + val fiefRepository = FiefRepository(mockPlugin) + val fief = Fief("testFief", MfPlayerId("test"), MfFactionId("test")) + fiefRepository.addFief(fief) + assertEquals(fief, fiefRepository.getFief("testFief")) + } + + @Test + fun testGetFiefByUUID() { + val mockPlugin = mockk() + val fiefRepository = FiefRepository(mockPlugin) + val fief = Fief("testFief", MfPlayerId("test"), MfFactionId("test")) + val fiefId = fief.getId() + fiefRepository.addFief(fief) + assertEquals(fief, fiefRepository.getFief(fiefId)) + } + + @Test + fun testGetFiefByPlayerUUID() { + val mockPlugin = mockk() + val fiefRepository = FiefRepository(mockPlugin) + val fief = Fief("testFief", MfPlayerId("test"), MfFactionId("test")) + val playerId = MfPlayerId("test") + fief.addMember(playerId) + fiefRepository.addFief(fief) + assertEquals(fief, fiefRepository.getPlayersFief(playerId)) + } +} \ No newline at end of file