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;
+ }
+}