diff --git a/pom.xml b/pom.xml index c554ed6..8a0b76d 100644 --- a/pom.xml +++ b/pom.xml @@ -7,13 +7,15 @@ com.rappytv.labyutils LabyUtils 1.0.1 + A simple plugin to utilize LabyMod's server API without coding knowledge. + https://github.com/RappyPlugins/LabyUtils#readme jar LabyUtils - 17 - 1.0.3 + 11 + 1.0.4 UTF-8 @@ -25,8 +27,8 @@ maven-compiler-plugin 3.13.0 - 11 - 11 + ${java.version} + ${java.version} @@ -56,6 +58,10 @@ spigotmc-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + papermc + https://repo.papermc.io/repository/maven-public/ + sonatype https://oss.sonatype.org/content/groups/public/ @@ -87,6 +93,12 @@ 1.12-SNAPSHOT provided + + com.velocitypowered + velocity-api + 3.3.0-SNAPSHOT + provided + net.labymod.serverapi server-bukkit @@ -97,10 +109,16 @@ server-bungeecord ${labymod.serverApiVersion} + + net.labymod.serverapi + server-velocity + ${labymod.serverApiVersion} + org.jetbrains annotations 24.1.0 + provided com.google.code.gson diff --git a/src/main/java/com/rappytv/labyutils/bukkit/LabyUtilsBukkit.java b/src/main/java/com/rappytv/labyutils/bukkit/LabyUtilsBukkit.java index 0876ecc..ac6a09a 100644 --- a/src/main/java/com/rappytv/labyutils/bukkit/LabyUtilsBukkit.java +++ b/src/main/java/com/rappytv/labyutils/bukkit/LabyUtilsBukkit.java @@ -8,7 +8,9 @@ import com.rappytv.labyutils.bukkit.listeners.PlayerListener; import com.rappytv.labyutils.common.ILabyUtilsPlugin; import io.sentry.Sentry; +import net.labymod.serverapi.api.logger.ProtocolPlatformLogger; import net.labymod.serverapi.server.bukkit.LabyModProtocolService; +import net.labymod.serverapi.server.common.JavaProtocolLogger; import net.milkbowl.vault.economy.Economy; import org.bukkit.Bukkit; import org.bukkit.plugin.PluginManager; @@ -24,12 +26,14 @@ public final class LabyUtilsBukkit extends JavaPlugin implements ILabyUtilsPlugi private Economy economy = null; private boolean usingPapi = false; private BukkitConfigManager configManager; + private ProtocolPlatformLogger logger; @Override public void onEnable() { instance = this; saveDefaultConfig(); configManager = new BukkitConfigManager(this); + logger = new JavaProtocolLogger(getLogger()); if(configManager.isSentryEnabled()) { getLogger().info("Thanks for enabling Sentry! Loading..."); initializeSentry(getDescription().getVersion()); @@ -97,4 +101,9 @@ private boolean loadPlaceholderAPI() { usingPapi = getServer().getPluginManager().getPlugin("PlaceholderAPI") != null; return usingPapi; } + + @Override + public ProtocolPlatformLogger logger() { + return logger; + } } diff --git a/src/main/java/com/rappytv/labyutils/bungee/LabyUtilsBungee.java b/src/main/java/com/rappytv/labyutils/bungee/LabyUtilsBungee.java index 7b222dd..6cddb8e 100644 --- a/src/main/java/com/rappytv/labyutils/bungee/LabyUtilsBungee.java +++ b/src/main/java/com/rappytv/labyutils/bungee/LabyUtilsBungee.java @@ -4,18 +4,22 @@ import com.rappytv.labyutils.bungee.commands.ReloadCommand; import com.rappytv.labyutils.bungee.listener.PlayerListener; import com.rappytv.labyutils.common.ILabyUtilsPlugin; +import net.labymod.serverapi.api.logger.ProtocolPlatformLogger; import net.labymod.serverapi.server.bungeecord.LabyModProtocolService; +import net.labymod.serverapi.server.common.JavaProtocolLogger; import net.md_5.bungee.api.plugin.Plugin; public final class LabyUtilsBungee extends Plugin implements ILabyUtilsPlugin { private static LabyUtilsBungee instance; private BungeeConfigManager configManager; + private ProtocolPlatformLogger platformLogger; @Override public void onEnable() { instance = this; configManager = new BungeeConfigManager(new LabyUtilsConfig(this)); + platformLogger = new JavaProtocolLogger(getLogger()); try { LabyModProtocolService.initialize(this); getLogger().info("LabyMod protocol service initialized."); @@ -38,4 +42,9 @@ public static String getPrefix() { public BungeeConfigManager getConfigManager() { return configManager; } + + @Override + public ProtocolPlatformLogger logger() { + return platformLogger; + } } diff --git a/src/main/java/com/rappytv/labyutils/common/ILabyUtilsPlugin.java b/src/main/java/com/rappytv/labyutils/common/ILabyUtilsPlugin.java index 48e41b3..b56d2c5 100644 --- a/src/main/java/com/rappytv/labyutils/common/ILabyUtilsPlugin.java +++ b/src/main/java/com/rappytv/labyutils/common/ILabyUtilsPlugin.java @@ -3,6 +3,7 @@ import com.google.gson.Gson; import com.google.gson.JsonObject; import io.sentry.Sentry; +import net.labymod.serverapi.api.logger.ProtocolPlatformLogger; import net.labymod.serverapi.core.model.display.TabListFlag; import org.jetbrains.annotations.Nullable; @@ -19,21 +20,20 @@ import java.util.Map; import java.util.UUID; import java.util.function.Consumer; -import java.util.logging.Logger; public interface ILabyUtilsPlugin { Map cachedFlags = new HashMap<>(); Gson gson = new Gson(); HttpClient client = HttpClient.newHttpClient(); - Logger getLogger(); + ProtocolPlatformLogger logger(); default void initializeSentry(String version) { Sentry.init(options -> { options.setDsn("https://d8bbca67730b0a4d93cf0e7d179ef12f@sentry.rappytv.com/4"); options.setTracesSampleRate(1.0); options.setRelease(version); - getLogger().info("Sentry loaded!"); + logger().info("Sentry loaded!"); }); } @@ -70,13 +70,13 @@ default void getCountryCode(UUID uuid, InetSocketAddress address, Consumer { Sentry.captureException(throwable); - getLogger().warning("Failed to get country code of " + host); + logger().warn("Failed to get country code of " + host); consumer.accept(null); return null; }); } catch (Exception e) { Sentry.captureException(e); - getLogger().warning("Failed to get country code of " + host); + logger().warn("Failed to get country code of " + host); consumer.accept(null); } } diff --git a/src/main/java/com/rappytv/labyutils/velocity/LabyUtilsVelocity.java b/src/main/java/com/rappytv/labyutils/velocity/LabyUtilsVelocity.java new file mode 100644 index 0000000..a8d8ad5 --- /dev/null +++ b/src/main/java/com/rappytv/labyutils/velocity/LabyUtilsVelocity.java @@ -0,0 +1,85 @@ +package com.rappytv.labyutils.velocity; + +import com.rappytv.labyutils.common.ILabyUtilsPlugin; +import com.rappytv.labyutils.velocity.commands.LabyInfoCommand; +import com.rappytv.labyutils.velocity.commands.ReloadCommand; +import com.rappytv.labyutils.velocity.listener.PlayerListener; +import com.velocitypowered.api.command.BrigadierCommand; +import com.velocitypowered.api.command.CommandManager; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; +import com.velocitypowered.api.plugin.PluginContainer; +import com.velocitypowered.api.plugin.annotation.DataDirectory; +import com.velocitypowered.api.proxy.ProxyServer; +import net.kyori.adventure.text.TextComponent; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import net.labymod.serverapi.api.logger.ProtocolPlatformLogger; +import net.labymod.serverapi.server.velocity.LabyModProtocolService; +import net.labymod.serverapi.server.velocity.Slf4jPlatformLogger; +import org.slf4j.Logger; + +import javax.inject.Inject; +import java.nio.file.Path; +import java.util.Optional; + +public final class LabyUtilsVelocity implements ILabyUtilsPlugin { + + private static LabyUtilsVelocity instance; + private VelocityConfigManager configManager; + private final ProxyServer server; + private final ProtocolPlatformLogger logger; + private final Logger serverLogger; + private final Path dataDirectory; + + @Inject + public LabyUtilsVelocity(ProxyServer server, Logger logger, @DataDirectory Path dataDirectory) { + this.server = server; + this.serverLogger = logger; + this.logger = new Slf4jPlatformLogger(logger); + this.dataDirectory = dataDirectory; + } + + @Subscribe + public void onProxyInitialization(ProxyInitializeEvent event) { + instance = this; + configManager = new VelocityConfigManager(/*new VelocityConfig(this)*/); + try { + LabyModProtocolService.initialize(this, server, serverLogger); + logger.info("LabyMod protocol service initialized."); + } catch (IllegalStateException e) { + logger.info("LabyMod protocol service already initialized."); + } + if(configManager.isSentryEnabled()) { + String version = "?"; + Optional plugin = server.getPluginManager().getPlugin("labyutils"); + if(plugin.isPresent() && plugin.get().getDescription().getVersion().isPresent()) { + version = plugin.get().getDescription().getVersion().get(); + } + logger.info("Thanks for enabling Sentry! Loading..."); + initializeSentry(version); + } + CommandManager manager = server.getCommandManager(); + BrigadierCommand infoCommand = LabyInfoCommand.createBrigadierCommand(this); + BrigadierCommand reloadCommand = ReloadCommand.createBrigadierCommand(this); + manager.register(manager.metaBuilder(infoCommand).build(), infoCommand); + manager.register(manager.metaBuilder(reloadCommand).build(), reloadCommand); + server.getEventManager().register(this, new PlayerListener(this)); + } + + @Override + public ProtocolPlatformLogger logger() { + return logger; + } + + public static TextComponent getPrefix() { + return LegacyComponentSerializer.legacyAmpersand().deserialize(instance.getConfigManager().getPrefix()); + } + + public VelocityConfigManager getConfigManager() { + return configManager; + } + + public ProxyServer getServer() { + return server; + } +} diff --git a/src/main/java/com/rappytv/labyutils/velocity/VelocityConfig.java b/src/main/java/com/rappytv/labyutils/velocity/VelocityConfig.java new file mode 100644 index 0000000..fb5fa4a --- /dev/null +++ b/src/main/java/com/rappytv/labyutils/velocity/VelocityConfig.java @@ -0,0 +1,4 @@ +package com.rappytv.labyutils.velocity; + +public class VelocityConfig { // TODO: Implement config +} diff --git a/src/main/java/com/rappytv/labyutils/velocity/VelocityConfigManager.java b/src/main/java/com/rappytv/labyutils/velocity/VelocityConfigManager.java new file mode 100644 index 0000000..c4dc016 --- /dev/null +++ b/src/main/java/com/rappytv/labyutils/velocity/VelocityConfigManager.java @@ -0,0 +1,126 @@ +package com.rappytv.labyutils.velocity; + +import com.rappytv.labyutils.common.IConfigManager; + +public class VelocityConfigManager implements IConfigManager { + + @Override + public void reloadConfig() { + + } + + @Override + public String getPrefix() { + return ""; + } + + @Override + public boolean isSentryEnabled() { + return true; + } + + @Override + public boolean isWelcomeLogEnabled() { + return true; + } + + @Override + public boolean isWelcomeMessageEnabled() { + return true; + } + + @Override + public String getWelcomeMessage() { + return ""; + } + + @Override + public boolean isBannerEnabled() { + return true; + } + + @Override + public String getBannerUrl() { + return ""; + } + + @Override + public int getEconomyUpdateInterval() { + return 0; + } + + @Override + public boolean showCashBalance() { + return true; + } + + @Override + public boolean showBankBalance() { + return true; + } + + @Override + public boolean areFlagsEnabled() { + return true; + } + + @Override + public boolean areSubtitlesEnabled() { + return true; + } + + @Override + public Object getSubtitles() { + return null; + } + + @Override + public boolean areInteractionsEnabled() { + return true; + } + + @Override + public Object getInteractionBullets() { + return null; + } + + @Override + public boolean isAddonManagementEnabled() { + return true; + } + + @Override + public Object getAddonManagement() { + return null; + } + + @Override + public String getAddonKickMessage() { + return ""; + } + + @Override + public boolean arePermissionsEnabled() { + return true; + } + + @Override + public Object getPermissions() { + return null; + } + + @Override + public boolean isRpcEnabled() { + return true; + } + + @Override + public String getRpcText() { + return ""; + } + + @Override + public boolean showRpcJoinTime() { + return true; + } +} diff --git a/src/main/java/com/rappytv/labyutils/velocity/commands/LabyInfoCommand.java b/src/main/java/com/rappytv/labyutils/velocity/commands/LabyInfoCommand.java new file mode 100644 index 0000000..eeb24db --- /dev/null +++ b/src/main/java/com/rappytv/labyutils/velocity/commands/LabyInfoCommand.java @@ -0,0 +1,119 @@ +package com.rappytv.labyutils.velocity.commands; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.tree.LiteralCommandNode; +import com.rappytv.labyutils.common.ILabyUtilsPlugin; +import com.rappytv.labyutils.velocity.LabyUtilsVelocity; +import com.velocitypowered.api.command.BrigadierCommand; +import com.velocitypowered.api.command.CommandSource; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; +import net.labymod.serverapi.api.model.component.ServerAPITextComponent; +import net.labymod.serverapi.server.velocity.LabyModPlayer; +import net.labymod.serverapi.server.velocity.LabyModProtocolService; + +public class LabyInfoCommand { + + @SuppressWarnings("ResultOfMethodCallIgnored") + public static BrigadierCommand createBrigadierCommand(final LabyUtilsVelocity plugin) { + Component prefix = LabyUtilsVelocity.getPrefix(); + LiteralCommandNode infoNode = BrigadierCommand.literalArgumentBuilder("labyinfo") + .requires(source -> source.hasPermission("labyutils.info")) + .executes(context -> { + plugin.getConfigManager().reloadConfig(); + context.getSource().sendMessage(prefix.append(Component.text( + "Please enter a player name!", + NamedTextColor.RED + ))); + + return Command.SINGLE_SUCCESS; + }) + .then(BrigadierCommand.requiredArgumentBuilder("player", StringArgumentType.word()) + .suggests((ctx, builder) -> { + plugin.getServer().getAllPlayers().forEach(player -> builder.suggest(player.getUsername())); + return builder.buildFuture(); + }) + .executes(context -> { + String name = context.getArgument("player", String.class); + plugin.getServer().getPlayer(name).ifPresentOrElse(player -> { + Component response = Component.empty() + .append(prefix) + .append(Component.text( + "LabyInfo of " + player.getUsername(), NamedTextColor.GOLD + )) + .appendNewline() + .append(prefix) + .append(Component.text("UUID: ", NamedTextColor.AQUA)) + .append(Component.text(player.getUniqueId().toString(), NamedTextColor.GRAY)) + .appendNewline() + .append(prefix) + .append(Component.text("Using LabyMod: ", NamedTextColor.AQUA)); + LabyModPlayer labyPlayer = LabyModProtocolService.get().getPlayer(player.getUniqueId()); + if(labyPlayer == null) { + context.getSource().sendMessage(response.append( + Component.text("No", NamedTextColor.RED) + )); + return; + } + response.append(Component.text("Yes", NamedTextColor.GREEN)); + if(plugin.getConfigManager().areSubtitlesEnabled() + && context.getSource().hasPermission("labyutils.info.subtitle")) { + ServerAPITextComponent component = (ServerAPITextComponent) labyPlayer.subtitle().getText(); + String subtitle = component != null ? component.getText() : "--"; + response + .appendNewline() + .append(prefix) + .append(Component.text("Server subtitle: ", NamedTextColor.AQUA)) + .append(LegacyComponentSerializer.legacyAmpersand().deserialize( + "§7" + subtitle + )); + } + if(context.getSource().hasPermission("labyutils.info.economy")) { + response + .appendNewline() + .append(prefix) + .append(Component.text("Economy cash: ", NamedTextColor.AQUA)) + .append(Component.text( + plugin.formatNumber(labyPlayer.cashEconomy().getBalance()), + NamedTextColor.GRAY + )) + .appendNewline() + .append(prefix) + .append(Component.text("Economy bank: ", NamedTextColor.AQUA)) + .append(Component.text( + plugin.formatNumber(labyPlayer.bankEconomy().getBalance()), + NamedTextColor.GRAY + )); + } + if(context.getSource().hasPermission("labyutils.info.version")) { + response + .appendNewline() + .append(prefix) + .append(Component.text("LabyMod version: ", NamedTextColor.AQUA)) + .append(Component.text(labyPlayer.getLabyModVersion())); + } + if(context.getSource().hasPermission("labyutils.info.region")) { + String flag = ILabyUtilsPlugin.cachedFlags.containsKey(player.getUniqueId()) + ? ILabyUtilsPlugin.cachedFlags.get(player.getUniqueId()).name() + : "--"; + response + .appendNewline() + .append(prefix) + .append(Component.text("Region: ", NamedTextColor.AQUA)) + .append(Component.text(flag, NamedTextColor.GRAY)); + } + context.getSource().sendMessage(response); + }, () -> context.getSource().sendMessage(Component.text( + LabyUtilsVelocity.getPrefix() + "§cThis player was not found!" + ))); + + return Command.SINGLE_SUCCESS; + }) + ) + .build(); + + return new BrigadierCommand(infoNode); + } +} diff --git a/src/main/java/com/rappytv/labyutils/velocity/commands/ReloadCommand.java b/src/main/java/com/rappytv/labyutils/velocity/commands/ReloadCommand.java new file mode 100644 index 0000000..d8316c7 --- /dev/null +++ b/src/main/java/com/rappytv/labyutils/velocity/commands/ReloadCommand.java @@ -0,0 +1,29 @@ +package com.rappytv.labyutils.velocity.commands; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.tree.LiteralCommandNode; +import com.rappytv.labyutils.velocity.LabyUtilsVelocity; +import com.velocitypowered.api.command.BrigadierCommand; +import com.velocitypowered.api.command.CommandSource; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; + +public class ReloadCommand { + + public static BrigadierCommand createBrigadierCommand(final LabyUtilsVelocity plugin) { + LiteralCommandNode reloadNode = BrigadierCommand.literalArgumentBuilder("labyutils") + .requires(source -> source.hasPermission("labyutils.reload")) + .executes(context -> { + plugin.getConfigManager().reloadConfig(); + context.getSource().sendMessage(LabyUtilsVelocity.getPrefix().append(Component.text( + "Addon config successfully reloaded!", + NamedTextColor.GRAY + ))); + + return Command.SINGLE_SUCCESS; + }) + .build(); + + return new BrigadierCommand(reloadNode); + } +} diff --git a/src/main/java/com/rappytv/labyutils/velocity/listener/PlayerListener.java b/src/main/java/com/rappytv/labyutils/velocity/listener/PlayerListener.java new file mode 100644 index 0000000..ecde32a --- /dev/null +++ b/src/main/java/com/rappytv/labyutils/velocity/listener/PlayerListener.java @@ -0,0 +1,213 @@ +package com.rappytv.labyutils.velocity.listener; + +import com.rappytv.labyutils.common.listeners.IPlayerListener; +import com.rappytv.labyutils.velocity.LabyUtilsVelocity; +import com.velocitypowered.api.event.Subscribe; +import net.kyori.adventure.text.Component; +import net.labymod.serverapi.api.model.component.ServerAPIComponent; +import net.labymod.serverapi.core.model.feature.DiscordRPC; +import net.labymod.serverapi.core.model.feature.InteractionMenuEntry; +import net.labymod.serverapi.core.model.moderation.Permission; +import net.labymod.serverapi.core.model.moderation.RecommendedAddon; +import net.labymod.serverapi.server.velocity.LabyModPlayer; +import net.labymod.serverapi.server.velocity.event.LabyModPlayerJoinEvent; + +import java.util.ArrayList; +import java.util.List; + +public class PlayerListener implements IPlayerListener { + + private final LabyUtilsVelocity plugin; + + public PlayerListener(LabyUtilsVelocity plugin) { + this.plugin = plugin; + } + + @Subscribe(async = false) + @Override + public void onPlayerJoin(LabyModPlayerJoinEvent event) { + LabyModPlayer labyPlayer = event.labyModPlayer(); + + logJoin(labyPlayer); + sendWelcomer(labyPlayer); + setBanner(labyPlayer); + setFlag(labyPlayer); + setSubtitle(labyPlayer); + setInteractionBullets(labyPlayer); + manageAddons(labyPlayer); + managePermissions(labyPlayer); + setRPC(labyPlayer); + } + + @Override + public void logJoin(LabyModPlayer player) { + if(!plugin.getConfigManager().isWelcomeLogEnabled()) return; + plugin.logger().info(String.format( + "%s just joined with LabyMod v%s!", + player.getPlayer().getUsername(), + player.getLabyModVersion() + )); + } + + @Override + public void sendWelcomer(LabyModPlayer player) { + if(!plugin.getConfigManager().isWelcomeMessageEnabled()) return; + String text = plugin + .getConfigManager() + .getWelcomeMessage() + .replace("", plugin.getConfigManager().getPrefix()); + player.getPlayer().sendMessage(Component.text(text)); + } + + @Override + public void setBanner(LabyModPlayer player) { + if(!plugin.getConfigManager().isBannerEnabled()) return; + player.sendTabListBanner(plugin.getConfigManager().getBannerUrl()); + } + + @Override + public void setFlag(LabyModPlayer player) { + plugin.getCountryCode(player.getUniqueId(), player.getPlayer().getRemoteAddress(), (flag) -> { + if(flag != null && plugin.getConfigManager().areFlagsEnabled()) { + plugin.getServer().getScheduler().buildTask(plugin, () -> player.setTabListFlag(flag)).schedule(); + } + }); + } + + @Override + public void setSubtitle(LabyModPlayer player) { + if(!plugin.getConfigManager().areSubtitlesEnabled()) return; +// Configuration section = plugin +// .getConfigManager() +// .getSubtitles(); +// +// if(section == null) return; +// ServerAPIComponent component = null; +// double size = -1; +// +// for(String key : section.getKeys()) { +// String permission = section.getString(key + ".permission"); +// String text = section.getString(key + ".text"); +// if(permission != null && text != null && player.getPlayer().hasPermission(permission)) { +// component = ServerAPIComponent.text(text); +// size = section.getDouble(key + ".size"); +// break; +// } +// } +// if(component == null || size <= 0) { +// player.resetSubtitle(); +// return; +// } +// +// player.updateSubtitle(component, size); + } + + @Override + public void setInteractionBullets(LabyModPlayer player) { + if(!plugin.getConfigManager().areInteractionsEnabled()) return; +// List entries = new ArrayList<>(); +// Configuration section = plugin +// .getConfigManager() +// .getInteractionBullets(); +// +// for(String key : section.getKeys()) { +// if(section.contains(key + ".permission") +// && !player.getPlayer().hasPermission(section.getString(key + ".permission"))) continue; +// try { +// entries.add((InteractionMenuEntry.create( +// ServerAPIComponent.text(section.getString(key + ".title")), +// InteractionMenuEntry.InteractionMenuType.valueOf( +// section.getString(key + ".type").toUpperCase().replace(' ', '_') +// ), +// section.getString(key + ".value") +// ))); +// } catch (Exception e) { +// plugin.getLogger().warning("Failed to build interaction bullet with id " + key); +// } +// } +// +// if(!entries.isEmpty()) player.sendInteractionMenuEntries(entries); + } + + @Override + public void manageAddons(LabyModPlayer player) { + if(!plugin.getConfigManager().isAddonManagementEnabled()) return; +// List recommendedAddons = new ArrayList<>(); +// List disabledAddons = new ArrayList<>(); +// +// Configuration section = plugin +// .getConfigManager() +// .getAddonManagement(); +// +// if(section == null) return; +// +// for(String key : section.getKeys()) { +// boolean canBypass = player.getPlayer().hasPermission("labyutils.bypass.*") +// || player.getPlayer().hasPermission("labyutils.bypass." + key); +// if(canBypass) continue; +// switch (section.getString(key, "none").toLowerCase()) { +// case "recommend": +// recommendedAddons.add(RecommendedAddon.of(key, false)); +// break; +// case "require": +// recommendedAddons.add(RecommendedAddon.of(key, true)); +// break; +// case "disable": +// disabledAddons.add(key); +// break; +// } +// } +// +// if(!recommendedAddons.isEmpty()) { +// player.sendAddonRecommendations(recommendedAddons, response -> { +// if(response.isInitial()) return; +// if(!response.isAllInstalled()) { +// if(player.getPlayer().isActive()) player.getPlayer().disconnect( +// Component.text(String.format( +// plugin.getConfigManager().getAddonKickMessage(), +// String.join(", ", response.getMissingAddons()) +// )) +// ); +// } +// }); +// } +// if(!disabledAddons.isEmpty()) { +// player.disableAddons(disabledAddons); +// } + } + + @Override + public void managePermissions(LabyModPlayer player) { + if(!plugin.getConfigManager().arePermissionsEnabled()) return; + // TODO: Find error source +// List permissions = new ArrayList<>(); +// Configuration section = plugin +// .getConfigManager() +// .getPermissions(); +// +// if(section == null) return; +// +// for(String key : section.getKeys()) { +// boolean hasPermission = player.getPlayer().hasPermission("labyutils.permissions.*") +// || player.getPlayer().hasPermission("labyutils.permissions." + section.getString(key)); +// permissions.add(hasPermission ? Permission.of(key).allow() : Permission.of(key).deny()); +// } +// +// player.sendPermissions(permissions); + } + + @Override + public void setRPC(LabyModPlayer player) { + if(!plugin.getConfigManager().isRpcEnabled()) return; +// String text = plugin.getConfigManager().getRpcText(); +// boolean showTime = plugin.getConfigManager().showRpcJoinTime(); +// +// if(text == null) return; +// +// DiscordRPC rpc = showTime +// ? DiscordRPC.createWithStart(text, System.currentTimeMillis()) +// : DiscordRPC.create(text); +// +// player.sendDiscordRPC(rpc); + } +} diff --git a/src/main/resources/bungee.yml b/src/main/resources/bungee.yml index 746ad6b..d502015 100644 --- a/src/main/resources/bungee.yml +++ b/src/main/resources/bungee.yml @@ -1,5 +1,5 @@ -name: LabyUtils +name: ${project.artifactId} version: '${project.version}' main: com.rappytv.labyutils.bungee.LabyUtilsBungee author: RappyTV -description: A simple plugin to utilize LabyMod's server API without coding knowledge. \ No newline at end of file +description: ${project.description} \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 2ef5329..285c9f6 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,9 +1,10 @@ -name: LabyUtils +name: ${project.artifactId} version: '${project.version}' main: com.rappytv.labyutils.bukkit.LabyUtilsBukkit api-version: '1.13' authors: [ RappyTV ] -description: A simple plugin to utilize LabyMod's server API without coding knowledge. +description: ${project.description} +website: ${project.url} softdepend: - Vault - PlaceholderAPI diff --git a/src/main/resources/velocity-plugin.json b/src/main/resources/velocity-plugin.json new file mode 100644 index 0000000..4d48d59 --- /dev/null +++ b/src/main/resources/velocity-plugin.json @@ -0,0 +1,12 @@ +{ + "id": "labyutils", + "name": "${project.artifactId}", + "version": "${project.version}", + "description": "${project.description}", + "url": "${project.url}", + "authors": [ + "RappyTV" + ], + "dependencies": [], + "main": "com.rappytv.labyutils.velocity.LabyUtilsVelocity" +} \ No newline at end of file