1
mirror of https://github.com/CarmJos/EasyPlugin.git synced 2026-06-04 16:48:16 +08:00

[v1.3.0] 版本更新

- [U] 添加 MessagesInitializer 与 MessagesConfig 等相关消息配置,用于快捷创建消息静态类进行消文本消息的处理。
This commit is contained in:
2022-01-09 13:13:30 +08:00
parent 2ac6fc1485
commit f15e0a5bec
21 changed files with 597 additions and 213 deletions
+1 -1
View File
@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easyplugin-parent</artifactId> <artifactId>easyplugin-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>1.2.0</version> <version>1.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easyplugin-parent</artifactId> <artifactId>easyplugin-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>1.2.0</version> <version>1.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easyplugin-parent</artifactId> <artifactId>easyplugin-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>1.2.0</version> <version>1.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easyplugin-parent</artifactId> <artifactId>easyplugin-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>1.2.0</version> <version>1.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easyplugin-parent</artifactId> <artifactId>easyplugin-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>1.2.0</version> <version>1.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@@ -27,15 +27,15 @@ public class FileConfig {
return messageConfiguration == null ? null : messageConfiguration.get(); return messageConfiguration == null ? null : messageConfiguration.get();
} }
private long updateTime; protected long updateTime;
private final JavaPlugin plugin; protected final JavaPlugin plugin;
private final File fileFolder; protected final File fileFolder;
private final String fileName; protected final String fileName;
private final String resourcePath; protected final String resourcePath;
private File file; protected File file;
private FileConfiguration config; protected FileConfiguration config;
public FileConfig(@NotNull JavaPlugin plugin) throws IOException { public FileConfig(@NotNull JavaPlugin plugin) throws IOException {
this(plugin, "config.yml"); this(plugin, "config.yml");
@@ -57,11 +57,10 @@ public class FileConfig {
this.resourcePath = resourcePath; this.resourcePath = resourcePath;
this.fileFolder = fileFolder; this.fileFolder = fileFolder;
this.fileName = fileName; this.fileName = fileName;
initFile(); initFile();
} }
private void initFile() throws IOException { protected void initFile() throws IOException {
if (!getFileFolder().exists()) getFileFolder().mkdirs(); if (!getFileFolder().exists()) getFileFolder().mkdirs();
this.file = new File(getFileFolder(), fileName); this.file = new File(getFileFolder(), fileName);
@@ -0,0 +1,105 @@
package cc.carm.lib.easyplugin.configuration.language;
import cc.carm.lib.easyplugin.configuration.file.FileConfig;
import cc.carm.lib.easyplugin.configuration.values.ConfigValue;
import cc.carm.lib.easyplugin.utils.ColorParser;
import cc.carm.lib.easyplugin.utils.MessageUtils;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collections;
public class EasyMessage {
@Nullable ConfigValue<String> configValue;
@Nullable String defaultValue;
@Nullable String[] messageParams;
public EasyMessage() {
this(null);
}
public EasyMessage(@Nullable String defaultValue) {
this(defaultValue, null);
}
public EasyMessage(@Nullable String defaultValue, @Nullable String[] messageParams) {
this.defaultValue = defaultValue;
this.messageParams = messageParams;
}
public void initialize(@NotNull FileConfig sourceConfig, @NotNull String sectionName) {
this.configValue = new ConfigValue<>(sourceConfig, sectionName, String.class, getDefaultValue());
}
private @Nullable String getDefaultValue() {
return defaultValue;
}
private @Nullable String[] getMessageParams() {
return messageParams;
}
private @NotNull String getDefaultMessages() {
if (getDefaultValue() == null) return "";
else return getDefaultValue();
}
private @NotNull String getMessages() {
if (configValue == null) {
return getDefaultMessages();
} else {
return configValue.get();
}
}
public @NotNull String get(@Nullable CommandSender sender) {
return get(sender, null);
}
public @NotNull String get(@Nullable CommandSender sender, @Nullable Object[] values) {
return get(sender, getMessageParams(), values);
}
public @NotNull String get(@Nullable CommandSender sender, @Nullable String[] params, @Nullable Object[] values) {
if (sender == null) return getMessages();
if (params == null || values == null) {
return ColorParser.parse(MessageUtils.setPlaceholders(sender, getMessages()));
} else {
return ColorParser.parse(MessageUtils.setPlaceholders(sender, getMessages(), params, values));
}
}
public void send(@Nullable CommandSender sender) {
send(sender, null);
}
public void send(@Nullable CommandSender sender, @Nullable Object[] values) {
send(sender, getMessageParams(), values);
}
public void send(@Nullable CommandSender sender, @Nullable String[] params, @Nullable Object[] values) {
if (params == null || values == null) {
MessageUtils.sendWithPlaceholders(sender, getMessages());
} else {
MessageUtils.sendWithPlaceholders(sender, Collections.singletonList(getMessages()), params, values);
}
}
public void sendToAll() {
sendToAll(null);
}
public void sendToAll(@Nullable Object[] values) {
sendToAll(messageParams, values);
}
public void sendToAll(@Nullable String[] params, @Nullable Object[] values) {
Bukkit.getOnlinePlayers().forEach(pl -> send(pl, params, values));
}
}
@@ -0,0 +1,110 @@
package cc.carm.lib.easyplugin.configuration.language;
import cc.carm.lib.easyplugin.configuration.file.FileConfig;
import cc.carm.lib.easyplugin.configuration.values.ConfigValueList;
import cc.carm.lib.easyplugin.utils.MessageUtils;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Unmodifiable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class EasyMessageList {
@Nullable ConfigValueList<String> configValue;
@Nullable String[] defaultValue;
@Nullable String[] messageParams;
public EasyMessageList() {
this((String[]) null);
}
public EasyMessageList(@Nullable String... defaultValue) {
this(defaultValue, null);
}
public EasyMessageList(@Nullable String[] defaultValue,
@Nullable String[] messageParams) {
this.defaultValue = defaultValue;
this.messageParams = messageParams;
}
public void initialize(FileConfig sourceConfig, String sectionName) {
configValue = new ConfigValueList<>(sourceConfig, sectionName, String.class, getDefaultValue());
}
private @Nullable String[] getDefaultValue() {
return defaultValue;
}
@Unmodifiable
private @NotNull List<String> getDefaultMessages() {
if (getDefaultValue() == null) return new ArrayList<>();
else return Arrays.asList(getDefaultValue());
}
private @Nullable String[] getMessageParams() {
return messageParams;
}
private @NotNull List<String> getMessages() {
if (configValue == null) {
return getDefaultMessages();
} else {
return configValue.get();
}
}
public @NotNull List<String> get(@Nullable CommandSender sender) {
return get(sender, null);
}
public @NotNull List<String> get(@Nullable CommandSender sender, @Nullable Object[] values) {
return get(sender, getMessageParams(), values);
}
public @NotNull List<String> get(@Nullable CommandSender sender, @Nullable String[] params, @Nullable Object[] values) {
if (sender == null) return getMessages();
if (params == null || values == null) {
return MessageUtils.setPlaceholders(sender, getMessages());
} else {
return MessageUtils.setPlaceholders(sender, getMessages(), params, values);
}
}
public void send(@Nullable CommandSender sender) {
send(sender, null);
}
public void send(@Nullable CommandSender sender, @Nullable Object[] values) {
send(sender, getMessageParams(), values);
}
public void send(@Nullable CommandSender sender, @Nullable String[] params, @Nullable Object[] values) {
if (params == null || values == null) {
MessageUtils.sendWithPlaceholders(sender, getMessages());
} else {
MessageUtils.sendWithPlaceholders(sender, getMessages(), params, values);
}
}
public void sendToAll() {
sendToAll(null);
}
public void sendToAll(@Nullable Object[] values) {
sendToAll(messageParams, values);
}
public void sendToAll(@Nullable String[] params, @Nullable Object[] values) {
Bukkit.getOnlinePlayers().forEach(pl -> send(pl, params, values));
}
}
@@ -0,0 +1,39 @@
package cc.carm.lib.easyplugin.configuration.language;
import cc.carm.lib.easyplugin.configuration.file.FileConfig;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
@SuppressWarnings("ResultOfMethodCallIgnored")
public class MessagesConfig extends FileConfig {
public MessagesConfig(@NotNull JavaPlugin plugin) throws IOException {
this(plugin, "messages.yml");
}
public MessagesConfig(@NotNull JavaPlugin plugin, @NotNull String fileName) throws IOException {
this(plugin, plugin.getDataFolder(), fileName);
}
public MessagesConfig(@NotNull JavaPlugin plugin, @NotNull File fileFolder, @NotNull String fileName) throws IOException {
super(plugin, fileName, fileFolder, fileName);
}
@Override
public void initFile() throws IOException {
if (!getFileFolder().exists()) getFileFolder().mkdirs();
this.file = new File(getFileFolder(), fileName);
if (!file.exists()) file.createNewFile();
this.config = YamlConfiguration.loadConfiguration(this.file);
}
@Override
public void save() throws IOException {
getConfig().save(getFile());
}
}
@@ -0,0 +1,100 @@
package cc.carm.lib.easyplugin.configuration.language;
import cc.carm.lib.easyplugin.configuration.file.FileConfig;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;
public class MessagesInitializer {
private MessagesInitializer() {
// 静态方法类,不应当实例化。
}
public static void initialize(FileConfig source, Class<? extends MessagesRoot> rootClazz) {
initialize(source, rootClazz, true);
}
public static void initialize(FileConfig source, Class<? extends MessagesRoot> rootClazz, boolean saveDefault) {
MessagesSection sectionAnnotation = rootClazz.getAnnotation(MessagesSection.class);
String rootSection = null;
if (sectionAnnotation != null && sectionAnnotation.value().length() > 1) {
rootSection = sectionAnnotation.value();
}
for (Class<?> innerClass : rootClazz.getDeclaredClasses()) {
initSection(source, rootSection, innerClass, saveDefault);
}
for (Field field : rootClazz.getFields()) {
initMessage(source, rootSection, rootClazz, field, saveDefault);
}
if (saveDefault) {
try {
source.save();
} catch (IOException ignore) {
}
}
}
private static void initSection(FileConfig source, String parentSection, Class<?> clazz, boolean saveDefault) {
if (!Modifier.isStatic(clazz.getModifiers()) || !Modifier.isPublic(clazz.getModifiers())) return;
String section = getSection(clazz.getSimpleName(), parentSection, clazz.getAnnotation(MessagesSection.class));
for (Class<?> innerClass : clazz.getDeclaredClasses()) initSection(source, section, innerClass, saveDefault);
for (Field field : clazz.getFields()) initMessage(source, section, clazz, field, saveDefault);
}
private static void initMessage(FileConfig source, String parentSection, Class<?> clazz, Field field, boolean saveDefault) {
try {
String section = getSection(field.getName(), parentSection, field.getAnnotation(MessagesSection.class));
Object object = field.get(clazz);
if (object instanceof EasyMessage) {
EasyMessage message = ((EasyMessage) object);
if (saveDefault && message.defaultValue != null && !source.getConfig().contains(section)) {
source.getConfig().set(section, message.defaultValue);
}
message.initialize(source, section);
} else if (object instanceof EasyMessageList) {
EasyMessageList messageList = ((EasyMessageList) object);
if (saveDefault && messageList.defaultValue != null && !source.getConfig().contains(section)) {
source.getConfig().set(section, Arrays.asList(messageList.defaultValue));
}
messageList.initialize(source, section);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
private static String getSection(@NotNull String name,
@Nullable String parentSection,
@Nullable MessagesSection sectionAnnotation) {
String parent = parentSection != null ? parentSection + "." : "";
if (sectionAnnotation != null && sectionAnnotation.value().length() > 0) {
return parent + sectionAnnotation.value();
} else {
return parent + getSectionName(name);
}
}
private static String getSectionName(String codeName) {
return codeName.toLowerCase().replace("_", "-");
}
}
@@ -0,0 +1,5 @@
package cc.carm.lib.easyplugin.configuration.language;
public abstract class MessagesRoot {
}
@@ -0,0 +1,14 @@
package cc.carm.lib.easyplugin.configuration.language;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MessagesSection {
String value() default "";
}
+1 -1
View File
@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easyplugin-parent</artifactId> <artifactId>easyplugin-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>1.2.0</version> <version>1.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easyplugin-parent</artifactId> <artifactId>easyplugin-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>1.2.0</version> <version>1.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easyplugin-parent</artifactId> <artifactId>easyplugin-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>1.2.0</version> <version>1.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easyplugin-parent</artifactId> <artifactId>easyplugin-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>1.2.0</version> <version>1.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@@ -1,8 +1,11 @@
package cc.carm.lib.easyplugin.utils; package cc.carm.lib.easyplugin.utils;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class ColorParser { public class ColorParser {
@@ -11,6 +14,14 @@ public class ColorParser {
return parseColor(text); return parseColor(text);
} }
public static String[] parse(String... texts) {
return parse(Arrays.asList(texts)).toArray(new String[0]);
}
public static List<String> parse(List<String> texts) {
return texts.stream().map(ColorParser::parse).collect(Collectors.toList());
}
public static String parseColor(final String text) { public static String parseColor(final String text) {
return text.replaceAll("&", "§").replace("§§", "&"); return text.replaceAll("&", "§").replace("§§", "&");
} }
@@ -18,6 +18,11 @@ public class MessageUtils {
return Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null; return Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null;
} }
public static void send(@Nullable CommandSender sender, String... messages) {
send(sender, Arrays.asList(messages));
}
public static void send(@Nullable CommandSender sender, List<String> messages) { public static void send(@Nullable CommandSender sender, List<String> messages) {
if (messages == null || messages.isEmpty() || sender == null) return; if (messages == null || messages.isEmpty() || sender == null) return;
for (String s : messages) { for (String s : messages) {
@@ -25,10 +30,6 @@ public class MessageUtils {
} }
} }
public static void send(@Nullable CommandSender sender, String... messages) {
send(sender, Arrays.asList(messages));
}
public static void sendWithPlaceholders(CommandSender sender, String... messages) { public static void sendWithPlaceholders(CommandSender sender, String... messages) {
sendWithPlaceholders(sender, Arrays.asList(messages)); sendWithPlaceholders(sender, Arrays.asList(messages));
} }
+1 -1
View File
@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easyplugin-parent</artifactId> <artifactId>easyplugin-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>1.2.0</version> <version>1.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>easyplugin-parent</artifactId> <artifactId>easyplugin-parent</artifactId>
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<version>1.2.0</version> <version>1.3.0</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
+1 -1
View File
@@ -14,7 +14,7 @@
<groupId>cc.carm.lib</groupId> <groupId>cc.carm.lib</groupId>
<artifactId>easyplugin-parent</artifactId> <artifactId>easyplugin-parent</artifactId>
<packaging>pom</packaging> <packaging>pom</packaging>
<version>1.2.0</version> <version>1.3.0</version>
<modules> <modules>
<module>easyplugin-bom</module> <module>easyplugin-bom</module>