SimonOrJ/GetMeHome

View on GitHub
src/main/java/com/simonorj/mc/getmehome/MessageTool.java

Summary

Maintainability
A
0 mins
Test Coverage
package com.simonorj.mc.getmehome;
 
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
 
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
 
public class MessageTool {
private static ClassLoader loader = null;
private static String base(I18n i18n, Locale locale, Object... args) {
String msg = getBundleString(i18n, locale);
 
return String.format(msg, args);
}
 
private static String getBundleString(I18n i18n, Locale locale) {
if (loader != null) {
try {
return ResourceBundle.getBundle("GetMeHome", locale, loader).getString(i18n.toString());
} catch (NullPointerException | MissingResourceException ignore) {}
}
 
return ResourceBundle.getBundle("i18n.GetMeHome", locale).getString(i18n.toString());
}
 
static void reloadI18n(File i18nFolder) {
if (!i18nFolder.isDirectory()) {
loader = null;
return;
}
 
try {
URL[] urls = {i18nFolder.toURI().toURL()};
loader = new URLClassLoader(urls);
} catch (MalformedURLException e) {
e.printStackTrace();
loader = null;
}
}
 
public static String raw(I18n i18n, CommandSender p, Object... args) {
return base(i18n, getLocale(p), args);
}
 
public static String prefixed(I18n i18n, CommandSender p, Object... args) {
String pre = GetMeHome.getInstance().getPrefix();
if (!pre.isEmpty()) pre += ' ';
 
ChatColor focus = GetMeHome.getInstance().getFocusColor();
ChatColor content = GetMeHome.getInstance().getContentColor();
 
for (int i = args.length - 1; i >= 0; i--) {
args[i] = focus + args[i].toString() + content;
}
 
return pre + content + base(i18n, getLocale(p), args);
}
 
public static String error(I18n i18n, CommandSender p, Object... args) {
String pre = GetMeHome.getInstance().getPrefix();
if (!pre.isEmpty()) pre += ' ';
 
for (int i = args.length - 1; i >= 0; i--) {
args[i] = args[i].toString();
}
 
return pre + ChatColor.RED + base(i18n, getLocale(p), args);
}
 
private static Locale getLocale(CommandSender sender) {
if (!(sender instanceof Player))
return Locale.getDefault();
 
Player p = (Player) sender;
 
Method method = null;
for (Method m : p.getClass().getDeclaredMethods()) {
if (m.getName().equals("getHandle"))
method = m;
}
if (method == null) {
return Locale.getDefault();
}
 
String locale;
 
try {
Object ep = method.invoke(p, (Object[]) null);
Field f = ep.getClass().getDeclaredField("locale");
f.setAccessible(true);
locale = (String) f.get(ep);
} catch (IllegalAccessException | InvocationTargetException | NoSuchFieldException e) {
e.printStackTrace();
return Locale.getDefault();
}
 
String[] l = locale.split("_", 3);
 
if (l.length == 1)
return new Locale(l[0]);
 
if (l.length == 2)
return new Locale(l[0],l[1]);
 
return new Locale(l[0],l[1],l[2]);
}
}