Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package ru.greenpix.plugintk.placeholders;
- import java.util.Map;
- import org.apache.commons.lang.text.StrLookup;
- import org.apache.commons.lang.text.StrSubstitutor;
- import org.apache.commons.lang3.StringUtils;
- import org.bukkit.entity.Player;
- import com.google.common.collect.Maps;
- import lombok.Getter;
- public abstract class PlaceholderProgram {
- private final static char SPECIAL = '$';
- private final static char SEPARATOR = ',';
- private final static String SECTION = ":";
- private final static String PREFIX = "{";
- private final static String SUFFIX = "}";
- /**
- * Переопределенные и объявленные (новые) заполнители
- */
- @Getter
- private final Map<String, Placeholder> overrideAndDeclared = Maps.newHashMap();
- /**
- * @return все заполнители всех плагинов
- */
- public abstract Map<String, Placeholder> getGlobal();
- /**
- * @param text - исходная строка
- * @param player - игрок (может быть равен null)
- * @param special - специальный объект в качестве аргумента (может быть равен null)
- * @return строка, в которой все заполнители заменены
- *
- * Пример 1:
- * Допустим есть глобальный placeholder player_name, который возвращает имя игрока
- * Также у нас экземпляр игрока - player
- * -> replace("Hello {player_name}", player, null)
- * -> Результат: "Hello (Никнейм Игрока)"
- *
- * Пример 2:
- * Допустим есть placeholder town_name, который возвращает имя города
- * Также у нас экземпляр города - town
- * -> replace("Town {town_name}", null, town)
- * По игроку мы можем узнать его город, поэтому special не указываем
- * Как мы узнаем по игроку город определяется в самом Placeholder
- * -> replace("Town {town_name}", player, null)
- * -> Результат: "Town (Название Города)"
- *
- * Пример 3:
- * Допустим есть placeholder ms%sec, который возвращает количество
- * миллисекунд, которое прошло за определенное количество секунд
- * По умолчанию это количество секунд, например, равно 1
- * -> replace("Millisecond {ms%sec}", null, null)
- * -> Результат: "Millisecond (от 0 до 999)"
- * Теперь мы хотим задать количество секунд равное 5
- * -> replace("Millisecond {ms%sec:5}, null, null);
- * -> Результат: "Millisecond (от 0 до 4999)"
- * Таким образом, после знака ':' идут аргументы.
- * Аргументов может быть несколько, они перечисляются через запятую.
- */
- public String replace(String text, final Player player, final Object special) {
- return new StrSubstitutor(new StrLookup() {
- public String lookup(String argument) {
- return find(argument, player, special);
- }
- }, PREFIX, SUFFIX, StrSubstitutor.DEFAULT_ESCAPE).replace(text);
- }
- private String find(String argument, Player player, Object special) {
- if(argument.isEmpty()) {
- return null;
- }
- String[] arr = StringUtils.split(argument, SECTION, 2);
- if(special != null && arr[0].charAt(0) == SPECIAL) {
- arr[0] = arr[0].substring(1, arr[0].length());
- } else {
- special = null;
- }
- Placeholder placeholder = getOverrideAndDeclared().get(arr[0]);
- if(placeholder == null) {
- placeholder = getGlobal().get(arr[0]);
- if(placeholder == null) {
- return null;
- }
- }
- if(arr.length == 1) {
- return placeholder.replace(player, special);
- } else {
- return placeholder.replace(player, special, StringUtils.split(arr[1], SEPARATOR));
- }
- }
- }
- public interface Placeholder {
- String replace(Player player, Object special, String... args);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement