diff --git a/src/de/warking/bungeecore/BungeeCore.java b/src/de/warking/bungeecore/BungeeCore.java index 289c640..abc3920 100644 --- a/src/de/warking/bungeecore/BungeeCore.java +++ b/src/de/warking/bungeecore/BungeeCore.java @@ -2,6 +2,7 @@ package de.warking.bungeecore; import de.warking.bungeecore.arenasystem.ArenaSystem; import de.warking.bungeecore.commands.*; +import de.warking.bungeecore.sql.sql; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.plugin.Command; import net.md_5.bungee.api.plugin.Plugin; @@ -22,7 +23,7 @@ public class BungeeCore extends Plugin { public static BungeeCore instance; public static String ChatPrefix; public static final String TeamchatPrefix = "§4T§7c§r §e"; - public static final DateTimeFormatter DateFormat = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"); + public static final DateTimeFormatter DateFormat = DateTimeFormatter.ofPattern("dd.MM.yyyy"); public static String LobbyServer; public static final HashMap serverPermissions = new HashMap<>(); public static final HashMap commands = new HashMap<>(); @@ -91,8 +92,9 @@ public class BungeeCore extends Plugin { addCmd(new AlertCommand()); addCmd(new KickCommand()); addCmd(new JoinmeCommand()); - addCmd(new FightCommand()); + //addCmd(new FightCommand()); addCmd(new HelpCommand()); + addCmd(new BanCommand()); } @Override diff --git a/src/de/warking/bungeecore/PlayerListener.java b/src/de/warking/bungeecore/PlayerListener.java index e97b50c..f731926 100644 --- a/src/de/warking/bungeecore/PlayerListener.java +++ b/src/de/warking/bungeecore/PlayerListener.java @@ -1,9 +1,15 @@ package de.warking.bungeecore; +import de.warking.bungeecore.arenasystem.Arena; import de.warking.bungeecore.arenasystem.ArenaSystem; +import de.warking.bungeecore.sql.BannedUserIPs; +import de.warking.bungeecore.sql.WarkingUser; import net.md_5.bungee.api.AbstractReconnectHandler; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; @@ -12,6 +18,7 @@ import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.event.EventHandler; import java.util.List; +import java.util.Map; public class PlayerListener implements Listener { @@ -19,6 +26,7 @@ public class PlayerListener implements Listener { public void onLogin(LoginEvent event) { WarkingUser user = new WarkingUser(event.getConnection()); if(user.isBanned()) { + user.updateBanIP(event.getConnection().getAddress().getAddress().getHostAddress()); event.setCancelled(true); if (user.BanTime.before(WarkingUser.PermaBan)) { event.setCancelReason(new TextComponent(BungeeCore.ChatPrefix + "§cDu bist permanent gebannt. §r§lGrund§r: §c" + user.BanReason)); @@ -27,6 +35,34 @@ public class PlayerListener implements Listener { user.BanTime.toLocalDateTime().format(BungeeCore.DateFormat) + " gebannt. §r§lGrund§r: §c" + user.BanReason)); } } + + List ips = BannedUserIPs.get(event.getConnection().getAddress().getAddress().getHostAddress()); + if(ips.size() > 0){ + StringBuilder potentialBan = new StringBuilder(); + potentialBan.append(BungeeCore.ChatPrefix); + potentialBan.append("§cMögliche Bannumgehung durch §r"); + potentialBan.append(user.UserName); + potentialBan.append("§c:"); + + for(BannedUserIPs banned : ips){ + WarkingUser bannedUser = new WarkingUser(banned.getUserID()); + potentialBan.append(" §6"); + potentialBan.append(banned.getTimestamp().toLocalDateTime().format(BungeeCore.DateFormat)); + potentialBan.append(" §c"); + potentialBan.append(bannedUser.UserName); + } + + TextComponent msg = new TextComponent(potentialBan.toString()); + msg.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§cBanne Spieler wegen Bannumgehung").create())); + msg.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/ban " + user.UserName + " perma Bannumgehung")); + for (ProxiedPlayer target : ProxyServer.getInstance().getPlayers()){ + if ((target.hasPermission("bungeecore.teamchat")) + && (target.getChatMode() == ProxiedPlayer.ChatMode.COMMANDS_ONLY + || target.getChatMode() == ProxiedPlayer.ChatMode.SHOWN)){ + target.sendMessage(msg); + } + } + } } @EventHandler @@ -74,7 +110,12 @@ public class PlayerListener implements Listener { break; } - //player.getModList(); For the Future! + Map modlist = player.getModList(); + for(String key : modlist.keySet()){ + System.out.println(key + " > " + modlist.get(key)); + } + if(player.isForgeUser()) + System.out.println("Forge user!"); } /** To redirect players to the lobby in case of server closure. */ @@ -104,6 +145,15 @@ public class PlayerListener implements Listener { ev.setCancelServer(kickTo); } + @EventHandler + public void onServerSwitchEvent(ServerSwitchEvent e){ + ProxiedPlayer p = e.getPlayer(); + Arena a = ArenaSystem.getArena(p); + if(a != null && !p.getServer().getInfo().equals(a.server)){ + a.removePlayer(p); + } + } + @EventHandler public void onChatEvent(ChatEvent e){ if(e.isCommand()){ @@ -129,9 +179,8 @@ public class PlayerListener implements Listener { e.setCancelled(true); return; } - if(ArenaSystem.getPlayer(sender) != null){ + if(ArenaSystem.inArena(sender)) return; - } String name = sender.getDisplayName(); String message = e.getMessage(); diff --git a/src/de/warking/bungeecore/arenasystem/Arena.java b/src/de/warking/bungeecore/arenasystem/Arena.java index 3726959..18daaee 100644 --- a/src/de/warking/bungeecore/arenasystem/Arena.java +++ b/src/de/warking/bungeecore/arenasystem/Arena.java @@ -11,31 +11,32 @@ import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetSocketAddress; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; public class Arena implements Runnable{ public final String serverName; public final int arenenNummer; - public final String spielModus; + public final ArenaMode spielModus; private Process p; private PrintWriter writer; - private ServerInfo server; + public ServerInfo server; private boolean started = false; - private final List cachedPlayers = new ArrayList<>(); - private final List players = new ArrayList<>(); + private final List cachedPlayers = new ArrayList<>(); + private final List players = new ArrayList<>(); - public Arena(String modus, int id){ + public Arena(ArenaMode modus, int id){ spielModus = modus; arenenNummer = id; - serverName = modus + id; + serverName = modus.name() + id; int port = 2500 + arenenNummer; ProcessBuilder pb = new ProcessBuilder( "/home/netuser/mc", - "-a", modus, serverName, Integer.toString(port)); + "-a", modus.name(), serverName, Integer.toString(port)); try{ p = pb.start(); ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.instance, this); @@ -50,54 +51,30 @@ public class Arena implements Runnable{ } } - private void sendPlayer(ArenaPlayer p){ + public void sendPlayer(ProxiedPlayer p){ if(!started){ - p.player.sendMessage(BungeeCore.ChatPrefix + "Die Arena wird gestartet, einen Moment bitte..."); + p.sendMessage(BungeeCore.ChatPrefix + "Die Arena wird gestartet, einen Moment bitte..."); cachedPlayers.add(p); }else{ - if(players.contains(p)){ - p.player.connect(server); - players.add(p); + p.connect(server); + players.add(p); + } + } + + public void removePlayer(ProxiedPlayer p){ + Iterator it = cachedPlayers.iterator(); + while(it.hasNext()){ + if(it.next().equals(p)){ + it.remove(); + return; } - p.player.getServer().sendData("FightSystem:NewPlayer", p.role.name().getBytes()); } - } - - public void sendPlayer(ProxiedPlayer p){ - ArenaRole role; - switch(cachedPlayers.size() + players.size()){ - case 0: - role = ArenaRole.RED_LEADER; - break; - case 1: - role = ArenaRole.BLUE_LEADER; - break; - default: - role = ArenaRole.SPECTATOR; - } - - ArenaPlayer aP = new ArenaPlayer(p, role); - sendPlayer(aP); - } - - public void sendPlayer(ProxiedPlayer p, ProxiedPlayer initiator){ - ArenaPlayer parent = getPlayer(initiator); - if(parent == null) - return; - - switch(parent.role){ - case RED_LEADER: - case RED_MEMBER: - sendPlayer(new ArenaPlayer(p, ArenaRole.RED_MEMBER)); - break; - case BLUE_MEMBER: - case BLUE_LEADER: - sendPlayer(new ArenaPlayer(p, ArenaRole.BLUE_MEMBER)); - break; - case SPECTATOR: - default: - sendPlayer(new ArenaPlayer(p, ArenaRole.SPECTATOR)); - break; + it = players.iterator(); + while(it.hasNext()){ + if(it.next().equals(p)){ + it.remove(); + return; + } } } @@ -118,42 +95,35 @@ public class Arena implements Runnable{ ArenaSystem.arenen.remove(this); } - public ArenaPlayer getPlayer(ProxiedPlayer p){ - for(int i = 0; i < cachedPlayers.size(); i++) - if(cachedPlayers.get(i).player.equals(p)){ - if(server.equals(p.getServer().getInfo())) { - return cachedPlayers.get(i); - }else{ - cachedPlayers.remove(i); - return null; - } - } - for(int i = 0; i < players.size(); i++) - if(players.get(i).player.equals(p)){ - if(server.equals(p.getServer().getInfo())) { - return players.get(i); - }else{ - players.remove(i); - return null; - } - } - return null; + public boolean inArena(ProxiedPlayer p){ + for(ProxiedPlayer ap : cachedPlayers) + if(ap.equals(p)) + return true; + for(ProxiedPlayer ap : players) + if(ap.equals(p)) + return true; + return false; } @Override public void run() { try { BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); - String line; + String line = ""; while (!started && (line = reader.readLine()) != null) { //started = line.contains(" INFO]: Done ("); Problematisch started = line.contains("INFO]: [AAC] AAC has been enabled."); } - //Thread.sleep(1000); + if(line == null){ + System.out.println("Fatal error starting arena!"); + return; + } - for(ArenaPlayer aP : cachedPlayers){ + Thread.sleep(200); + + for(ProxiedPlayer aP : cachedPlayers){ sendPlayer(aP); } cachedPlayers.clear(); diff --git a/src/de/warking/bungeecore/arenasystem/ArenaMode.java b/src/de/warking/bungeecore/arenasystem/ArenaMode.java new file mode 100644 index 0000000..e2fa75e --- /dev/null +++ b/src/de/warking/bungeecore/arenasystem/ArenaMode.java @@ -0,0 +1,8 @@ +package de.warking.bungeecore.arenasystem; + +public enum ArenaMode { + AirShip, + WarShip, + WarGear, + MiniWarGear +} diff --git a/src/de/warking/bungeecore/arenasystem/ArenaPlayer.java b/src/de/warking/bungeecore/arenasystem/ArenaPlayer.java deleted file mode 100644 index dec67e0..0000000 --- a/src/de/warking/bungeecore/arenasystem/ArenaPlayer.java +++ /dev/null @@ -1,13 +0,0 @@ -package de.warking.bungeecore.arenasystem; - -import net.md_5.bungee.api.connection.ProxiedPlayer; - -public class ArenaPlayer { - public ProxiedPlayer player; - public ArenaRole role; - - public ArenaPlayer(ProxiedPlayer p, ArenaRole r){ - player = p; - role = r; - } -} \ No newline at end of file diff --git a/src/de/warking/bungeecore/arenasystem/ArenaRole.java b/src/de/warking/bungeecore/arenasystem/ArenaRole.java deleted file mode 100644 index 8e1559a..0000000 --- a/src/de/warking/bungeecore/arenasystem/ArenaRole.java +++ /dev/null @@ -1,9 +0,0 @@ -package de.warking.bungeecore.arenasystem; - -public enum ArenaRole { - RED_LEADER, - RED_MEMBER, - BLUE_LEADER, - BLUE_MEMBER, - SPECTATOR -} diff --git a/src/de/warking/bungeecore/arenasystem/ArenaSystem.java b/src/de/warking/bungeecore/arenasystem/ArenaSystem.java index 1e10df9..045c7ad 100644 --- a/src/de/warking/bungeecore/arenasystem/ArenaSystem.java +++ b/src/de/warking/bungeecore/arenasystem/ArenaSystem.java @@ -25,7 +25,7 @@ public class ArenaSystem { return id; } - public static Arena startServer(String modus){ + public static Arena startServer(ArenaMode modus){ Arena arena = new Arena(modus, freeId()); arenen.add(arena); return arena; @@ -36,19 +36,17 @@ public class ArenaSystem { arenen.firstElement().stop(); } - public static ArenaPlayer getPlayer(ProxiedPlayer p){ + public static boolean inArena(ProxiedPlayer p){ for(Arena a : arenen){ - ArenaPlayer aP = a.getPlayer(p); - if(aP != null) - return aP; + if(a.inArena(p)) + return true; } - return null; + return false; } public static Arena getArena(ProxiedPlayer p){ for(Arena a : arenen){ - ArenaPlayer aP = a.getPlayer(p); - if(aP != null) + if(a.inArena(p)) return a; } return null; diff --git a/src/de/warking/bungeecore/commands/BanCommand.java b/src/de/warking/bungeecore/commands/BanCommand.java new file mode 100644 index 0000000..5a6bdc3 --- /dev/null +++ b/src/de/warking/bungeecore/commands/BanCommand.java @@ -0,0 +1,63 @@ +package de.warking.bungeecore.commands; + +import de.warking.bungeecore.BungeeCore; +import de.warking.bungeecore.sql.WarkingUser; +import net.md_5.bungee.api.*; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.util.*; + +public class BanCommand extends Command { + + public BanCommand() { + super("ban", "bungeecore.ban"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + if(args.length < 3){ + sender.sendMessage(BungeeCore.ChatPrefix + "/ban [Spieler] [dd.mm.yyyy oder perma] [Grund]"); + return; + } + + WarkingUser target = new WarkingUser(args[0]); + if(target.UserName == null){ + sender.sendMessage(BungeeCore.ChatPrefix + "§cDer Spieler existiert nicht."); + return; + } + + StringBuilder msgBuilder = new StringBuilder(); + msgBuilder.append(BungeeCore.ChatPrefix); + Timestamp banTime; + if(args[1].equalsIgnoreCase("perma")) { + msgBuilder.append("§cDu bist permanent gebannt. §r§lGrund§r: §c"); + banTime = Timestamp.from(Instant.ofEpochSecond(946674800)); + }else{ + SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy"); + try{ + Date parsedDate = dateFormat.parse(args[1]); + banTime = new java.sql.Timestamp(parsedDate.getTime()); + msgBuilder.append(" Du bist bis zum "); + msgBuilder.append(banTime.toLocalDateTime().format(BungeeCore.DateFormat)); + msgBuilder.append(" gebannt. §r§lGrund§r: §c"); + }catch(ParseException e){ + sender.sendMessage(BungeeCore.ChatPrefix + "§cUngültige Zeitangabe."); + return; + } + } + + StringBuilder banReason = new StringBuilder(); + for (int i = 2; i < args.length; i++){ + banReason.append(args[i]).append(" "); + } + String msg = banReason.toString(); + msgBuilder.append(msg); + sender.sendMessage(BungeeCore.ChatPrefix + "Du hast " + target.UserName + " gebannt. Grund: §c" + msg); + ProxiedPlayer targetPlayer = ProxyServer.getInstance().getPlayer(target.UUID); + target.banPlayer(targetPlayer.getAddress().getAddress().getHostAddress(), banTime, msg); + targetPlayer.disconnect(msgBuilder.toString()); + } +} diff --git a/src/de/warking/bungeecore/commands/Command.java b/src/de/warking/bungeecore/commands/Command.java index c1b7ec7..0b48a73 100644 --- a/src/de/warking/bungeecore/commands/Command.java +++ b/src/de/warking/bungeecore/commands/Command.java @@ -27,6 +27,6 @@ public abstract class Command extends net.md_5.bungee.api.plugin.Command impleme } public Iterable onTabComplete(CommandSender commandSender, String[] args) { - return null; + return new ArrayList<>(); } } diff --git a/src/de/warking/bungeecore/commands/FightCommand.java b/src/de/warking/bungeecore/commands/FightCommand.java index 49086d0..bbed93e 100644 --- a/src/de/warking/bungeecore/commands/FightCommand.java +++ b/src/de/warking/bungeecore/commands/FightCommand.java @@ -2,6 +2,7 @@ package de.warking.bungeecore.commands; import de.warking.bungeecore.BungeeCore; import de.warking.bungeecore.arenasystem.Arena; +import de.warking.bungeecore.arenasystem.ArenaMode; import de.warking.bungeecore.arenasystem.ArenaSystem; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.ProxyServer; @@ -23,7 +24,11 @@ public class FightCommand extends Command { @Override public void execute(CommandSender sender, String[] args) { if(args.length != 1){ - sender.sendMessage(BungeeCore.ChatPrefix + "/fight airship"); + sender.sendMessage(BungeeCore.ChatPrefix + "§7Mit §6/fight §7kannst du einen neuen Kampf starten!"); + sender.sendMessage(BungeeCore.ChatPrefix + "/fight AirShip §8- §7Starte einen §6AirShip§8-§7Kampf§8!"); + sender.sendMessage(BungeeCore.ChatPrefix + "/fight WarShip §8- §7Starte einen §6WarShip§8-§7Kampf§8!"); + sender.sendMessage(BungeeCore.ChatPrefix + "/fight WarGear §8- §7Starte einen §6WarGear§8-§7Kampf§8!"); + sender.sendMessage(BungeeCore.ChatPrefix + "/fight MiniWarGear §8- §7Starte einen §6Mini§8-§6WarGear§8-§7Kampf§8!"); return; } if(sender instanceof ProxiedPlayer){ @@ -32,7 +37,19 @@ public class FightCommand extends Command { switch(args[0].toLowerCase()){ case "as": case "airship": - arena = ArenaSystem.startServer("Airship"); + arena = ArenaSystem.startServer(ArenaMode.AirShip); + break; + case "ws": + case "warship": + arena = ArenaSystem.startServer(ArenaMode.WarShip); + break; + case "wg": + case "wargear": + arena = ArenaSystem.startServer(ArenaMode.WarGear); + break; + case "mwg": + case "miniwargear": + arena = ArenaSystem.startServer(ArenaMode.MiniWarGear); break; default: sender.sendMessage(BungeeCore.ChatPrefix + "§cUnbekannter Spielmodus: " + args[0]); @@ -40,8 +57,8 @@ public class FightCommand extends Command { } arena.sendPlayer(player); - TextComponent tc = new TextComponent(BungeeCore.ChatPrefix + "Kämpfe jetzt " + arena.spielModus + " gegen " + player.getName() + "[Hier Klicken]!"); - tc.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§aGegen Spieler kämpfen").create())); + TextComponent tc = new TextComponent(BungeeCore.ChatPrefix + "§7Klicke §6hier§7, um jetzt §6" + arena.spielModus + " §7gegen §6" + player.getName() + " §7zu kämpfen!"); + tc.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§aGegen §7" + player.getName() + " §ckämpfen").create())); tc.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/join " + player.getName())); ProxyServer.getInstance().broadcast(tc); } @@ -51,8 +68,14 @@ public class FightCommand extends Command { public Iterable onTabComplete(CommandSender commandSender, String[] args) { List gamemodes = new ArrayList<>(); if(args.length == 1){ - gamemodes.add("airship"); - gamemodes.add("as"); + gamemodes.add("AirShip"); + gamemodes.add("AS"); + gamemodes.add("WarShip"); + gamemodes.add("WS"); + gamemodes.add("WarGear"); + gamemodes.add("WG"); + gamemodes.add("MiniWarGear"); + gamemodes.add("MWG"); } System.out.println(args); return gamemodes; diff --git a/src/de/warking/bungeecore/commands/HelpCommand.java b/src/de/warking/bungeecore/commands/HelpCommand.java index 7b4cd5a..fe66071 100644 --- a/src/de/warking/bungeecore/commands/HelpCommand.java +++ b/src/de/warking/bungeecore/commands/HelpCommand.java @@ -16,12 +16,30 @@ public class HelpCommand extends Command { public void execute(CommandSender sender, String[] args) { if(args.length != 1){ - sender.sendMessage(new TextComponent(BungeeCore.ChatPrefix + "§l§7Hilfe")); + TextComponent tc = new TextComponent(BungeeCore.ChatPrefix + "§7Kehre von überall mit §6/l §7zur Lobby zurück!"); + tc.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§cZurück zur Lobby").create())); + tc.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/l")); + sender.sendMessage(tc); - TextComponent tc = new TextComponent(BungeeCore.ChatPrefix + "Klicke hier, um dem Server beizutreten!"); - tc.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§cServer beitreten").create())); - tc.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/help ")); + tc = new TextComponent(BungeeCore.ChatPrefix + "§7Komme mit §6/bau §7auf den Bauserver!"); + tc.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§cZum Bauserver").create())); + tc.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/bauserver")); + sender.sendMessage(tc); + tc = new TextComponent(BungeeCore.ChatPrefix + "§7Erhalte mit §6/bau §7Hilfe auf dem Bauserver!"); + tc.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§cHilfe zum Bausystem").create())); + tc.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/bau")); + sender.sendMessage(tc); + + /*tc = new TextComponent(BungeeCore.ChatPrefix + "§7Starte mit §6/fight §7einen neuen Kampf!"); + tc.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§cZum Kampfsystem").create())); + tc.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/fight")); + sender.sendMessage(tc); + + tc = new TextComponent(BungeeCore.ChatPrefix + "§7Trete mit §6/join [Spieler] §7einem Kampf bei!"); + tc.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§cSpieler nachjoinen").create())); + tc.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/join")); + sender.sendMessage(tc);*/ }else{ switch(args[0]){ diff --git a/src/de/warking/bungeecore/commands/JoinmeCommand.java b/src/de/warking/bungeecore/commands/JoinmeCommand.java index 8cc123a..52ef00c 100644 --- a/src/de/warking/bungeecore/commands/JoinmeCommand.java +++ b/src/de/warking/bungeecore/commands/JoinmeCommand.java @@ -2,7 +2,6 @@ package de.warking.bungeecore.commands; import de.warking.bungeecore.BungeeCore; import de.warking.bungeecore.arenasystem.Arena; -import de.warking.bungeecore.arenasystem.ArenaPlayer; import de.warking.bungeecore.arenasystem.ArenaSystem; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.ProxyServer; @@ -25,38 +24,32 @@ public class JoinmeCommand extends Command { ProxiedPlayer player = (ProxiedPlayer) sender; if (args.length == 0 && player.hasPermission("bungeecore.joinme")) { - TextComponent tc = new TextComponent(BungeeCore.ChatPrefix + "Klicke hier, um dem Spieler " + player.getName() + " auf " + player.getServer().getInfo().getName() + " zu folgen!"); + TextComponent tc = new TextComponent(BungeeCore.ChatPrefix + "§7Klicke §6hier§8, §7um zu §6" + player.getName() + " §7auf §6" + player.getServer().getInfo().getName() + " §7zu kommen§8!"); tc.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("§aSpieler folgen").create())); tc.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/join " + player.getName())); ProxyServer.getInstance().broadcast(tc); } else if (args.length == 1) { ProxiedPlayer target = ProxyServer.getInstance().getPlayer(args[0]); if(target == null || !target.isConnected()){ - player.sendMessage(BungeeCore.ChatPrefix + "§cDieser Spieler ist derzeit offline."); + player.sendMessage(BungeeCore.ChatPrefix + "§cDieser Spieler ist offline."); return; }else if(target.equals(player)){ - player.sendMessage(BungeeCore.ChatPrefix + "§cDu bist bereits in deiner Sphäre."); + player.sendMessage(BungeeCore.ChatPrefix + "§cSei eins mit dir selbst!"); return; } - ServerInfo server = ProxyServer.getInstance().getPlayer(args[0]).getServer().getInfo(); + ServerInfo server = target.getServer().getInfo(); String ServerPerm = BungeeCore.serverPermissions.get(server.getName()); + Arena arena = ArenaSystem.getArena(target); - if(ServerPerm == null){ - Arena arena = ArenaSystem.getArena(player); - - if(arena == null){ - player.sendMessage(BungeeCore.ChatPrefix + "§cDu kannst diesem Spieler derzeit nicht folgen."); - return; - } - - arena.sendPlayer(player, target); - }else if(!player.hasPermission(ServerPerm)){ + if(arena != null){ + arena.sendPlayer(player); + }else if(ServerPerm != null && !player.hasPermission(ServerPerm)){ player.sendMessage(BungeeCore.ChatPrefix + "§cDu kannst diesem Spieler derzeit nicht folgen."); }else{ player.connect(server); } } else { - player.sendMessage(BungeeCore.ChatPrefix + "/join [Spieler]"); + player.sendMessage(BungeeCore.ChatPrefix + "§7Mit §r/join §8[§rSpieler§8] §7kannst du einem Spieler folgen §8(z.B. in eine Arena)§7."); } } } diff --git a/src/de/warking/bungeecore/commands/TeamchatCommand.java b/src/de/warking/bungeecore/commands/TeamchatCommand.java index b8db735..17c565c 100644 --- a/src/de/warking/bungeecore/commands/TeamchatCommand.java +++ b/src/de/warking/bungeecore/commands/TeamchatCommand.java @@ -31,7 +31,7 @@ public class TeamchatCommand extends Command { msg = ChatColor.translateAlternateColorCodes('&', msg); for (ProxiedPlayer target : ProxyServer.getInstance().getPlayers()){ - if ((target.hasPermission("bungeecore.teamchat") || target.hasPermission("bungeecore.*")) + if ((target.hasPermission("bungeecore.teamchat")) && target.getChatMode() == ProxiedPlayer.ChatMode.SHOWN){ target.sendMessage(msg); } diff --git a/src/de/warking/bungeecore/commands/WebpwCommand.java b/src/de/warking/bungeecore/commands/WebpwCommand.java index 8dead66..c2ee40a 100644 --- a/src/de/warking/bungeecore/commands/WebpwCommand.java +++ b/src/de/warking/bungeecore/commands/WebpwCommand.java @@ -1,8 +1,8 @@ package de.warking.bungeecore.commands; import de.warking.bungeecore.BungeeCore; -import de.warking.bungeecore.WarkingUser; -import de.warking.bungeecore.sql; +import de.warking.bungeecore.sql.WarkingUser; +import de.warking.bungeecore.sql.sql; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.connection.ProxiedPlayer; diff --git a/src/de/warking/bungeecore/sql/BannedUserIPs.java b/src/de/warking/bungeecore/sql/BannedUserIPs.java new file mode 100644 index 0000000..0229d47 --- /dev/null +++ b/src/de/warking/bungeecore/sql/BannedUserIPs.java @@ -0,0 +1,64 @@ +package de.warking.bungeecore.sql; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.List; + +public class BannedUserIPs { + + private int UserID; + private Timestamp Timestamp; + private String IP; + + private BannedUserIPs(int userID, Timestamp timestamp, String ip){ + UserID = userID; + Timestamp = timestamp; + IP = ip; + } + + public static List get(int userID){ + List userIPs = new ArrayList<>(); + ResultSet dbentry = sql.select("SELECT * FROM BannedUserIPs WHERE UserID = '" + userID + "' ORDER BY Timestamp ASC"); + try { + while(dbentry.next()){ + userIPs.add(new BannedUserIPs( + userID, + dbentry.getTimestamp("Timestamp"), + dbentry.getString("IP"))); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return userIPs; + } + + public static List get(String ip){ + List userIDs = new ArrayList<>(); + ResultSet dbentry = sql.select("SELECT * FROM BannedUserIPs WHERE IP = '" + ip + "' ORDER BY Timestamp DESC"); + try { + while(dbentry.next()){ + userIDs.add(new BannedUserIPs( + dbentry.getInt("UserID"), + dbentry.getTimestamp("Timestamp"), + ip)); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return userIDs; + } + + public int getUserID() { + return UserID; + } + + public java.sql.Timestamp getTimestamp() { + return Timestamp; + } + + public String getIP() { + return IP; + } +} diff --git a/src/de/warking/bungeecore/WarkingUser.java b/src/de/warking/bungeecore/sql/WarkingUser.java similarity index 77% rename from src/de/warking/bungeecore/WarkingUser.java rename to src/de/warking/bungeecore/sql/WarkingUser.java index 7bf506c..3a9ca80 100644 --- a/src/de/warking/bungeecore/WarkingUser.java +++ b/src/de/warking/bungeecore/sql/WarkingUser.java @@ -1,5 +1,6 @@ -package de.warking.bungeecore; +package de.warking.bungeecore.sql; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.connection.PendingConnection; import net.md_5.bungee.api.connection.ProxiedPlayer; @@ -20,12 +21,16 @@ public class WarkingUser { public static Timestamp PermaBan = Timestamp.from(Instant.ofEpochSecond(946684800)); + public WarkingUser(int id){ + init(sql.select("SELECT * FROM UserData WHERE id = '" + id + "'")); + } + public WarkingUser(UUID UUID){ init(sql.select("SELECT * FROM UserData WHERE UUID = '" + UUID.toString() + "'")); } public WarkingUser(String UserName){ - init(sql.select("SELECT * FROM UserData WHERE UserName = '" + UserName + "'")); + init(sql.select("SELECT * FROM UserData WHERE lower(UserName) = '" + UserName.toLowerCase() + "'")); } public WarkingUser(PendingConnection connection){ @@ -91,9 +96,24 @@ public class WarkingUser { return true; }else{ sql.update("UPDATE UserData SET BanTime = NULL, BanReason = '' WHERE UUID = '" + UUID.toString() + "'"); + sql.update("DELETE FROM BannedUserIPs WHERE UserID = '" + id + "'"); BanTime = null; BanReason = ""; return false; } } + + public void updateBanIP(String ip){ + sql.update("INSERT INTO BannedUserIPs\n" + + " (UserID, Timestamp, IP)\n" + + "VALUES\n" + + " (" + id + ", NOW(), '" + ip + "')\n" + + "ON DUPLICATE KEY UPDATE\n" + + " Timestamp=NOW()"); + } + + public void banPlayer(String ip, Timestamp time, String banReason){ + sql.update("UPDATE UserData SET BanTime = '" + time.toString() + "', BanReason = '" + banReason + "' WHERE UUID = '" + UUID.toString() + "'"); + updateBanIP(ip); + } } diff --git a/src/de/warking/bungeecore/sql.java b/src/de/warking/bungeecore/sql/sql.java similarity index 98% rename from src/de/warking/bungeecore/sql.java rename to src/de/warking/bungeecore/sql/sql.java index d3afbeb..de0c805 100644 --- a/src/de/warking/bungeecore/sql.java +++ b/src/de/warking/bungeecore/sql/sql.java @@ -1,4 +1,4 @@ -package de.warking.bungeecore; +package de.warking.bungeecore.sql; import java.sql.Connection; import java.sql.DriverManager;