Advertisement
Guest User

Untitled

a guest
Jan 19th, 2020
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.19 KB | None | 0 0
  1. package ru.greenpix.plugintk.placeholders;
  2.  
  3. import java.util.Map;
  4.  
  5. import org.apache.commons.lang.text.StrLookup;
  6. import org.apache.commons.lang.text.StrSubstitutor;
  7. import org.apache.commons.lang3.StringUtils;
  8. import org.bukkit.entity.Player;
  9.  
  10. import com.google.common.collect.Maps;
  11.  
  12. import lombok.Getter;
  13.  
  14. public abstract class PlaceholderProgram {
  15.  
  16.     private final static char SPECIAL = '$';
  17.    
  18.     private final static char SEPARATOR = ',';
  19.    
  20.     private final static String SECTION = ":";
  21.    
  22.     private final static String PREFIX = "{";
  23.    
  24.     private final static String SUFFIX = "}";
  25.    
  26.     /**
  27.      * Переопределенные и объявленные (новые) заполнители
  28.      */
  29.    
  30.     @Getter
  31.     private final Map<String, Placeholder> overrideAndDeclared = Maps.newHashMap();
  32.    
  33.     /**
  34.      * @return все заполнители всех плагинов
  35.      */
  36.    
  37.     public abstract Map<String, Placeholder> getGlobal();
  38.    
  39.     /**
  40.      * @param text - исходная строка
  41.      * @param player - игрок (может быть равен null)
  42.      * @param special - специальный объект в качестве аргумента (может быть равен null)
  43.      * @return строка, в которой все заполнители заменены
  44.      *
  45.      * Пример 1:
  46.      *  Допустим есть глобальный placeholder player_name, который возвращает имя игрока
  47.      *  Также у нас экземпляр игрока - player
  48.      *  -> replace("Hello {player_name}", player, null)
  49.      *  -> Результат: "Hello (Никнейм Игрока)"
  50.      *
  51.      * Пример 2:
  52.      *  Допустим есть placeholder town_name, который возвращает имя города
  53.      *  Также у нас экземпляр города - town
  54.      *  -> replace("Town {town_name}", null, town)
  55.      *  По игроку мы можем узнать его город, поэтому special не указываем
  56.      *  Как мы узнаем по игроку город определяется в самом Placeholder
  57.      *  -> replace("Town {town_name}", player, null)
  58.      *  -> Результат: "Town (Название Города)"
  59.      *
  60.      *  Пример 3:
  61.      *  Допустим есть placeholder ms%sec, который возвращает количество
  62.      *  миллисекунд, которое прошло за определенное количество секунд
  63.      *  По умолчанию это количество секунд, например, равно 1
  64.      *  -> replace("Millisecond {ms%sec}", null, null)
  65.      *  -> Результат: "Millisecond (от 0 до 999)"
  66.      *  Теперь мы хотим задать количество секунд равное 5
  67.      *  -> replace("Millisecond {ms%sec:5}, null, null);
  68.      *  -> Результат: "Millisecond (от 0 до 4999)"
  69.      *  Таким образом, после знака ':' идут аргументы.
  70.      *  Аргументов может быть несколько, они перечисляются через запятую.
  71.      */
  72.    
  73.     public String replace(String text, final Player player, final Object special) {
  74.         return new StrSubstitutor(new StrLookup() {
  75.             public String lookup(String argument) {
  76.                 return find(argument, player, special);
  77.             }
  78.         }, PREFIX, SUFFIX, StrSubstitutor.DEFAULT_ESCAPE).replace(text);
  79.     }
  80.    
  81.     private String find(String argument, Player player, Object special) {
  82.         if(argument.isEmpty()) {
  83.             return null;
  84.         }
  85.         String[] arr = StringUtils.split(argument, SECTION, 2);
  86.         if(special != null && arr[0].charAt(0) == SPECIAL) {
  87.             arr[0] = arr[0].substring(1, arr[0].length());
  88.         } else {
  89.             special = null;
  90.         }
  91.         Placeholder placeholder = getOverrideAndDeclared().get(arr[0]);
  92.         if(placeholder == null) {
  93.             placeholder = getGlobal().get(arr[0]);
  94.             if(placeholder == null) {
  95.                 return null;
  96.             }
  97.         }
  98.         if(arr.length == 1) {
  99.             return placeholder.replace(player, special);
  100.         } else {
  101.             return placeholder.replace(player, special, StringUtils.split(arr[1], SEPARATOR));
  102.         }
  103.     }
  104. }
  105.  
  106. public interface Placeholder {
  107.  
  108.     String replace(Player player, Object special, String... args);
  109.    
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement