Compare commits

..

8 Commits

Author SHA1 Message Date
HaHaWTH
2a40c2be36 Remove relocation 2024-07-23 11:19:40 +08:00
HaHaWTH
a4312fdb51 Remove relocation 2024-07-23 09:35:14 +08:00
HaHaWTH
cadd5ddb24 throw ClassCastException 2024-07-23 01:48:23 +08:00
HaHaWTH
2d10e77b6c Support for kick message 2024-07-23 01:37:20 +08:00
HaHaWTH
3b6160c91f Support for kick message 2024-07-23 00:51:48 +08:00
HaHaWTH
8df6a008c8 replace direct char references with constants
Replace direct references to the '§' and '&' chars with named constants
to improve code readability and maintainability within the MiniMessageUtils
class
2024-07-22 15:31:05 +08:00
HaHaWTH
2b8450f27e Convert manually 2024-07-22 15:15:25 +08:00
HaHaWTH
58f8176dae Bukkit Audience 2024-07-22 14:29:02 +08:00
32 changed files with 318 additions and 96 deletions

View File

@ -41,7 +41,7 @@ jobs:
javaVersion: '17' javaVersion: '17'
- mcVersion: '1.20.4' - mcVersion: '1.20.4'
javaVersion: '21' javaVersion: '21'
- mcVersion: '1.21.1' - mcVersion: '1.21'
javaVersion: '21' javaVersion: '21'
steps: steps:
- uses: HaHaWTH/minecraft-plugin-runtime-test@paper - uses: HaHaWTH/minecraft-plugin-runtime-test@paper

View File

@ -27,14 +27,15 @@
10. Player login logic improvement to reduce lag 10. Player login logic improvement to reduce lag
11. Automatically purge bot data 11. Automatically purge bot data
12. **Folia support (in active testing)** 12. **Folia support (in active testing)**
13. **Velocity support (See [Velocity Support](./vc-support.md))** 13. Offhand Menu compatibility(Thats amazing)
14. Support Virtual Threads caching 14. **Velocity support (See [Velocity Support](./vc-support.md))**
15. Automatically fix portal stuck issue 15. Support Virtual Threads caching
16. Automatically login for Bedrock players(configurable) 16. Automatically fix portal stuck issue
17. Fix shulker box crash bug on legacy versions(MC 1.13-) 17. Automatically login for Bedrock players(configurable)
18. **H2 database support** 18. Fix shulker box crash bug on legacy versions(MC 1.13-)
19. **100% compatibility with original authme and extensions** 19. **H2 database support**
20. More...... 20. **100% compatibility with original authme and extensions**
21. More......
**Download links:** **Download links:**
[Releases](https://github.com/HaHaWTH/AuthMeReReloaded/releases/latest) [Releases](https://github.com/HaHaWTH/AuthMeReReloaded/releases/latest)

60
pom.xml
View File

@ -67,7 +67,7 @@
<maven.minimumVersion>3.6.3</maven.minimumVersion> <maven.minimumVersion>3.6.3</maven.minimumVersion>
<!-- Dependencies versions --> <!-- Dependencies versions -->
<spigot.version>1.21.1-R0.1-SNAPSHOT</spigot.version> <spigot.version>1.20.6-R0.1-SNAPSHOT</spigot.version>
<!-- Versioning properties --> <!-- Versioning properties -->
<project.outputName>AuthMe</project.outputName> <project.outputName>AuthMe</project.outputName>
@ -111,7 +111,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId> <artifactId>maven-javadoc-plugin</artifactId>
<version>3.11.1</version> <version>3.8.0</version>
<configuration> <configuration>
<failOnError>false</failOnError> <failOnError>false</failOnError>
<failOnWarnings>false</failOnWarnings> <failOnWarnings>false</failOnWarnings>
@ -454,18 +454,6 @@
<pattern>com.alessiodp.libby</pattern> <pattern>com.alessiodp.libby</pattern>
<shadedPattern>fr.xephi.authme.libs.com.alessiodp.libby</shadedPattern> <shadedPattern>fr.xephi.authme.libs.com.alessiodp.libby</shadedPattern>
</relocation> </relocation>
<relocation>
<pattern>net.kyori.adventure</pattern>
<shadedPattern>fr.xephi.authme.libs.net.kyori.adventure</shadedPattern>
</relocation>
<relocation>
<pattern>net.kyori.examination</pattern>
<shadedPattern>fr.xephi.authme.libs.net.kyori.examination</shadedPattern>
</relocation>
<relocation>
<pattern>net.kyori.option</pattern>
<shadedPattern>fr.xephi.authme.libs.net.kyori.option</shadedPattern>
</relocation>
</relocations> </relocations>
<filters> <filters>
@ -497,19 +485,19 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId> <artifactId>maven-install-plugin</artifactId>
<version>3.1.3</version> <version>3.1.2</version>
</plugin> </plugin>
<!-- Deploy the jars as artifacts into the remote repository --> <!-- Deploy the jars as artifacts into the remote repository -->
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId> <artifactId>maven-deploy-plugin</artifactId>
<version>3.1.3</version> <version>3.1.2</version>
</plugin> </plugin>
<!-- Handle documentation generation, required by other plugins --> <!-- Handle documentation generation, required by other plugins -->
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId> <artifactId>maven-site-plugin</artifactId>
<version>3.21.0</version> <version>3.12.1</version>
</plugin> </plugin>
<!-- Publish coveralls test coverage reports, not included in the build cycle by default --> <!-- Publish coveralls test coverage reports, not included in the build cycle by default -->
<plugin> <plugin>
@ -631,9 +619,8 @@
<!-- Multiverse Repo --> <!-- Multiverse Repo -->
<repository> <repository>
<id>multiverse-multiverse-releases</id> <id>onarandombox-repo-releases</id>
<name>Multiverse Repository</name> <url>https://repo.onarandombox.com/content/repositories/multiverse/</url>
<url>https://repo.onarandombox.com/multiverse-releases</url>
<releases> <releases>
<enabled>true</enabled> <enabled>true</enabled>
</releases> </releases>
@ -641,6 +628,22 @@
<enabled>false</enabled> <enabled>false</enabled>
</snapshots> </snapshots>
</repository> </repository>
<repository>
<id>onarandombox-repo-snapshots</id>
<url>https://repo.onarandombox.com/content/repositories/multiverse-snapshots/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<!-- FoliaLib -->
<repository>
<id>devmart-other</id>
<url>https://nexuslite.gcnt.net/repos/other/</url>
</repository>
<repository> <repository>
<id>opencollab-snapshot</id> <id>opencollab-snapshot</id>
@ -886,14 +889,9 @@
<dependency> <dependency>
<groupId>net.kyori</groupId> <groupId>net.kyori</groupId>
<artifactId>adventure-platform-bukkit</artifactId> <artifactId>adventure-platform-bukkit</artifactId>
<version>4.3.4</version> <version>4.3.3</version>
</dependency> </dependency>
<dependency>
<groupId>net.kyori</groupId>
<artifactId>adventure-text-serializer-gson</artifactId>
<version>4.17.0</version>
</dependency>
<!-- LuckPerms plugin --> <!-- LuckPerms plugin -->
<dependency> <dependency>
<groupId>net.luckperms</groupId> <groupId>net.luckperms</groupId>
@ -969,8 +967,8 @@
<!-- Multi World plugin, https://www.spigotmc.org/resources/multiverse-core.390/ --> <!-- Multi World plugin, https://www.spigotmc.org/resources/multiverse-core.390/ -->
<dependency> <dependency>
<groupId>com.onarandombox.multiversecore</groupId> <groupId>com.onarandombox.multiversecore</groupId>
<artifactId>multiverse-core</artifactId> <artifactId>Multiverse-Core</artifactId>
<version>4.3.14</version> <version>4.3.1</version>
<type>jar</type> <type>jar</type>
<scope>provided</scope> <scope>provided</scope>
<exclusions> <exclusions>
@ -1127,7 +1125,7 @@
<dependency> <dependency>
<groupId>org.checkerframework</groupId> <groupId>org.checkerframework</groupId>
<artifactId>checker-qual</artifactId> <artifactId>checker-qual</artifactId>
<version>3.48.0</version> <version>3.45.0</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
@ -1143,7 +1141,7 @@
<dependency> <dependency>
<groupId>org.xerial</groupId> <groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId> <artifactId>sqlite-jdbc</artifactId>
<version>3.47.1.0</version> <version>3.46.0.0</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>

View File

@ -31,6 +31,7 @@ import fr.xephi.authme.listener.ServerListener;
import fr.xephi.authme.mail.EmailService; import fr.xephi.authme.mail.EmailService;
import fr.xephi.authme.output.ConsoleLoggerFactory; import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.security.crypts.Sha256; import fr.xephi.authme.security.crypts.Sha256;
import fr.xephi.authme.service.AdventureService;
import fr.xephi.authme.service.BackupService; import fr.xephi.authme.service.BackupService;
import fr.xephi.authme.service.BukkitService; import fr.xephi.authme.service.BukkitService;
import fr.xephi.authme.service.MigrationService; import fr.xephi.authme.service.MigrationService;
@ -76,11 +77,12 @@ public class AuthMe extends JavaPlugin {
// Version and build number values // Version and build number values
private static String pluginVersion = "5.7.0-Fork"; private static String pluginVersion = "5.7.0-Fork";
private static final String pluginBuild = "b"; private static final String pluginBuild = "b";
private static String pluginBuildNumber = "53"; private static String pluginBuildNumber = "52";
// Private instances // Private instances
private EmailService emailService; private EmailService emailService;
private CommandHandler commandHandler; private CommandHandler commandHandler;
private static TaskScheduler scheduler; private static TaskScheduler scheduler;
private static AdventureService adventureService;
@Inject @Inject
public static Settings settings; public static Settings settings;
private DataSource database; private DataSource database;
@ -139,6 +141,13 @@ public class AuthMe extends JavaPlugin {
return scheduler; return scheduler;
} }
/**
* Get the AdventureService
*/
public static AdventureService getAdventureService() {
return adventureService;
}
/** /**
* The library manager * The library manager
*/ */
@ -153,6 +162,8 @@ public class AuthMe extends JavaPlugin {
loadPluginInfo(getDescription().getVersion()); loadPluginInfo(getDescription().getVersion());
scheduler = UniversalScheduler.getScheduler(this); scheduler = UniversalScheduler.getScheduler(this);
libraryManager = new BukkitLibraryManager(this); libraryManager = new BukkitLibraryManager(this);
adventureService = new AdventureService(this);
adventureService.init();
// Set the Logger instance and log file path // Set the Logger instance and log file path
ConsoleLogger.initialize(getLogger(), new File(getDataFolder(), LOG_FILENAME)); ConsoleLogger.initialize(getLogger(), new File(getDataFolder(), LOG_FILENAME));
@ -403,6 +414,11 @@ public class AuthMe extends JavaPlugin {
// Wait for tasks and close data source // Wait for tasks and close data source
new TaskCloser(database).run(); new TaskCloser(database).run();
// Close AdventureService
if (adventureService != null) {
adventureService.close();
}
// Disabled correctly // Disabled correctly
Consumer<String> infoLogMethod = logger == null ? getLogger()::info : logger::info; Consumer<String> infoLogMethod = logger == null ? getLogger()::info : logger::info;
infoLogMethod.accept("AuthMe " + this.getDescription().getVersion() + " is unloaded successfully!"); infoLogMethod.accept("AuthMe " + this.getDescription().getVersion() + " is unloaded successfully!");

View File

@ -15,6 +15,8 @@ import fr.xephi.authme.util.PlayerUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
import javax.inject.Inject; import javax.inject.Inject;
import java.time.Instant; import java.time.Instant;
@ -24,6 +26,8 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Optional; import java.util.Optional;
import static fr.xephi.authme.listener.PlayerListener.PENDING_INVENTORIES;
/** /**
* The current API of AuthMe. * The current API of AuthMe.
* *
@ -257,6 +261,18 @@ public class AuthMeApi {
return dataSource.saveAuth(auth); return dataSource.saveAuth(auth);
} }
/**
* Open an inventory for the given player at any time.
*
* @param player The player to open the inventory for
* @param inventory The inventory to open
* @return The inventory view
*/
public InventoryView openInventory(Player player, Inventory inventory) {
PENDING_INVENTORIES.add(inventory);
return player.openInventory(inventory);
}
/** /**
* Force a player to login, i.e. the player is logged in without needing his password. * Force a player to login, i.e. the player is logged in without needing his password.
* *

View File

@ -12,6 +12,7 @@ import fr.xephi.authme.service.BukkitService;
import fr.xephi.authme.service.CommonService; import fr.xephi.authme.service.CommonService;
import fr.xephi.authme.service.ValidationService; import fr.xephi.authme.service.ValidationService;
import fr.xephi.authme.service.ValidationService.ValidationResult; import fr.xephi.authme.service.ValidationService.ValidationResult;
import fr.xephi.authme.util.message.MiniMessageUtils;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -79,7 +80,7 @@ public class RegisterAdminCommand implements ExecutableCommand {
if (player != null) { if (player != null) {
bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(() -> bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(() ->
// AuthMeReReloaded - Folia compatibility // AuthMeReReloaded - Folia compatibility
bukkitService.runTaskIfFolia(player, () -> player.kickPlayer(commonService.retrieveSingleMessage(player, MessageKey.KICK_FOR_ADMIN_REGISTER)))); bukkitService.runTaskIfFolia(player, () -> MiniMessageUtils.kickPlayer(player, MiniMessageUtils.parseMiniMessage(commonService.retrieveSingleMessage(player, MessageKey.KICK_FOR_ADMIN_REGISTER)))));
} }
}); });
} }

View File

@ -8,7 +8,6 @@ import fr.xephi.authme.process.Management;
import fr.xephi.authme.service.CommonService; import fr.xephi.authme.service.CommonService;
import fr.xephi.authme.service.ValidationService; import fr.xephi.authme.service.ValidationService;
import fr.xephi.authme.service.ValidationService.ValidationResult; import fr.xephi.authme.service.ValidationService.ValidationResult;
import fr.xephi.authme.settings.properties.SecuritySettings;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
@ -43,14 +42,11 @@ public class ChangePasswordCommand extends PlayerCommand {
commonService.send(player, MessageKey.NOT_LOGGED_IN); commonService.send(player, MessageKey.NOT_LOGGED_IN);
return; return;
} }
// Check if the user has been verified or not
if (commonService.getProperty(SecuritySettings.CHANGE_PASSWORD_EMAIL_VERIFICATION_REQUIRED)) { if (codeManager.isVerificationRequired(player)) {
// Check if the user has been verified or not codeManager.codeExistOrGenerateNew(name);
if (codeManager.isVerificationRequired(player)) { commonService.send(player, MessageKey.VERIFICATION_CODE_REQUIRED);
codeManager.codeExistOrGenerateNew(name); return;
commonService.send(player, MessageKey.VERIFICATION_CODE_REQUIRED);
return;
}
} }
String oldPassword = arguments.get(0); String oldPassword = arguments.get(0);

View File

@ -9,6 +9,7 @@ import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.properties.SecuritySettings; import fr.xephi.authme.settings.properties.SecuritySettings;
import fr.xephi.authme.util.PlayerUtils; import fr.xephi.authme.util.PlayerUtils;
import fr.xephi.authme.util.expiring.TimedCounter; import fr.xephi.authme.util.expiring.TimedCounter;
import fr.xephi.authme.util.message.MiniMessageUtils;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
@ -106,7 +107,7 @@ public class TempbanManager implements SettingsDependent, HasCleanup {
bukkitService.runTask(player,() -> { // AuthMeReReloaded - Folia compatibility bukkitService.runTask(player,() -> { // AuthMeReReloaded - Folia compatibility
if (customCommand.isEmpty()) { if (customCommand.isEmpty()) {
bukkitService.banIp(ip, reason, expires, "AuthMe"); bukkitService.banIp(ip, reason, expires, "AuthMe");
player.kickPlayer(reason); MiniMessageUtils.kickPlayer(player, MiniMessageUtils.parseMiniMessage(reason));
} else { } else {
String command = customCommand String command = customCommand
.replace("%player%", name) .replace("%player%", name)

View File

@ -3,6 +3,7 @@ package fr.xephi.authme.listener;
import fr.xephi.authme.message.MessageKey; import fr.xephi.authme.message.MessageKey;
import fr.xephi.authme.service.CommonService; import fr.xephi.authme.service.CommonService;
import fr.xephi.authme.util.message.MiniMessageUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -26,7 +27,7 @@ public class DoubleLoginFixListener implements Listener {
HashSet<String> PlayerSet = new HashSet<String>(); HashSet<String> PlayerSet = new HashSet<String>();
for (Player ep : PlayerList) { for (Player ep : PlayerList) {
if (PlayerSet.contains(ep.getName().toLowerCase())) { if (PlayerSet.contains(ep.getName().toLowerCase())) {
ep.kickPlayer(service.retrieveSingleMessage(ep.getPlayer(), MessageKey.DOUBLE_LOGIN_FIX)); MiniMessageUtils.kickPlayer(ep, MiniMessageUtils.parseMiniMessage(service.retrieveSingleMessage(ep.getPlayer(), MessageKey.DOUBLE_LOGIN_FIX)));
break; break;
} }
PlayerSet.add(ep.getName().toLowerCase()); PlayerSet.add(ep.getName().toLowerCase());

View File

@ -18,6 +18,7 @@ import fr.xephi.authme.settings.properties.RegistrationSettings;
import fr.xephi.authme.settings.properties.RestrictionSettings; import fr.xephi.authme.settings.properties.RestrictionSettings;
import fr.xephi.authme.util.StringUtils; import fr.xephi.authme.util.StringUtils;
import fr.xephi.authme.util.Utils; import fr.xephi.authme.util.Utils;
import fr.xephi.authme.util.message.MiniMessageUtils;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerLoginEvent;
@ -140,7 +141,7 @@ public class OnJoinVerifier implements Reloadable {
Player nonVipPlayer = generateKickPlayer(onlinePlayers); Player nonVipPlayer = generateKickPlayer(onlinePlayers);
if (nonVipPlayer != null) { if (nonVipPlayer != null) {
// AuthMeReReloaded - Folia compatibility // AuthMeReReloaded - Folia compatibility
bukkitService.runTaskIfFolia(nonVipPlayer, () -> nonVipPlayer.kickPlayer(messages.retrieveSingle(player, MessageKey.KICK_FOR_VIP))); bukkitService.runTaskIfFolia(nonVipPlayer, () -> MiniMessageUtils.kickPlayer(nonVipPlayer, MiniMessageUtils.parseMiniMessage(messages.retrieveSingle(player, MessageKey.KICK_FOR_VIP))));
event.allow(); event.allow();
return false; return false;
} else { } else {

View File

@ -52,9 +52,12 @@ import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.player.PlayerShearEntityEvent; import org.bukkit.event.player.PlayerShearEntityEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.InventoryView;
import javax.inject.Inject; import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Set; import java.util.Set;
@ -95,6 +98,8 @@ public class PlayerListener implements Listener {
@Inject @Inject
private QuickCommandsProtectionManager quickCommandsProtectionManager; private QuickCommandsProtectionManager quickCommandsProtectionManager;
public static List<Inventory> PENDING_INVENTORIES = new ArrayList<>();
// Lowest priority to apply fast protection checks // Lowest priority to apply fast protection checks
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onAsyncPlayerPreLoginEventLowest(AsyncPlayerPreLoginEvent event) { public void onAsyncPlayerPreLoginEventLowest(AsyncPlayerPreLoginEvent event) {
@ -214,7 +219,7 @@ public class PlayerListener implements Listener {
String customJoinMessage = settings.getProperty(RegistrationSettings.CUSTOM_JOIN_MESSAGE); String customJoinMessage = settings.getProperty(RegistrationSettings.CUSTOM_JOIN_MESSAGE);
if (!customJoinMessage.isEmpty()) { if (!customJoinMessage.isEmpty()) {
customJoinMessage = ChatColor.translateAlternateColorCodes('&', MiniMessageUtils.parseMiniMessageToLegacy(customJoinMessage)); customJoinMessage = ChatColor.translateAlternateColorCodes('&', customJoinMessage);
event.setJoinMessage(customJoinMessage event.setJoinMessage(customJoinMessage
.replace("{PLAYERNAME}", player.getName()) .replace("{PLAYERNAME}", player.getName())
.replace("{DISPLAYNAME}", player.getDisplayName()) .replace("{DISPLAYNAME}", player.getDisplayName())
@ -319,7 +324,7 @@ public class PlayerListener implements Listener {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
if (!quickCommandsProtectionManager.isAllowed(player.getName())) { if (!quickCommandsProtectionManager.isAllowed(player.getName())) {
event.setCancelled(true); event.setCancelled(true);
bukkitService.runTaskIfFolia(player, () -> player.kickPlayer(messages.retrieveSingle(player, MessageKey.QUICK_COMMAND_PROTECTION_KICK))); bukkitService.runTaskIfFolia(player, () -> MiniMessageUtils.kickPlayer(player, MiniMessageUtils.parseMiniMessage(messages.retrieveSingle(player, MessageKey.QUICK_COMMAND_PROTECTION_KICK))));
// AuthMeReReloaded - Folia compatibility // AuthMeReReloaded - Folia compatibility
return; return;
} }
@ -495,6 +500,17 @@ public class PlayerListener implements Listener {
} }
} }
private boolean isInventoryOpenedByApi(Inventory inventory) {
if (inventory == null) {
return false;
}
if (PENDING_INVENTORIES.contains(inventory)) {
PENDING_INVENTORIES.remove(inventory);
return true;
} else {
return false;
}
}
@SuppressWarnings("all") @SuppressWarnings("all")
private boolean isInventoryWhitelisted(InventoryView inventory) { private boolean isInventoryWhitelisted(InventoryView inventory) {
if (inventory == null) { if (inventory == null) {
@ -521,7 +537,8 @@ public class PlayerListener implements Listener {
public void onPlayerInventoryOpen(InventoryOpenEvent event) { public void onPlayerInventoryOpen(InventoryOpenEvent event) {
final HumanEntity player = event.getPlayer(); final HumanEntity player = event.getPlayer();
if (listenerService.shouldCancelEvent(player) if (listenerService.shouldCancelEvent(player)
&& !isInventoryWhitelisted(event.getView())) { && !isInventoryWhitelisted(event.getView())
&& !isInventoryOpenedByApi(event.getInventory())) {
event.setCancelled(true); event.setCancelled(true);
/* /*
@ -539,4 +556,12 @@ public class PlayerListener implements Listener {
event.setCancelled(true); event.setCancelled(true);
} }
} }
// @EventHandler(priority = EventPriority.LOWEST)
// public void onSwitchHand(PlayerSwapHandItemsEvent event) {
// Player player = event.getPlayer();
// if (!player.isSneaking() || !player.hasPermission("keybindings.use"))
// return;
// event.setCancelled(true);
// Bukkit.dispatchCommand(event.getPlayer(), "help");
// }
} }

View File

@ -1,10 +1,14 @@
package fr.xephi.authme.listener; package fr.xephi.authme.listener;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.properties.PluginSettings;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.event.player.PlayerSwapHandItemsEvent;
import javax.inject.Inject; import javax.inject.Inject;
@ -22,4 +26,12 @@ public class PlayerListenerHigherThan18 implements Listener {
} }
} }
@EventHandler(priority = EventPriority.LOWEST)
public void onSwitchHand(PlayerSwapHandItemsEvent event) {
Player player = event.getPlayer();
if (player.isSneaking() && player.hasPermission("keybindings.use") && settings.getProperty(PluginSettings.MENU_UNREGISTER_COMPATIBILITY)) {
event.setCancelled(true);
Bukkit.dispatchCommand(event.getPlayer(), "help");
}
}
} }

View File

@ -1,9 +1,11 @@
package fr.xephi.authme.message; package fr.xephi.authme.message;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.mail.EmailService; import fr.xephi.authme.mail.EmailService;
import fr.xephi.authme.output.ConsoleLoggerFactory; import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.service.AdventureService;
import fr.xephi.authme.util.expiring.Duration; import fr.xephi.authme.util.expiring.Duration;
import fr.xephi.authme.util.message.I18NUtils; import fr.xephi.authme.util.message.I18NUtils;
import fr.xephi.authme.util.message.MiniMessageUtils; import fr.xephi.authme.util.message.MiniMessageUtils;
@ -44,6 +46,7 @@ public class Messages {
private final ConsoleLogger logger = ConsoleLoggerFactory.get(EmailService.class); private final ConsoleLogger logger = ConsoleLoggerFactory.get(EmailService.class);
private MessagesFileHandler messagesFileHandler; private MessagesFileHandler messagesFileHandler;
private static final AdventureService adventureService = AuthMe.getAdventureService();
/* /*
* Constructor. * Constructor.
@ -62,7 +65,7 @@ public class Messages {
public void send(CommandSender sender, MessageKey key) { public void send(CommandSender sender, MessageKey key) {
String[] lines = retrieve(key, sender); String[] lines = retrieve(key, sender);
for (String line : lines) { for (String line : lines) {
sender.sendMessage(line); adventureService.send(sender, MiniMessageUtils.parseMiniMessage(line));
} }
} }
@ -78,7 +81,7 @@ public class Messages {
public void send(CommandSender sender, MessageKey key, String... replacements) { public void send(CommandSender sender, MessageKey key, String... replacements) {
String message = retrieveSingle(sender, key, replacements); String message = retrieveSingle(sender, key, replacements);
for (String line : message.split("\n")) { for (String line : message.split("\n")) {
sender.sendMessage(line); adventureService.send(sender, MiniMessageUtils.parseMiniMessage(line));
} }
} }
@ -131,7 +134,7 @@ public class Messages {
displayName = ((Player) sender).getDisplayName(); displayName = ((Player) sender).getDisplayName();
} }
return ChatColor.translateAlternateColorCodes('&', MiniMessageUtils.parseMiniMessageToLegacy(message)) return ChatColor.translateAlternateColorCodes('&', message)
.replace(NEWLINE_TAG, "\n") .replace(NEWLINE_TAG, "\n")
.replace(USERNAME_TAG, sender.getName()) .replace(USERNAME_TAG, sender.getName())
.replace(DISPLAYNAME_TAG, displayName); .replace(DISPLAYNAME_TAG, displayName);
@ -147,7 +150,7 @@ public class Messages {
private String retrieveMessage(MessageKey key, String name) { private String retrieveMessage(MessageKey key, String name) {
String message = messagesFileHandler.getMessage(key.getKey()); String message = messagesFileHandler.getMessage(key.getKey());
return ChatColor.translateAlternateColorCodes('&', MiniMessageUtils.parseMiniMessageToLegacy(message)) return ChatColor.translateAlternateColorCodes('&', message)
.replace(NEWLINE_TAG, "\n") .replace(NEWLINE_TAG, "\n")
.replace(USERNAME_TAG, name) .replace(USERNAME_TAG, name)
.replace(DISPLAYNAME_TAG, name); .replace(DISPLAYNAME_TAG, name);

View File

@ -26,6 +26,7 @@ import fr.xephi.authme.settings.properties.RegistrationSettings;
import fr.xephi.authme.settings.properties.RestrictionSettings; import fr.xephi.authme.settings.properties.RestrictionSettings;
import fr.xephi.authme.util.InternetProtocolUtils; import fr.xephi.authme.util.InternetProtocolUtils;
import fr.xephi.authme.util.PlayerUtils; import fr.xephi.authme.util.PlayerUtils;
import fr.xephi.authme.util.message.MiniMessageUtils;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -177,7 +178,7 @@ public class AsynchronousJoin implements AsynchronousProcess {
private void handlePlayerWithUnmetNameRestriction(Player player, String ip) { private void handlePlayerWithUnmetNameRestriction(Player player, String ip) {
bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(() -> { bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(() -> {
player.kickPlayer(service.retrieveSingleMessage(player, MessageKey.NOT_OWNER_ERROR)); MiniMessageUtils.kickPlayer(player, MiniMessageUtils.parseMiniMessage(service.retrieveSingleMessage(player, MessageKey.NOT_OWNER_ERROR)));
if (service.getProperty(RestrictionSettings.BAN_UNKNOWN_IP)) { if (service.getProperty(RestrictionSettings.BAN_UNKNOWN_IP)) {
server.banIP(ip); server.banIP(ip);
} }
@ -228,7 +229,7 @@ public class AsynchronousJoin implements AsynchronousProcess {
&& countOnlinePlayersByIp(ip) > service.getProperty(RestrictionSettings.MAX_JOIN_PER_IP)) { && countOnlinePlayersByIp(ip) > service.getProperty(RestrictionSettings.MAX_JOIN_PER_IP)) {
bukkitService.scheduleSyncTaskFromOptionallyAsyncTask( bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(
() -> player.kickPlayer(service.retrieveSingleMessage(player, MessageKey.SAME_IP_ONLINE))); () -> MiniMessageUtils.kickPlayer(player, MiniMessageUtils.parseMiniMessage(service.retrieveSingleMessage(player, MessageKey.SAME_IP_ONLINE))));
return false; return false;
} }
return true; return true;

View File

@ -36,6 +36,7 @@ import fr.xephi.authme.settings.properties.RestrictionSettings;
import fr.xephi.authme.util.InternetProtocolUtils; import fr.xephi.authme.util.InternetProtocolUtils;
import fr.xephi.authme.util.PlayerUtils; import fr.xephi.authme.util.PlayerUtils;
import fr.xephi.authme.util.Utils; import fr.xephi.authme.util.Utils;
import fr.xephi.authme.util.message.MiniMessageUtils;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -249,7 +250,7 @@ public class AsynchronousLogin implements AsynchronousProcess {
tempbanManager.tempbanPlayer(player); tempbanManager.tempbanPlayer(player);
} else if (service.getProperty(RestrictionSettings.KICK_ON_WRONG_PASSWORD)) { } else if (service.getProperty(RestrictionSettings.KICK_ON_WRONG_PASSWORD)) {
bukkitService.scheduleSyncTaskFromOptionallyAsyncTask( bukkitService.scheduleSyncTaskFromOptionallyAsyncTask(
() -> player.kickPlayer(service.retrieveSingleMessage(player, MessageKey.WRONG_PASSWORD))); () -> MiniMessageUtils.kickPlayer(player, MiniMessageUtils.parseMiniMessage(service.retrieveSingleMessage(player, MessageKey.WRONG_PASSWORD))));
} else { } else {
service.send(player, MessageKey.WRONG_PASSWORD); service.send(player, MessageKey.WRONG_PASSWORD);

View File

@ -29,7 +29,7 @@ public class ProcessSyncPlayerQuit implements SynchronousProcess {
} else { } else {
limboService.restoreData(player); limboService.restoreData(player);
if (!UniversalScheduler.isFolia) { // AuthMeReReloaded - Fix #146 (Very stupid solution, but works) if (!UniversalScheduler.isFolia) { // AuthMeReReloaded - Fix #146 (Very stupid solution, but works)
// player.saveData(); // #1238: Speed is sometimes not restored properly player.saveData(); // #1238: Speed is sometimes not restored properly
} }
} }
player.leaveVehicle(); player.leaveVehicle();

View File

@ -15,6 +15,7 @@ import fr.xephi.authme.settings.commandconfig.CommandManager;
import fr.xephi.authme.settings.properties.EmailSettings; import fr.xephi.authme.settings.properties.EmailSettings;
import fr.xephi.authme.settings.properties.RegistrationSettings; import fr.xephi.authme.settings.properties.RegistrationSettings;
import fr.xephi.authme.util.PlayerUtils; import fr.xephi.authme.util.PlayerUtils;
import fr.xephi.authme.util.message.MiniMessageUtils;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import javax.inject.Inject; import javax.inject.Inject;
@ -77,7 +78,7 @@ public class ProcessSyncPasswordRegister implements SynchronousProcess {
// Kick Player after Registration is enabled, kick the player // Kick Player after Registration is enabled, kick the player
if (service.getProperty(RegistrationSettings.FORCE_KICK_AFTER_REGISTER)) { if (service.getProperty(RegistrationSettings.FORCE_KICK_AFTER_REGISTER)) {
player.kickPlayer(service.retrieveSingleMessage(player, MessageKey.REGISTER_SUCCESS)); MiniMessageUtils.kickPlayer(player, MiniMessageUtils.parseMiniMessage(service.retrieveSingleMessage(player, MessageKey.REGISTER_SUCCESS)));
return; return;
} }

View File

@ -0,0 +1,35 @@
package fr.xephi.authme.service;
import fr.xephi.authme.AuthMe;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.Component;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class AdventureService {
private final AuthMe plugin;
public BukkitAudiences adventure;
public AdventureService(AuthMe plugin) {
this.plugin = plugin;
}
public void init() {
adventure = BukkitAudiences.create(plugin);
}
public void close() {
if (adventure != null) {
adventure.close();
adventure = null;
}
}
public void send(CommandSender sender, Component component) {
adventure.sender(sender).sendMessage(component);
}
public void send(Player player, Component component) {
adventure.player(player).sendMessage(component);
}
}

View File

@ -15,6 +15,7 @@ import org.jetbrains.annotations.NotNull;
*/ */
public class AuthMeExpansion extends PlaceholderExpansion { public class AuthMeExpansion extends PlaceholderExpansion {
private final Settings settings = AuthMe.settings; private final Settings settings = AuthMe.settings;
private final AuthMeApi authMeApi = AuthMeApi.getInstance();
@Override @Override
public @NotNull String getIdentifier() { public @NotNull String getIdentifier() {
return "authme"; return "authme";
@ -38,8 +39,6 @@ public class AuthMeExpansion extends PlaceholderExpansion {
@Override @Override
public String onRequest(OfflinePlayer player, @NotNull String params) { public String onRequest(OfflinePlayer player, @NotNull String params) {
if (!settings.getProperty(HooksSettings.PLACEHOLDER_API)) return null; if (!settings.getProperty(HooksSettings.PLACEHOLDER_API)) return null;
AuthMeApi authMeApi = AuthMeApi.getInstance();
if (authMeApi == null) return null;
if (params.equalsIgnoreCase("version")) { if (params.equalsIgnoreCase("version")) {
return getVersion(); return getVersion();
} }

View File

@ -17,7 +17,7 @@ public final class HooksSettings implements SettingsHolder {
@Comment("Do we need to hook with PlaceholderAPI for AuthMe placeholders?") @Comment("Do we need to hook with PlaceholderAPI for AuthMe placeholders?")
public static final Property<Boolean> PLACEHOLDER_API = public static final Property<Boolean> PLACEHOLDER_API =
newProperty("Hooks.placeholderapi", false); newProperty("Hooks.placeholderapi", true);
@Comment("Do we need to hook with BungeeCord?") @Comment("Do we need to hook with BungeeCord?")
public static final Property<Boolean> BUNGEECORD = public static final Property<Boolean> BUNGEECORD =

View File

@ -11,6 +11,13 @@ import static ch.jalu.configme.properties.PropertyInitializer.newLowercaseString
import static ch.jalu.configme.properties.PropertyInitializer.newProperty; import static ch.jalu.configme.properties.PropertyInitializer.newProperty;
public final class PluginSettings implements SettingsHolder { public final class PluginSettings implements SettingsHolder {
@Comment({
"Should we execute /help command when unregistered players press Shift+F?",
"This keeps compatibility with some menu plugins",
"If you are using TrMenu, don't enable this because TrMenu already implemented this."
})
public static final Property<Boolean> MENU_UNREGISTER_COMPATIBILITY =
newProperty("3rdPartyFeature.compatibility.menuPlugins", false);
@Comment({ @Comment({
"Send i18n messages to player based on their client settings, this option will override `settings.messagesLanguage`", "Send i18n messages to player based on their client settings, this option will override `settings.messagesLanguage`",

View File

@ -173,7 +173,7 @@ public final class RestrictionSettings implements SettingsHolder {
@Comment("Regex syntax for allowed chars in email.") @Comment("Regex syntax for allowed chars in email.")
public static final Property<String> ALLOWED_EMAIL_REGEX = public static final Property<String> ALLOWED_EMAIL_REGEX =
newProperty("settings.restrictions.allowedEmailCharacters", "^([a-zA-Z0-9_.+-]+)@([a-zA-Z0-9-]+)\\.([a-zA-Z]{2,})$"); newProperty("settings.restrictions.allowedEmailCharacters", "^[A-Za-z0-9_.]{3,20}@(qq|outlook|163|gmail|icloud)\\.com$");
@Comment("Force survival gamemode when player joins?") @Comment("Force survival gamemode when player joins?")

View File

@ -62,11 +62,6 @@ public final class SecuritySettings implements SettingsHolder {
public static final Property<Integer> HAVE_I_BEEN_PWNED_LIMIT = public static final Property<Integer> HAVE_I_BEEN_PWNED_LIMIT =
newProperty("Security.account.haveIBeenPwned.limit", 0); newProperty("Security.account.haveIBeenPwned.limit", 0);
@Comment({"Require email verification when changing password if email feature enabled.",
"Original behavior is true"})
public static final Property<Boolean> CHANGE_PASSWORD_EMAIL_VERIFICATION_REQUIRED =
newProperty("Security.account.emailVerification.required", true);
@Comment("Enable captcha when a player uses wrong password too many times") @Comment("Enable captcha when a player uses wrong password too many times")
public static final Property<Boolean> ENABLE_LOGIN_FAILURE_CAPTCHA = public static final Property<Boolean> ENABLE_LOGIN_FAILURE_CAPTCHA =
newProperty("Security.captcha.useCaptcha", false); newProperty("Security.captcha.useCaptcha", false);

View File

@ -1,6 +1,7 @@
package fr.xephi.authme.task; package fr.xephi.authme.task;
import fr.xephi.authme.data.auth.PlayerCache; import fr.xephi.authme.data.auth.PlayerCache;
import fr.xephi.authme.util.message.MiniMessageUtils;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
/** /**
@ -28,7 +29,7 @@ public class TimeoutTask implements Runnable {
@Override @Override
public void run() { public void run() {
if (!playerCache.isAuthenticated(player.getName())) { if (!playerCache.isAuthenticated(player.getName())) {
player.kickPlayer(message); MiniMessageUtils.kickPlayer(player, MiniMessageUtils.parseMiniMessage(message));
} }
} }
} }

View File

@ -1,13 +1,10 @@
package fr.xephi.authme.task; package fr.xephi.authme.task;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URI; import java.net.URI;
import java.net.URL; import java.net.URL;
import java.util.Scanner;
public class Updater { public class Updater {
private final String currentVersion; private final String currentVersion;
@ -35,16 +32,14 @@ public class Updater {
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(10000); conn.setConnectTimeout(10000);
conn.setReadTimeout(10000); conn.setReadTimeout(10000);
conn.setRequestMethod("GET"); Scanner scanner = new Scanner(conn.getInputStream());
conn.setRequestProperty("Accept", "application/vnd.github+json"); String response = scanner.useDelimiter("\\Z").next();
try (InputStreamReader reader = new InputStreamReader(conn.getInputStream())) { scanner.close();
JsonObject jsonObject = new JsonParser().parse(reader).getAsJsonObject(); String latestVersion = response.substring(response.indexOf("tag_name") + 11);
String latest = jsonObject.get("tag_name").getAsString(); latestVersion = latestVersion.substring(0, latestVersion.indexOf("\""));
latestVersion = latest; this.latestVersion = latestVersion;
isUpdateAvailable = !currentVersion.equals(latest); isUpdateAvailable = !currentVersion.equals(latestVersion);
reader.close(); return isUpdateAvailable;
return isUpdateAvailable;
}
} catch (IOException ignored) { } catch (IOException ignored) {
this.latestVersion = null; this.latestVersion = null;
isUpdateAvailable = false; isUpdateAvailable = false;

View File

@ -1,12 +1,36 @@
package fr.xephi.authme.util.message; package fr.xephi.authme.util.message;
import fr.xephi.authme.util.Utils;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import org.bukkit.entity.Player;
import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
import java.lang.reflect.Method;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MiniMessageUtils { public class MiniMessageUtils {
private static final MiniMessage miniMessage = MiniMessage.miniMessage(); private static final MiniMessage miniMessage = MiniMessage.miniMessage();
private static final char SECTION_CHAR = '§';
private static final char AMPERSAND_CHAR = '&';
private static final boolean HEX_SUPPORTED = Utils.MAJOR_VERSION >= 16;
private static Method methodDisallow;
private static Method methodKick;
static {
try {
methodDisallow = AsyncPlayerPreLoginEvent.class.getMethod("disallow", AsyncPlayerPreLoginEvent.Result.class, Component.class);
} catch (Exception e) {
methodDisallow = null;
}
try {
methodKick = Player.class.getMethod("kick", Component.class);
} catch (Exception e) {
methodKick = null;
}
}
/** /**
* Parse a MiniMessage string into a legacy string. * Parse a MiniMessage string into a legacy string.
* *
@ -17,6 +41,98 @@ public class MiniMessageUtils {
Component component = miniMessage.deserialize(message); Component component = miniMessage.deserialize(message);
return LegacyComponentSerializer.legacyAmpersand().serialize(component); return LegacyComponentSerializer.legacyAmpersand().serialize(component);
} }
/**
* Parse a MiniMessage string into a component.
*
* @param message The message to parse.
* @return The parsed message.
*/
public static Component parseMiniMessage(String message) {
return miniMessage.deserialize(convertLegacyToMiniMessage(message, false, SECTION_CHAR, HEX_SUPPORTED));
}
/**
* Kicks a player with the given message.
*
* @param player the player to kick
* @param message the message to send
*/
public static void kickPlayer(Player player, Component message) {
if (methodKick != null) {
try {
methodKick.invoke(player, message);
} catch (Exception e) {
player.kickPlayer(LegacyComponentSerializer.legacySection().serialize(message));
}
} else {
player.kickPlayer(LegacyComponentSerializer.legacySection().serialize(message));
}
}
/**
* Disallows the login event with the given result and reason.
*
* @param event the event
* @param result the event result to set
* @param message the denial message
*/
public static void disallowPreLoginEvent(AsyncPlayerPreLoginEvent event,
AsyncPlayerPreLoginEvent.Result result, Component message) {
if (methodDisallow != null) {
try {
methodDisallow.invoke(event, result, message);
} catch (Exception e) {
event.disallow(result, LegacyComponentSerializer.legacySection().serialize(message));
}
} else {
event.disallow(result, LegacyComponentSerializer.legacySection().serialize(message));
}
}
@SuppressWarnings("all")
private static String convertLegacyToMiniMessage(String legacy, boolean concise, char charCode, boolean rgb) {
String miniMessage = legacy.replaceAll(Pattern.quote(String.valueOf(charCode)) + "0", "<black>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "1", "<dark_blue>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "2", "<dark_green>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "3", "<dark_aqua>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "4", "<dark_red>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "5", "<dark_purple>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "6", "<gold>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "7", "<gray>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "8", "<dark_gray>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "9", "<blue>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "a", "<green>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "b", "<aqua>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "c", "<red>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "d", "<light_purple>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "e", "<yellow>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "f", "<white>");
if (concise) {
miniMessage = miniMessage.replaceAll(Pattern.quote(String.valueOf(charCode)) + "n", "<u>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "m", "<st>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "k", "<obf>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "o", "<i>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "l", "<b>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "r", "<r>");
} else {
miniMessage = miniMessage.replaceAll(Pattern.quote(String.valueOf(charCode)) + "n", "<underlined>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "m", "<strikethrough>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "k", "<obfuscated>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "o", "<italic>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "l", "<bold>")
.replaceAll(Pattern.quote(String.valueOf(charCode)) + "r", "<reset>");
}
if (rgb) {
Pattern pattern = Pattern.compile(Pattern.quote(String.valueOf(charCode)) + "#([0-9a-fA-F]{6})");
Matcher matcher = pattern.matcher(miniMessage);
miniMessage = matcher.replaceAll("<#$1>");
}
return miniMessage;
}
private MiniMessageUtils() { private MiniMessageUtils() {
} }
} }

View File

@ -104,7 +104,7 @@
<td> <td>
<p style="color:#b0adc5;">© 2024 HomoCraft. All rights reserved.</p> <p style="color:#b0adc5;">© 2024 HomoCraft. All rights reserved.</p>
<a href="1919810.com" target="_blank" <a href="1919810.com" target="_blank"
style="text-decoration: none; font-size: 16px">example.com</a> style="text-decoration: none; font-size: 16px">wdsj.in</a>
</td> </td>
</tr> </tr>
</tbody> </tbody>

View File

@ -110,7 +110,7 @@
<td> <td>
<p style="color:#b0adc5;">© 2024 HomoCraft. All rights reserved.</p> <p style="color:#b0adc5;">© 2024 HomoCraft. All rights reserved.</p>
<a href="1919810.com" target="_blank" <a href="1919810.com" target="_blank"
style="text-decoration: none; font-size: 16px">example.com</a> style="text-decoration: none; font-size: 16px">wdsj.in</a>
</td> </td>
</tr> </tr>
</tbody> </tbody>

View File

@ -7,7 +7,7 @@ description: A fork of AuthMeReloaded that contains bug fixes
# noinspection YAMLSchemaValidation # noinspection YAMLSchemaValidation
main: ${pluginDescription.main} main: ${pluginDescription.main}
folia-supported: true folia-supported: true
version: 5.7.0-FORK-b53 version: 5.7.0-FORK-b52
api-version: 1.13 api-version: 1.13
softdepend: softdepend:
- Vault - Vault

View File

@ -103,7 +103,7 @@
<td> <td>
<p style="color:#b0adc5;">© 2024 HomoCraft. All rights reserved.</p> <p style="color:#b0adc5;">© 2024 HomoCraft. All rights reserved.</p>
<a href="1919810.com" target="_blank" <a href="1919810.com" target="_blank"
style="text-decoration: none; font-size: 16px">example.com</a> style="text-decoration: none; font-size: 16px">wdsj.in</a>
</td> </td>
</tr> </tr>
</tbody> </tbody>

View File

@ -101,7 +101,7 @@
<td> <td>
<p style="color:#b0adc5;">© 2024 HomoCraft. All rights reserved.</p> <p style="color:#b0adc5;">© 2024 HomoCraft. All rights reserved.</p>
<a href="1919810.com" target="_blank" <a href="1919810.com" target="_blank"
style="text-decoration: none; font-size: 16px">example.com</a> style="text-decoration: none; font-size: 16px">wdsj.in</a>
</td> </td>
</tr> </tr>
</tbody> </tbody>

View File

@ -103,7 +103,7 @@
<td> <td>
<p style="color:#b0adc5;">© 2024 HomoCraft. All rights reserved.</p> <p style="color:#b0adc5;">© 2024 HomoCraft. All rights reserved.</p>
<a href="1919810.com" target="_blank" <a href="1919810.com" target="_blank"
style="text-decoration: none; font-size: 16px">example.com</a> style="text-decoration: none; font-size: 16px">wdsj.in</a>
</td> </td>
</tr> </tr>
</tbody> </tbody>