From 92f444d763f962fc52a7bd1ebe188000e52fece5 Mon Sep 17 00:00:00 2001 From: Mrec <66518248+RecoTG@users.noreply.github.com> Date: Sun, 17 Aug 2025 00:33:21 +0100 Subject: [PATCH] Add CI matrix, placeholder expansion, and dependency shading --- .github/workflows/ci.yml | 23 +++++ .github/workflows/maven.yml | 35 ------- checkstyle.xml | 3 + pmd-rules.xml | 3 + pom.xml | 91 +++++++++++++++++-- .../yourorg/servershop/ServerShopPlugin.java | 72 +++++++++++---- .../servershop/placeholder/ShopExpansion.java | 62 +++++++++++++ 7 files changed, 231 insertions(+), 58 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/maven.yml create mode 100644 checkstyle.xml create mode 100644 pmd-rules.xml create mode 100644 src/main/java/com/yourorg/servershop/placeholder/ShopExpansion.java diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..6d7b056 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,23 @@ +name: Build + +on: + push: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + java: [17, 21] + paper: ['1.20.6', '1.21.1'] + steps: + - uses: actions/checkout@v4 + - name: Set up JDK + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: ${{ matrix.java }} + cache: maven + - name: Build + run: mvn -V -B -Dpaper.version=${{ matrix.paper }} verify diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml deleted file mode 100644 index 06b6aa0..0000000 --- a/.github/workflows/maven.yml +++ /dev/null @@ -1,35 +0,0 @@ -# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time -# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-maven - -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - -name: Java CI with Maven - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'temurin' - cache: maven - - name: Build with Maven - run: mvn -B package --file pom.xml - - # Optional: Uploads the full dependency graph to GitHub to improve the quality of Dependabot alerts this repository can receive - - name: Update dependency graph - uses: advanced-security/maven-dependency-submission-action@571e99aab1055c2e71a1e2309b9691de18d6b7d6 diff --git a/checkstyle.xml b/checkstyle.xml new file mode 100644 index 0000000..2538346 --- /dev/null +++ b/checkstyle.xml @@ -0,0 +1,3 @@ + + + diff --git a/pmd-rules.xml b/pmd-rules.xml new file mode 100644 index 0000000..86dc0b8 --- /dev/null +++ b/pmd-rules.xml @@ -0,0 +1,3 @@ + + + diff --git a/pom.xml b/pom.xml index 26f377a..af17e74 100644 --- a/pom.xml +++ b/pom.xml @@ -12,12 +12,17 @@ 17 17 UTF-8 + 1.20.6 - spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + papermc + https://repo.papermc.io/repository/maven-public/ + + + placeholderapi + https://repo.extendedclip.com/content/repositories/placeholderapi/ sonatype @@ -31,9 +36,9 @@ - org.spigotmc - spigot-api - 1.20.6-R0.1-SNAPSHOT + io.papermc.paper + paper-api + ${paper.version}-R0.1-SNAPSHOT provided @@ -42,6 +47,12 @@ 1.7.1 provided + + me.clip + placeholderapi + 2.11.6 + provided + com.zaxxer HikariCP @@ -52,6 +63,11 @@ mysql-connector-j 8.4.0 + + org.bstats + bstats-bukkit + 3.0.2 + @@ -65,6 +81,56 @@ UTF-8 + + com.diffplug.spotless + spotless-maven-plugin + 2.40.0 + + + + check + + verify + + + + + + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + 3.3.0 + + + verify + check + + + + checkstyle.xml + true + true + + + + org.apache.maven.plugins + maven-pmd-plugin + 3.21.2 + + + verify + check + + + + + pmd-rules.xml + + + org.apache.maven.plugins maven-shade-plugin @@ -75,7 +141,20 @@ shade false - + + + org.bstats + com.yourorg.servershop.libs.bstats + + + com.zaxxer.hikari + com.yourorg.servershop.libs.hikari + + + com.mysql + com.yourorg.servershop.libs.mysql + + diff --git a/src/main/java/com/yourorg/servershop/ServerShopPlugin.java b/src/main/java/com/yourorg/servershop/ServerShopPlugin.java index 5f18fb9..96454c0 100644 --- a/src/main/java/com/yourorg/servershop/ServerShopPlugin.java +++ b/src/main/java/com/yourorg/servershop/ServerShopPlugin.java @@ -1,13 +1,15 @@ package com.yourorg.servershop; import com.yourorg.servershop.commands.*; +import com.yourorg.servershop.config.*; +import com.yourorg.servershop.dynamic.*; import com.yourorg.servershop.gui.MenuManager; import com.yourorg.servershop.logging.*; +import com.yourorg.servershop.placeholder.ShopExpansion; import com.yourorg.servershop.shop.*; import com.yourorg.servershop.weekly.*; -import com.yourorg.servershop.dynamic.*; -import com.yourorg.servershop.config.*; import net.milkbowl.vault.economy.Economy; +import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.plugin.RegisteredServiceProvider; @@ -23,7 +25,8 @@ public final class ServerShopPlugin extends JavaPlugin { private DynamicPricingManager dynamic; private CategorySettings categorySettings; - @Override public void onEnable() { + @Override + public void onEnable() { saveDefaultConfig(); saveResource("messages.yml", false); saveResource("shop.yml", false); @@ -33,7 +36,8 @@ public final class ServerShopPlugin extends JavaPlugin { return; } this.categorySettings = new CategorySettings(this); - this.catalog = new Catalog(this); catalog.reload(); + this.catalog = new Catalog(this); + catalog.reload(); this.weekly = new WeeklyShopManager(this); this.logger = new LoggerManager(this); this.dynamic = new DynamicPricingManager(this); @@ -41,25 +45,36 @@ public final class ServerShopPlugin extends JavaPlugin { this.menus = new MenuManager(this); Bukkit.getPluginManager().registerEvents(menus, this); - int saveEvery = Math.max(1, getConfig().getInt("dynamicPricing.decay.saveEveryMinutes", 5)); - Bukkit.getScheduler().runTaskTimerAsynchronously(this, dynamic::tickSaveAll, 20L * 60L * saveEvery, 20L * 60L * saveEvery); + new Metrics(this, 0); + if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { + new ShopExpansion(this).register(); + } + + int saveEvery = + Math.max(1, getConfig().getInt("dynamicPricing.decay.saveEveryMinutes", 5)); + Bukkit.getScheduler() + .runTaskTimerAsynchronously( + this, dynamic::tickSaveAll, 20L * 60L * saveEvery, 20L * 60L * saveEvery); getCommand("shop").setExecutor(new ShopCommand(this)); getCommand("sell").setExecutor(new SellCommand(this)); getCommand("sellall").setExecutor(new SellAllCommand(this)); getCommand("shoplog").setExecutor(new ShopLogCommand(this)); getCommand("weeklyshop").setExecutor(new WeeklyShopCommand(this)); - getLogger().info("DynamicServerShop enabled (Importer + Admin + Category multipliers + Fuzzy Search)."); + getLogger().info( + "DynamicServerShop enabled (Importer + Admin + Category multipliers + Fuzzy Search)."); } - @Override public void onDisable() { + @Override + public void onDisable() { if (logger != null) logger.close(); if (dynamic != null) dynamic.close(); } private boolean setupEconomy() { if (getServer().getPluginManager().getPlugin("Vault") == null) return false; - RegisteredServiceProvider rsp = getServer().getServicesManager().getRegistration(Economy.class); + RegisteredServiceProvider rsp = + getServer().getServicesManager().getRegistration(Economy.class); if (rsp == null) return false; economy = rsp.getProvider(); return economy != null; @@ -71,12 +86,35 @@ public String prefixed(String msg) { return prefix + msg; } - public Economy economy() { return economy; } - public Catalog catalog() { return catalog; } - public LoggerManager logger() { return logger; } - public WeeklyShopManager weekly() { return weekly; } - public MenuManager menus() { return menus; } - public ShopService shop() { return shopService; } - public DynamicPricingManager dynamic() { return dynamic; } - public CategorySettings categorySettings() { return categorySettings; } + public Economy economy() { + return economy; + } + + public Catalog catalog() { + return catalog; + } + + public LoggerManager logger() { + return logger; + } + + public WeeklyShopManager weekly() { + return weekly; + } + + public MenuManager menus() { + return menus; + } + + public ShopService shop() { + return shopService; + } + + public DynamicPricingManager dynamic() { + return dynamic; + } + + public CategorySettings categorySettings() { + return categorySettings; + } } diff --git a/src/main/java/com/yourorg/servershop/placeholder/ShopExpansion.java b/src/main/java/com/yourorg/servershop/placeholder/ShopExpansion.java new file mode 100644 index 0000000..b219807 --- /dev/null +++ b/src/main/java/com/yourorg/servershop/placeholder/ShopExpansion.java @@ -0,0 +1,62 @@ +package com.yourorg.servershop.placeholder; + +import com.yourorg.servershop.ServerShopPlugin; +import java.util.Locale; +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import org.bukkit.Material; +import org.bukkit.entity.Player; + +/** Simple PlaceholderAPI expansion for shop data. */ +public class ShopExpansion extends PlaceholderExpansion { + private final ServerShopPlugin plugin; + + public ShopExpansion(ServerShopPlugin plugin) { + this.plugin = plugin; + } + + @Override + public String getIdentifier() { + return "shop"; + } + + @Override + public String getAuthor() { + return String.join(", ", plugin.getDescription().getAuthors()); + } + + @Override + public String getVersion() { + return plugin.getDescription().getVersion(); + } + + @Override + public boolean canRegister() { + return true; + } + + @Override + public String onPlaceholderRequest(Player player, String identifier) { + if (identifier == null) { + return null; + } + String id = identifier.toLowerCase(Locale.ROOT); + if (id.startsWith("price_")) { + String matName = id.substring("price_".length()).toUpperCase(Locale.ROOT); + Material mat = Material.matchMaterial(matName); + if (mat == null) { + return ""; + } + double price = plugin.shop().priceSell(mat); + if (price < 0) { + return ""; + } + return String.format(Locale.US, "%.2f", price); + } + if (id.startsWith("multiplier_")) { + String cat = identifier.substring("multiplier_".length()); + double mult = plugin.categorySettings().multiplier(cat); + return String.format(Locale.US, "%.2f", mult); + } + return null; + } +}