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