diff --git a/build.gradle b/build.gradle index 4884c99..a5fa628 100644 --- a/build.gradle +++ b/build.gradle @@ -24,6 +24,7 @@ ext { 'commons-lang:commons-lang', 'org.yaml:snakeyaml' ]], + commons_text: 'org.apache.commons:commons-text:1.9', lombok: 'org.projectlombok:lombok:1.18.12' ] } @@ -42,4 +43,5 @@ dependencies { annotationProcessor libs.lombok compileOnly2 libs.bukkit + implementation libs.commons_text } \ No newline at end of file diff --git a/src/main/java/ghast/EventContext.java b/src/main/java/ghast/EventContext.java index 5a9a33a..1ddd732 100644 --- a/src/main/java/ghast/EventContext.java +++ b/src/main/java/ghast/EventContext.java @@ -3,6 +3,7 @@ package ghast; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.bukkit.Bukkit; +import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -17,6 +18,7 @@ import java.util.function.Consumer; public class EventContext implements Listener { private static final BooleanSupplier EMPTY_FILTER = () -> true; + private static final Consumer CANCEL_EVENT = event -> event.setCancelled(true); private final Map, Consumer> eventMap = new HashMap<>(); private BooleanSupplier filter = EMPTY_FILTER; @@ -31,8 +33,7 @@ public class EventContext implements Listener { eventMap.remove(eventType); } else { eventMap.put(eventType, consumer); - Bukkit.getPluginManager().registerEvent(eventType, this, eventPriority, - this::eventExecute, GhastTools.getPlugin()); + bukkitRegisterEvent(eventType, eventPriority); } return this; } @@ -41,6 +42,21 @@ public class EventContext implements Listener { return onEvent(eventType, EventPriority.NORMAL, consumer); } + public EventContext cancelEvent(Class eventType, EventPriority eventPriority) { + eventMap.put(eventType, CANCEL_EVENT); + bukkitRegisterEvent(eventType, eventPriority); + return this; + } + + public EventContext cancelEvent(Class eventType) { + return cancelEvent(eventType, EventPriority.NORMAL); + } + + private void bukkitRegisterEvent(Class eventType, EventPriority eventPriority) { + Bukkit.getPluginManager().registerEvent(eventType, this, eventPriority, + this::eventExecute, GhastTools.getPlugin()); + } + @SuppressWarnings({ "unchecked", "rawtypes" }) private void eventExecute(Listener listener, Event event) { Consumer consumer = eventMap.get(event.getClass()); diff --git a/src/main/java/ghast/GhastTools.java b/src/main/java/ghast/GhastTools.java index 39fdd11..a374852 100644 --- a/src/main/java/ghast/GhastTools.java +++ b/src/main/java/ghast/GhastTools.java @@ -23,6 +23,20 @@ public class GhastTools { } } + @SuppressWarnings("java:S112") + public Plugin getPlugin() { + if (refPlugin == null) { + throw new RuntimeException("Plugin not set."); + } + + Plugin plugin = refPlugin.get(); + if (plugin == null) { + throw new RuntimeException("Plugin not set."); + } + + return plugin; + } + @SuppressWarnings("java:S112") public YamlConfiguration loadConfig(boolean saveDefault) { if (saveDefault) { @@ -39,18 +53,4 @@ public class GhastTools { public YamlConfiguration loadConfig() { return loadConfig(true); } - - @SuppressWarnings("java:S112") - Plugin getPlugin() { - if (refPlugin == null) { - throw new RuntimeException("Plugin not set."); - } - - Plugin plugin = refPlugin.get(); - if (plugin == null) { - throw new RuntimeException("Plugin not set."); - } - - return plugin; - } } diff --git a/src/main/java/ghast/I18n.java b/src/main/java/ghast/I18n.java new file mode 100644 index 0000000..c56c826 --- /dev/null +++ b/src/main/java/ghast/I18n.java @@ -0,0 +1,91 @@ +package ghast; + +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Table; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.experimental.UtilityClass; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.text.StringSubstitutor; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.Reader; +import java.util.HashMap; +import java.util.Map; + +@UtilityClass +@SuppressWarnings("unused") +public class I18n { + + private final String DEFAULT_LANG = "en"; + private final Table messagesMap = HashBasedTable.create(); + + //region Load messages + @SuppressWarnings("java:S112") + public void loadMessages(String lang, Reader reader) { + Map map = messagesMap.row(lang.toLowerCase()); + + try { + BufferedReader bufferedReader = new BufferedReader(reader); + String line; + while ((line = bufferedReader.readLine()) != null) { + String[] split = line.split("=", 2); + map.put(split[0].trim().toLowerCase(), split[1].trim()); + } + } catch (IOException e) { + throw new RuntimeException("Error load messages: " + e.getMessage(), e); + } + } + + public void loadMessages(String lang, Map messages) { + Map map = messagesMap.row(lang.toLowerCase()); + messages.forEach((k, v) -> map.put(k.toLowerCase(), v)); + } + + public void loadMessages(Reader reader) { + loadMessages(DEFAULT_LANG, reader); + } + + public void loadMessages(Map messages) { + loadMessages(DEFAULT_LANG, messages); + } + //endregion + + //region Get message + public String get(String lang, String key) { + return messagesMap.row(lang.toLowerCase()).getOrDefault(key.toLowerCase(), StringUtils.EMPTY); + } + + public String get(String lang, String key, Map params) { + return StringSubstitutor.replace(get(lang, key.toLowerCase()), params, "{", "}"); + } + + public String get(String key) { + return get(DEFAULT_LANG, key); + } + + public String get(String key, Map params) { + return get(DEFAULT_LANG, key, params); + } + //endregion + + public ParamBuilder paramBuilder() { + return new ParamBuilder(); + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + public static class ParamBuilder { + + private final Map params = new HashMap<>(); + + public ParamBuilder add(String key, Object value) { + params.put(key, value); + return this; + } + + public Map build() { + return params; + } + } +} diff --git a/src/main/java/ghast/XLog.java b/src/main/java/ghast/XLog.java index cbadd99..b480aad 100644 --- a/src/main/java/ghast/XLog.java +++ b/src/main/java/ghast/XLog.java @@ -7,6 +7,7 @@ import java.util.logging.Level; import static java.text.MessageFormat.format; @UtilityClass +@SuppressWarnings("unused") public class XLog { //region Debug