diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java index 37284a45..8ee57796 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java @@ -15,8 +15,11 @@ import com.github.games647.fastlogin.bukkit.listener.protocolsupport.ProtocolSup import com.github.games647.fastlogin.bukkit.tasks.DelayedAuthHook; import com.github.games647.fastlogin.core.FastLoginCore; import com.google.common.cache.CacheLoader; +import com.google.common.collect.Sets; import java.security.KeyPair; +import java.util.Set; +import java.util.UUID; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; import java.util.logging.Level; @@ -38,6 +41,8 @@ public class FastLoginBukkit extends JavaPlugin { private final FastLoginCore core = new BukkitCore(this); private boolean serverStarted; + private final Set pendingConfirms = Sets.newHashSet(); + //this map is thread-safe for async access (Packet Listener) //SafeCacheBuilder is used in order to be version independent private final ConcurrentMap session = CompatibleCacheBuilder @@ -211,6 +216,10 @@ public class FastLoginBukkit extends JavaPlugin { return serverStarted; } + public Set getPendingConfirms() { + return pendingConfirms; + } + public void setServerStarted() { if (!this.serverStarted) { this.serverStarted = true; diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/commands/CrackedCommand.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/commands/CrackedCommand.java index ad4bc15e..bd693687 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/commands/CrackedCommand.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/commands/CrackedCommand.java @@ -35,7 +35,7 @@ public class CrackedCommand implements CommandExecutor { sender.sendMessage(message); } } else { - //todo: load async if it's not in the cache anymore + //todo: load async if final PlayerProfile profile = plugin.getCore().getStorage().loadProfile(sender.getName()); if (profile.isPremium()) { sender.sendMessage(plugin.getCore().getMessage("remove-premium")); @@ -54,44 +54,48 @@ public class CrackedCommand implements CommandExecutor { return true; } else { - if (!sender.hasPermission(command.getPermission() + ".other")) { - sender.sendMessage(plugin.getCore().getMessage("no-permission")); - return true; - } - - if (plugin.isBungeeCord()) { - notifiyBungeeCord(sender, args[0]); - String message = plugin.getCore().getMessage("wait-on-proxy"); - if (message != null) { - sender.sendMessage(message); - } - } else { - //todo: load async if it's not in the cache anymore - final PlayerProfile profile = plugin.getCore().getStorage().loadProfile(args[0]); - if (profile == null) { - sender.sendMessage(plugin.getCore().getMessage("player-unknown")); - return true; - } - - if (profile.isPremium()) { - sender.sendMessage(plugin.getCore().getMessage("remove-premium")); - profile.setPremium(false); - profile.setUuid(null); - Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { - @Override - public void run() { - plugin.getCore().getStorage().save(profile); - } - }); - } else { - sender.sendMessage(plugin.getCore().getMessage("not-premium-other")); - } - } + onCrackedOther(sender, command, args); } return true; } + private void onCrackedOther(CommandSender sender, Command command, String[] args) { + if (!sender.hasPermission(command.getPermission() + ".other")) { + sender.sendMessage(plugin.getCore().getMessage("no-permission")); + return; + } + + if (plugin.isBungeeCord()) { + notifiyBungeeCord(sender, args[0]); + String message = plugin.getCore().getMessage("wait-on-proxy"); + if (message != null) { + sender.sendMessage(message); + } + } else { + //todo: load async + final PlayerProfile profile = plugin.getCore().getStorage().loadProfile(args[0]); + if (profile == null) { + sender.sendMessage(plugin.getCore().getMessage("player-unknown")); + return; + } + + if (profile.isPremium()) { + sender.sendMessage(plugin.getCore().getMessage("remove-premium")); + profile.setPremium(false); + profile.setUuid(null); + Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { + @Override + public void run() { + plugin.getCore().getStorage().save(profile); + } + }); + } else { + sender.sendMessage(plugin.getCore().getMessage("not-premium-other")); + } + } + } + private void notifiyBungeeCord(CommandSender sender, String target) { if (sender instanceof Player) { notifiyBungeeCord((Player) sender, target); diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/commands/PremiumCommand.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/commands/PremiumCommand.java index 9557ccd5..4d7aa1c0 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/commands/PremiumCommand.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/commands/PremiumCommand.java @@ -5,6 +5,8 @@ import com.github.games647.fastlogin.core.PlayerProfile; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; +import java.util.UUID; + import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -40,7 +42,15 @@ public class PremiumCommand implements CommandExecutor { sender.sendMessage(message); } } else { -// //todo: load async if it's not in the cache anymore + UUID id = ((Player) sender).getUniqueId(); + if (plugin.getConfig().getBoolean("premium-warning") && !plugin.getPendingConfirms().contains(id)) { + sender.sendMessage(plugin.getCore().getMessage("premium-warming")); + plugin.getPendingConfirms().add(id); + return true; + } + + plugin.getPendingConfirms().remove(id); + //todo: load async final PlayerProfile profile = plugin.getCore().getStorage().loadProfile(sender.getName()); if (profile.isPremium()) { sender.sendMessage(plugin.getCore().getMessage("already-exists")); @@ -60,45 +70,49 @@ public class PremiumCommand implements CommandExecutor { return true; } else { - if (!sender.hasPermission(command.getPermission() + ".other")) { - sender.sendMessage(plugin.getCore().getMessage("no-permission")); - return true; - } - - if (plugin.isBungeeCord()) { - notifiyBungeeCord(sender, args[0]); - String message = plugin.getCore().getMessage("wait-on-proxy"); - if (message != null) { - sender.sendMessage(message); - } - } else { - //todo: load async if it's not in the cache anymore - final PlayerProfile profile = plugin.getCore().getStorage().loadProfile(args[0]); - if (profile == null) { - sender.sendMessage(plugin.getCore().getMessage("player-unknown")); - return true; - } - - if (profile.isPremium()) { - sender.sendMessage(plugin.getCore().getMessage("already-exists-other")); - } else { - //todo: resolve uuid - profile.setPremium(true); - Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { - @Override - public void run() { - plugin.getCore().getStorage().save(profile); - } - }); - - sender.sendMessage(plugin.getCore().getMessage("add-premium")); - } - } + onPremiumOther(sender, command, args); } return true; } + private void onPremiumOther(CommandSender sender, Command command, String[] args) { + if (!sender.hasPermission(command.getPermission() + ".other")) { + sender.sendMessage(plugin.getCore().getMessage("no-permission")); + return ; + } + + if (plugin.isBungeeCord()) { + notifiyBungeeCord(sender, args[0]); + String message = plugin.getCore().getMessage("wait-on-proxy"); + if (message != null) { + sender.sendMessage(message); + } + } else { + //todo: load async + final PlayerProfile profile = plugin.getCore().getStorage().loadProfile(args[0]); + if (profile == null) { + sender.sendMessage(plugin.getCore().getMessage("player-unknown")); + return; + } + + if (profile.isPremium()) { + sender.sendMessage(plugin.getCore().getMessage("already-exists-other")); + } else { + //todo: resolve uuid + profile.setPremium(true); + Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { + @Override + public void run() { + plugin.getCore().getStorage().save(profile); + } + }); + + sender.sendMessage(plugin.getCore().getMessage("add-premium")); + } + } + } + private void notifiyBungeeCord(CommandSender sender, String target) { if (sender instanceof Player) { notifiyBungeeCord((Player) sender, target); diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/BukkitJoinListener.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/BukkitJoinListener.java index 4c811081..0488a041 100644 --- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/BukkitJoinListener.java +++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/BukkitJoinListener.java @@ -44,9 +44,10 @@ public class BukkitJoinListener implements Listener { } } - @EventHandler(ignoreCancelled = true) + @EventHandler public void onPlayerQuit(PlayerQuitEvent quitEvent) { Player player = quitEvent.getPlayer(); player.removeMetadata(plugin.getName(), plugin); + plugin.getPendingConfirms().remove(player.getUniqueId()); } } diff --git a/bungee/src/main/java/com/github/games647/fastlogin/bungee/FastLoginBungee.java b/bungee/src/main/java/com/github/games647/fastlogin/bungee/FastLoginBungee.java index 0a09f6cb..d845d78d 100644 --- a/bungee/src/main/java/com/github/games647/fastlogin/bungee/FastLoginBungee.java +++ b/bungee/src/main/java/com/github/games647/fastlogin/bungee/FastLoginBungee.java @@ -6,10 +6,13 @@ import com.github.games647.fastlogin.bungee.listener.PlayerConnectionListener; import com.github.games647.fastlogin.bungee.listener.PluginMessageListener; import com.github.games647.fastlogin.core.FastLoginCore; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import java.io.File; import java.io.IOException; import java.util.Random; +import java.util.Set; +import java.util.UUID; import java.util.concurrent.ConcurrentMap; import java.util.logging.Level; @@ -32,6 +35,7 @@ public class FastLoginBungee extends Plugin { private Configuration configuration; private final Random random = new Random(); + private final Set pendingConfirms = Sets.newHashSet(); private final ConcurrentMap session = Maps.newConcurrentMap(); @@ -101,6 +105,10 @@ public class FastLoginBungee extends Plugin { return session; } + public Set getPendingConfirms() { + return pendingConfirms; + } + /** * Get the auth plugin hook for BungeeCord * diff --git a/bungee/src/main/java/com/github/games647/fastlogin/bungee/listener/PlayerConnectionListener.java b/bungee/src/main/java/com/github/games647/fastlogin/bungee/listener/PlayerConnectionListener.java index 9949117b..532a1d7d 100644 --- a/bungee/src/main/java/com/github/games647/fastlogin/bungee/listener/PlayerConnectionListener.java +++ b/bungee/src/main/java/com/github/games647/fastlogin/bungee/listener/PlayerConnectionListener.java @@ -94,5 +94,6 @@ public class PlayerConnectionListener implements Listener { public void onDisconnect(PlayerDisconnectEvent disconnectEvent) { ProxiedPlayer player = disconnectEvent.getPlayer(); plugin.getSession().remove(player.getPendingConnection()); + plugin.getPendingConfirms().remove(player.getUniqueId()); } } diff --git a/bungee/src/main/java/com/github/games647/fastlogin/bungee/listener/PluginMessageListener.java b/bungee/src/main/java/com/github/games647/fastlogin/bungee/listener/PluginMessageListener.java index 15c87d75..72f18a8a 100644 --- a/bungee/src/main/java/com/github/games647/fastlogin/bungee/listener/PluginMessageListener.java +++ b/bungee/src/main/java/com/github/games647/fastlogin/bungee/listener/PluginMessageListener.java @@ -8,6 +8,7 @@ import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteStreams; import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.event.PluginMessageEvent; @@ -48,6 +49,14 @@ public class PluginMessageListener implements Listener { if ("ON".equals(subchannel)) { String playerName = dataInput.readUTF(); + if (playerName.equals(fromPlayer.getName()) && plugin.getConfig().getBoolean("premium-warning") + && !plugin.getPendingConfirms().contains(fromPlayer.getUniqueId())) { + fromPlayer.sendMessage(TextComponent.fromLegacyText(plugin.getCore().getMessage("premium-warming"))); + plugin.getPendingConfirms().add(fromPlayer.getUniqueId()); + return; + } + + plugin.getPendingConfirms().remove(fromPlayer.getUniqueId()); AsyncToggleMessage task = new AsyncToggleMessage(plugin, fromPlayer, playerName, true); ProxyServer.getInstance().getScheduler().runAsync(plugin, task); } else if ("OFF".equals(subchannel)) {