diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitCommandExecutor.java b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitCommandExecutor.java new file mode 100644 index 0000000..6a8f427 --- /dev/null +++ b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitCommandExecutor.java @@ -0,0 +1,22 @@ +package dev.brighten.antivpn.bukkit; + +import dev.brighten.antivpn.command.CommandExecutor; +import lombok.RequiredArgsConstructor; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +@RequiredArgsConstructor +public class BukkitCommandExecutor implements CommandExecutor { + + private final CommandSender sender; + + @Override + public void sendMessage(String message) { + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', message)); + } + + @Override + public boolean hasPermission(String permission) { + return sender.hasPermission(permission); + } +} diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayer.java b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayer.java new file mode 100644 index 0000000..660094b --- /dev/null +++ b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayer.java @@ -0,0 +1,38 @@ +package dev.brighten.antivpn.bukkit; + +import dev.brighten.antivpn.api.APIPlayer; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +public class BukkitPlayer extends APIPlayer { + + private final Player player; + public BukkitPlayer(Player player) { + super(player.getUniqueId(), player.getName(), player.getAddress().getAddress()); + + this.player = player; + } + + @Override + public void sendMessage(String message) { + player.sendMessage(ChatColor.translateAlternateColorCodes('&', message)); + } + + @Override + public void kickPlayer(String reason) { + if(!Bukkit.isPrimaryThread()) { + new BukkitRunnable() { + public void run() { + player.kickPlayer(ChatColor.translateAlternateColorCodes('&', reason)); + } + }.runTask(BukkitPlugin.pluginInstance); + } else player.kickPlayer(ChatColor.translateAlternateColorCodes('&', reason)); + } + + @Override + public boolean hasPermission(String permission) { + return player.hasPermission(permission); + } +} diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayerExecutor.java b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayerExecutor.java new file mode 100644 index 0000000..7b6d264 --- /dev/null +++ b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlayerExecutor.java @@ -0,0 +1,40 @@ +package dev.brighten.antivpn.bukkit; + +import dev.brighten.antivpn.api.APIPlayer; +import dev.brighten.antivpn.api.PlayerExecutor; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; + +public class BukkitPlayerExecutor implements PlayerExecutor { + @Override + public Optional getPlayer(String name) { + final Player player = Bukkit.getPlayer(name); + + if(player == null) { + return Optional.empty(); + } + + return Optional.of(new BukkitPlayer(player)); + } + + @Override + public Optional getPlayer(UUID uuid) { + final Player player = Bukkit.getPlayer(uuid); + + if(player == null) { + return Optional.empty(); + } + + return Optional.of(new BukkitPlayer(player)); + } + + @Override + public List getOnlinePlayers() { + return Bukkit.getOnlinePlayers().stream().map(BukkitPlayer::new).collect(Collectors.toList()); + } +} diff --git a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java index 5b336bd..dfe7fd9 100644 --- a/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java +++ b/Bukkit/src/main/java/dev/brighten/antivpn/bukkit/BukkitPlugin.java @@ -1,6 +1,12 @@ package dev.brighten.antivpn.bukkit; import dev.brighten.antivpn.AntiVPN; +import dev.brighten.antivpn.command.Command; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.ComponentBuilder; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; import org.bukkit.plugin.java.JavaPlugin; public class BukkitPlugin extends JavaPlugin { @@ -13,7 +19,22 @@ public class BukkitPlugin extends JavaPlugin { //Loading config saveDefaultConfig(); - AntiVPN.start(new BukkitConfig(), new BukkitListener()); + AntiVPN.start(new BukkitConfig(), new BukkitListener(), new BukkitPlayerExecutor()); + + for (Command command : AntiVPN.getInstance().getCommands()) { + getCommand(command.parent() + (command.parent().length() > 0 ? " " : "") + command.name()) + .setExecutor((sender, cmd, key, args) -> { + if(!sender.hasPermission("antivpn.command.*") + && !sender.hasPermission(command.permission())) { + sender.sendMessage(ChatColor.RED + "No permission."); + return true; + } + + command.execute(new BukkitCommandExecutor(sender), args); + + return true; + }); + } } @Override diff --git a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeCommandExecutor.java b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeCommandExecutor.java new file mode 100644 index 0000000..b524fe6 --- /dev/null +++ b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeeCommandExecutor.java @@ -0,0 +1,24 @@ +package dev.brighten.antivpn.bungee; + +import dev.brighten.antivpn.command.CommandExecutor; +import lombok.RequiredArgsConstructor; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.chat.TextComponent; + +@RequiredArgsConstructor +public class BungeeCommandExecutor implements CommandExecutor { + + private final CommandSender executor; + + @Override + public void sendMessage(String message) { + executor.sendMessage(TextComponent.fromLegacyText(ChatColor + .translateAlternateColorCodes('&', message))); + } + + @Override + public boolean hasPermission(String permission) { + return executor.hasPermission(permission); + } +} diff --git a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlayer.java b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlayer.java new file mode 100644 index 0000000..5a6b5e7 --- /dev/null +++ b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlayer.java @@ -0,0 +1,34 @@ +package dev.brighten.antivpn.bungee; + +import dev.brighten.antivpn.api.APIPlayer; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.connection.ProxiedPlayer; + +public class BungeePlayer extends APIPlayer { + + private final ProxiedPlayer player; + public BungeePlayer(ProxiedPlayer player) { + super(player.getUniqueId(), player.getName(), player.getAddress().getAddress()); + + this.player = player; + } + + + @Override + public void sendMessage(String message) { + player.sendMessage(TextComponent.fromLegacyText(ChatColor + .translateAlternateColorCodes('&', message))); + } + + @Override + public void kickPlayer(String reason) { + player.disconnect(TextComponent.fromLegacyText(ChatColor + .translateAlternateColorCodes('&', reason))); + } + + @Override + public boolean hasPermission(String permission) { + return player.hasPermission(permission); + } +} diff --git a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlayerExecutor.java b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlayerExecutor.java new file mode 100644 index 0000000..4221c55 --- /dev/null +++ b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlayerExecutor.java @@ -0,0 +1,37 @@ +package dev.brighten.antivpn.bungee; + +import dev.brighten.antivpn.api.APIPlayer; +import dev.brighten.antivpn.api.PlayerExecutor; +import net.md_5.bungee.BungeeCord; +import net.md_5.bungee.api.connection.ProxiedPlayer; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; + +public class BungeePlayerExecutor implements PlayerExecutor { + + @Override + public Optional getPlayer(String name) { + ProxiedPlayer player = BungeeCord.getInstance().getPlayer(name); + + if(player == null) return Optional.empty(); + + return Optional.of(new BungeePlayer(player)); + } + + @Override + public Optional getPlayer(UUID uuid) { + ProxiedPlayer player = BungeeCord.getInstance().getPlayer(uuid); + + if(player == null) return Optional.empty(); + + return Optional.of(new BungeePlayer(player)); + } + + @Override + public List getOnlinePlayers() { + return BungeeCord.getInstance().getPlayers().stream().map(BungeePlayer::new).collect(Collectors.toList()); + } +} diff --git a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java index 4b03b87..cc59889 100644 --- a/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java +++ b/Bungee/src/main/java/dev/brighten/antivpn/bungee/BungeePlugin.java @@ -2,7 +2,13 @@ package dev.brighten.antivpn.bungee; import dev.brighten.antivpn.AntiVPN; import dev.brighten.antivpn.bungee.util.Config; +import dev.brighten.antivpn.command.Command; import lombok.Getter; +import net.md_5.bungee.BungeeCord; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.plugin.Plugin; public class BungeePlugin extends Plugin { @@ -20,7 +26,24 @@ public class BungeePlugin extends Plugin { config = new Config(); //Loading plugin - AntiVPN.start(new BungeeConfig(), new BungeeListener()); + AntiVPN.start(new BungeeConfig(), new BungeeListener(), new BungeePlayerExecutor()); + + for (Command command : AntiVPN.getInstance().getCommands()) { + BungeeCord.getInstance().getPluginManager().registerCommand(pluginInstance, new net.md_5.bungee.api.plugin + .Command(command.parent() + " " + command.name(), command.permission(), command.aliases()) { + @Override + public void execute(CommandSender commandSender, String[] strings) { + if(!commandSender.hasPermission("antivpn.command.*") + && !commandSender.hasPermission(command.permission())) { + commandSender.sendMessage(new ComponentBuilder("No permission").color(ChatColor.RED) + .create()); + return; + } + + command.execute(new BungeeCommandExecutor(commandSender), strings); + } + }); + } } @Override diff --git a/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java b/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java index e6d5b35..af17653 100644 --- a/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java +++ b/Common/src/main/java/dev/brighten/antivpn/AntiVPN.java @@ -1,7 +1,9 @@ package dev.brighten.antivpn; +import dev.brighten.antivpn.api.PlayerExecutor; import dev.brighten.antivpn.api.VPNConfig; import dev.brighten.antivpn.api.VPNExecutor; +import dev.brighten.antivpn.command.Command; import dev.brighten.antivpn.utils.VPNResponse; import dev.brighten.antivpn.utils.json.JSONException; import dev.brighten.antivpn.utils.json.JSONObject; @@ -11,6 +13,8 @@ import lombok.Getter; import lombok.Setter; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; @Getter @Setter(AccessLevel.PRIVATE) @@ -19,17 +23,23 @@ public class AntiVPN { private static AntiVPN INSTANCE; private VPNConfig config; private VPNExecutor executor; + private PlayerExecutor playerExecutor; + private List commands = new ArrayList<>(); - public static void start(VPNConfig config, VPNExecutor executor) { + public static void start(VPNConfig config, VPNExecutor executor, PlayerExecutor playerExecutor) { //Initializing INSTANCE = new AntiVPN(); - INSTANCE.setConfig(config); - INSTANCE.setExecutor(executor); + INSTANCE.config = config; + INSTANCE.executor = executor; + INSTANCE.playerExecutor = playerExecutor; - getInstance().getExecutor().registerListeners(); - getInstance().getConfig().update(); + INSTANCE.executor.registerListeners(); + INSTANCE.config.update(); + + //Registering commands + registerCommands(); } public void stop() { @@ -51,4 +61,7 @@ public class AntiVPN { return VPNResponse.fromJson(result); } + private static void registerCommands() { + + } } diff --git a/Common/src/main/java/dev/brighten/antivpn/api/APIPlayer.java b/Common/src/main/java/dev/brighten/antivpn/api/APIPlayer.java new file mode 100644 index 0000000..fd871c0 --- /dev/null +++ b/Common/src/main/java/dev/brighten/antivpn/api/APIPlayer.java @@ -0,0 +1,21 @@ +package dev.brighten.antivpn.api; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.net.InetAddress; +import java.util.UUID; + +@Getter +@RequiredArgsConstructor +public abstract class APIPlayer { + private final UUID uuid; + private final String name; + private final InetAddress ip; + + public abstract void sendMessage(String message); + + public abstract void kickPlayer(String reason); + + public abstract boolean hasPermission(String permission); +} diff --git a/Common/src/main/java/dev/brighten/antivpn/api/PlayerExecutor.java b/Common/src/main/java/dev/brighten/antivpn/api/PlayerExecutor.java new file mode 100644 index 0000000..be7398e --- /dev/null +++ b/Common/src/main/java/dev/brighten/antivpn/api/PlayerExecutor.java @@ -0,0 +1,14 @@ +package dev.brighten.antivpn.api; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface PlayerExecutor { + + Optional getPlayer(String name); + + Optional getPlayer(UUID uuid); + + List getOnlinePlayers(); +} diff --git a/Common/src/main/java/dev/brighten/antivpn/command/Command.java b/Common/src/main/java/dev/brighten/antivpn/command/Command.java new file mode 100644 index 0000000..c60364b --- /dev/null +++ b/Common/src/main/java/dev/brighten/antivpn/command/Command.java @@ -0,0 +1,28 @@ +package dev.brighten.antivpn.command; + +import dev.brighten.antivpn.AntiVPN; + +public abstract class Command { + + public Command() { + for (Command child : children()) { + AntiVPN.getInstance().getCommands().add(child); + } + } + + public abstract String permission(); + + public abstract String name(); + + public abstract String[] aliases(); + + public abstract String description(); + + public abstract String usage(); + + public abstract String parent(); + + public abstract Command[] children(); + + public abstract String execute(CommandExecutor executor, String[] args); +} diff --git a/Common/src/main/java/dev/brighten/antivpn/command/CommandExecutor.java b/Common/src/main/java/dev/brighten/antivpn/command/CommandExecutor.java new file mode 100644 index 0000000..5109744 --- /dev/null +++ b/Common/src/main/java/dev/brighten/antivpn/command/CommandExecutor.java @@ -0,0 +1,8 @@ +package dev.brighten.antivpn.command; + +public interface CommandExecutor { + + void sendMessage(String message); + boolean hasPermission(String permission); + +} diff --git a/Common/src/main/java/dev/brighten/antivpn/command/impl/AntiVPNCommand.java b/Common/src/main/java/dev/brighten/antivpn/command/impl/AntiVPNCommand.java new file mode 100644 index 0000000..913c0e2 --- /dev/null +++ b/Common/src/main/java/dev/brighten/antivpn/command/impl/AntiVPNCommand.java @@ -0,0 +1,62 @@ +package dev.brighten.antivpn.command.impl; + +import dev.brighten.antivpn.command.Command; +import dev.brighten.antivpn.command.CommandExecutor; +import dev.brighten.antivpn.utils.StringUtil; + +import java.util.ArrayList; +import java.util.List; + +public class AntiVPNCommand extends Command { + @Override + public String permission() { + return "antivpn.command"; + } + + @Override + public String name() { + return "antivpn"; + } + + @Override + public String[] aliases() { + return new String[] {"kaurivpn", "kvpn", "vpn", "avpn"}; + } + + @Override + public String description() { + return "The main help command"; + } + + @Override + public String usage() { + return ""; + } + + @Override + public String parent() { + return ""; + } + + @Override + public Command[] children() { + return new Command[] {new LookupCommand()}; + } + + @Override + public String execute(CommandExecutor uuid, String[] args) { + List messages = new ArrayList<>(); + + messages.add(StringUtil.line("&8")); + messages.add("&6&lAntiVPN Help Page"); + messages.add(""); + messages.add(String.format("&8/&f%s &8- &7&o%s", "antivpn", description())); + for (Command child : children()) { + messages.add(String.format("&8/&f%s &8- &7&o%s", "&7antivpn &f" + child.name() + " &7" + child.usage(), + description())); + } + messages.add(StringUtil.line("&8")); + + return String.join("\n", messages); + } +} diff --git a/Common/src/main/java/dev/brighten/antivpn/command/impl/LookupCommand.java b/Common/src/main/java/dev/brighten/antivpn/command/impl/LookupCommand.java new file mode 100644 index 0000000..9a2d75b --- /dev/null +++ b/Common/src/main/java/dev/brighten/antivpn/command/impl/LookupCommand.java @@ -0,0 +1,81 @@ +package dev.brighten.antivpn.command.impl; + +import dev.brighten.antivpn.AntiVPN; +import dev.brighten.antivpn.api.APIPlayer; +import dev.brighten.antivpn.command.Command; +import dev.brighten.antivpn.command.CommandExecutor; +import dev.brighten.antivpn.utils.StringUtil; + +import java.util.Optional; + +public class LookupCommand extends Command { + @Override + public String permission() { + return "antivpn.command.lookup"; + } + + @Override + public String name() { + return "lookup"; + } + + @Override + public String[] aliases() { + return new String[] {"check"}; + } + + @Override + public String description() { + return "Lookup a player's ip info"; + } + + @Override + public String usage() { + return ""; + } + + @Override + public String parent() { + return "antivpn"; + } + + @Override + public Command[] children() { + return new Command[0]; + } + + @Override + public String execute(CommandExecutor executor, String[] args) { + if(args.length == 0) { + return "&cPlease supply a player to check the VPN information of"; + } + + Optional player = AntiVPN.getInstance().getPlayerExecutor().getPlayer(args[0]); + + if(!player.isPresent()) { + return String.format("&cNo player found with the name \"%s\"", args[0]); + } + + AntiVPN.getInstance().getExecutor().checkIp(player.get().getIp().getHostAddress(), + false, result -> { + if(!result.isSuccess()) { + executor.sendMessage("&cThere was an error trying to find the information of this player."); + } else { + executor.sendMessage(StringUtil.line("&8")); + executor.sendMessage("&6&l" + player.get().getName() + "s &7&lConnection Information"); + executor.sendMessage(""); + executor.sendMessage(String.format("&e%s&8: &f%s", "Proxy", result.isProxy() + ? "&a" + result.getMethod() : "&cNo")); + executor.sendMessage(String.format("&e%s&8: &f%s", "ISP", result.getIsp())); + executor.sendMessage(String.format("&e%s&8: &f%s", "Country", result.getCountryName())); + executor.sendMessage(String.format("&e%s&8: &f%s", "City", result.getCity())); + executor.sendMessage(String.format("&e%s&8: &f%s", "Coordinates", result.getLatitude() + + "&7/&f" + result.getLongitude())); + executor.sendMessage(StringUtil.line("&8")); + } + }); + + + return "&7Looking up the IP information for player " + player.get().getName() + "..."; + } +} diff --git a/Common/src/main/java/dev/brighten/antivpn/utils/StringUtil.java b/Common/src/main/java/dev/brighten/antivpn/utils/StringUtil.java new file mode 100644 index 0000000..53ba8af --- /dev/null +++ b/Common/src/main/java/dev/brighten/antivpn/utils/StringUtil.java @@ -0,0 +1,15 @@ +package dev.brighten.antivpn.utils; + +public class StringUtil { + public static String line(String color) { + return color + "&m-----------------------------------------------------"; + } + + public static String line() { + return "&m-----------------------------------------------------"; + } + + public static String lineNoStrike(String color) { + return color + "-----------------------------------------------------"; + } +}