mirror of
https://github.com/TuxCoding/FastLogin.git
synced 2025-07-30 02:37:34 +02:00
Added autoRegister for BungeeCord
This commit is contained in:
@ -22,11 +22,6 @@ public class CrackedCommand implements CommandExecutor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||||
if (plugin.getStorage() == null) {
|
|
||||||
sender.sendMessage(ChatColor.DARK_RED + "This command is disabled on the backend server");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.length == 0) {
|
if (args.length == 0) {
|
||||||
if (!(sender instanceof Player)) {
|
if (!(sender instanceof Player)) {
|
||||||
//console or command block
|
//console or command block
|
||||||
@ -37,22 +32,25 @@ public class CrackedCommand implements CommandExecutor {
|
|||||||
final Player player = (Player) sender;
|
final Player player = (Player) sender;
|
||||||
// UUID uuid = player.getUniqueId();
|
// UUID uuid = player.getUniqueId();
|
||||||
|
|
||||||
//todo: load async if it's not in the cache anymore
|
if (plugin.isBungeeCord()) {
|
||||||
final PlayerProfile profile = plugin.getStorage().getProfile(player.getName(), true);
|
|
||||||
if (profile.isPremium()) {
|
|
||||||
sender.sendMessage(ChatColor.DARK_GREEN + "Removed from the list of premium players");
|
|
||||||
profile.setPremium(false);
|
|
||||||
profile.setUuid(null);
|
|
||||||
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
plugin.getStorage().save(profile);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
notifiyBungeeCord((Player) sender);
|
notifiyBungeeCord((Player) sender);
|
||||||
|
sender.sendMessage(ChatColor.YELLOW + "Sending request...");
|
||||||
} else {
|
} else {
|
||||||
sender.sendMessage(ChatColor.DARK_RED + "You are not in the premium list");
|
//todo: load async if it's not in the cache anymore
|
||||||
|
final PlayerProfile profile = plugin.getStorage().getProfile(player.getName(), true);
|
||||||
|
if (profile.isPremium()) {
|
||||||
|
sender.sendMessage(ChatColor.DARK_GREEN + "Removed from the list of premium players");
|
||||||
|
profile.setPremium(false);
|
||||||
|
profile.setUuid(null);
|
||||||
|
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
plugin.getStorage().save(profile);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
sender.sendMessage(ChatColor.DARK_RED + "You are not in the premium list");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -27,11 +27,6 @@ public class PremiumCommand implements CommandExecutor {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||||
if (plugin.getStorage() == null) {
|
|
||||||
sender.sendMessage(ChatColor.DARK_RED + "This command is disabled on the backend server");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.length == 0) {
|
if (args.length == 0) {
|
||||||
if (!(sender instanceof Player)) {
|
if (!(sender instanceof Player)) {
|
||||||
//console or command block
|
//console or command block
|
||||||
@ -42,23 +37,28 @@ public class PremiumCommand implements CommandExecutor {
|
|||||||
Player player = (Player) sender;
|
Player player = (Player) sender;
|
||||||
// UUID uuid = player.getUniqueId();
|
// UUID uuid = player.getUniqueId();
|
||||||
|
|
||||||
// //todo: load async if it's not in the cache anymore
|
if (plugin.isBungeeCord()) {
|
||||||
final PlayerProfile profile = plugin.getStorage().getProfile(player.getName(), true);
|
notifiyBungeeCord(player);
|
||||||
if (profile.isPremium()) {
|
sender.sendMessage(ChatColor.YELLOW + "Sending request...");
|
||||||
sender.sendMessage(ChatColor.DARK_RED + "You are already on the premium list");
|
|
||||||
} else {
|
} else {
|
||||||
//todo: resolve uuid
|
// //todo: load async if it's not in the cache anymore
|
||||||
profile.setPremium(true);
|
final PlayerProfile profile = plugin.getStorage().getProfile(player.getName(), true);
|
||||||
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
|
if (profile.isPremium()) {
|
||||||
@Override
|
sender.sendMessage(ChatColor.DARK_RED + "You are already on the premium list");
|
||||||
public void run() {
|
} else {
|
||||||
plugin.getStorage().save(profile);
|
//todo: resolve uuid
|
||||||
}
|
profile.setPremium(true);
|
||||||
});
|
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
|
||||||
sender.sendMessage(ChatColor.DARK_GREEN + "Added to the list of premium players");
|
@Override
|
||||||
|
public void run() {
|
||||||
|
plugin.getStorage().save(profile);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
sender.sendMessage(ChatColor.DARK_GREEN + "Added to the list of premium players");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
notifiyBungeeCord((Player) sender);
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
sender.sendMessage(ChatColor.DARK_RED + "NOT IMPLEMENTED YET");
|
sender.sendMessage(ChatColor.DARK_RED + "NOT IMPLEMENTED YET");
|
||||||
|
@ -53,7 +53,7 @@ premiumUuid: false
|
|||||||
# players like cracked player, you have to use other plugins.
|
# players like cracked player, you have to use other plugins.
|
||||||
#
|
#
|
||||||
# If you want to use skins for your cracked player, you need an additional plugin like
|
# If you want to use skins for your cracked player, you need an additional plugin like
|
||||||
# ChangeSkin, SKinRestoer, ...
|
# ChangeSkin, SkinRestoer, ...
|
||||||
forwardSkin: true
|
forwardSkin: true
|
||||||
|
|
||||||
# Database configuration
|
# Database configuration
|
||||||
|
@ -7,6 +7,7 @@ import java.io.File;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
import java.util.Random;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
@ -28,10 +29,16 @@ public class FastLoginBungee extends Plugin {
|
|||||||
+ "-" + withoutDashes.substring(20, 32));
|
+ "-" + withoutDashes.substring(20, 32));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final char[] CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||||
|
.toCharArray();
|
||||||
|
|
||||||
private BungeeAuthPlugin bungeeAuthPlugin;
|
private BungeeAuthPlugin bungeeAuthPlugin;
|
||||||
|
private final MojangApiConnector mojangApiConnector = new MojangApiConnector(this);
|
||||||
private Storage storage;
|
private Storage storage;
|
||||||
private Configuration configuration;
|
private Configuration configuration;
|
||||||
|
|
||||||
|
private final Random random = new Random();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
File configFile = new File(getDataFolder(), "config.yml");
|
File configFile = new File(getDataFolder(), "config.yml");
|
||||||
@ -75,6 +82,15 @@ public class FastLoginBungee extends Plugin {
|
|||||||
registerHook();
|
registerHook();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String generateStringPassword() {
|
||||||
|
StringBuilder generatedPassword = new StringBuilder(8);
|
||||||
|
for (int i = 1; i <= 8; i++) {
|
||||||
|
generatedPassword.append(CHARACTERS[random.nextInt(CHARACTERS.length - 1)]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return generatedPassword.toString();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
if (storage != null) {
|
if (storage != null) {
|
||||||
@ -90,6 +106,10 @@ public class FastLoginBungee extends Plugin {
|
|||||||
return storage;
|
return storage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MojangApiConnector getMojangApiConnector() {
|
||||||
|
return mojangApiConnector;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the auth plugin hook for BungeeCord
|
* Get the auth plugin hook for BungeeCord
|
||||||
*
|
*
|
||||||
|
@ -0,0 +1,78 @@
|
|||||||
|
package com.github.games647.fastlogin.bungee;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import net.md_5.bungee.BungeeCord;
|
||||||
|
|
||||||
|
public class MojangApiConnector {
|
||||||
|
|
||||||
|
//http connection, read timeout and user agent for a connection to mojang api servers
|
||||||
|
private static final int TIMEOUT = 1 * 1_000;
|
||||||
|
private static final String USER_AGENT = "Premium-Checker";
|
||||||
|
|
||||||
|
//mojang api check to prove a player is logged in minecraft and made a join server request
|
||||||
|
private static final String HAS_JOINED_URL = "https://sessionserver.mojang.com/session/minecraft/hasJoined?";
|
||||||
|
|
||||||
|
//only premium (paid account) users have a uuid from here
|
||||||
|
private static final String UUID_LINK = "https://api.mojang.com/users/profiles/minecraft/";
|
||||||
|
//this includes a-zA-Z1-9_
|
||||||
|
private static final String VALID_PLAYERNAME = "^\\w{2,16}$";
|
||||||
|
|
||||||
|
//compile the pattern only on plugin enable -> and this have to be threadsafe
|
||||||
|
private final Pattern playernameMatcher = Pattern.compile(VALID_PLAYERNAME);
|
||||||
|
|
||||||
|
private final FastLoginBungee plugin;
|
||||||
|
|
||||||
|
private final Gson gson = new Gson();
|
||||||
|
|
||||||
|
public MojangApiConnector(FastLoginBungee plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param playerName
|
||||||
|
* @return null on non-premium
|
||||||
|
*/
|
||||||
|
public UUID getPremiumUUID(String playerName) {
|
||||||
|
//check if it's a valid playername
|
||||||
|
if (playernameMatcher.matcher(playerName).matches()) {
|
||||||
|
//only make a API call if the name is valid existing mojang account
|
||||||
|
try {
|
||||||
|
HttpURLConnection connection = getConnection(UUID_LINK + playerName);
|
||||||
|
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
|
||||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||||
|
String line = reader.readLine();
|
||||||
|
if (line != null && !line.equals("null")) {
|
||||||
|
MojangPlayer mojangPlayer = BungeeCord.getInstance().gson.fromJson(line, MojangPlayer.class);
|
||||||
|
return FastLoginBungee.parseId(mojangPlayer.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//204 - no content for not found
|
||||||
|
} catch (Exception ex) {
|
||||||
|
plugin.getLogger().log(Level.SEVERE, "Failed to check if player has a paid account", ex);
|
||||||
|
}
|
||||||
|
//this connection doesn't need to be closed. So can make use of keep alive in java
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private HttpURLConnection getConnection(String url) throws IOException {
|
||||||
|
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
|
||||||
|
connection.setConnectTimeout(TIMEOUT);
|
||||||
|
connection.setReadTimeout(TIMEOUT);
|
||||||
|
//the new Mojang API just uses json as response
|
||||||
|
connection.setRequestProperty("Content-Type", "application/json");
|
||||||
|
connection.setRequestProperty("User-Agent", USER_AGENT);
|
||||||
|
|
||||||
|
return connection;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package com.github.games647.fastlogin.bungee;
|
||||||
|
|
||||||
|
public class MojangPlayer {
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
@ -2,13 +2,19 @@ package com.github.games647.fastlogin.bungee;
|
|||||||
|
|
||||||
import com.github.games647.fastlogin.bungee.hooks.BungeeAuthPlugin;
|
import com.github.games647.fastlogin.bungee.hooks.BungeeAuthPlugin;
|
||||||
import com.google.common.base.Charsets;
|
import com.google.common.base.Charsets;
|
||||||
|
import com.google.common.cache.CacheBuilder;
|
||||||
import com.google.common.io.ByteArrayDataInput;
|
import com.google.common.io.ByteArrayDataInput;
|
||||||
import com.google.common.io.ByteArrayDataOutput;
|
import com.google.common.io.ByteArrayDataOutput;
|
||||||
import com.google.common.io.ByteStreams;
|
import com.google.common.io.ByteStreams;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.ConcurrentMap;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import net.md_5.bungee.api.ChatColor;
|
||||||
import net.md_5.bungee.api.ProxyServer;
|
import net.md_5.bungee.api.ProxyServer;
|
||||||
|
import net.md_5.bungee.api.chat.TextComponent;
|
||||||
import net.md_5.bungee.api.connection.PendingConnection;
|
import net.md_5.bungee.api.connection.PendingConnection;
|
||||||
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
import net.md_5.bungee.api.connection.ProxiedPlayer;
|
||||||
import net.md_5.bungee.api.connection.Server;
|
import net.md_5.bungee.api.connection.Server;
|
||||||
@ -30,6 +36,10 @@ import net.md_5.bungee.event.EventHandler;
|
|||||||
public class PlayerConnectionListener implements Listener {
|
public class PlayerConnectionListener implements Listener {
|
||||||
|
|
||||||
protected final FastLoginBungee plugin;
|
protected final FastLoginBungee plugin;
|
||||||
|
private final ConcurrentMap<PendingConnection, Object> pendingAutoRegister = CacheBuilder
|
||||||
|
.newBuilder()
|
||||||
|
.expireAfterWrite(1, TimeUnit.MINUTES)
|
||||||
|
.<PendingConnection, Object>build().asMap();
|
||||||
|
|
||||||
public PlayerConnectionListener(FastLoginBungee plugin) {
|
public PlayerConnectionListener(FastLoginBungee plugin) {
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
@ -49,14 +59,15 @@ public class PlayerConnectionListener implements Listener {
|
|||||||
if (playerProfile != null) {
|
if (playerProfile != null) {
|
||||||
//user not exists in the db
|
//user not exists in the db
|
||||||
if (!playerProfile.isPremium() && playerProfile.getUserId() == -1) {
|
if (!playerProfile.isPremium() && playerProfile.getUserId() == -1) {
|
||||||
// BungeeAuthPlugin authPlugin = plugin.getBungeeAuthPlugin();
|
BungeeAuthPlugin authPlugin = plugin.getBungeeAuthPlugin();
|
||||||
// if (plugin.getConfiguration().getBoolean("autoRegister") && !authPlugin.isRegistered(username)) {
|
if (plugin.getConfiguration().getBoolean("autoRegister") && !authPlugin.isRegistered(username)) {
|
||||||
// UUID premiumUUID = plugin.getApiConnector().getPremiumUUID(username);
|
UUID premiumUUID = plugin.getMojangApiConnector().getPremiumUUID(username);
|
||||||
// if (premiumUUID != null) {
|
if (premiumUUID != null) {
|
||||||
// plugin.getLogger().log(Level.FINER, "Player {0} uses a premium username", username);
|
plugin.getLogger().log(Level.FINER, "Player {0} uses a premium username", username);
|
||||||
// connection.setOnlineMode(true);
|
connection.setOnlineMode(true);
|
||||||
// }
|
pendingAutoRegister.put(connection, new Object());
|
||||||
// }
|
}
|
||||||
|
}
|
||||||
} else if (playerProfile.isPremium()) {
|
} else if (playerProfile.isPremium()) {
|
||||||
connection.setOnlineMode(true);
|
connection.setOnlineMode(true);
|
||||||
}
|
}
|
||||||
@ -108,7 +119,13 @@ public class PlayerConnectionListener implements Listener {
|
|||||||
|
|
||||||
BungeeAuthPlugin authPlugin = plugin.getBungeeAuthPlugin();
|
BungeeAuthPlugin authPlugin = plugin.getBungeeAuthPlugin();
|
||||||
if (authPlugin != null) {
|
if (authPlugin != null) {
|
||||||
authPlugin.forceLogin(player);
|
Object existed = pendingAutoRegister.remove(player.getPendingConnection());
|
||||||
|
if (existed == null) {
|
||||||
|
authPlugin.forceLogin(player);
|
||||||
|
} else {
|
||||||
|
String password = plugin.generateStringPassword();
|
||||||
|
authPlugin.forceRegister(player, password);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -136,6 +153,16 @@ public class PlayerConnectionListener implements Listener {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
PlayerProfile playerProfile = plugin.getStorage().getProfile(forPlayer.getName(), true);
|
PlayerProfile playerProfile = plugin.getStorage().getProfile(forPlayer.getName(), true);
|
||||||
|
if (playerProfile.isPremium()) {
|
||||||
|
if (forPlayer.isConnected()) {
|
||||||
|
TextComponent textComponent = new TextComponent("You are already on the premium list");
|
||||||
|
textComponent.setColor(ChatColor.DARK_RED);
|
||||||
|
forPlayer.sendMessage(textComponent);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
playerProfile.setPremium(true);
|
playerProfile.setPremium(true);
|
||||||
//todo: set uuid
|
//todo: set uuid
|
||||||
plugin.getStorage().save(playerProfile);
|
plugin.getStorage().save(playerProfile);
|
||||||
@ -147,6 +174,16 @@ public class PlayerConnectionListener implements Listener {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
PlayerProfile playerProfile = plugin.getStorage().getProfile(forPlayer.getName(), true);
|
PlayerProfile playerProfile = plugin.getStorage().getProfile(forPlayer.getName(), true);
|
||||||
|
if (!playerProfile.isPremium()) {
|
||||||
|
if (forPlayer.isConnected()) {
|
||||||
|
TextComponent textComponent = new TextComponent("You are not in the premium list");
|
||||||
|
textComponent.setColor(ChatColor.DARK_RED);
|
||||||
|
forPlayer.sendMessage(textComponent);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
playerProfile.setPremium(false);
|
playerProfile.setPremium(false);
|
||||||
playerProfile.setUuid(null);
|
playerProfile.setUuid(null);
|
||||||
//todo: set uuid
|
//todo: set uuid
|
||||||
|
@ -4,7 +4,6 @@ import java.lang.reflect.Method;
|
|||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
import me.vik1395.BungeeAuth.ListenerClass;
|
import me.vik1395.BungeeAuth.ListenerClass;
|
||||||
import me.vik1395.BungeeAuth.Main;
|
import me.vik1395.BungeeAuth.Main;
|
||||||
@ -43,13 +42,8 @@ public class BungeeAuthHook implements BungeeAuthPlugin {
|
|||||||
callProtected("setStatus", parameterTypes, arguments);
|
callProtected("setStatus", parameterTypes, arguments);
|
||||||
ListenerClass.movePlayer(player, false);
|
ListenerClass.movePlayer(player, false);
|
||||||
|
|
||||||
ProxyServer.getInstance().getScheduler().schedule(Main.plugin, new Runnable() {
|
//proparly not thread-safe
|
||||||
@Override
|
ListenerClass.prelogin.get(player.getName()).cancel();
|
||||||
public void run() {
|
|
||||||
//not thread-safe
|
|
||||||
ListenerClass.prelogin.get(player.getName()).cancel();
|
|
||||||
}
|
|
||||||
}, 0, TimeUnit.SECONDS);
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
Main.plugin.getLogger().severe("[BungeeAuth] Error force loging in player");
|
Main.plugin.getLogger().severe("[BungeeAuth] Error force loging in player");
|
||||||
}
|
}
|
||||||
@ -95,14 +89,8 @@ public class BungeeAuthHook implements BungeeAuthPlugin {
|
|||||||
public void run() {
|
public void run() {
|
||||||
try {
|
try {
|
||||||
callProtected("newPlayerEntry", parameterTypes, arguments);
|
callProtected("newPlayerEntry", parameterTypes, arguments);
|
||||||
|
//proparly not thread-safe
|
||||||
ProxyServer.getInstance().getScheduler().schedule(Main.plugin, new Runnable() {
|
forceLogin(player);
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
//proparly not thread-safe
|
|
||||||
forceLogin(player);
|
|
||||||
}
|
|
||||||
}, 0, TimeUnit.SECONDS);
|
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
Main.plugin.getLogger().severe("[BungeeAuth] Error when creating a new player in the Database");
|
Main.plugin.getLogger().severe("[BungeeAuth] Error when creating a new player in the Database");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user