diff --git a/pom.xml b/pom.xml index 47e0a3f..74583a3 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ BlockFox - 1.8 + 21 UTF-8 diff --git a/src/main/java/de/lunarakai/blockfox/BlockFoxPlugin.java b/src/main/java/de/lunarakai/blockfox/BlockFoxPlugin.java index 8cbdedb..09f539d 100644 --- a/src/main/java/de/lunarakai/blockfox/BlockFoxPlugin.java +++ b/src/main/java/de/lunarakai/blockfox/BlockFoxPlugin.java @@ -1,15 +1,45 @@ package de.lunarakai.blockfox; import de.iani.cubesideutils.bukkit.commands.CommandRouter; +import de.lunarakai.blockfox.commands.InfoCommand; import de.lunarakai.blockfox.commands.TestRSSCommand; +import de.lunarakai.blockfox.common.BlockFoxManager; +import de.lunarakai.blockfox.common.DisplayList; +import java.util.Locale; +import java.util.ResourceBundle; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.translation.GlobalTranslator; +import net.kyori.adventure.translation.TranslationRegistry; +import net.kyori.adventure.util.UTF8ResourceBundleControl; import org.bukkit.plugin.java.JavaPlugin; public final class BlockFoxPlugin extends JavaPlugin { + public static final String PERMISSION_USE = "blockfox.use"; + public static final String PERMISSION_ADMIN = "blockfox.admin"; + + private BlockFoxManager blockFoxManager; + private DisplayList displayList; @Override public void onEnable() { this.saveDefaultConfig(); + registerLocales(); + + getServer().getScheduler().runTask(this, this::onLateEnable); + } + + public void onLateEnable() { + displayList = new DisplayList(this); + displayList.load(); + + blockFoxManager = new BlockFoxManager(this); + + // Commands CommandRouter commandRouter = new CommandRouter(getCommand("blockfox")); + // Common + commandRouter.addCommandMapping(new InfoCommand(this), "info"); + + // RSS commandRouter.addCommandMapping(new TestRSSCommand(this), "testrss"); } @@ -18,4 +48,25 @@ public final class BlockFoxPlugin extends JavaPlugin { public void onDisable() { // Plugin shutdown logic } + + public DisplayList getDisplayList() { + return displayList; + } + + public BlockFoxManager getManager() { + return blockFoxManager; + } + + private void registerLocales() { + TranslationRegistry registry = TranslationRegistry.create(Key.key("blockfox:lang")); + + ResourceBundle bundle_en_US = ResourceBundle.getBundle("lang.en_US", Locale.US, UTF8ResourceBundleControl.get()); + registry.registerAll(Locale.US, bundle_en_US, true); + + ResourceBundle bundle_de_DE = ResourceBundle.getBundle("lang.de_DE", Locale.GERMAN, UTF8ResourceBundleControl.get()); + registry.registerAll(Locale.GERMAN, bundle_de_DE, true); + + GlobalTranslator.translator().addSource(registry); + } + } diff --git a/src/main/java/de/lunarakai/blockfox/commands/InfoCommand.java b/src/main/java/de/lunarakai/blockfox/commands/InfoCommand.java new file mode 100644 index 0000000..a652b07 --- /dev/null +++ b/src/main/java/de/lunarakai/blockfox/commands/InfoCommand.java @@ -0,0 +1,63 @@ +package de.lunarakai.blockfox.commands; + +import de.iani.cubesideutils.bukkit.commands.SubCommand; +import de.iani.cubesideutils.bukkit.commands.exceptions.DisallowsCommandBlockException; +import de.iani.cubesideutils.bukkit.commands.exceptions.IllegalSyntaxException; +import de.iani.cubesideutils.bukkit.commands.exceptions.InternalCommandException; +import de.iani.cubesideutils.bukkit.commands.exceptions.NoPermissionException; +import de.iani.cubesideutils.bukkit.commands.exceptions.RequiresPlayerException; +import de.iani.cubesideutils.commands.ArgsParser; +import de.lunarakai.blockfox.BlockFoxPlugin; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; + +public class InfoCommand extends SubCommand { + BlockFoxPlugin plugin; + + public InfoCommand(BlockFoxPlugin plugin) { + this.plugin = plugin; + } + + @Override + public String getUsage() { + return ""; + } + + @Override + public boolean requiresPlayer() { + return false; + } + + @Override + public String getRequiredPermission() { + return BlockFoxPlugin.PERMISSION_USE; + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String s, String s1, ArgsParser args) throws DisallowsCommandBlockException, RequiresPlayerException, NoPermissionException, IllegalSyntaxException, InternalCommandException { + sender.sendMessage(Component.text("--- ", NamedTextColor.AQUA) + .append(Component.text(plugin.getName(), NamedTextColor.GREEN)) + .append(Component.text(" ---", NamedTextColor.AQUA))); + + sender.sendMessage(Component.translatable("blockfox.info.version", NamedTextColor.AQUA) + .append(Component.text(": ", NamedTextColor.AQUA)) + .append(Component.text(plugin.getPluginMeta().getVersion(), NamedTextColor.GREEN))); + + sender.sendMessage(Component.translatable("blockfox.info.developer", NamedTextColor.AQUA) + .append(Component.text(": ", NamedTextColor.AQUA)) + .append(Component.text(plugin.getPluginMeta().getAuthors().getFirst(), NamedTextColor.GREEN))); + + sender.sendMessage(Component.translatable("blockfox.info.website", NamedTextColor.AQUA) + .append(Component.text(": ", NamedTextColor.AQUA)) + .append(Component.text(plugin.getPluginMeta().getWebsite(), NamedTextColor.GREEN))); + + sender.sendMessage(Component.translatable("blockfox.info.license", NamedTextColor.AQUA) + .append(Component.text(": ", NamedTextColor.AQUA)) + .append(Component.text("GPL-3.0", NamedTextColor.GREEN))); + + return true; + } +} + diff --git a/src/main/java/de/lunarakai/blockfox/common/BlockFoxDisplay.java b/src/main/java/de/lunarakai/blockfox/common/BlockFoxDisplay.java index 460efea..806b52d 100644 --- a/src/main/java/de/lunarakai/blockfox/common/BlockFoxDisplay.java +++ b/src/main/java/de/lunarakai/blockfox/common/BlockFoxDisplay.java @@ -2,6 +2,9 @@ package de.lunarakai.blockfox.common; import com.google.common.base.Preconditions; import de.lunarakai.blockfox.BlockFoxPlugin; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.List; import java.util.UUID; import org.bukkit.Location; @@ -17,14 +20,19 @@ public class BlockFoxDisplay { private final BlockFace orientation; private DisplayStatus displayStatus = DisplayStatus.INACTIVE; private BlockFoxDisplayMode blockFoxDisplayMode = BlockFoxDisplayMode.RSS_FEED; + private ArrayList savedLinks; private UUID[] textDisplays; private Player currentPlayer; + // Width = 5 + // Height = 3 + public BlockFoxDisplay(BlockFoxPlugin plugin, ConfigurationSection displaySection) { this.plugin = plugin; this.name = Preconditions.checkNotNull(displaySection.getString("name")); this.location = Preconditions.checkNotNull(displaySection.getLocation("location")); this.textDisplays = new UUID[99]; // TODO + this.savedLinks = new ArrayList<>(); BlockFace orientation = BlockFace.NORTH; try { @@ -38,7 +46,9 @@ public class BlockFoxDisplay { String modeValue = displaySection.getString("mode"); switch(modeValue) { + case "fixed_rss": this.blockFoxDisplayMode = BlockFoxDisplayMode.FIXED_RSS_FEED; break; case "fediverse": this.blockFoxDisplayMode = BlockFoxDisplayMode.FEDIVERSE_CLIENT; break; + case "fixed_fediverse": this.blockFoxDisplayMode = BlockFoxDisplayMode.FIXED_FEDIVERSE_CLIENT; break; default: this.blockFoxDisplayMode = BlockFoxDisplayMode.RSS_FEED; } @@ -49,7 +59,99 @@ public class BlockFoxDisplay { textDisplays[i] = UUID.fromString(textDisplay); } } + + List savedLinksList = displaySection.getStringList("savedlinks"); + for(int i = 0; i < savedLinksList.size(); i++) { + String link = savedLinksList.get(i); + if(link != null) { + try { + URI uri = new URI(savedLinksList.get(i)); + savedLinks.add(uri); + } catch (URISyntaxException e) { + throw new RuntimeException(e); + } + } + } } + public void save(ConfigurationSection displaySection) { + displaySection.set("name", name); + displaySection.set("location", location); + displaySection.set("orientation", orientation.name()); + displaySection.set("mode", blockFoxDisplayMode.getModeName()); + List textDisplays = new ArrayList<>(); + for(UUID uuid : this.textDisplays) { + textDisplays.add(uuid == null ? null : uuid.toString()); + } + displaySection.set("textdisplays", textDisplays); + List savedLinks = new ArrayList<>(); + for(URI url : this.savedLinks) { + savedLinks.add(url == null ? null : url.toString()); + } + displaySection.set("savedlinks", savedLinks); + } + public void addJoiningPlayer(Player player) { + Preconditions.checkNotNull(player); + Preconditions.checkState(displayStatus == DisplayStatus.INACTIVE); + this.displayStatus = DisplayStatus.ACTIVE; + this.currentPlayer = player; + } + + public String getName() { + return name; + } + + public boolean hasPlayer() { + return currentPlayer != null; + } + + public Player getCurrentPlayer() { + return currentPlayer; + } + + public Location getLocation() { + return location; + } + + public BlockFace getOrientation() { + return orientation; + } + + public DisplayStatus getDisplayStatus() { + return displayStatus; + } + + public UUID[] getTextDisplays() { + return textDisplays; + } + + public BlockFoxDisplayMode getBlockFoxDisplayMode() { + return blockFoxDisplayMode; + } + + public void setDisplayStatus(DisplayStatus status) { + this.displayStatus = status; + } + + public void setBlockFoxDisplayMode(BlockFoxDisplayMode mode) { + this.blockFoxDisplayMode = mode; + } + + public ArrayList getSavedLinks() { + return savedLinks; + } + + public void addLink(URI link) { + savedLinks.add(link); + } + + private int getRotationYaw() { + return switch (orientation) { + case EAST -> 90; + case SOUTH -> 180; + case WEST -> 270; + default -> 0; + }; + } } diff --git a/src/main/java/de/lunarakai/blockfox/common/BlockFoxDisplayMode.java b/src/main/java/de/lunarakai/blockfox/common/BlockFoxDisplayMode.java index 1f74d25..a7d6ea8 100644 --- a/src/main/java/de/lunarakai/blockfox/common/BlockFoxDisplayMode.java +++ b/src/main/java/de/lunarakai/blockfox/common/BlockFoxDisplayMode.java @@ -1,6 +1,18 @@ package de.lunarakai.blockfox.common; public enum BlockFoxDisplayMode { - RSS_FEED, - FEDIVERSE_CLIENT -} + RSS_FEED ("rss"), + FIXED_RSS_FEED ("fixed_rss"), + FEDIVERSE_CLIENT ("fediverse"), + FIXED_FEDIVERSE_CLIENT ("fixed_fediverse"); + + private final String name; + + BlockFoxDisplayMode(String mode) { + name = mode; + } + + public String getModeName() { + return this.name; + } + } diff --git a/src/main/java/de/lunarakai/blockfox/common/BlockFoxManager.java b/src/main/java/de/lunarakai/blockfox/common/BlockFoxManager.java index 4f1df63..41ccc50 100644 --- a/src/main/java/de/lunarakai/blockfox/common/BlockFoxManager.java +++ b/src/main/java/de/lunarakai/blockfox/common/BlockFoxManager.java @@ -1,4 +1,32 @@ package de.lunarakai.blockfox.common; +import com.google.common.base.Preconditions; +import de.lunarakai.blockfox.BlockFoxPlugin; +import de.lunarakai.lunarutils.chat.MessageUtils; +import org.bukkit.entity.Player; + public class BlockFoxManager { + private final BlockFoxPlugin plugin; + + public BlockFoxManager(BlockFoxPlugin plugin) { + this.plugin = plugin; + } + + public void joinDisplay(Player player, BlockFoxDisplay display) { + if(!player.hasPermission(BlockFoxPlugin.PERMISSION_USE)) { + return; + } + Preconditions.checkArgument(plugin.getDisplayList().getPlayerDisplay(player) == null, "player is already using a display"); + Preconditions.checkArgument(display.getDisplayStatus() == DisplayStatus.INACTIVE, "display is already in use"); + display.addJoiningPlayer(player); + plugin.getDisplayList().setBlockFoxDisplayForPlayer(player, display); + } + public void leaveDisplay(Player player, boolean message) { + BlockFoxDisplay display = plugin.getDisplayList().getPlayerDisplay(player); + Preconditions.checkArgument(display != null, "player is not using any display"); + plugin.getDisplayList().setBlockFoxDisplayForPlayer(player, null); + if(message) { + MessageUtils.sendSimpleInfoMessage(player, "blockfox.display.usagecanceled"); + } + } } diff --git a/src/main/java/de/lunarakai/blockfox/common/DisplayList.java b/src/main/java/de/lunarakai/blockfox/common/DisplayList.java index cec4028..eb34d5e 100644 --- a/src/main/java/de/lunarakai/blockfox/common/DisplayList.java +++ b/src/main/java/de/lunarakai/blockfox/common/DisplayList.java @@ -76,10 +76,10 @@ public class DisplayList { } private void setDisplayBlocks(BlockFoxDisplay blockFoxDisplay) { - for(Location loc : blockFoxDisplay.getBlocks()) { - bfdisplayBlocks.put(loc.clone(), blockFoxDisplay); - } - for(UUID uuid : blockFoxDisplay.getItemDisplays()) { +// for(Location loc : blockFoxDisplay.getBlocks()) { +// bfdisplayBlocks.put(loc.clone(), blockFoxDisplay); +// } + for(UUID uuid : blockFoxDisplay.getTextDisplays()) { if(uuid != null) { bfdisplayItemDisplays.put(uuid, blockFoxDisplay); } @@ -101,11 +101,11 @@ public class DisplayList { } public boolean collidesWithBlockFoxDisplay(BlockFoxDisplay newBlockFoxDisplay) { - for(Location location : newBlockFoxDisplay.getBlocks()) { - if(bfdisplayBlocks.get(location) != null) { - return true; - } - } +// for(Location location : newBlockFoxDisplay.getBlocks()) { +// if(bfdisplayBlocks.get(location) != null) { +// return true; +// } +// } return false; } @@ -131,18 +131,18 @@ public class DisplayList { public void removeBlockFoxDisplay(BlockFoxDisplay blockFoxDisplay) { if(blockFoxDisplay.hasPlayer()) { - plugin.getManager().quitDisplay(blockFoxDisplay.getCurrentPlayer(), true, true); + plugin.getManager().leaveDisplay(blockFoxDisplay.getCurrentPlayer(), true); } - for(UUID uuid : arena.getItemDisplays()) { + for(UUID uuid : blockFoxDisplay.getTextDisplays()) { if(uuid != null) { bfdisplayItemDisplays.remove(uuid); } } - for(Location block : blockFoxDisplay.getBlocks()) { - bfdisplayBlocks.remove(block); - } - blockFoxDisplay.removeItemDisplay(); +// for(Location block : blockFoxDisplay.getBlocks()) { +// bfdisplayBlocks.remove(block); +// } + //blockFoxDisplay.removeItemDisplay(); bfDisplays.remove(blockFoxDisplay.getName()); save(); diff --git a/src/main/java/de/lunarakai/blockfox/utils/HTMLUtils.java b/src/main/java/de/lunarakai/blockfox/utils/HTMLUtils.java index 3e0f818..42d5473 100644 --- a/src/main/java/de/lunarakai/blockfox/utils/HTMLUtils.java +++ b/src/main/java/de/lunarakai/blockfox/utils/HTMLUtils.java @@ -8,8 +8,7 @@ import org.jsoup.select.Elements; public class HTMLUtils { public static List formatHTMLList(Document document) { - // todo: format html elements to readable string (for example new line at ul li) - // todo: with current method ul li inside another ul li are duplicated + // Todo: needs a prettier solution but it works for one sub list point at least ^^ List list = new ArrayList<>(); Elements elements = document.select("ul"); Elements li = elements.select("li"); @@ -20,10 +19,6 @@ public class HTMLUtils { continue; } list.add("- " + element.text() + "\n"); - - - - } return list; } diff --git a/src/main/resources/lang/de_DE.properties b/src/main/resources/lang/de_DE.properties new file mode 100644 index 0000000..0f55711 --- /dev/null +++ b/src/main/resources/lang/de_DE.properties @@ -0,0 +1,6 @@ +blockfox.info.version=Version +blockfox.info.developer=Entwickelt von +blockfox.info.website=Website +blockfox.info.license=Lizenz + +blockfox.display.usagecanceled="Die Benutzung wurde abgebrochen" \ No newline at end of file diff --git a/src/main/resources/lang/en_US.properties b/src/main/resources/lang/en_US.properties new file mode 100644 index 0000000..765a328 --- /dev/null +++ b/src/main/resources/lang/en_US.properties @@ -0,0 +1,7 @@ +# Info Command +blockfox.info.version=Version +blockfox.info.developer=Developed by +blockfox.info.website=Website +blockfox.info.license=License + +blockfox.display.usagecanceled=The usage was canceled \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index a7dead5..7262026 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,10 +1,16 @@ name: BlockFox version: '${project.version}' main: de.lunarakai.blockfox.BlockFoxPlugin +author: LunarAkai +website: https://github.com/LunarAkai/BlockFox api-version: '1.21' depend: - CubesideUtils - LunarUtils commands: blockfox: - description: main command \ No newline at end of file + description: main command + +permissions: + blockfox.admin: {} + blockfox.use: {} \ No newline at end of file