mirror of
https://github.com/GeyserMC/Floodgate.git
synced 2025-12-21 07:49:18 +00:00
Various changes, mostly language support
This commit is contained in:
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "common/src/main/resources/languages"]
|
||||||
|
path = common/src/main/resources/languages
|
||||||
|
url = https://github.com/GeyserMC/languages
|
||||||
@@ -45,12 +45,13 @@ public final class BungeePlugin extends Plugin {
|
|||||||
new BungeePlatformModule(this)
|
new BungeePlatformModule(this)
|
||||||
);
|
);
|
||||||
|
|
||||||
long endCtm = System.currentTimeMillis();
|
|
||||||
getLogger().info("Took " + (endCtm - ctm) + "ms to boot Floodgate");
|
|
||||||
|
|
||||||
// Bungeecord doesn't have a build-in function to disable plugins,
|
// Bungeecord doesn't have a build-in function to disable plugins,
|
||||||
// so there is no need to have a custom Platform class like Spigot
|
// so there is no need to have a custom Platform class like Spigot
|
||||||
platform = injector.getInstance(FloodgatePlatform.class);
|
platform = injector.getInstance(FloodgatePlatform.class);
|
||||||
|
|
||||||
|
long endCtm = System.currentTimeMillis();
|
||||||
|
getLogger().info(platform.getLanguageManager().getLocaleStringLog("floodgate.core.finish",
|
||||||
|
endCtm - ctm));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
|||||||
import org.geysermc.floodgate.api.player.FloodgatePlayer;
|
import org.geysermc.floodgate.api.player.FloodgatePlayer;
|
||||||
import org.geysermc.floodgate.config.ProxyFloodgateConfig;
|
import org.geysermc.floodgate.config.ProxyFloodgateConfig;
|
||||||
import org.geysermc.floodgate.handler.BungeeDataHandler;
|
import org.geysermc.floodgate.handler.BungeeDataHandler;
|
||||||
|
import org.geysermc.floodgate.util.LanguageManager;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@@ -23,12 +24,15 @@ public final class BungeeListener implements Listener {
|
|||||||
private final BungeeDataHandler dataHandler;
|
private final BungeeDataHandler dataHandler;
|
||||||
private final ProxyFloodgateApi api;
|
private final ProxyFloodgateApi api;
|
||||||
private final FloodgateLogger logger;
|
private final FloodgateLogger logger;
|
||||||
|
private final LanguageManager languageManager;
|
||||||
|
|
||||||
public BungeeListener(Plugin plugin, ProxyFloodgateConfig config, ProxyFloodgateApi api,
|
public BungeeListener(Plugin plugin, ProxyFloodgateConfig config, ProxyFloodgateApi api,
|
||||||
HandshakeHandler handshakeHandler, FloodgateLogger logger) {
|
HandshakeHandler handshakeHandler, FloodgateLogger logger,
|
||||||
|
LanguageManager languageManager) {
|
||||||
this.dataHandler = new BungeeDataHandler(plugin, config, api, handshakeHandler, logger);
|
this.dataHandler = new BungeeDataHandler(plugin, config, api, handshakeHandler, logger);
|
||||||
this.api = api;
|
this.api = api;
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
|
this.languageManager = languageManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOW)
|
@EventHandler(priority = EventPriority.LOW)
|
||||||
@@ -57,8 +61,8 @@ public final class BungeeListener implements Listener {
|
|||||||
logger.info("Login" + (player != null) + " " + uniqueId);
|
logger.info("Login" + (player != null) + " " + uniqueId);
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
player.as(FloodgatePlayerImpl.class).setLogin(false);
|
player.as(FloodgatePlayerImpl.class).setLogin(false);
|
||||||
logger.info("Floodgate player who is logged in as {} {} joined",
|
logger.info(languageManager.getLocaleStringLog("floodgate.ingame.login_name",
|
||||||
player.getCorrectUsername(), player.getCorrectUniqueId());
|
player.getCorrectUsername(), player.getCorrectUniqueId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,9 +80,8 @@ public final class BungeeListener implements Listener {
|
|||||||
FloodgatePlayer fPlayer;
|
FloodgatePlayer fPlayer;
|
||||||
if ((fPlayer = api.removePlayer(player.getUniqueId())) != null) {
|
if ((fPlayer = api.removePlayer(player.getUniqueId())) != null) {
|
||||||
api.removeEncryptedData(player.getUniqueId());
|
api.removeEncryptedData(player.getUniqueId());
|
||||||
logger.info(
|
logger.info(languageManager.getLocaleStringLog(
|
||||||
"Floodgate player who was logged in as {} {} disconnected",
|
"floodgate.ingame.disconnect_name", player.getName())
|
||||||
player.getName(), player.getUniqueId()
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
logger.info("Disconnected " + fPlayer);
|
logger.info("Disconnected " + fPlayer);
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
|||||||
import org.geysermc.floodgate.config.ProxyFloodgateConfig;
|
import org.geysermc.floodgate.config.ProxyFloodgateConfig;
|
||||||
import org.geysermc.floodgate.listener.BungeeListener;
|
import org.geysermc.floodgate.listener.BungeeListener;
|
||||||
import org.geysermc.floodgate.register.ListenerRegister;
|
import org.geysermc.floodgate.register.ListenerRegister;
|
||||||
|
import org.geysermc.floodgate.util.LanguageManager;
|
||||||
|
|
||||||
public final class BungeeListenerModule extends AbstractModule {
|
public final class BungeeListenerModule extends AbstractModule {
|
||||||
@Override
|
@Override
|
||||||
@@ -49,7 +50,7 @@ public final class BungeeListenerModule extends AbstractModule {
|
|||||||
@ProvidesIntoSet
|
@ProvidesIntoSet
|
||||||
public Listener bungeeListener(Plugin plugin, ProxyFloodgateConfig config,
|
public Listener bungeeListener(Plugin plugin, ProxyFloodgateConfig config,
|
||||||
ProxyFloodgateApi api, HandshakeHandler handshakeHandler,
|
ProxyFloodgateApi api, HandshakeHandler handshakeHandler,
|
||||||
FloodgateLogger logger) {
|
FloodgateLogger logger, LanguageManager languageManager) {
|
||||||
return new BungeeListener(plugin, config, api, handshakeHandler, logger);
|
return new BungeeListener(plugin, config, api, handshakeHandler, logger, languageManager);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ import org.geysermc.floodgate.config.loader.ConfigLoader;
|
|||||||
import org.geysermc.floodgate.link.PlayerLinkLoader;
|
import org.geysermc.floodgate.link.PlayerLinkLoader;
|
||||||
import org.geysermc.floodgate.module.ConfigLoadedModule;
|
import org.geysermc.floodgate.module.ConfigLoadedModule;
|
||||||
import org.geysermc.floodgate.module.PostInitializeModule;
|
import org.geysermc.floodgate.module.PostInitializeModule;
|
||||||
|
import org.geysermc.floodgate.util.LanguageManager;
|
||||||
|
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
@@ -57,6 +58,9 @@ public class FloodgatePlatform {
|
|||||||
@Getter(AccessLevel.PROTECTED)
|
@Getter(AccessLevel.PROTECTED)
|
||||||
private final FloodgateLogger logger;
|
private final FloodgateLogger logger;
|
||||||
|
|
||||||
|
@Getter(AccessLevel.PROTECTED)
|
||||||
|
private final LanguageManager languageManager;
|
||||||
|
|
||||||
private final Injector guice;
|
private final Injector guice;
|
||||||
|
|
||||||
@Inject private PlatformInjector injector;
|
@Inject private PlatformInjector injector;
|
||||||
@@ -65,9 +69,10 @@ public class FloodgatePlatform {
|
|||||||
public FloodgatePlatform(@Named("dataDirectory") Path dataDirectory, FloodgateApi api,
|
public FloodgatePlatform(@Named("dataDirectory") Path dataDirectory, FloodgateApi api,
|
||||||
ConfigLoader configLoader, PlayerLinkLoader playerLinkLoader,
|
ConfigLoader configLoader, PlayerLinkLoader playerLinkLoader,
|
||||||
HandshakeHandler handshakeHandler, FloodgateLogger logger,
|
HandshakeHandler handshakeHandler, FloodgateLogger logger,
|
||||||
Injector injector) {
|
LanguageManager languageManager, Injector injector) {
|
||||||
this.api = api;
|
this.api = api;
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
|
this.languageManager = languageManager;
|
||||||
|
|
||||||
if (!Files.isDirectory(dataDirectory)) {
|
if (!Files.isDirectory(dataDirectory)) {
|
||||||
try {
|
try {
|
||||||
@@ -79,12 +84,14 @@ public class FloodgatePlatform {
|
|||||||
}
|
}
|
||||||
|
|
||||||
config = configLoader.load();
|
config = configLoader.load();
|
||||||
|
this.languageManager.initialize(config);
|
||||||
|
|
||||||
// make the config available for other classes
|
// make the config available for other classes
|
||||||
guice = injector.createChildInjector(new ConfigLoadedModule(config, api));
|
guice = injector.createChildInjector(new ConfigLoadedModule(config, api));
|
||||||
|
|
||||||
guice.injectMembers(playerLinkLoader);
|
guice.injectMembers(playerLinkLoader);
|
||||||
guice.injectMembers(handshakeHandler);
|
guice.injectMembers(handshakeHandler);
|
||||||
|
guice.injectMembers(languageManager);
|
||||||
|
|
||||||
PlayerLink link = playerLinkLoader.load();
|
PlayerLink link = playerLinkLoader.load();
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,9 @@ public class FloodgateConfig {
|
|||||||
@JsonProperty(value = "replace-spaces")
|
@JsonProperty(value = "replace-spaces")
|
||||||
private boolean replaceSpaces;
|
private boolean replaceSpaces;
|
||||||
|
|
||||||
|
@JsonProperty(value = "default-locale")
|
||||||
|
private String defaultLocale;
|
||||||
|
|
||||||
@JsonProperty(value = "disconnect")
|
@JsonProperty(value = "disconnect")
|
||||||
private DisconnectMessages messages;
|
private DisconnectMessages messages;
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ import org.geysermc.floodgate.config.updater.ConfigUpdater;
|
|||||||
import org.geysermc.floodgate.util.EncryptionUtil;
|
import org.geysermc.floodgate.util.EncryptionUtil;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
@@ -74,7 +76,13 @@ public class ConfigLoader {
|
|||||||
boolean newConfig = !Files.exists(configPath);
|
boolean newConfig = !Files.exists(configPath);
|
||||||
try {
|
try {
|
||||||
if (newConfig) {
|
if (newConfig) {
|
||||||
Files.copy(defaultConfigPath, configPath);
|
InputStream newConfigFile =
|
||||||
|
ConfigLoader.class.getClassLoader().getResourceAsStream(defaultConfigName);
|
||||||
|
if (newConfigFile == null) {
|
||||||
|
throw new RuntimeException("Failed to get the default config file!");
|
||||||
|
}
|
||||||
|
|
||||||
|
Files.copy(newConfigFile, configPath);
|
||||||
|
|
||||||
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
|
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
|
||||||
generator.initialize(2048);
|
generator.initialize(2048);
|
||||||
|
|||||||
@@ -45,6 +45,8 @@ public class ConfigUpdater {
|
|||||||
private final ConfigFileUpdater fileUpdater;
|
private final ConfigFileUpdater fileUpdater;
|
||||||
private final FloodgateLogger logger;
|
private final FloodgateLogger logger;
|
||||||
|
|
||||||
|
private static final int CONFIG_VERSION = 1;
|
||||||
|
|
||||||
public void update(Path defaultConfigLocation) {
|
public void update(Path defaultConfigLocation) {
|
||||||
Path configLocation = dataFolder.resolve("config.yml");
|
Path configLocation = dataFolder.resolve("config.yml");
|
||||||
|
|
||||||
@@ -70,12 +72,12 @@ public class ConfigUpdater {
|
|||||||
|
|
||||||
int version = (int) versionElement;
|
int version = (int) versionElement;
|
||||||
checkArgument(
|
checkArgument(
|
||||||
version == 1,
|
version == CONFIG_VERSION,
|
||||||
"Config is newer then possible on this version! Expected 1, got " + version
|
"Config is newer then possible on this version! Expected " + CONFIG_VERSION + ", got " + version
|
||||||
);
|
);
|
||||||
|
|
||||||
// config is already up-to-date
|
// config is already up-to-date
|
||||||
if (version == 1) {
|
if (version == CONFIG_VERSION) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ import org.geysermc.floodgate.config.updater.ConfigFileUpdater;
|
|||||||
import org.geysermc.floodgate.config.updater.ConfigUpdater;
|
import org.geysermc.floodgate.config.updater.ConfigUpdater;
|
||||||
import org.geysermc.floodgate.inject.CommonPlatformInjector;
|
import org.geysermc.floodgate.inject.CommonPlatformInjector;
|
||||||
import org.geysermc.floodgate.link.PlayerLinkLoader;
|
import org.geysermc.floodgate.link.PlayerLinkLoader;
|
||||||
|
import org.geysermc.floodgate.util.LanguageManager;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
|
||||||
@@ -85,6 +86,12 @@ public final class CommonModule extends AbstractModule {
|
|||||||
return new ConfigUpdater(dataDirectory, configFileUpdater, logger);
|
return new ConfigUpdater(dataDirectory, configFileUpdater, logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
public LanguageManager languageLoader(FloodgateLogger logger) {
|
||||||
|
return new LanguageManager(logger);
|
||||||
|
}
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
public PlayerLinkLoader playerLinkLoader() {
|
public PlayerLinkLoader playerLinkLoader() {
|
||||||
|
|||||||
@@ -0,0 +1,183 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* @author GeyserMC
|
||||||
|
* @link https://github.com/GeyserMC/Floodgate
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.geysermc.floodgate.util;
|
||||||
|
|
||||||
|
import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
||||||
|
import org.geysermc.floodgate.config.FloodgateConfig;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.text.MessageFormat;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
|
||||||
|
public class LanguageManager {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The locale used in console and as a fallback
|
||||||
|
*/
|
||||||
|
private String defaultLocale;
|
||||||
|
|
||||||
|
private final Map<String, Properties> LOCALE_MAPPINGS = new HashMap<>();
|
||||||
|
|
||||||
|
private final FloodgateLogger logger;
|
||||||
|
|
||||||
|
public LanguageManager(FloodgateLogger logger) {
|
||||||
|
this.logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads the log's locale file once Floodgate loads the config
|
||||||
|
*
|
||||||
|
* @param config the Floodgate config
|
||||||
|
*/
|
||||||
|
public void initialize(FloodgateConfig config) {
|
||||||
|
loadFloodgateLocale("en_US"); // Fallback
|
||||||
|
|
||||||
|
if (config.getDefaultLocale() != null && isValidLanguage(formatLocale(config.getDefaultLocale()))) {
|
||||||
|
loadFloodgateLocale(formatLocale(config.getDefaultLocale()));
|
||||||
|
defaultLocale = formatLocale(config.getDefaultLocale());
|
||||||
|
} else {
|
||||||
|
String systemLocale = formatLocale(Locale.getDefault().getLanguage() + "_" + Locale.getDefault().getCountry());
|
||||||
|
if (isValidLanguage(systemLocale)) {
|
||||||
|
loadFloodgateLocale(systemLocale);
|
||||||
|
defaultLocale = formatLocale(systemLocale);
|
||||||
|
} else {
|
||||||
|
defaultLocale = "en_US";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads a Geyser locale from resources, if the file doesn't exist it just logs a warning
|
||||||
|
*
|
||||||
|
* @param locale Locale to load
|
||||||
|
*/
|
||||||
|
public void loadFloodgateLocale(String locale) {
|
||||||
|
locale = formatLocale(locale);
|
||||||
|
|
||||||
|
InputStream localeStream = LanguageManager.class.getClassLoader().getResourceAsStream(
|
||||||
|
"languages/texts/" + locale + ".properties");
|
||||||
|
|
||||||
|
// Load the locale
|
||||||
|
if (localeStream != null) {
|
||||||
|
Properties localeProp = new Properties();
|
||||||
|
try {
|
||||||
|
localeProp.load(new InputStreamReader(localeStream, StandardCharsets.UTF_8));
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new AssertionError("Failed to load Floodgate locale", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert the locale into the mappings
|
||||||
|
LOCALE_MAPPINGS.put(locale, localeProp);
|
||||||
|
} else {
|
||||||
|
logger.warn("Missing locale file: " + locale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a formatted language string with the default locale for Floodgate
|
||||||
|
*
|
||||||
|
* @param key Language string to translate
|
||||||
|
* @param values Values to put into the string
|
||||||
|
* @return Translated string or the original message if it was not found in the given locale
|
||||||
|
*/
|
||||||
|
public String getLocaleStringLog(String key, Object... values) {
|
||||||
|
return getPlayerLocaleString(key, defaultLocale, values);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a formatted language string with the given locale for Floodgate
|
||||||
|
*
|
||||||
|
* @param key Language string to translate
|
||||||
|
* @param locale Locale to translate to
|
||||||
|
* @param values Values to put into the string
|
||||||
|
* @return Translated string or the original message if it was not found in the given locale
|
||||||
|
*/
|
||||||
|
public String getPlayerLocaleString(String key, String locale, Object... values) {
|
||||||
|
locale = formatLocale(locale);
|
||||||
|
|
||||||
|
Properties properties = LOCALE_MAPPINGS.get(locale);
|
||||||
|
String formatString = properties.getProperty(key);
|
||||||
|
|
||||||
|
// Try and get the key from the default locale
|
||||||
|
if (formatString == null) {
|
||||||
|
properties = LOCALE_MAPPINGS.get(defaultLocale);
|
||||||
|
formatString = properties.getProperty(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try and get the key from en_US (this should only ever happen in development)
|
||||||
|
if (formatString == null) {
|
||||||
|
properties = LOCALE_MAPPINGS.get("en_US");
|
||||||
|
formatString = properties.getProperty(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Final fallback
|
||||||
|
if (formatString == null) {
|
||||||
|
formatString = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
return MessageFormat.format(formatString.replace("'", "''").replace("&", "\u00a7"), values);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cleans up and formats a locale string
|
||||||
|
*
|
||||||
|
* @param locale The locale to format
|
||||||
|
* @return The formatted locale
|
||||||
|
*/
|
||||||
|
private static String formatLocale(String locale) {
|
||||||
|
try {
|
||||||
|
String[] parts = locale.toLowerCase().split("_");
|
||||||
|
return parts[0] + "_" + parts[1].toUpperCase();
|
||||||
|
} catch (Exception e) {
|
||||||
|
return locale;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ensures that the given locale is supported by Floodgate
|
||||||
|
* @param locale the locale to validate
|
||||||
|
* @return true if the given locale is supported by Floodgate
|
||||||
|
*/
|
||||||
|
private boolean isValidLanguage(String locale) {
|
||||||
|
boolean result = true;
|
||||||
|
if (LanguageManager.class.getResource("/languages/texts/" + locale + ".properties") == null) {
|
||||||
|
result = false;
|
||||||
|
logger.warn(locale + " is not a supported Floodgate language.");
|
||||||
|
} else {
|
||||||
|
if (!LOCALE_MAPPINGS.containsKey(locale)) {
|
||||||
|
loadFloodgateLocale(locale);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,6 +11,9 @@ username-prefix: "*"
|
|||||||
# Should spaces be replaced with '_' in bedrock usernames?
|
# Should spaces be replaced with '_' in bedrock usernames?
|
||||||
replace-spaces: true
|
replace-spaces: true
|
||||||
|
|
||||||
|
# The default locale for Floodgate. By default, Floodgate uses the system locale
|
||||||
|
# default-locale: en_US
|
||||||
|
|
||||||
disconnect:
|
disconnect:
|
||||||
# The disconnect message Geyser users should get when connecting
|
# The disconnect message Geyser users should get when connecting
|
||||||
# to the server with an invalid key
|
# to the server with an invalid key
|
||||||
|
|||||||
1
common/src/main/resources/languages
Submodule
1
common/src/main/resources/languages
Submodule
Submodule common/src/main/resources/languages added at ec6e12a046
@@ -11,6 +11,9 @@ username-prefix: "*"
|
|||||||
# Should spaces be replaced with '_' in bedrock usernames?
|
# Should spaces be replaced with '_' in bedrock usernames?
|
||||||
replace-spaces: true
|
replace-spaces: true
|
||||||
|
|
||||||
|
# The default locale for Floodgate. By default, Floodgate uses the system locale
|
||||||
|
# default-locale: en_US
|
||||||
|
|
||||||
# todo impl args like {proxy}
|
# todo impl args like {proxy}
|
||||||
# Should {proxy} send the bedrock player data to the servers it is connecting to?
|
# Should {proxy} send the bedrock player data to the servers it is connecting to?
|
||||||
# This requires Floodgate to be installed on the servers.
|
# This requires Floodgate to be installed on the servers.
|
||||||
|
|||||||
2
pom.xml
2
pom.xml
@@ -21,7 +21,7 @@
|
|||||||
<url>https://github.com/GeyserMC/Floodgate</url>
|
<url>https://github.com/GeyserMC/Floodgate</url>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<geyser-version>1.0-SNAPSHOT</geyser-version>
|
<geyser-version>1.1.0</geyser-version>
|
||||||
<bukkit-version>1.8.8-R0.1-SNAPSHOT</bukkit-version>
|
<bukkit-version>1.8.8-R0.1-SNAPSHOT</bukkit-version>
|
||||||
<bungee-version>1.15-SNAPSHOT</bungee-version>
|
<bungee-version>1.15-SNAPSHOT</bungee-version>
|
||||||
<velocity-version>1.1.0-SNAPSHOT</velocity-version>
|
<velocity-version>1.1.0-SNAPSHOT</velocity-version>
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import org.geysermc.floodgate.api.FloodgateApi;
|
|||||||
import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
||||||
import org.geysermc.floodgate.config.loader.ConfigLoader;
|
import org.geysermc.floodgate.config.loader.ConfigLoader;
|
||||||
import org.geysermc.floodgate.link.PlayerLinkLoader;
|
import org.geysermc.floodgate.link.PlayerLinkLoader;
|
||||||
|
import org.geysermc.floodgate.util.LanguageManager;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
|
|
||||||
@@ -46,9 +47,9 @@ public final class SpigotPlatform extends FloodgatePlatform {
|
|||||||
public SpigotPlatform(@Named("dataDirectory") Path dataDirectory, FloodgateApi api,
|
public SpigotPlatform(@Named("dataDirectory") Path dataDirectory, FloodgateApi api,
|
||||||
ConfigLoader configLoader, PlayerLinkLoader playerLinkLoader,
|
ConfigLoader configLoader, PlayerLinkLoader playerLinkLoader,
|
||||||
HandshakeHandler handshakeHandler, FloodgateLogger logger,
|
HandshakeHandler handshakeHandler, FloodgateLogger logger,
|
||||||
Injector injector) {
|
LanguageManager languageManager, Injector injector) {
|
||||||
super(dataDirectory, api, configLoader, playerLinkLoader,
|
super(dataDirectory, api, configLoader, playerLinkLoader,
|
||||||
handshakeHandler, logger, injector);
|
handshakeHandler, logger, languageManager, injector);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -46,10 +46,11 @@ public final class SpigotPlugin extends JavaPlugin {
|
|||||||
new SpigotPlatformModule(this)
|
new SpigotPlatformModule(this)
|
||||||
);
|
);
|
||||||
|
|
||||||
long endCtm = System.currentTimeMillis();
|
|
||||||
getLogger().info("Took " + (endCtm - ctm) + "ms to boot Floodgate");
|
|
||||||
|
|
||||||
platform = injector.getInstance(SpigotPlatform.class);
|
platform = injector.getInstance(SpigotPlatform.class);
|
||||||
|
|
||||||
|
long endCtm = System.currentTimeMillis();
|
||||||
|
getLogger().info(platform.getLanguageManager().getLocaleStringLog("floodgate.core.finish",
|
||||||
|
endCtm - ctm));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ import org.geysermc.floodgate.FloodgatePlayerImpl;
|
|||||||
import org.geysermc.floodgate.api.SimpleFloodgateApi;
|
import org.geysermc.floodgate.api.SimpleFloodgateApi;
|
||||||
import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
||||||
import org.geysermc.floodgate.api.player.FloodgatePlayer;
|
import org.geysermc.floodgate.api.player.FloodgatePlayer;
|
||||||
|
import org.geysermc.floodgate.util.LanguageManager;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@@ -45,6 +46,7 @@ import java.util.UUID;
|
|||||||
public final class SpigotListener implements Listener {
|
public final class SpigotListener implements Listener {
|
||||||
private final SimpleFloodgateApi api;
|
private final SimpleFloodgateApi api;
|
||||||
private final FloodgateLogger logger;
|
private final FloodgateLogger logger;
|
||||||
|
private final LanguageManager languageManager;
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void onAsyncPreLogin(AsyncPlayerPreLoginEvent event) {
|
public void onAsyncPreLogin(AsyncPlayerPreLoginEvent event) {
|
||||||
@@ -66,8 +68,8 @@ public final class SpigotListener implements Listener {
|
|||||||
FloodgatePlayer player = api.getPlayer(uniqueId);
|
FloodgatePlayer player = api.getPlayer(uniqueId);
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
player.as(FloodgatePlayerImpl.class).setLogin(false);
|
player.as(FloodgatePlayerImpl.class).setLogin(false);
|
||||||
logger.info("Floodgate player who is logged in as {} {} joined",
|
logger.info(languageManager.getLocaleStringLog("floodgate.ingame.login_name",
|
||||||
player.getCorrectUsername(), player.getCorrectUniqueId());
|
player.getCorrectUsername(), player.getCorrectUniqueId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,9 +77,8 @@ public final class SpigotListener implements Listener {
|
|||||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
if (api.removePlayer(player.getUniqueId()) != null) {
|
if (api.removePlayer(player.getUniqueId()) != null) {
|
||||||
logger.info(
|
logger.info(languageManager.getLocaleStringLog(
|
||||||
"Floodgate player who was logged in as {} {} disconnected",
|
"floodgate.ingame.disconnect_name", player.getName())
|
||||||
player.getName(), player.getUniqueId()
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import org.geysermc.floodgate.api.SimpleFloodgateApi;
|
|||||||
import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
||||||
import org.geysermc.floodgate.listener.SpigotListener;
|
import org.geysermc.floodgate.listener.SpigotListener;
|
||||||
import org.geysermc.floodgate.register.ListenerRegister;
|
import org.geysermc.floodgate.register.ListenerRegister;
|
||||||
|
import org.geysermc.floodgate.util.LanguageManager;
|
||||||
|
|
||||||
public final class SpigotListenerModule extends AbstractModule {
|
public final class SpigotListenerModule extends AbstractModule {
|
||||||
@Override
|
@Override
|
||||||
@@ -44,7 +45,8 @@ public final class SpigotListenerModule extends AbstractModule {
|
|||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
@ProvidesIntoSet
|
@ProvidesIntoSet
|
||||||
public Listener spigotListener(SimpleFloodgateApi api, FloodgateLogger logger) {
|
public Listener spigotListener(SimpleFloodgateApi api, FloodgateLogger logger,
|
||||||
return new SpigotListener(api, logger);
|
LanguageManager languageManager) {
|
||||||
|
return new SpigotListener(api, logger, languageManager);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,10 +50,11 @@ public final class VelocityPlugin {
|
|||||||
new VelocityPlatformModule()
|
new VelocityPlatformModule()
|
||||||
);
|
);
|
||||||
|
|
||||||
long endCtm = System.currentTimeMillis();
|
|
||||||
logger.info("Took " + (endCtm - ctm) + "ms to boot Floodgate");
|
|
||||||
|
|
||||||
platform = injector.getInstance(FloodgatePlatform.class);
|
platform = injector.getInstance(FloodgatePlatform.class);
|
||||||
|
|
||||||
|
long endCtm = System.currentTimeMillis();
|
||||||
|
logger.info(platform.getLanguageManager().getLocaleStringLog("floodgate.core.finish",
|
||||||
|
endCtm - ctm));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ import net.kyori.adventure.text.TextComponent;
|
|||||||
import org.geysermc.floodgate.api.ProxyFloodgateApi;
|
import org.geysermc.floodgate.api.ProxyFloodgateApi;
|
||||||
import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
||||||
import org.geysermc.floodgate.api.player.FloodgatePlayer;
|
import org.geysermc.floodgate.api.player.FloodgatePlayer;
|
||||||
|
import org.geysermc.floodgate.util.LanguageManager;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -58,17 +59,19 @@ public final class VelocityListener {
|
|||||||
private final AttributeKey<FloodgatePlayer> playerAttribute;
|
private final AttributeKey<FloodgatePlayer> playerAttribute;
|
||||||
private final AttributeKey<String> kickMessageAttribute;
|
private final AttributeKey<String> kickMessageAttribute;
|
||||||
private final FloodgateLogger logger;
|
private final FloodgateLogger logger;
|
||||||
|
private final LanguageManager languageManager;
|
||||||
|
|
||||||
private final Cache<InboundConnection, FloodgatePlayer> playerCache;
|
private final Cache<InboundConnection, FloodgatePlayer> playerCache;
|
||||||
|
|
||||||
public VelocityListener(ProxyFloodgateApi api,
|
public VelocityListener(ProxyFloodgateApi api,
|
||||||
AttributeKey<FloodgatePlayer> playerAttribute,
|
AttributeKey<FloodgatePlayer> playerAttribute,
|
||||||
AttributeKey<String> kickMessageAttribute,
|
AttributeKey<String> kickMessageAttribute,
|
||||||
FloodgateLogger logger) {
|
FloodgateLogger logger, LanguageManager languageManager) {
|
||||||
this.api = api;
|
this.api = api;
|
||||||
this.playerAttribute = playerAttribute;
|
this.playerAttribute = playerAttribute;
|
||||||
this.kickMessageAttribute = kickMessageAttribute;
|
this.kickMessageAttribute = kickMessageAttribute;
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
|
this.languageManager = languageManager;
|
||||||
|
|
||||||
this.playerCache = CacheBuilder.newBuilder()
|
this.playerCache = CacheBuilder.newBuilder()
|
||||||
.maximumSize(500)
|
.maximumSize(500)
|
||||||
@@ -125,8 +128,9 @@ public final class VelocityListener {
|
|||||||
|
|
||||||
if (fPlayer != null && api.removePlayer(fPlayer)) {
|
if (fPlayer != null && api.removePlayer(fPlayer)) {
|
||||||
api.removeEncryptedData(event.getPlayer().getUniqueId());
|
api.removeEncryptedData(event.getPlayer().getUniqueId());
|
||||||
logger.info("Removed Bedrock player who was logged in as {} {} ",
|
logger.info(languageManager.getLocaleStringLog(
|
||||||
player.getUsername(), player.getUniqueId());
|
"floodgate.ingame.disconnect_name", player.getUsername())
|
||||||
|
);
|
||||||
}
|
}
|
||||||
} catch (Exception exception) {
|
} catch (Exception exception) {
|
||||||
logger.error("Failed to remove the player", exception);
|
logger.error("Failed to remove the player", exception);
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import org.geysermc.floodgate.api.logger.FloodgateLogger;
|
|||||||
import org.geysermc.floodgate.api.player.FloodgatePlayer;
|
import org.geysermc.floodgate.api.player.FloodgatePlayer;
|
||||||
import org.geysermc.floodgate.listener.VelocityListener;
|
import org.geysermc.floodgate.listener.VelocityListener;
|
||||||
import org.geysermc.floodgate.register.ListenerRegister;
|
import org.geysermc.floodgate.register.ListenerRegister;
|
||||||
|
import org.geysermc.floodgate.util.LanguageManager;
|
||||||
|
|
||||||
public final class VelocityListenerModule extends AbstractModule {
|
public final class VelocityListenerModule extends AbstractModule {
|
||||||
@Override
|
@Override
|
||||||
@@ -45,8 +46,9 @@ public final class VelocityListenerModule extends AbstractModule {
|
|||||||
@Singleton
|
@Singleton
|
||||||
@ProvidesIntoSet
|
@ProvidesIntoSet
|
||||||
public Object velocityListener(ProxyFloodgateApi api, FloodgateLogger logger,
|
public Object velocityListener(ProxyFloodgateApi api, FloodgateLogger logger,
|
||||||
|
LanguageManager languageManager,
|
||||||
@Named("playerAttribute") AttributeKey<FloodgatePlayer> playerAttr,
|
@Named("playerAttribute") AttributeKey<FloodgatePlayer> playerAttr,
|
||||||
@Named("kickMessageAttribute") AttributeKey<String> kickMessageAttr) {
|
@Named("kickMessageAttribute") AttributeKey<String> kickMessageAttr) {
|
||||||
return new VelocityListener(api, playerAttr, kickMessageAttr, logger);
|
return new VelocityListener(api, playerAttr, kickMessageAttr, logger, languageManager);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user