Merge branch 'master' into feat/i18n
This commit is contained in:
@@ -44,6 +44,7 @@ import fr.xephi.authme.settings.properties.EmailSettings;
|
||||
import fr.xephi.authme.settings.properties.HooksSettings;
|
||||
import fr.xephi.authme.settings.properties.SecuritySettings;
|
||||
import fr.xephi.authme.task.CleanupTask;
|
||||
import fr.xephi.authme.task.Updater;
|
||||
import fr.xephi.authme.task.purge.PurgeService;
|
||||
import fr.xephi.authme.util.ExceptionUtils;
|
||||
import org.bukkit.Server;
|
||||
@@ -55,15 +56,10 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.Objects;
|
||||
import java.util.Scanner;
|
||||
import java.util.function.Consumer;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import static fr.xephi.authme.service.BukkitService.TICKS_PER_MINUTE;
|
||||
import static fr.xephi.authme.util.Utils.isClassLoaded;
|
||||
@@ -218,14 +214,15 @@ public class AuthMe extends JavaPlugin {
|
||||
}
|
||||
//detect server brand with classloader
|
||||
checkServerType();
|
||||
Objects.requireNonNull(getCommand("register")).setTabCompleter(new TabCompleteHandler());
|
||||
Objects.requireNonNull(getCommand("login")).setTabCompleter(new TabCompleteHandler());
|
||||
try {
|
||||
Objects.requireNonNull(getCommand("register")).setTabCompleter(new TabCompleteHandler());
|
||||
Objects.requireNonNull(getCommand("login")).setTabCompleter(new TabCompleteHandler());
|
||||
} catch (NullPointerException ignored) {
|
||||
}
|
||||
logger.info("AuthMeReReloaded is enabled successfully!");
|
||||
// Purge on start if enabled
|
||||
PurgeService purgeService = injector.getSingleton(PurgeService.class);
|
||||
purgeService.runAutoPurge();
|
||||
// 注册玩家加入事件监听
|
||||
// register3rdPartyListeners();
|
||||
logger.info("GitHub: https://github.com/HaHaWTH/AuthMeReReloaded/");
|
||||
if (settings.getProperty(SecuritySettings.CHECK_FOR_UPDATES)) {
|
||||
checkForUpdates();
|
||||
@@ -233,8 +230,6 @@ public class AuthMe extends JavaPlugin {
|
||||
}
|
||||
|
||||
|
||||
//Migrated
|
||||
|
||||
/**
|
||||
* Load the version and build number of the plugin from the description file.
|
||||
*
|
||||
@@ -402,7 +397,7 @@ public class AuthMe extends JavaPlugin {
|
||||
if (onShutdownPlayerSaver != null) {
|
||||
onShutdownPlayerSaver.saveAllPlayers();
|
||||
}
|
||||
if (settings.getProperty(EmailSettings.SHUTDOWN_MAIL)){
|
||||
if (settings != null && settings.getProperty(EmailSettings.SHUTDOWN_MAIL)) {
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy'.'MM'.'dd'.' HH:mm:ss");
|
||||
Date date = new Date(System.currentTimeMillis());
|
||||
emailService.sendShutDown(settings.getProperty(EmailSettings.SHUTDOWN_MAIL_ADDRESS),dateFormat.format(date));
|
||||
@@ -422,55 +417,19 @@ public class AuthMe extends JavaPlugin {
|
||||
ConsoleLogger.closeFileWriter();
|
||||
}
|
||||
|
||||
private static final String owner = "HaHaWTH";
|
||||
// private static final String owner_gitee = "Shixuehan114514";
|
||||
private static final String repo = "AuthMeReReloaded";
|
||||
|
||||
private void checkForUpdates() {
|
||||
logger.info("Checking for updates...");
|
||||
Updater updater = new Updater(pluginBuild + pluginBuildNumber);
|
||||
bukkitService.runTaskAsynchronously(() -> {
|
||||
try {
|
||||
// 从南通集线器获取最新版本号
|
||||
URL url = new URL("https://api.github.com/repos/" + owner + "/" + repo + "/releases/latest");
|
||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||
conn.setConnectTimeout(10000); // 设置连接超时为10秒
|
||||
conn.setReadTimeout(10000); // 设置读取超时为10秒
|
||||
Scanner scanner = new Scanner(conn.getInputStream());
|
||||
String response = scanner.useDelimiter("\\Z").next();
|
||||
scanner.close();
|
||||
|
||||
// 处理JSON响应
|
||||
String latestVersion = response.substring(response.indexOf("tag_name") + 11);
|
||||
latestVersion = latestVersion.substring(0, latestVersion.indexOf("\""));
|
||||
if (isUpdateAvailable(latestVersion)) {
|
||||
String message = "New version available! Latest:" + latestVersion + " Current:" + pluginBuild + pluginBuildNumber;
|
||||
getLogger().log(Level.WARNING, message);
|
||||
getLogger().log(Level.WARNING, "Download from here: https://github.com/HaHaWTH/AuthMeReReloaded/releases/latest");
|
||||
} else {
|
||||
getLogger().log(Level.INFO, "You are running the latest version.");
|
||||
}
|
||||
} catch (IOException ignored) {
|
||||
if (updater.isUpdateAvailable()) {
|
||||
String message = "New version available! Latest:" + updater.getLatestVersion() + " Current:" + pluginBuild + pluginBuildNumber;
|
||||
logger.warning(message);
|
||||
logger.warning("Download from here: https://github.com/HaHaWTH/AuthMeReReloaded/releases/latest");
|
||||
} else {
|
||||
logger.info("You are running the latest version.");
|
||||
}
|
||||
});
|
||||
}
|
||||
private boolean isUpdateAvailable(String latestVersion) {
|
||||
// Extract the first character and the remaining digits from the version string
|
||||
char latestChar = latestVersion.charAt(0);
|
||||
int latestNumber = Integer.parseInt(latestVersion.substring(1));
|
||||
|
||||
char currentChar = pluginBuild.charAt(0);
|
||||
int currentNumber = Integer.parseInt(pluginBuildNumber);
|
||||
|
||||
// Compare the characters first
|
||||
if (latestChar > currentChar) {
|
||||
return true;
|
||||
} else if (latestChar < currentChar) {
|
||||
return false;
|
||||
} else {
|
||||
// If the characters are the same, compare the numbers
|
||||
return latestNumber > currentNumber;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void checkServerType() {
|
||||
|
||||
@@ -265,6 +265,16 @@ public class AuthMeApi {
|
||||
management.forceLogin(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Force a player to login, i.e. the player is logged in without needing his password.
|
||||
*
|
||||
* @param player The player to log in
|
||||
* @param quiet Whether to suppress the login message
|
||||
*/
|
||||
public void forceLogin(Player player, boolean quiet) {
|
||||
management.forceLogin(player, quiet);
|
||||
}
|
||||
|
||||
/**
|
||||
* Force a player to logout.
|
||||
*
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package fr.xephi.authme.command.executable.authme;
|
||||
|
||||
import fr.xephi.authme.command.PlayerCommand;
|
||||
import fr.xephi.authme.service.BukkitService;
|
||||
import fr.xephi.authme.settings.Settings;
|
||||
import fr.xephi.authme.settings.SpawnLoader;
|
||||
import fr.xephi.authme.settings.properties.SecuritySettings;
|
||||
import fr.xephi.authme.util.TeleportUtils;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@@ -18,17 +18,17 @@ public class FirstSpawnCommand extends PlayerCommand {
|
||||
private Settings settings;
|
||||
@Inject
|
||||
private SpawnLoader spawnLoader;
|
||||
@Inject
|
||||
private BukkitService bukkitService;
|
||||
@Override
|
||||
public void runCommand(Player player, List<String> arguments) {
|
||||
if (spawnLoader.getFirstSpawn() == null) {
|
||||
player.sendMessage("[AuthMe] First spawn has failed, please try to define the first spawn");
|
||||
} else {
|
||||
//String name= player.getName();
|
||||
if(settings.getProperty(SecuritySettings.SMART_ASYNC_TELEPORT)) {
|
||||
bukkitService.runTaskIfFolia(player, () -> {
|
||||
TeleportUtils.teleport(player, spawnLoader.getFirstSpawn());
|
||||
} else {
|
||||
player.teleport(spawnLoader.getFirstSpawn());
|
||||
}
|
||||
});
|
||||
//player.teleport(spawnLoader.getFirstSpawn());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
package fr.xephi.authme.command.executable.authme;
|
||||
|
||||
import fr.xephi.authme.command.PlayerCommand;
|
||||
import fr.xephi.authme.service.BukkitService;
|
||||
import fr.xephi.authme.settings.SpawnLoader;
|
||||
import fr.xephi.authme.util.TeleportUtils;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import javax.inject.Inject;
|
||||
@@ -11,13 +13,15 @@ public class SpawnCommand extends PlayerCommand {
|
||||
|
||||
@Inject
|
||||
private SpawnLoader spawnLoader;
|
||||
@Inject
|
||||
private BukkitService bukkitService;
|
||||
|
||||
@Override
|
||||
public void runCommand(Player player, List<String> arguments) {
|
||||
if (spawnLoader.getSpawn() == null) {
|
||||
player.sendMessage("[AuthMe] Spawn has failed, please try to define the spawn");
|
||||
} else {
|
||||
player.teleport(spawnLoader.getSpawn());
|
||||
bukkitService.runTaskIfFolia(player, () -> TeleportUtils.teleport(player, spawnLoader.getSpawn()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ public class BedrockAutoLoginListener implements Listener {
|
||||
UUID uuid = event.getPlayer().getUniqueId();
|
||||
bukkitService.runTaskLater(player, () -> {
|
||||
if (isBedrockPlayer(uuid) && !authmeApi.isAuthenticated(player) && authmeApi.isRegistered(name)) {
|
||||
authmeApi.forceLogin(player);
|
||||
authmeApi.forceLogin(player, true);
|
||||
messages.send(player, MessageKey.BEDROCK_AUTO_LOGGED_IN);
|
||||
}
|
||||
},20L);
|
||||
|
||||
@@ -75,11 +75,7 @@ public class LoginLocationFixListener implements Listener {
|
||||
boolean solved = false;
|
||||
for (BlockFace face : faces) {
|
||||
if (JoinBlock.getRelative(face).getType().equals(Material.AIR) && JoinBlock.getRelative(face).getRelative(BlockFace.UP).getType().equals(Material.AIR)) {
|
||||
if (settings.getProperty(SecuritySettings.SMART_ASYNC_TELEPORT)) {
|
||||
TeleportUtils.teleport(player, JoinBlock.getRelative(face).getLocation().add(0.5, 0.1, 0.5));
|
||||
} else {
|
||||
player.teleport(JoinBlock.getRelative(face).getLocation().add(0.5, 0.1, 0.5));
|
||||
}
|
||||
TeleportUtils.teleport(player, JoinBlock.getRelative(face).getLocation().add(0.5, 0.1, 0.5));
|
||||
solved = true;
|
||||
break;
|
||||
}
|
||||
@@ -107,20 +103,12 @@ public class LoginLocationFixListener implements Listener {
|
||||
if (JoinBlock.getRelative(BlockFace.DOWN).getType().equals(Material.LAVA)) {
|
||||
JoinBlock.getRelative(BlockFace.DOWN).setType(Material.DIRT);
|
||||
}
|
||||
if (settings.getProperty(SecuritySettings.SMART_ASYNC_TELEPORT)) {
|
||||
TeleportUtils.teleport(player, JoinBlock.getLocation().add(0.5, 0.1, 0.5));
|
||||
} else {
|
||||
player.teleport(JoinBlock.getLocation().add(0.5, 0.1, 0.5));
|
||||
}
|
||||
TeleportUtils.teleport(player, JoinBlock.getLocation().add(0.5, 0.1, 0.5));
|
||||
messages.send(player, MessageKey.LOCATION_FIX_UNDERGROUND);
|
||||
break;
|
||||
}
|
||||
if (i == MaxHeight) {
|
||||
if (settings.getProperty(SecuritySettings.SMART_ASYNC_TELEPORT)) {
|
||||
TeleportUtils.teleport(player, JoinBlock.getLocation().add(0.5, 1.1, 0.5));
|
||||
} else {
|
||||
player.teleport(JoinBlock.getLocation().add(0.5, 1.1, 0.5));
|
||||
}
|
||||
TeleportUtils.teleport(player, JoinBlock.getLocation().add(0.5, 1.1, 0.5));
|
||||
messages.send(player, MessageKey.LOCATION_FIX_UNDERGROUND_CANT_FIX);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,8 +19,8 @@ import fr.xephi.authme.settings.SpawnLoader;
|
||||
import fr.xephi.authme.settings.properties.HooksSettings;
|
||||
import fr.xephi.authme.settings.properties.RegistrationSettings;
|
||||
import fr.xephi.authme.settings.properties.RestrictionSettings;
|
||||
import fr.xephi.authme.settings.properties.SecuritySettings;
|
||||
import fr.xephi.authme.util.TeleportUtils;
|
||||
import fr.xephi.authme.util.message.MiniMessageUtils;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.HumanEntity;
|
||||
@@ -220,7 +220,7 @@ public class PlayerListener implements Listener{
|
||||
|
||||
String customJoinMessage = settings.getProperty(RegistrationSettings.CUSTOM_JOIN_MESSAGE);
|
||||
if (!customJoinMessage.isEmpty()) {
|
||||
customJoinMessage = ChatColor.translateAlternateColorCodes('&', customJoinMessage);
|
||||
customJoinMessage = ChatColor.translateAlternateColorCodes('&', MiniMessageUtils.parseMiniMessageToLegacy(customJoinMessage));
|
||||
event.setJoinMessage(customJoinMessage
|
||||
.replace("{PLAYERNAME}", player.getName())
|
||||
.replace("{DISPLAYNAME}", player.getDisplayName())
|
||||
@@ -375,17 +375,9 @@ public class PlayerListener implements Listener{
|
||||
Location spawn = spawnLoader.getSpawnLocation(player);
|
||||
if (spawn != null && spawn.getWorld() != null) {
|
||||
if (!player.getWorld().equals(spawn.getWorld())) {
|
||||
if(settings.getProperty(SecuritySettings.SMART_ASYNC_TELEPORT)) {
|
||||
TeleportUtils.teleport(player,spawn);
|
||||
} else {
|
||||
player.teleport(spawn);
|
||||
}
|
||||
TeleportUtils.teleport(player,spawn);
|
||||
} else if (spawn.distance(player.getLocation()) > settings.getProperty(ALLOWED_MOVEMENT_RADIUS)) {
|
||||
if(settings.getProperty(SecuritySettings.SMART_ASYNC_TELEPORT)) {
|
||||
TeleportUtils.teleport(player,spawn);
|
||||
} else {
|
||||
player.teleport(spawn);
|
||||
}
|
||||
TeleportUtils.teleport(player,spawn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import fr.xephi.authme.mail.EmailService;
|
||||
import fr.xephi.authme.output.ConsoleLoggerFactory;
|
||||
import fr.xephi.authme.util.expiring.Duration;
|
||||
import fr.xephi.authme.util.message.I18NUtils;
|
||||
import fr.xephi.authme.util.message.MiniMessageUtils;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -129,8 +130,8 @@ public class Messages {
|
||||
if (sender instanceof Player) {
|
||||
displayName = ((Player) sender).getDisplayName();
|
||||
}
|
||||
|
||||
return ChatColor.translateAlternateColorCodes('&', message)
|
||||
|
||||
return ChatColor.translateAlternateColorCodes('&', MiniMessageUtils.parseMiniMessageToLegacy(message))
|
||||
.replace(NEWLINE_TAG, "\n")
|
||||
.replace(USERNAME_TAG, sender.getName())
|
||||
.replace(DISPLAYNAME_TAG, displayName);
|
||||
@@ -146,7 +147,7 @@ public class Messages {
|
||||
private String retrieveMessage(MessageKey key, String name) {
|
||||
String message = messagesFileHandler.getMessage(key.getKey());
|
||||
|
||||
return ChatColor.translateAlternateColorCodes('&', message)
|
||||
return ChatColor.translateAlternateColorCodes('&', MiniMessageUtils.parseMiniMessageToLegacy(message))
|
||||
.replace(NEWLINE_TAG, "\n")
|
||||
.replace(USERNAME_TAG, name)
|
||||
.replace(DISPLAYNAME_TAG, name);
|
||||
|
||||
@@ -13,7 +13,6 @@ import fr.xephi.authme.service.bungeecord.BungeeSender;
|
||||
import fr.xephi.authme.service.bungeecord.MessageType;
|
||||
import fr.xephi.authme.service.velocity.VMessageType;
|
||||
import fr.xephi.authme.service.velocity.VelocitySender;
|
||||
import fr.xephi.authme.settings.properties.RestrictionSettings;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import javax.inject.Inject;
|
||||
@@ -65,11 +64,11 @@ public class AsynchronousLogout implements AsynchronousProcess {
|
||||
PlayerAuth auth = playerCache.getAuth(name);
|
||||
database.updateSession(auth);
|
||||
// TODO: send an update when a messaging service will be implemented (SESSION)
|
||||
if (service.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) {
|
||||
auth.setQuitLocation(player.getLocation());
|
||||
database.updateQuitLoc(auth);
|
||||
//if (service.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) {
|
||||
auth.setQuitLocation(player.getLocation());
|
||||
database.updateQuitLoc(auth);
|
||||
// TODO: send an update when a messaging service will be implemented (QUITLOC)
|
||||
}
|
||||
//} AuthMeReReloaded - Always save quit location
|
||||
|
||||
playerCache.removePlayer(name);
|
||||
codeManager.unverify(name);
|
||||
|
||||
@@ -12,7 +12,6 @@ import fr.xephi.authme.service.SessionService;
|
||||
import fr.xephi.authme.service.ValidationService;
|
||||
import fr.xephi.authme.settings.SpawnLoader;
|
||||
import fr.xephi.authme.settings.properties.PluginSettings;
|
||||
import fr.xephi.authme.settings.properties.RestrictionSettings;
|
||||
import fr.xephi.authme.util.PlayerUtils;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -68,13 +67,16 @@ public class AsynchronousQuit implements AsynchronousProcess {
|
||||
boolean wasLoggedIn = playerCache.isAuthenticated(name);
|
||||
|
||||
if (wasLoggedIn) {
|
||||
if (service.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) {
|
||||
Location loc = spawnLoader.getPlayerLocationOrSpawn(player);
|
||||
PlayerAuth auth = PlayerAuth.builder()
|
||||
.name(name).location(loc)
|
||||
.realName(player.getName()).build();
|
||||
database.updateQuitLoc(auth);
|
||||
}
|
||||
//if (service.getProperty(RestrictionSettings.SAVE_QUIT_LOCATION)) {
|
||||
// AuthMeReReloaded - Always save quit location on quit
|
||||
Location loc = spawnLoader.getPlayerLocationOrSpawn(player);
|
||||
PlayerAuth authLoc = PlayerAuth.builder()
|
||||
.name(name).location(loc)
|
||||
.realName(player.getName()).build();
|
||||
database.updateQuitLoc(authLoc);
|
||||
// AuthMeReReloaded - Fix AuthMe#2769 -1
|
||||
//}
|
||||
|
||||
|
||||
String ip = PlayerUtils.getPlayerIp(player);
|
||||
PlayerAuth auth = PlayerAuth.builder()
|
||||
|
||||
@@ -14,7 +14,6 @@ import fr.xephi.authme.output.ConsoleLoggerFactory;
|
||||
import fr.xephi.authme.settings.Settings;
|
||||
import fr.xephi.authme.settings.SpawnLoader;
|
||||
import fr.xephi.authme.settings.properties.RestrictionSettings;
|
||||
import fr.xephi.authme.settings.properties.SecuritySettings;
|
||||
import fr.xephi.authme.util.TeleportUtils;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
@@ -189,10 +188,8 @@ public class TeleportationService implements Reloadable {
|
||||
private void performTeleportation(final Player player, final AbstractTeleportEvent event) {
|
||||
bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(() -> {
|
||||
bukkitService.callEvent(event);
|
||||
if (player.isOnline() && isEventValid(event) && settings.getProperty(SecuritySettings.SMART_ASYNC_TELEPORT)) {
|
||||
if (player.isOnline() && isEventValid(event)) {
|
||||
TeleportUtils.teleport(player, event.getTo());
|
||||
} else if (player.isOnline() && isEventValid(event)) {
|
||||
player.teleport(event.getTo());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ public final class ProtectionSettings implements SettingsHolder {
|
||||
|
||||
@Comment("Kicks the player that issued a command before the defined time after the join process")
|
||||
public static final Property<Integer> QUICK_COMMANDS_DENIED_BEFORE_MILLISECONDS =
|
||||
newProperty("Protection.quickCommands.denyCommandsBeforeMilliseconds", 3000);
|
||||
newProperty("Protection.quickCommands.denyCommandsBeforeMilliseconds", 1000);
|
||||
|
||||
private ProtectionSettings() {
|
||||
}
|
||||
|
||||
@@ -48,11 +48,6 @@ public final class SecuritySettings implements SettingsHolder {
|
||||
public static final Property<Boolean> ADVANCED_SHULKER_FIX =
|
||||
newProperty("3rdPartyFeature.fixes.advancedShulkerFix", false);
|
||||
|
||||
@Comment({"Choose the best teleport method by server brand?",
|
||||
"(Enable this if you are using Paper/Folia)"})
|
||||
public static final Property<Boolean> SMART_ASYNC_TELEPORT =
|
||||
newProperty("3rdPartyFeature.optimizes.smartAsyncTeleport", true);
|
||||
|
||||
@Comment("Send a GUI captcha to unregistered players?(Requires ProtocolLib)")
|
||||
public static final Property<Boolean> GUI_CAPTCHA =
|
||||
newProperty("3rdPartyFeature.features.captcha.guiCaptcha", false);
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
package fr.xephi.authme.task;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
import java.util.Scanner;
|
||||
|
||||
public class Updater {
|
||||
private final String currentVersion;
|
||||
private String latestVersion;
|
||||
private static boolean isUpdateAvailable = false;
|
||||
private static final String owner = "HaHaWTH";
|
||||
private static final String repo = "AuthMeReReloaded";
|
||||
private static final String UPDATE_URL = "https://api.github.com/repos/" + owner + "/" + repo + "/releases/latest";
|
||||
|
||||
public Updater(String currentVersion) {
|
||||
this.currentVersion = currentVersion;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check if there is an update available
|
||||
* Note: This method will perform a network request!
|
||||
*
|
||||
* @return true if there is an update available, false otherwise
|
||||
*/
|
||||
public boolean isUpdateAvailable() {
|
||||
URI uri = URI.create(UPDATE_URL);
|
||||
try {
|
||||
URL url = uri.toURL();
|
||||
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
||||
conn.setConnectTimeout(10000);
|
||||
conn.setReadTimeout(10000);
|
||||
Scanner scanner = new Scanner(conn.getInputStream());
|
||||
String response = scanner.useDelimiter("\\Z").next();
|
||||
scanner.close();
|
||||
String latestVersion = response.substring(response.indexOf("tag_name") + 11);
|
||||
latestVersion = latestVersion.substring(0, latestVersion.indexOf("\""));
|
||||
this.latestVersion = latestVersion;
|
||||
isUpdateAvailable = !currentVersion.equals(latestVersion);
|
||||
return isUpdateAvailable;
|
||||
} catch (IOException ignored) {
|
||||
this.latestVersion = null;
|
||||
isUpdateAvailable = false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public String getLatestVersion() {
|
||||
return latestVersion;
|
||||
}
|
||||
|
||||
public String getCurrentVersion() {
|
||||
return currentVersion;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if there is an update available, false otherwise
|
||||
* Must be called after {@link Updater#isUpdateAvailable()}
|
||||
*
|
||||
* @return A boolean indicating whether there is an update available
|
||||
*/
|
||||
public static boolean hasUpdate() {
|
||||
return isUpdateAvailable;
|
||||
}
|
||||
}
|
||||
@@ -10,7 +10,7 @@ public final class PlayerUtils {
|
||||
// Utility class
|
||||
private PlayerUtils() {
|
||||
}
|
||||
private static final boolean IS_LEAVES_SERVER = Utils.isClassLoaded("top.leavesmc.leaves.LeavesConfig");
|
||||
private static final boolean isLeavesServer = Utils.isClassLoaded("top.leavesmc.leaves.LeavesConfig") || Utils.isClassLoaded("org.leavesmc.leaves.LeavesConfig");
|
||||
|
||||
/**
|
||||
* Returns the IP of the given player.
|
||||
@@ -29,7 +29,7 @@ public final class PlayerUtils {
|
||||
* @return True if the player is an NPC, false otherwise
|
||||
*/
|
||||
public static boolean isNpc(Player player) {
|
||||
if (IS_LEAVES_SERVER) {
|
||||
if (isLeavesServer) {
|
||||
return player.hasMetadata("NPC") || player.getAddress() == null;
|
||||
} else {
|
||||
return player.hasMetadata("NPC");
|
||||
|
||||
@@ -3,24 +3,24 @@ package fr.xephi.authme.util;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.invoke.MethodHandle;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.lang.invoke.MethodType;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
|
||||
/**
|
||||
* This class is a utility class for handling async teleportation of players in game.
|
||||
*/
|
||||
public class TeleportUtils {
|
||||
private static Method teleportAsyncMethod;
|
||||
private static MethodHandle teleportAsyncMethodHandle;
|
||||
|
||||
static {
|
||||
try {//Detect Paper class
|
||||
Class<?> paperClass = Class.forName("com.destroystokyo.paper.PaperConfig");
|
||||
teleportAsyncMethod = Player.class.getMethod("teleportAsync", Location.class);
|
||||
teleportAsyncMethod.setAccessible(true);
|
||||
// if detected,use teleportAsync()
|
||||
} catch (ClassNotFoundException | NoSuchMethodException e) {
|
||||
teleportAsyncMethod = null;
|
||||
//if not, set method to null
|
||||
try {
|
||||
MethodHandles.Lookup lookup = MethodHandles.lookup();
|
||||
teleportAsyncMethodHandle = lookup.findVirtual(Player.class, "teleportAsync", MethodType.methodType(CompletableFuture.class, Location.class));
|
||||
} catch (NoSuchMethodException | IllegalAccessException e) {
|
||||
teleportAsyncMethodHandle = null;
|
||||
// if not, set method handle to null
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,10 +31,10 @@ public class TeleportUtils {
|
||||
* @param location Where should the player be teleported
|
||||
*/
|
||||
public static void teleport(Player player, Location location) {
|
||||
if (teleportAsyncMethod != null) {
|
||||
if (teleportAsyncMethodHandle != null) {
|
||||
try {
|
||||
teleportAsyncMethod.invoke(player, location);
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
teleportAsyncMethodHandle.invoke(player, location);
|
||||
} catch (Throwable throwable) {
|
||||
player.teleport(location);
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
package fr.xephi.authme.util.message;
|
||||
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
||||
|
||||
public class MiniMessageUtils {
|
||||
private static final MiniMessage miniMessage = MiniMessage.miniMessage();
|
||||
|
||||
/**
|
||||
* Parse a MiniMessage string into a legacy string.
|
||||
*
|
||||
* @param message The message to parse.
|
||||
* @return The parsed message.
|
||||
*/
|
||||
public static String parseMiniMessageToLegacy(String message) {
|
||||
Component component = miniMessage.deserialize(message);
|
||||
return LegacyComponentSerializer.legacyAmpersand().serialize(component);
|
||||
}
|
||||
|
||||
private MiniMessageUtils() {
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user