Fix & Optimize

This commit is contained in:
MC~蛟龙 2024-07-10 20:47:56 +08:00
parent 0ceb38e7a3
commit 97c703a45c
15 changed files with 96 additions and 55 deletions

View File

@ -0,0 +1,5 @@
[versions]
guava = "33.2.1-jre"
[libraries]
guava = { module = "com.google.guava:guava", version.ref = "guava" }

View File

@ -20,8 +20,12 @@ subprojects {
} }
dependencies { dependencies {
// Modules
implementation(project(":project:module-common"))
implementation(project(":project:module-util")) implementation(project(":project:module-util"))
implementation(project(":project:module-logger"))
implementation(project(":project:module-configuration")) implementation(project(":project:module-configuration"))
implementation(project(":project:module-message"))
// Spigot API, https://www.spigotmc.org/ // Spigot API, https://www.spigotmc.org/
compileOnly("org.spigotmc:spigot-api:1.20.6-R0.1-SNAPSHOT") compileOnly("org.spigotmc:spigot-api:1.20.6-R0.1-SNAPSHOT")
// Java Libraries // Java Libraries
@ -118,7 +122,9 @@ subprojects {
archiveClassifier.set("") archiveClassifier.set("")
archiveBaseName.set("AuthMe") archiveBaseName.set("AuthMe")
destinationDirectory.set(file("$rootDir/outs")) destinationDirectory.set(file("$rootDir/outs"))
// Libraries Relocate // Kotlin
relocate("kotlin.", "kolin200.")
// Others
relocate("org.apache.http", "fr.xephi.authme.libs.org.apache.http") relocate("org.apache.http", "fr.xephi.authme.libs.org.apache.http")
relocate("org.apache.commons", "fr.xephi.authme.libs.org.apache.commons") relocate("org.apache.commons", "fr.xephi.authme.libs.org.apache.commons")
relocate("waffle", "fr.xephi.authme.libs.waffle") relocate("waffle", "fr.xephi.authme.libs.waffle")

View File

@ -26,7 +26,7 @@ import java.util.logging.Logger;
*/ */
public final class ConsoleLogger { public final class ConsoleLogger {
private static final String NEW_LINE = System.getProperty("line.separator"); private static final String NEW_LINE = System.lineSeparator();
/** Formatter which formats dates to something like "[08-16 21:18:46]" for any given LocalDateTime. */ /** Formatter which formats dates to something like "[08-16 21:18:46]" for any given LocalDateTime. */
private static final DateTimeFormatter DATE_FORMAT = new DateTimeFormatterBuilder() private static final DateTimeFormatter DATE_FORMAT = new DateTimeFormatterBuilder()
.appendLiteral('[') .appendLiteral('[')

View File

@ -2,6 +2,7 @@ package fr.xephi.authme.message;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.configruation.Configuration;
import fr.xephi.authme.initialization.DataFolder; import fr.xephi.authme.initialization.DataFolder;
import fr.xephi.authme.initialization.Reloadable; import fr.xephi.authme.initialization.Reloadable;
import fr.xephi.authme.output.ConsoleLoggerFactory; import fr.xephi.authme.output.ConsoleLoggerFactory;
@ -9,8 +10,6 @@ import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.properties.PluginSettings; import fr.xephi.authme.settings.properties.PluginSettings;
import fr.xephi.authme.util.FileUtils; import fr.xephi.authme.util.FileUtils;
import fr.xephi.authme.util.message.I18NUtils; import fr.xephi.authme.util.message.I18NUtils;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.inject.Inject; import javax.inject.Inject;
@ -35,8 +34,8 @@ public abstract class AbstractMessageFileHandler implements Reloadable {
private Settings settings; private Settings settings;
private String filename; private String filename;
private FileConfiguration configuration; private Configuration configuration;
private Map<String, FileConfiguration> i18nConfiguration; private Map<String, Configuration> i18nConfiguration;
private final String defaultFile; private final String defaultFile;
protected AbstractMessageFileHandler() { protected AbstractMessageFileHandler() {
@ -49,7 +48,7 @@ public abstract class AbstractMessageFileHandler implements Reloadable {
String language = settings.getProperty(PluginSettings.MESSAGES_LANGUAGE); String language = settings.getProperty(PluginSettings.MESSAGES_LANGUAGE);
filename = createFilePath(language); filename = createFilePath(language);
File messagesFile = initializeFile(filename); File messagesFile = initializeFile(filename);
configuration = YamlConfiguration.loadConfiguration(messagesFile); configuration = Configuration.loadFromFile(messagesFile);
i18nConfiguration = null; i18nConfiguration = null;
} }
@ -117,7 +116,7 @@ public abstract class AbstractMessageFileHandler implements Reloadable {
return configuration.getString(key); return configuration.getString(key);
} }
public FileConfiguration getI18nConfiguration(String locale) { public Configuration getI18nConfiguration(String locale) {
if (i18nConfiguration == null) { if (i18nConfiguration == null) {
i18nConfiguration = new ConcurrentHashMap<>(); i18nConfiguration = new ConcurrentHashMap<>();
} }
@ -130,7 +129,7 @@ public abstract class AbstractMessageFileHandler implements Reloadable {
// Sync with reload(); // Sync with reload();
String i18nFilename = createFilePath(locale); String i18nFilename = createFilePath(locale);
File i18nMessagesFile = initializeFile(i18nFilename); File i18nMessagesFile = initializeFile(i18nFilename);
FileConfiguration config = YamlConfiguration.loadConfiguration(i18nMessagesFile); Configuration config = Configuration.loadFromFile(i18nMessagesFile);
i18nConfiguration.put(locale, config); i18nConfiguration.put(locale, config);

View File

@ -1,10 +1,9 @@
package fr.xephi.authme.message; package fr.xephi.authme.message;
import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.configruation.Configuration;
import fr.xephi.authme.output.ConsoleLoggerFactory; import fr.xephi.authme.output.ConsoleLoggerFactory;
import fr.xephi.authme.util.FileUtils; import fr.xephi.authme.util.FileUtils;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import javax.inject.Inject; import javax.inject.Inject;
import java.io.InputStream; import java.io.InputStream;
@ -19,9 +18,10 @@ public class HelpMessagesFileHandler extends AbstractMessageFileHandler {
private final ConsoleLogger logger = ConsoleLoggerFactory.get(HelpMessagesFileHandler.class); private final ConsoleLogger logger = ConsoleLoggerFactory.get(HelpMessagesFileHandler.class);
private FileConfiguration defaultConfiguration; private Configuration defaultConfiguration;
@Inject // Trigger injection in the superclass @Inject
// Trigger injection in the superclass
HelpMessagesFileHandler() { HelpMessagesFileHandler() {
} }
@ -37,7 +37,7 @@ public class HelpMessagesFileHandler extends AbstractMessageFileHandler {
if (message == null) { if (message == null) {
logger.warning("Error getting message with key '" + key + "'. " logger.warning("Error getting message with key '" + key + "'. "
+ "Please update your config file '" + getFilename() + "' or run /authme messages help"); + "Please update your config file '" + getFilename() + "' or run /authme messages help");
return getDefault(key); return getDefault(key);
} }
return message; return message;
@ -52,12 +52,12 @@ public class HelpMessagesFileHandler extends AbstractMessageFileHandler {
private String getDefault(String key) { private String getDefault(String key) {
if (defaultConfiguration == null) { if (defaultConfiguration == null) {
InputStream stream = FileUtils.getResourceFromJar(createFilePath(DEFAULT_LANGUAGE)); InputStream stream = FileUtils.getResourceFromJar(createFilePath(DEFAULT_LANGUAGE));
defaultConfiguration = YamlConfiguration.loadConfiguration(new InputStreamReader(stream)); defaultConfiguration = Configuration.loadFromReader(new InputStreamReader(stream));
} }
String message = defaultConfiguration.getString(key); String message = defaultConfiguration.getString(key);
return message == null return message == null
? "Error retrieving message '" + key + "'" ? "Error retrieving message '" + key + "'"
: message; : message;
} }
@Override @Override

View File

@ -7,12 +7,14 @@ import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.filter.AbstractFilter; import org.apache.logging.log4j.core.filter.AbstractFilter;
import org.apache.logging.log4j.message.Message; import org.apache.logging.log4j.message.Message;
import java.io.Serializable;
/** /**
* Implements a filter for Log4j to skip sensitive AuthMe commands. * Implements a filter for Log4j to skip sensitive AuthMe commands.
* *
* @author Xephi59 * @author Xephi59
*/ */
public class Log4JFilter extends AbstractFilter { public class Log4JFilter extends AbstractFilter implements Serializable {
private static final long serialVersionUID = -5594073755007974254L; private static final long serialVersionUID = -5594073755007974254L;

View File

@ -1,5 +1 @@
repositories { dependencies {}
}
dependencies {
}

View File

@ -0,0 +1 @@
dependencies {}

View File

@ -3,12 +3,8 @@ package fr.xephi.authme.configruation
import com.electronwill.nightconfig.core.CommentedConfig import com.electronwill.nightconfig.core.CommentedConfig
import com.electronwill.nightconfig.core.Config import com.electronwill.nightconfig.core.Config
import com.electronwill.nightconfig.core.EnumGetMethod import com.electronwill.nightconfig.core.EnumGetMethod
import org.tabooproject.reflex.Reflex.Companion.setProperty import fr.xephi.authme.util.Coerce
import taboolib.common.util.decodeUnicode import fr.xephi.authme.util.StringUtil
import taboolib.common5.Coerce
import taboolib.library.configuration.ConfigurationSection
import taboolib.module.configuration.util.Commented
import taboolib.module.configuration.util.CommentedList
/** /**
* ConfigSection * ConfigSection
@ -16,7 +12,11 @@ import taboolib.module.configuration.util.CommentedList
* @author Taboolib * @author Taboolib
* @since 2024/7/10 19:33 * @since 2024/7/10 19:33
*/ */
open class ConfigSection(var root: Config, override val name: String = "", override val parent: ConfigurationSection? = null) : ConfigurationSection { open class ConfigSection(
var root: Config,
override val name: String = "",
override val parent: ConfigurationSection? = null
) : ConfigurationSection {
private val configType = Type.getType(root.configFormat()) private val configType = Type.getType(root.configFormat())
@ -71,9 +71,12 @@ open class ConfigSection(var root: Config, override val name: String = "", overr
// 因为在 set 方法中 Map 会被转换为 Config 类型 // 因为在 set 方法中 Map 会被转换为 Config 类型
is Map<*, *> -> { is Map<*, *> -> {
val subConfig = root.createSubConfig() val subConfig = root.createSubConfig()
subConfig.setProperty("map", value) val field = subConfig::class.java.getField("map")
field.isAccessible = true
field.set(subConfig, value)
ConfigSection(subConfig, name, parent) ConfigSection(subConfig, name, parent)
} }
else -> unwrap(value) else -> unwrap(value)
} }
} }
@ -84,15 +87,17 @@ open class ConfigSection(var root: Config, override val name: String = "", overr
value is List<*> -> root.set<Any>(path, unwrap(value, this)) value is List<*> -> root.set<Any>(path, unwrap(value, this))
value is Collection<*> && value !is List<*> -> set(path, value.toList()) value is Collection<*> && value !is List<*> -> set(path, value.toList())
value is ConfigurationSection -> set(path, value.getConfig()) value is ConfigurationSection -> set(path, value.getConfig())
value is Map<*, *> -> set(path, value.toConfig(this)) value is Map<*, *> -> set(path, value.asConfig(this))
value is Commented -> { value is Commented -> {
set(path, value.value) set(path, value.value)
setComment(path, value.comment) setComment(path, value.comment)
} }
value is CommentedList -> { value is CommentedList -> {
set(path, value.value) set(path, value.value)
setComments(path, value.comment) setComments(path, value.comment)
} }
else -> root.set<Any>(path, value) else -> root.set<Any>(path, value)
} }
} }
@ -111,11 +116,11 @@ open class ConfigSection(var root: Config, override val name: String = "", overr
} }
override fun getInt(path: String): Int { override fun getInt(path: String): Int {
return Coerce.toInteger(get(path)) return Coerce.asInteger(get(path)).get()
} }
override fun getInt(path: String, def: Int): Int { override fun getInt(path: String, def: Int): Int {
return Coerce.toInteger(get(path) ?: def) return Coerce.asInteger(get(path) ?: def).get()
} }
override fun isInt(path: String): Boolean { override fun isInt(path: String): Boolean {
@ -124,11 +129,11 @@ open class ConfigSection(var root: Config, override val name: String = "", overr
} }
override fun getBoolean(path: String): Boolean { override fun getBoolean(path: String): Boolean {
return Coerce.toBoolean(get(path)) return Coerce.asBoolean(get(path)).get()
} }
override fun getBoolean(path: String, def: Boolean): Boolean { override fun getBoolean(path: String, def: Boolean): Boolean {
return Coerce.toBoolean(get(path) ?: def) return Coerce.asBoolean(get(path) ?: def).get()
} }
override fun isBoolean(path: String): Boolean { override fun isBoolean(path: String): Boolean {
@ -136,11 +141,11 @@ open class ConfigSection(var root: Config, override val name: String = "", overr
} }
override fun getDouble(path: String): Double { override fun getDouble(path: String): Double {
return Coerce.toDouble(get(path)) return Coerce.asDouble(get(path)).get()
} }
override fun getDouble(path: String, def: Double): Double { override fun getDouble(path: String, def: Double): Double {
return Coerce.toDouble(get(path) ?: def) return Coerce.asDouble(get(path) ?: def).get()
} }
override fun isDouble(path: String): Boolean { override fun isDouble(path: String): Boolean {
@ -148,11 +153,11 @@ open class ConfigSection(var root: Config, override val name: String = "", overr
} }
override fun getLong(path: String): Long { override fun getLong(path: String): Long {
return Coerce.toLong(get(path)) return Coerce.asLong(get(path)).get()
} }
override fun getLong(path: String, def: Long): Long { override fun getLong(path: String, def: Long): Long {
return Coerce.toLong(get(path) ?: def) return Coerce.asLong(get(path) ?: def).get()
} }
override fun isLong(path: String): Boolean { override fun isLong(path: String): Boolean {
@ -176,35 +181,35 @@ open class ConfigSection(var root: Config, override val name: String = "", overr
} }
override fun getIntegerList(path: String): List<Int> { override fun getIntegerList(path: String): List<Int> {
return getList(path)?.map { Coerce.toInteger(it) }?.toList() ?: ArrayList() return getList(path)?.map { Coerce.asInteger(it).get() }?.toList() ?: ArrayList()
} }
override fun getBooleanList(path: String): List<Boolean> { override fun getBooleanList(path: String): List<Boolean> {
return getList(path)?.map { Coerce.toBoolean(it) }?.toList() ?: ArrayList() return getList(path)?.map { Coerce.asBoolean(it).get() }?.toList() ?: ArrayList()
} }
override fun getDoubleList(path: String): List<Double> { override fun getDoubleList(path: String): List<Double> {
return getList(path)?.map { Coerce.toDouble(it) }?.toList() ?: ArrayList() return getList(path)?.map { Coerce.asDouble(it).get() }?.toList() ?: ArrayList()
} }
override fun getFloatList(path: String): List<Float> { override fun getFloatList(path: String): List<Float> {
return getList(path)?.map { Coerce.toFloat(it) }?.toList() ?: ArrayList() return getList(path)?.map { Coerce.asFloat(it).get() }?.toList() ?: ArrayList()
} }
override fun getLongList(path: String): List<Long> { override fun getLongList(path: String): List<Long> {
return getList(path)?.map { Coerce.toLong(it) }?.toList() ?: ArrayList() return getList(path)?.map { Coerce.asLong(it).get() }?.toList() ?: ArrayList()
} }
override fun getByteList(path: String): List<Byte> { override fun getByteList(path: String): List<Byte> {
return getList(path)?.map { Coerce.toByte(it) }?.toList() ?: ArrayList() return getList(path)?.map { Coerce.asByte(it).get() }?.toList() ?: ArrayList()
} }
override fun getCharacterList(path: String): List<Char> { override fun getCharacterList(path: String): List<Char> {
return getList(path)?.map { Coerce.toChar(it) }?.toList() ?: ArrayList() return getList(path)?.map { Coerce.asChar(it).get() }?.toList() ?: ArrayList()
} }
override fun getShortList(path: String): List<Short> { override fun getShortList(path: String): List<Short> {
return getList(path)?.map { Coerce.toShort(it) }?.toList() ?: ArrayList() return getList(path)?.map { Coerce.asShort(it).get() }?.toList() ?: ArrayList()
} }
override fun getMapList(path: String): List<Map<*, *>> { override fun getMapList(path: String): List<Map<*, *>> {
@ -289,7 +294,7 @@ open class ConfigSection(var root: Config, override val name: String = "", overr
return if (this is ConfigSection) root else error("Not supported") return if (this is ConfigSection) root else error("Not supported")
} }
private fun Map<*, *>.toConfig(parent: ConfigSection): Config { private fun Map<*, *>.asConfig(parent: ConfigSection): Config {
val section = ConfigSection(parent.root.createSubConfig()) val section = ConfigSection(parent.root.createSubConfig())
forEach { (k, v) -> section[k.toString()] = v } forEach { (k, v) -> section[k.toString()] = v }
return section.root return section.root
@ -321,7 +326,7 @@ open class ConfigSection(var root: Config, override val name: String = "", overr
value is List<*> -> unwrap(value, parent) value is List<*> -> unwrap(value, parent)
value is Collection<*> && value !is List<*> -> value.toList() value is Collection<*> && value !is List<*> -> value.toList()
value is ConfigurationSection -> value.getConfig() value is ConfigurationSection -> value.getConfig()
value is Map<*, *> -> value.toConfig(parent) value is Map<*, *> -> value.asConfig(parent)
else -> value else -> value
} }
} }

View File

@ -81,6 +81,8 @@ interface Configuration : ConfigurationSection {
/** /**
* 识别可能的 [ConfigurationSection] 类型 * 识别可能的 [ConfigurationSection] 类型
*/ */
@JvmStatic
@JvmOverloads
fun parse(any: Any, type: Type = Type.YAML, concurrent: Boolean = true): ConfigurationSection { fun parse(any: Any, type: Type = Type.YAML, concurrent: Boolean = true): ConfigurationSection {
val unwrapped = ConfigSection.unwrap(any) val unwrapped = ConfigSection.unwrap(any)
if (unwrapped is Map<*, *>) { if (unwrapped is Map<*, *>) {
@ -96,6 +98,8 @@ interface Configuration : ConfigurationSection {
* @param concurrent 是否支持并发 * @param concurrent 是否支持并发
* @return [Configuration] * @return [Configuration]
*/ */
@JvmStatic
@JvmOverloads
fun empty(type: Type = Type.YAML, concurrent: Boolean = true): Configuration { fun empty(type: Type = Type.YAML, concurrent: Boolean = true): Configuration {
return ConfigFile( return ConfigFile(
if (concurrent) type.newFormat().createConcurrentConfig() else type.newFormat() if (concurrent) type.newFormat().createConcurrentConfig() else type.newFormat()
@ -110,6 +114,8 @@ interface Configuration : ConfigurationSection {
* @param concurrent 是否支持并发 * @param concurrent 是否支持并发
* @return [Configuration] * @return [Configuration]
*/ */
@JvmStatic
@JvmOverloads
fun loadFromFile(file: File, type: Type? = null, concurrent: Boolean = true): Configuration { fun loadFromFile(file: File, type: Type? = null, concurrent: Boolean = true): Configuration {
val format = (type ?: getTypeFromFile(file)).newFormat() val format = (type ?: getTypeFromFile(file)).newFormat()
val configFile = val configFile =
@ -126,6 +132,8 @@ interface Configuration : ConfigurationSection {
* @param concurrent 是否支持并发 * @param concurrent 是否支持并发
* @return [Configuration] * @return [Configuration]
*/ */
@JvmStatic
@JvmOverloads
fun loadFromReader(reader: Reader, type: Type = Type.YAML, concurrent: Boolean = true): Configuration { fun loadFromReader(reader: Reader, type: Type = Type.YAML, concurrent: Boolean = true): Configuration {
val format = type.newFormat() val format = type.newFormat()
val configFile = val configFile =
@ -142,6 +150,8 @@ interface Configuration : ConfigurationSection {
* @param concurrent 是否支持并发 * @param concurrent 是否支持并发
* @return [Configuration] * @return [Configuration]
*/ */
@JvmStatic
@JvmOverloads
fun loadFromString(contents: String, type: Type = Type.YAML, concurrent: Boolean = true): Configuration { fun loadFromString(contents: String, type: Type = Type.YAML, concurrent: Boolean = true): Configuration {
val format = type.newFormat() val format = type.newFormat()
val configFile = val configFile =
@ -158,6 +168,8 @@ interface Configuration : ConfigurationSection {
* @param concurrent 是否支持并发 * @param concurrent 是否支持并发
* @return [Configuration] * @return [Configuration]
*/ */
@JvmStatic
@JvmOverloads
fun loadFromInputStream( fun loadFromInputStream(
inputStream: InputStream, inputStream: InputStream,
type: Type = Type.YAML, type: Type = Type.YAML,
@ -178,6 +190,8 @@ interface Configuration : ConfigurationSection {
* @param concurrent 是否支持并发 * @param concurrent 是否支持并发
* @return [ConfigurationSection] * @return [ConfigurationSection]
*/ */
@JvmStatic
@JvmOverloads
fun fromMap(map: Map<*, *>, type: Type = Type.YAML, concurrent: Boolean = true): ConfigurationSection { fun fromMap(map: Map<*, *>, type: Type = Type.YAML, concurrent: Boolean = true): ConfigurationSection {
val empty = empty(type, concurrent) val empty = empty(type, concurrent)
map.forEach { (k, v) -> empty[k.toString()] = v } map.forEach { (k, v) -> empty[k.toString()] = v }
@ -191,6 +205,8 @@ interface Configuration : ConfigurationSection {
* @param def 默认类型 * @param def 默认类型
* @return [Type] * @return [Type]
*/ */
@JvmStatic
@JvmOverloads
fun getTypeFromFile(file: File, def: Type = Type.YAML): Type { fun getTypeFromFile(file: File, def: Type = Type.YAML): Type {
return getTypeFromExtension(file.extension, def) return getTypeFromExtension(file.extension, def)
} }
@ -202,6 +218,8 @@ interface Configuration : ConfigurationSection {
* @param def 默认类型 * @param def 默认类型
* @return [Type] * @return [Type]
*/ */
@JvmStatic
@JvmOverloads
fun getTypeFromExtension(extension: String, def: Type = Type.YAML): Type { fun getTypeFromExtension(extension: String, def: Type = Type.YAML): Type {
return when (extension) { return when (extension) {
"yaml", "yml" -> Type.YAML "yaml", "yml" -> Type.YAML

View File

@ -1,5 +1,9 @@
package fr.xephi.authme.configruation package fr.xephi.authme.configruation
import com.electronwill.nightconfig.core.Config
import com.electronwill.nightconfig.core.ConfigFormat
import com.electronwill.nightconfig.yaml.YamlFormat
/** /**
* Type * Type
* *
@ -8,7 +12,7 @@ package fr.xephi.authme.configruation
*/ */
enum class Type(private val format: () -> ConfigFormat<out Config>) { enum class Type(private val format: () -> ConfigFormat<out Config>) {
YAML({ YamlFormat.INSTANCE }); YAML({ YamlFormat.defaultInstance() });
// TOML({ TomlFormat.instance() }), // TOML({ TomlFormat.instance() }),
// //
@ -25,7 +29,7 @@ enum class Type(private val format: () -> ConfigFormat<out Config>) {
companion object { companion object {
fun getType(format: ConfigFormat<*>): Type { fun getType(format: ConfigFormat<*>): Type {
return values().first { it.newFormat().javaClass == format.javaClass } return entries.first { it.newFormat().javaClass == format.javaClass }
} }
} }
} }

View File

@ -0,0 +1,3 @@
dependencies {
compileOnly(libs.guava)
}

View File

@ -0,0 +1 @@
dependencies {}

View File

@ -1,3 +1,3 @@
dependencies { dependencies {
compileOnly("com.google.guava:guava:33.2.1-jre") compileOnly(libs.guava)
} }

View File

@ -22,7 +22,7 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
package org.spongepowered.common.data.builder; package fr.xephi.authme.util;
import com.google.common.primitives.Doubles; import com.google.common.primitives.Doubles;
import com.google.common.primitives.Ints; import com.google.common.primitives.Ints;
@ -44,7 +44,8 @@ public final class Coerce {
/** /**
* No subclasses for you. * No subclasses for you.
*/ */
private Coerce() {} private Coerce() {
}
/** /**
* Gets the given object as a {@link String}. * Gets the given object as a {@link String}.