Author SHA1 Message Date
Thijs Alders 42b2a857b0 Add support for custom model data. 2020-10-19 23:02:13 +02:00
94 changed files with 1232 additions and 2457 deletions

No files matched your search

-1
View File
@@ -1 +0,0 @@
.gitea/CODEOWNERS linguist-detectable=false
-3
View File
@@ -1,3 +0,0 @@
# Pull requests request review from the eligible staff team(s).
# One approval from either an Admin or Developer satisfies branch protection.
* @trueog/Admins @trueog/Developers
+13 -32
View File
@@ -1,36 +1,17 @@
# Eclipse project files.
.project
.classpath
.settings/
assembly/.project
assembly/.classpath
assembly/.settings/
bukkit/.project
bukkit/.classpath
bukkit/.settings/
core/.project
core/.classpath
core/.settings/
bungee/.project
bungee/.classpath
bungee/.settings/
sponge/.project
sponge/.classpath
sponge/.settings/
velocity/.project
velocity/.classpath
velocity/.settings/
### Maven template
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
.mvn/wrapper/maven-wrapper.jar
.flattened-pom.xml
# Build artifacts.
.gradle/
build/
assembly/build/
bukkit/build/
bungee/build/
core/build/
velocity/build/
# IntelliJ project files.
# IntelliJ project files
.idea
*.iml
out
-6
View File
@@ -1,6 +0,0 @@
[submodule "libs/DiamondBank-OG"]
path = libs/DiamondBank-OG
url = https://git.trueog.net/trueog/DiamondBank-OG
[submodule "libs/GxUI-OG"]
path = libs/GxUI-OG
url = https://git.trueog.net/trueog/GxUI-OG
-21
View File
@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2022 CraftingStore.net
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
-3
View File
@@ -1,3 +0,0 @@
# CraftingStore-OG
Plugin to connect with CraftingStore for granting users purchased ranks.
+98
View File
@@ -0,0 +1,98 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.craftingstore</groupId>
<artifactId>craftingstore</artifactId>
<version>${revision}</version>
</parent>
<artifactId>assembly</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.1</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<finalName>CraftingStore-${project.version}</finalName>
<relocations>
<relocation>
<pattern>org.apache</pattern>
<shadedPattern>net.craftingstore.libraries.apache</shadedPattern>
</relocation>
<relocation>
<pattern>org.json</pattern>
<shadedPattern>net.craftingstore.libraries.json</shadedPattern>
</relocation>
<relocation>
<pattern>io.socket</pattern>
<shadedPattern>net.craftingstore.libraries.socket</shadedPattern>
</relocation>
<relocation>
<pattern>okhttp3</pattern>
<shadedPattern>net.craftingstore.libraries.okhttp3</shadedPattern>
</relocation>
<relocation>
<pattern>okio</pattern>
<shadedPattern>net.craftingstore.libraries.okio</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>net.craftingstore</groupId>
<artifactId>core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>net.craftingstore</groupId>
<artifactId>bukkit</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>net.craftingstore</groupId>
<artifactId>bungee</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>net.craftingstore</groupId>
<artifactId>sponge</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>net.craftingstore</groupId>
<artifactId>velocity</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
-4
View File
@@ -1,4 +0,0 @@
#!/usr/bin/bash
# Fetch all submodule content.
git submodule update --force --recursive --init
-251
View File
@@ -1,251 +0,0 @@
import org.gradle.kotlin.dsl.provideDelegate
/* ------------------------------ Plugins ------------------------------ */
plugins {
id("java") // Import Java plugin.
id("java-library") // Import Java Library plugin.
id("com.diffplug.spotless") version "8.1.0" // Import Spotless plugin.
id("com.gradleup.shadow") version "8.3.9" // Import Shadow plugin.
id("checkstyle") // Import Checkstyle plugin.
eclipse // Import Eclipse plugin.
kotlin("jvm") version "2.1.21" // Import Kotlin JVM plugin.
}
extra["kotlinAttribute"] = Attribute.of("kotlin-tag", Boolean::class.javaObjectType)
val kotlinAttribute: Attribute<Boolean> by rootProject.extra
/* --------------------------- JDK / Kotlin ---------------------------- */
java {
sourceCompatibility = JavaVersion.VERSION_17 // Compile with JDK 17 compatibility.
toolchain { // Select Java toolchain.
languageVersion.set(JavaLanguageVersion.of(17)) // Use JDK 17.
vendor.set(JvmVendorSpec.GRAAL_VM) // Use GraalVM CE.
}
}
kotlin { jvmToolchain(17) }
/* ----------------------------- Metadata ------------------------------ */
group = "net.craftingstore" // Declare bundle identifier.
version = "2.10.1" // Declare plugin version (will be in .jar).
val apiVersion = "1.19" // Declare minecraft server target version.
extra["apiVersion"] = apiVersion
/* ----------------------------- Resources ----------------------------- */
tasks.named<ProcessResources>("processResources") {
val props = mapOf("version" to version, "apiVersion" to apiVersion)
inputs.properties(props) // Indicates to rerun if version changes.
filesMatching("plugin.yml") { expand(props) }
from("LICENSE") { into("/") } // Bundle licenses into jarfiles.
}
/* ---------------------------- Repos ---------------------------------- */
allprojects {
repositories {
mavenCentral() // Import the Maven Central Maven Repository.
gradlePluginPortal() // Import the Gradle Plugin Portal Maven Repository.
maven { url = uri("https://repo.purpurmc.org/snapshots") } // Import the PurpurMC Maven Repository.
maven { url = uri("file://${System.getProperty("user.home")}/.m2/repository") }
maven { url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") }
maven { url = uri("https://repo.extendedclip.com/content/repositories/placeholderapi/") }
maven { url = uri("https://rayzr.dev/repo/") }
maven { url = uri("https://repo.codemc.org/repository/maven-public") }
maven { url = uri("https://jitpack.io") }
maven { url = uri("https://repo.papermc.io/repository/maven-public/") }
maven { url = uri("https://repo.spongepowered.org/maven") }
maven { url = uri("https://repo.velocitypowered.com/snapshots/") }
System.getProperty("SELF_MAVEN_LOCAL_REPO")?.let {
val dir = file(it)
if (dir.isDirectory) {
println("Using SELF_MAVEN_LOCAL_REPO at: $it")
maven { url = uri("file://${dir.absolutePath}") }
} else {
mavenLocal()
}
}
}
}
/* ---------------------- Java project deps ---------------------------- */
dependencies {
compileOnly("org.purpurmc.purpur:purpur-api:1.19.4-R0.1-SNAPSHOT") // Declare Purpur API version to be packaged.
compileOnly("io.github.miniplaceholders:miniplaceholders-api:2.2.3") // Import MiniPlaceholders API.
}
/* ---------------------- Reproducible jars ---------------------------- */
tasks.withType<AbstractArchiveTask>().configureEach { // Ensure reproducible .jars
isPreserveFileTimestamps = false
isReproducibleFileOrder = true
}
/* ----------------------------- Shadow -------------------------------- */
tasks.shadowJar {
exclude("io.github.miniplaceholders.*") // Exclude the MiniPlaceholders package from being shadowed.
archiveClassifier.set("") // Use empty string instead of null.
minimize()
enabled = false // Root project does not produce the server-installable plugin jar.
}
tasks.jar { archiveClassifier.set("part") } // Applies to root jarfile only.
val copyServerJarToRootBuildLibs by
tasks.registering(Copy::class) {
dependsOn(":assembly:shadowJar")
from(project(":assembly").layout.buildDirectory.file("libs/CraftingStore-OG-${rootProject.version}.jar"))
into(layout.buildDirectory.dir("libs"))
}
tasks.build {
dependsOn(tasks.spotlessApply, copyServerJarToRootBuildLibs)
} // Build depends on spotless and server jar copy.
/* --------------------------- Javac opts ------------------------------- */
tasks.withType<JavaCompile>().configureEach {
options.compilerArgs.add("-parameters") // Enable reflection for java code.
options.isFork = true // Run javac in its own process.
options.compilerArgs.add("-Xlint:deprecation") // Trigger deprecation warning messages.
options.encoding = "UTF-8" // Use UTF-8 file encoding.
}
/* ----------------------------- Auto Formatting ------------------------ */
spotless {
java {
eclipse().configFile("config/formatter/eclipse-java-formatter.xml") // Eclipse java formatting.
leadingTabsToSpaces() // Convert leftover leading tabs to spaces.
removeUnusedImports() // Remove imports that aren't being called.
}
kotlinGradle {
ktfmt().kotlinlangStyle().configure { it.setMaxWidth(120) } // JetBrains Kotlin formatting.
target("build.gradle.kts", "settings.gradle.kts") // Gradle files to format.
}
}
checkstyle {
toolVersion = "10.18.1" // Declare checkstyle version to use.
configFile = file("config/checkstyle/checkstyle.xml") // Point checkstyle to config file.
isIgnoreFailures = true // Don't fail the build if checkstyle does not pass.
isShowViolations = true // Show the violations in any IDE with the checkstyle plugin.
}
tasks.named("compileJava") {
dependsOn("spotlessApply") // Run spotless before compiling with the JDK.
}
tasks.named("spotlessCheck") {
dependsOn("spotlessApply") // Run spotless before checking if spotless ran.
}
subprojects {
apply(plugin = "java-library")
apply(plugin = "eclipse")
eclipse.project.name = "${project.name}-${rootProject.name}"
tasks.withType<Jar>().configureEach { archiveBaseName.set("${project.name}-${rootProject.name}") }
}
project(":core") {
java { toolchain { languageVersion.set(JavaLanguageVersion.of(17)) } }
dependencies {
compileOnly("com.google.code.gson:gson:2.8.9")
implementation("com.github.thijsa:socket.io-client-java:1.0.3")
implementation("org.apache.httpcomponents:httpclient:4.5.13")
implementation("commons-lang:commons-lang:2.6")
implementation("org.apache.commons:commons-lang3:3.18.0")
implementation("commons-logging:commons-logging:1.2")
implementation("org.apache.commons:commons-text:1.10.0")
}
}
project(":bukkit") {
java { toolchain { languageVersion.set(JavaLanguageVersion.of(17)) } }
dependencies {
implementation(project(":core"))
compileOnly("dev.folia:folia-api:1.19.4-R0.1-SNAPSHOT")
compileOnly("net.md-5:bungeecord-chat:1.20-R0.2")
compileOnly("me.clip:placeholderapi:2.11.6")
implementation("com.github.cryptomorin:XSeries:9.4.0")
compileOnlyApi(project(":libs:DiamondBank-OG")) {
attributes { attribute(kotlinAttribute, true) }
} // Import TrueOG network DiamondBank-OG Kotlin API (from source).
implementation(project(":libs:GxUI-OG")) // Import and package TrueOG Network GxUI-OG Java API (from source).
implementation("org.apache.commons:commons-text:1.10.0")
}
tasks.named<ProcessResources>("processResources") {
val props =
mapOf(
"version" to rootProject.version.toString(),
"apiVersion" to (rootProject.extra["apiVersion"]?.toString().orEmpty()),
)
inputs.properties(props)
filesMatching("plugin.yml") { expand(props) }
}
}
project(":sponge") {
java { toolchain { languageVersion.set(JavaLanguageVersion.of(17)) } }
dependencies {
implementation(project(":core"))
compileOnly("org.spongepowered:spongeapi:7.1.0")
}
tasks.named<ProcessResources>("processResources") {
val props = mapOf("version" to rootProject.version.toString())
inputs.properties(props)
from("src/main/java") { expand(props) }
}
}
project(":velocity") {
java { toolchain { languageVersion.set(JavaLanguageVersion.of(17)) } }
dependencies {
implementation(project(":core"))
compileOnly("com.velocitypowered:velocity-api:3.0.0")
implementation("com.googlecode.json-simple:json-simple:1.1.1") {
exclude(group = "junit", module = "junit")
exclude(group = "org.hamcrest", module = "hamcrest-core")
}
}
tasks.named<ProcessResources>("processResources") {
val props = mapOf("version" to rootProject.version.toString())
inputs.properties(props)
filesMatching("**/*") { expand(props) }
}
}
project(":assembly") {
apply(plugin = "com.gradleup.shadow")
java { toolchain { languageVersion.set(JavaLanguageVersion.of(17)) } }
dependencies {
implementation(project(":core"))
implementation(project(":bukkit"))
implementation(project(":sponge"))
implementation(project(":velocity"))
}
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
archiveFileName.set("CraftingStore-OG-${rootProject.version}.jar")
relocate("org.apache.http", "net.craftingstore.libraries.apache.http")
relocate("org.apache.commons.lang", "me.dadus33.libs.commonslang2")
relocate("org.apache.commons.lang3", "net.craftingstore.libraries.apache.commons.lang3")
relocate("org.apache.commons.logging", "net.craftingstore.libraries.apache.commons.logging")
relocate("org.apache.commons.codec", "net.craftingstore.libraries.apache.commons.codec")
relocate("org.apache.commons.text", "net.craftingstore.libraries.apache.commons.text")
relocate("org.json", "net.craftingstore.libraries.json")
relocate("io.socket", "net.craftingstore.libraries.socket")
relocate("okhttp3", "net.craftingstore.libraries.okhttp3")
relocate("okio", "net.craftingstore.libraries.okio")
relocate("com.cryptomorin.xseries", "net.craftingstore.libraries.xseries")
exclude("com/cryptomorin/xseries/messages/**")
exclude("com/cryptomorin/xseries/particles/**")
exclude("com/cryptomorin/xseries/XBiome*")
exclude("com/cryptomorin/xseries/NMSExtras*")
exclude("com/cryptomorin/xseries/NoteBlockMusic*")
exclude("com/cryptomorin/xseries/XSound*")
exclude("com/cryptomorin/xseries/XPotion*")
exclude("com/cryptomorin/xseries/XEnchantment*")
exclude("com/cryptomorin/xseries/XEntity*")
}
tasks.named<Jar>("jar") { enabled = false }
tasks.named("build") { dependsOn(tasks.named("shadowJar")) }
}
+79
View File
@@ -0,0 +1,79 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.craftingstore</groupId>
<artifactId>craftingstore</artifactId>
<version>${revision}</version>
</parent>
<artifactId>bukkit</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<!-- PlaceHolderAPI start -->
<repository>
<id>PlaceholderAPI</id>
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository>
<repository>
<id>razyr-dev</id>
<url>https://rayzr.dev/repo/</url>
</repository>
<repository>
<id>codemc</id>
<url>https://repo.codemc.org/repository/maven-public</url>
</repository>
<!-- PlaceholderRAPI end -->
</repositories>
<dependencies>
<dependency>
<groupId>net.craftingstore</groupId>
<artifactId>core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.16.3-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-chat</artifactId>
<version>1.16-R0.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>PlaceholderAPI</artifactId>
<version>2.10.7</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
@@ -39,14 +39,4 @@ public class BukkitPluginConfiguration implements PluginConfiguration {
public int getTimeBetweenCommands() {
return plugin.getConfig().getInt("time-between-commands", 200);
}
@Override
public String getNotEnoughBalanceMessage() {
return plugin.getConfig().getString("not-enough-balance-message", "&4You do not have enough in-game money in your account! You can also buy this package on the website:");
}
@Override
public boolean isUsingAlternativeApi() {
return plugin.getConfig().getBoolean("use-alternative-api", false);
}
}
@@ -3,11 +3,10 @@ package net.craftingstore.bukkit;
import net.craftingstore.bukkit.commands.BuyCommand;
import net.craftingstore.bukkit.commands.CraftingStoreCommand;
import net.craftingstore.bukkit.config.Config;
import net.craftingstore.bukkit.hooks.DiamondBankHook;
import net.craftingstore.bukkit.hooks.PlaceholderAPIHook;
import net.craftingstore.bukkit.listeners.InventoryListener;
import net.craftingstore.bukkit.listeners.AdminJoinListener;
import net.craftingstore.bukkit.listeners.PendingDonationJoinListener;
import net.craftingstore.bukkit.util.VersionUtil;
import net.craftingstore.core.CraftingStore;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
@@ -18,8 +17,7 @@ public class CraftingStoreBukkit extends JavaPlugin {
private CraftingStore craftingStore;
private Config config;
private String prefix = ChatColor.GRAY + "[" + ChatColor.RED + "CraftingStore-OG" + ChatColor.GRAY + "] " + ChatColor.WHITE;
private DiamondBankHook diamondBankHook;
private String prefix = ChatColor.GRAY + "[" + ChatColor.RED + "CraftingStore" + ChatColor.GRAY + "] " + ChatColor.WHITE;
@Override
public void onEnable() {
@@ -31,6 +29,7 @@ public class CraftingStoreBukkit extends JavaPlugin {
this.getCommand("csbuy").setExecutor(new BuyCommand(this));
}
this.getServer().getPluginManager().registerEvents(new InventoryListener(this), this);
this.getServer().getPluginManager().registerEvents(new AdminJoinListener(this), this);
this.getServer().getPluginManager().registerEvents(new PendingDonationJoinListener(this), this);
@@ -39,16 +38,6 @@ public class CraftingStoreBukkit extends JavaPlugin {
new PlaceholderAPIHook(craftingStore);
craftingStore.getLogger().info("Hooked with PlaceholderAPI");
}
// DiamondBank-OG hook
if (Bukkit.getPluginManager().isPluginEnabled("DiamondBank-OG")) {
this.diamondBankHook = new DiamondBankHook(this);
if (this.diamondBankHook.register()) {
craftingStore.getLogger().info("Hooked with DiamondBank-OG");
} else {
craftingStore.getLogger().info("There was a problem hooking with DiamondBank-OG");
this.diamondBankHook = null;
}
}
}
@Override
@@ -73,20 +62,4 @@ public class CraftingStoreBukkit extends JavaPlugin {
public String getPrefix() {
return prefix;
}
public DiamondBankHook getDiamondBankHook() {
return diamondBankHook;
}
public boolean isHookedWithDiamondBank() {
return diamondBankHook != null;
}
public void runSyncTask(Runnable runnable) {
if (VersionUtil.isFoliaSchedulerAvailable()) {
this.getServer().getGlobalRegionScheduler().run(this, (task) -> runnable.run());
} else {
this.getServer().getScheduler().runTask(this, runnable);
}
}
}
@@ -1,7 +1,6 @@
package net.craftingstore.bukkit;
import net.craftingstore.bukkit.events.DonationReceivedEvent;
import net.craftingstore.bukkit.util.VersionUtil;
import net.craftingstore.core.CraftingStorePlugin;
import net.craftingstore.core.PluginConfiguration;
import net.craftingstore.core.logging.CraftingStoreLogger;
@@ -10,9 +9,6 @@ import net.craftingstore.core.models.donation.Donation;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import java.util.concurrent.TimeUnit;
public class CraftingStoreBukkitImpl implements CraftingStorePlugin {
private CraftingStoreBukkit bukkitPlugin;
@@ -32,7 +28,7 @@ public class CraftingStoreBukkitImpl implements CraftingStorePlugin {
return false;
}
}
Server server = this.bukkitPlugin.getServer();
Server server = bukkitPlugin.getServer();
DonationReceivedEvent event = new DonationReceivedEvent(donation);
server.getPluginManager().callEvent(event);
@@ -40,7 +36,7 @@ public class CraftingStoreBukkitImpl implements CraftingStorePlugin {
return false;
}
this.bukkitPlugin.runSyncTask(() -> server.dispatchCommand(server.getConsoleSender(), donation.getCommand()));
server.getScheduler().runTask(bukkitPlugin, () -> server.dispatchCommand(server.getConsoleSender(), donation.getCommand()));
return true;
}
@@ -49,19 +45,11 @@ public class CraftingStoreBukkitImpl implements CraftingStorePlugin {
}
public void registerRunnable(Runnable runnable, int delay, int interval) {
if (VersionUtil.isFoliaSchedulerAvailable()) {
this.bukkitPlugin.getServer().getAsyncScheduler().runAtFixedRate(this.bukkitPlugin, task -> runnable.run(), delay, interval, TimeUnit.SECONDS);
} else {
this.bukkitPlugin.getServer().getScheduler().runTaskTimerAsynchronously(this.bukkitPlugin, runnable, delay * 20, interval * 20);
}
bukkitPlugin.getServer().getScheduler().runTaskTimerAsynchronously(bukkitPlugin, runnable, delay * 20, interval * 20);
}
public void runAsyncTask(Runnable runnable) {
if (VersionUtil.isFoliaSchedulerAvailable()) {
this.bukkitPlugin.getServer().getAsyncScheduler().runNow(this.bukkitPlugin, task -> runnable.run());
} else {
this.bukkitPlugin.getServer().getScheduler().runTaskAsynchronously(this.bukkitPlugin, runnable);
}
bukkitPlugin.getServer().getScheduler().runTaskAsynchronously(bukkitPlugin, runnable);
}
public String getToken() {
@@ -1,15 +1,15 @@
package net.craftingstore.bukkit.commands;
import net.craftingstore.bukkit.CraftingStoreBukkit;
import net.craftingstore.bukkit.inventory.CraftingStoreGUI;
import net.craftingstore.bukkit.inventory.InventoryBuilder;
import net.craftingstore.core.exceptions.CraftingStoreApiException;
import net.craftingstore.core.models.api.ApiInventory;
import net.craftingstore.core.models.api.inventory.CraftingStoreInventory;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import java.util.concurrent.ExecutionException;
@@ -26,22 +26,19 @@ public class BuyCommand implements CommandExecutor {
if (!(sender instanceof Player)) {
return false;
}
if (!this.instance.getCraftingStore().isEnabled()) {
if (!instance.getCraftingStore().isEnabled()) {
sender.sendMessage(instance.getPrefix() + "The plugin has not been set-up correctly. Please contact an administrator.");
return false;
}
Player p = (Player) sender;
this.instance.getCraftingStore().getImplementation().runAsyncTask(() -> {
Bukkit.getScheduler().runTaskAsynchronously(instance, () -> {
try {
InventoryBuilder builder = new InventoryBuilder(this.instance);
ApiInventory gui = instance.getCraftingStore().getApi().getGUI().get();
CraftingStoreGUI inventory = builder.build(
p,
new CraftingStoreInventory(gui.getTitle(), gui.getContent(), gui.getSize())
);
this.instance.runSyncTask(() -> {
CraftingStoreInventory gui = instance.getCraftingStore().getApi().getGUI().get();
Inventory inventory = builder.buildInventory(gui);
Bukkit.getScheduler().runTask(instance, () -> {
if (p.isOnline()) {
inventory.open(false);
p.openInventory(inventory);
}
});
} catch (CraftingStoreApiException | InterruptedException | ExecutionException e) {
@@ -44,35 +44,6 @@ public class CraftingStoreCommand implements CommandExecutor {
});
return true;
}
if ((args.length == 1 || args.length == 2) && args[0].equalsIgnoreCase("debug")) {
boolean isDebugging = this.instance.getCraftingStore().getLogger().isDebugging();
if (args.length == 1) {
sender.sendMessage(String.format(
"%sDebug mode is currently %s.",
this.instance.getPrefix(),
isDebugging ? "enabled" : "disabled"
));
return true;
}
String debugValue = args[1].toLowerCase();
if (debugValue.equalsIgnoreCase("true")) {
isDebugging = true;
} else if (debugValue.equalsIgnoreCase("false")) {
isDebugging = false;
} else {
sender.sendMessage(instance.getPrefix() + "Unknown debug value.");
return true;
}
this.instance.getCraftingStore().getLogger().setDebugging(isDebugging);
instance.getConfig().set("debug", isDebugging);
instance.getConfigWrapper().saveConfig();
sender.sendMessage(String.format(
"%sDebug mode has been %s.",
this.instance.getPrefix(),
isDebugging ? "enabled" : "disabled"
));
return true;
}
sender.sendMessage(ChatColor.GRAY + "" +ChatColor.STRIKETHROUGH + "-----------------------");
sender.sendMessage(ChatColor.DARK_GRAY + ">" + ChatColor.GRAY + " /" + label + " reload" + ChatColor.DARK_GRAY + " -> " + ChatColor.GRAY + "Reload the config.");
@@ -1,58 +0,0 @@
package net.craftingstore.bukkit.hooks;
import java.util.UUID;
import org.bukkit.plugin.RegisteredServiceProvider;
import net.craftingstore.bukkit.CraftingStoreBukkit;
import net.trueog.diamondbankog.DiamondBankException.EconomyDisabledException;
import net.trueog.diamondbankog.DiamondBankException.InsufficientFundsException;
import net.trueog.diamondbankog.DiamondBankException.InvalidPlayerException;
import net.trueog.diamondbankog.DiamondBankException.PlayerNotOnlineException;
import net.trueog.diamondbankog.api.DiamondBankAPIJava;
public class DiamondBankHook {
private static final String PURCHASE_REASON = "CraftingStore-OG in-game package purchase";
private static final String REFUND_REASON = "CraftingStore-OG in-game package purchase refund";
private final CraftingStoreBukkit instance;
private DiamondBankAPIJava diamondBank;
public DiamondBankHook(CraftingStoreBukkit instance) {
this.instance = instance;
}
public boolean register() {
RegisteredServiceProvider<DiamondBankAPIJava> rsp = instance.getServer().getServicesManager()
.getRegistration(DiamondBankAPIJava.class);
if (rsp == null) {
return false;
}
this.diamondBank = rsp.getProvider();
return true;
}
public boolean hasFunds(UUID playerId, int price) throws EconomyDisabledException {
long shards = toShards(price);
long availableShards = diamondBank.getBankShards(playerId) + diamondBank.getInventoryShards(playerId);
return availableShards >= shards;
}
public void charge(UUID playerId, int price, int packageId) throws EconomyDisabledException, InvalidPlayerException,
PlayerNotOnlineException, InsufficientFundsException {
diamondBank.consumeFromPlayer(playerId, toShards(price), PURCHASE_REASON, notes(packageId));
}
public void refund(UUID playerId, int price, int packageId) throws EconomyDisabledException {
diamondBank.addToPlayerBankShards(playerId, toShards(price), REFUND_REASON, notes(packageId));
}
private long toShards(int price) {
return diamondBank.diamondsToShards((double) price);
}
private String notes(int packageId) {
return "Plugin: CraftingStore-OG; package ID: " + packageId;
}
}
@@ -63,8 +63,8 @@ public class PlaceholderAPIHook extends PlaceholderExpansion {
private String handlePayments(OfflinePlayer player, String s) throws CraftingStoreApiException, ExecutionException, InterruptedException {
ApiPayment[] payments = instance.getApi().getPayments().get();
if (payments == null || payments.length == 0) {
return ""; // Recent payments are not retrieved yet or there are no payments.
if (payments == null) {
return ""; // Recent payments are not retrieved yet.
} else if (s.equalsIgnoreCase("payment")) {
StringBuilder builder = new StringBuilder();
for (ApiPayment payment : payments) {
@@ -94,16 +94,11 @@ public class PlaceholderAPIHook extends PlaceholderExpansion {
@Override
public String getAuthor() {
return "CraftingStore-OG";
return "CraftingStore";
}
@Override
public String getVersion() {
return this.instance.getImplementation().getConfiguration().getVersion();
}
@Override
public boolean persist() {
return true;
}
}
@@ -1,85 +0,0 @@
package net.craftingstore.bukkit.inventory;
import net.craftingstore.bukkit.CraftingStoreBukkit;
import net.craftingstore.bukkit.util.ChatColorUtil;
import net.craftingstore.core.exceptions.CraftingStoreApiException;
import net.craftingstore.core.models.api.ApiInventory;
import net.craftingstore.core.models.api.ApiPackageInformation;
import net.craftingstore.core.models.api.inventory.CraftingStoreInventory;
import net.craftingstore.core.models.api.inventory.InventoryItem;
import net.craftingstore.core.models.api.inventory.InventoryItemIcon;
import net.craftingstore.core.models.api.inventory.InventoryItemType;
import net.craftingstore.core.models.api.inventory.types.InventoryItemBuyablePackage;
import org.bukkit.entity.Player;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
public class BuyInventoryBuilder {
private final CraftingStoreBukkit instance;
private final InventoryBuilder inventoryBuilder;
public BuyInventoryBuilder(CraftingStoreBukkit instance, InventoryBuilder inventoryBuilder) {
this.instance = instance;
this.inventoryBuilder = inventoryBuilder;
}
public CraftingStoreGUI build(Player p, InventoryItemBuyablePackage item, CraftingStoreGUI inventory) throws CraftingStoreApiException, ExecutionException, InterruptedException {
ApiInventory buyMenu = this.instance.getCraftingStore().getApi().getGUI().get().getBuyMenu();
CraftingStoreInventory craftingStoreInventory = new CraftingStoreInventory(buyMenu.getTitle(), buyMenu.getContent(), buyMenu.getSize());
String ip = p.getAddress().getAddress().getHostAddress();
ApiPackageInformation packageInformation = this.instance.getCraftingStore().getApi().getPackageInformation(
p.getName(),
p.getUniqueId(),
ip,
item.getPackageId()
).get();
if (!packageInformation.isAllowedToBuy()) {
p.sendMessage(ChatColorUtil.translate(packageInformation.getMessage()));
this.closeInventory(p);
return null;
}
if (packageInformation.getPrice() != item.getPrice()) {
p.sendMessage(this.instance.getPrefix() + "There was a problem with the payment data. Please try again later.");
this.closeInventory(p);
return null;
}
Map<String, Object> placeholders = new HashMap<>();
placeholders.put("package_name", item.getName());
placeholders.put("package_price_ingame", packageInformation.getPrice());
return this.inventoryBuilder.buildBuyMenu(
p,
craftingStoreInventory,
inventory,
item,
placeholders
);
}
public CraftingStoreGUI buildLoadInventory(Player player) {
InventoryItemIcon icon = new InventoryItemIcon("LIGHT_BLUE_STAINED_GLASS_PANE", 1, 0, null);
InventoryItem[] content = new InventoryItem[9];
for (int i = 0; i < 9; i++) {
content[i] = new InventoryItem("Loading...", null, InventoryItemType.NULL, icon, i);
}
CraftingStoreInventory craftingStoreInventory = new CraftingStoreInventory(
"Loading...",
content,
9
);
return this.inventoryBuilder.build(player, craftingStoreInventory);
}
private void closeInventory(Player p) {
this.instance.runSyncTask(() -> {
if (p.isOnline()) {
p.closeInventory();
}
});
}
}
@@ -1,52 +0,0 @@
package net.craftingstore.bukkit.inventory;
import java.util.Map;
import org.bukkit.entity.Player;
import net.craftingstore.bukkit.CraftingStoreBukkit;
import net.craftingstore.core.models.api.inventory.CraftingStoreInventory;
import net.craftingstore.core.models.api.inventory.InventoryItem;
import net.craftingstore.core.models.api.inventory.types.InventoryItemBuyablePackage;
import net.trueog.gxui.GUIBase;
public class CraftingStoreGUI extends GUIBase {
private final InventoryBuilder inventoryBuilder;
private final CraftingStoreInventory inventory;
private final CraftingStoreGUI parentInventory;
private final InventoryItemBuyablePackage itemBuyablePackage;
private final Map<String, ?> placeholders;
public CraftingStoreGUI(
CraftingStoreBukkit instance,
Player player,
InventoryBuilder inventoryBuilder,
CraftingStoreInventory inventory,
CraftingStoreGUI parentInventory,
InventoryItemBuyablePackage itemBuyablePackage,
Map<String, ?> placeholders
) {
super(instance, player, inventoryBuilder.buildTitle(inventory, placeholders), inventory.getSize(), false);
this.inventoryBuilder = inventoryBuilder;
this.inventory = inventory;
this.parentInventory = parentInventory;
this.itemBuyablePackage = itemBuyablePackage;
this.placeholders = placeholders;
}
@Override
public void setupItems() {
for (InventoryItem item : this.inventory.getContent()) {
addItem(item.getIndex(), this.inventoryBuilder.buildItem(item, this.placeholders, this));
}
}
public CraftingStoreGUI getParentInventory() {
return parentInventory;
}
public InventoryItemBuyablePackage getItemBuyablePackage() {
return itemBuyablePackage;
}
}
@@ -0,0 +1,29 @@
package net.craftingstore.bukkit.inventory;
import net.craftingstore.core.models.api.inventory.CraftingStoreInventory;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
public class CraftingStoreInventoryHolder implements InventoryHolder {
private CraftingStoreInventory csInventory;
private CraftingStoreInventoryHolder parentInventory;
public CraftingStoreInventoryHolder(CraftingStoreInventory csInventory, CraftingStoreInventoryHolder parentInventory) {
this.csInventory = csInventory;
this.parentInventory = parentInventory;
}
@Override
public Inventory getInventory() {
return null;
}
public CraftingStoreInventory getCsInventory() {
return csInventory;
}
public CraftingStoreInventoryHolder getParentInventory() {
return parentInventory;
}
}
@@ -1,103 +1,56 @@
package net.craftingstore.bukkit.inventory;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.text.StringSubstitutor;
import net.craftingstore.bukkit.CraftingStoreBukkit;
import net.craftingstore.bukkit.util.VersionUtil;
import net.craftingstore.bukkit.util.XMaterial;
import net.craftingstore.core.models.api.inventory.CraftingStoreInventory;
import net.craftingstore.core.models.api.inventory.InventoryItem;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import net.craftingstore.bukkit.CraftingStoreBukkit;
import net.craftingstore.bukkit.inventory.handlers.BackButtonHandler;
import net.craftingstore.bukkit.inventory.handlers.BuyButtonHandler;
import net.craftingstore.bukkit.inventory.handlers.BuyablePackageHandler;
import net.craftingstore.bukkit.inventory.handlers.CategoryItemHandler;
import net.craftingstore.bukkit.inventory.handlers.CloseButtonHandler;
import net.craftingstore.bukkit.inventory.handlers.MessageButtonHandler;
import net.craftingstore.bukkit.util.ChatColorUtil;
import net.craftingstore.bukkit.util.VersionUtil;
import net.craftingstore.core.models.api.inventory.CraftingStoreInventory;
import net.craftingstore.core.models.api.inventory.InventoryItem;
import net.craftingstore.core.models.api.inventory.types.InventoryItemBackButton;
import net.craftingstore.core.models.api.inventory.types.InventoryItemBuyButton;
import net.craftingstore.core.models.api.inventory.types.InventoryItemBuyablePackage;
import net.craftingstore.core.models.api.inventory.types.InventoryItemCategory;
import net.craftingstore.core.models.api.inventory.types.InventoryItemCloseButton;
import net.craftingstore.core.models.api.inventory.types.InventoryItemMessage;
import net.trueog.gxui.GUIButton;
import net.trueog.gxui.GUIItem;
import java.util.Arrays;
import java.util.stream.Collectors;
public class InventoryBuilder {
private final CraftingStoreBukkit instance;
private final InventoryItemBuilder inventoryItemBuilder;
private final HashMap<Class<? extends InventoryItem>, InventoryItemHandler> handlers = new HashMap<>();
private CraftingStoreBukkit instance;
public InventoryBuilder(CraftingStoreBukkit instance) {
this.instance = instance;
this.inventoryItemBuilder = new InventoryItemBuilder(instance);
BuyInventoryBuilder buyInventoryBuilder = new BuyInventoryBuilder(instance, this);
this.handlers.put(InventoryItemBackButton.class, new BackButtonHandler());
this.handlers.put(InventoryItemCategory.class, new CategoryItemHandler(this));
this.handlers.put(InventoryItemCloseButton.class, new CloseButtonHandler());
this.handlers.put(InventoryItemMessage.class, new MessageButtonHandler());
this.handlers.put(InventoryItemBuyablePackage.class, new BuyablePackageHandler(instance, buyInventoryBuilder));
this.handlers.put(InventoryItemBuyButton.class, new BuyButtonHandler(instance, buyInventoryBuilder));
}
public CraftingStoreGUI build(Player player, CraftingStoreInventory inventory) {
return build(player, inventory, null);
public Inventory buildInventory(CraftingStoreInventory csInventory) {
return buildInventory(csInventory, null);
}
public CraftingStoreGUI build(Player player, CraftingStoreInventory inventory, CraftingStoreGUI parentInventory) {
return new CraftingStoreGUI(this.instance, player, this, inventory, parentInventory, null, new HashMap<>());
}
public CraftingStoreGUI buildBuyMenu(
Player player,
CraftingStoreInventory inventory,
CraftingStoreGUI parentInventory,
InventoryItemBuyablePackage itemBuyablePackage,
Map<String, ?> placeholders
) {
return new CraftingStoreGUI(
this.instance,
player,
this,
inventory,
parentInventory,
itemBuyablePackage,
placeholders
);
}
String buildTitle(CraftingStoreInventory inventory, Map<String, ?> placeholders) {
String title = inventory.getTitle();
public Inventory buildInventory(CraftingStoreInventory csInventory, CraftingStoreInventoryHolder parent) {
String title = csInventory.getTitle();
if (title == null || title.isEmpty()) {
title = "CraftingStore-OG";
title = "CraftingStore";
}
title = ChatColor.translateAlternateColorCodes('&', title);
Inventory inventory = Bukkit.createInventory(new CraftingStoreInventoryHolder(csInventory, parent), csInventory.getSize(), title);
StringSubstitutor stringSubstitutor = new StringSubstitutor(placeholders, "{", "}");
return ChatColorUtil.translate(stringSubstitutor.replace(title)).replace(ChatColor.COLOR_CHAR, '&');
}
GUIItem buildItem(InventoryItem inventoryItem, Map<String, ?> placeholders, CraftingStoreGUI inventory) {
StringSubstitutor stringSubstitutor = new StringSubstitutor(placeholders, "{", "}");
ItemStack itemStack = this.inventoryItemBuilder.getItemStack(
inventoryItem.getIcon().getMaterial(),
inventoryItem.getIcon().getAmount()
);
ItemMeta meta = itemStack.getItemMeta();
if (meta != null) {
meta.setDisplayName(ChatColorUtil.translate(stringSubstitutor.replace(inventoryItem.getName())));
for (InventoryItem inventoryItem : csInventory.getContent()) {
XMaterial xMaterial;
if (inventoryItem.getIcon().getMaterial() == null) {
xMaterial = XMaterial.CHEST;
} else {
xMaterial = XMaterial.fromString(inventoryItem.getIcon().getMaterial());
if (xMaterial == null || xMaterial.parseMaterial() == null) {
instance.getCraftingStore().getLogger().debug("Material " + inventoryItem.getIcon().getMaterial() + " not found.");
xMaterial = XMaterial.CHEST;
}
}
ItemStack itemStack = xMaterial.parseItem(inventoryItem.getIcon().getAmount());
ItemMeta meta = itemStack.getItemMeta();
meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', inventoryItem.getName()));
if (inventoryItem.getDescription() != null && inventoryItem.getDescription().length != 0) {
meta.setLore(Arrays.stream(inventoryItem.getDescription())
.map(stringSubstitutor::replace)
.map(ChatColorUtil::translate)
.map(d -> ChatColor.translateAlternateColorCodes('&', d))
.collect(Collectors.toList())
);
}
@@ -105,68 +58,9 @@ public class InventoryBuilder {
meta.setCustomModelData(inventoryItem.getIcon().getCustomModelData());
}
itemStack.setItemMeta(meta);
inventory.setItem(inventoryItem.getIndex(), itemStack);
}
GUIItem item = new ItemStackGUIItem(itemStack);
item.setPlayErrorSound(false);
if (this.handlers.containsKey(inventoryItem.getClass())) {
item.button(new InventoryButton(inventoryItem, inventory));
}
return item;
}
@SuppressWarnings("unchecked")
private boolean handleClick(InventoryItem item, CraftingStoreGUI inventory) {
InventoryItemHandler<InventoryItem> handler = this.handlers.get(item.getClass());
if (handler == null) {
return false;
}
handler.handle(inventory.getPlayer(), item, inventory);
return true;
}
private final class InventoryButton implements GUIButton {
private final InventoryItem item;
private final CraftingStoreGUI inventory;
private InventoryButton(InventoryItem item, CraftingStoreGUI inventory) {
this.item = item;
this.inventory = inventory;
}
@Override
public boolean leftClick() {
return handleClick(this.item, this.inventory);
}
@Override
public boolean leftClickShift() {
return leftClick();
}
@Override
public boolean rightClick() {
return leftClick();
}
@Override
public boolean rightClickShift() {
return leftClick();
}
}
private static final class ItemStackGUIItem extends GUIItem {
private final ItemStack itemStack;
private ItemStackGUIItem(ItemStack itemStack) {
this.itemStack = itemStack;
}
@Override
public ItemStack build() {
return itemStack.clone();
}
return inventory;
}
}
@@ -1,56 +0,0 @@
package net.craftingstore.bukkit.inventory;
import com.cryptomorin.xseries.XMaterial;
import net.craftingstore.bukkit.CraftingStoreBukkit;
import net.craftingstore.bukkit.util.VersionUtil;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import java.util.Optional;
public class InventoryItemBuilder {
private CraftingStoreBukkit instance;
public InventoryItemBuilder(CraftingStoreBukkit instance) {
this.instance = instance;
}
public ItemStack getItemStack(String material, int amount) {
ItemStack itemStack;
if (VersionUtil.isGuavaAvailable()) {
// 1.8+
com.cryptomorin.xseries.XMaterial xMaterial;
if (material == null) {
xMaterial = com.cryptomorin.xseries.XMaterial.CHEST;
} else {
Optional<XMaterial> xMaterialOptional = com.cryptomorin.xseries.XMaterial.matchXMaterial(material);
if (!xMaterialOptional.isPresent()) {
instance.getCraftingStore().getLogger().debug("Material " + material + " not found.");
xMaterial = com.cryptomorin.xseries.XMaterial.CHEST;
} else {
xMaterial = xMaterialOptional.get();
}
}
itemStack = xMaterial.parseItem();
if (itemStack == null) {
itemStack = new ItemStack(Material.CHEST);
}
itemStack.setAmount(amount);
} else {
// 1.7 support
net.craftingstore.bukkit.util.XMaterial xMaterial;
if (material == null) {
xMaterial = net.craftingstore.bukkit.util.XMaterial.CHEST;
} else {
xMaterial = net.craftingstore.bukkit.util.XMaterial.fromString(material);
if (xMaterial == null || xMaterial.parseMaterial() == null) {
instance.getCraftingStore().getLogger().debug("Material " + material + " not found.");
xMaterial = net.craftingstore.bukkit.util.XMaterial.CHEST;
}
}
itemStack = xMaterial.parseItem(amount);
}
return itemStack;
}
}
@@ -4,5 +4,5 @@ import net.craftingstore.core.models.api.inventory.InventoryItem;
import org.bukkit.entity.Player;
public interface InventoryItemHandler<T extends InventoryItem> {
void handle(Player p, T item, CraftingStoreGUI inventory);
void handle(Player p, T item, CraftingStoreInventoryHolder holder);
}
@@ -1,16 +1,25 @@
package net.craftingstore.bukkit.inventory.handlers;
import net.craftingstore.bukkit.inventory.CraftingStoreGUI;
import net.craftingstore.bukkit.inventory.CraftingStoreInventoryHolder;
import net.craftingstore.bukkit.inventory.InventoryBuilder;
import net.craftingstore.bukkit.inventory.InventoryItemHandler;
import net.craftingstore.core.models.api.inventory.types.InventoryItemBackButton;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
public class BackButtonHandler implements InventoryItemHandler<InventoryItemBackButton> {
private InventoryBuilder builder;
public BackButtonHandler(InventoryBuilder builder) {
this.builder = builder;
}
@Override
public void handle(Player p, InventoryItemBackButton item, CraftingStoreGUI inventory) {
if (inventory.getParentInventory() != null) {
inventory.getParentInventory().open(false);
public void handle(Player p, InventoryItemBackButton item, CraftingStoreInventoryHolder holder) {
if (holder.getParentInventory() != null) {
Inventory inventory = builder.buildInventory(holder.getParentInventory().getCsInventory(), holder.getParentInventory().getParentInventory());
p.openInventory(inventory);
}
}
}
@@ -1,166 +0,0 @@
package net.craftingstore.bukkit.inventory.handlers;
import java.util.UUID;
import org.bukkit.entity.Player;
import net.craftingstore.bukkit.CraftingStoreBukkit;
import net.craftingstore.bukkit.inventory.BuyInventoryBuilder;
import net.craftingstore.bukkit.inventory.CraftingStoreGUI;
import net.craftingstore.bukkit.inventory.InventoryItemHandler;
import net.craftingstore.bukkit.util.ChatColorUtil;
import net.craftingstore.core.models.api.ApiPackageInformation;
import net.craftingstore.core.models.api.inventory.types.InventoryItemBuyButton;
import net.craftingstore.core.models.api.inventory.types.InventoryItemBuyablePackage;
import net.trueog.diamondbankog.DiamondBankException;
import net.trueog.diamondbankog.DiamondBankException.InsufficientFundsException;
public class BuyButtonHandler implements InventoryItemHandler<InventoryItemBuyButton> {
private final CraftingStoreBukkit instance;
private final BuyInventoryBuilder buyInventoryBuilder;
public BuyButtonHandler(CraftingStoreBukkit instance, BuyInventoryBuilder buyInventoryBuilder) {
this.instance = instance;
this.buyInventoryBuilder = buyInventoryBuilder;
}
@Override
public void handle(Player p, InventoryItemBuyButton item, CraftingStoreGUI inventory) {
if (inventory.getItemBuyablePackage() == null) {
throw new RuntimeException("BuyButtonHandler only works in a buy menu");
}
InventoryItemBuyablePackage itemBuyablePackage = inventory.getItemBuyablePackage();
InventoryItemBuyButton.InventoryItemBuyButtonAction action = item.getAction();
if (action.equals(InventoryItemBuyButton.InventoryItemBuyButtonAction.ONLINE)) {
for (String message : itemBuyablePackage.getMessages()) {
p.sendMessage(ChatColorUtil.translate(message));
}
p.closeInventory();
return;
}
if (action.equals(InventoryItemBuyButton.InventoryItemBuyButtonAction.IN_GAME)) {
if (!this.instance.isHookedWithDiamondBank()) {
p.sendMessage(instance.getPrefix() + "CraftingStore-OG is not hooked with DiamondBank-OG!");
p.closeInventory();
return;
}
UUID playerId = p.getUniqueId();
String playerName = p.getName();
String ip = p.getAddress().getAddress().getHostAddress();
CraftingStoreGUI loading = this.buyInventoryBuilder.buildLoadInventory(p);
loading.open(false);
this.instance.getCraftingStore().getImplementation().runAsyncTask(() -> {
try {
ApiPackageInformation packageInformation = this.instance.getCraftingStore().getApi().getPackageInformation(
playerName,
playerId,
ip,
itemBuyablePackage.getPackageId()
).get();
if (!packageInformation.isAllowedToBuy()) {
p.sendMessage(ChatColorUtil.translate(packageInformation.getMessage()));
for (String message : itemBuyablePackage.getMessages()) {
p.sendMessage(ChatColorUtil.translate(message));
}
closeInventory(p);
return;
}
if (packageInformation.getPrice() != itemBuyablePackage.getPrice()) {
p.sendMessage(this.instance.getPrefix() + "There was a problem with the payment data. Please try again later.");
closeInventory(p);
return;
}
if (!this.instance.getDiamondBankHook().hasFunds(playerId, packageInformation.getPrice())) {
p.sendMessage(ChatColorUtil.translate(
this.instance.getCraftingStore().getImplementation().getConfiguration().getNotEnoughBalanceMessage()
));
closeInventory(p);
return;
}
try {
this.instance.getDiamondBankHook().charge(
playerId,
packageInformation.getPrice(),
itemBuyablePackage.getPackageId()
);
} catch (InsufficientFundsException exception) {
p.sendMessage(ChatColorUtil.translate(
this.instance.getCraftingStore().getImplementation().getConfiguration().getNotEnoughBalanceMessage()
));
closeInventory(p);
return;
} catch (DiamondBankException exception) {
exception.printStackTrace();
p.sendMessage(this.instance.getPrefix() + "There was a problem with the transaction. Please try again later");
closeInventory(p);
return;
}
try {
boolean success = this.instance.getCraftingStore().getApi().createPayment(
playerName,
packageInformation.getPrice(),
new int[]{itemBuyablePackage.getPackageId()}
).get();
if (success) {
p.sendMessage(ChatColorUtil.translate(itemBuyablePackage.getSuccessMessage()));
closeInventory(p);
return;
}
throw new RuntimeException("Failed to create a transaction at CraftingStore. Giving money back.");
} catch (Exception exception) {
exception.printStackTrace();
this.instance.getCraftingStore().getLogger().error(String.format(
"Unable to create a transaction for player %s with package %s and cost %s. Giving the player's money back...",
playerName,
itemBuyablePackage.getPackageId(),
packageInformation.getPrice()
));
try {
this.instance.getDiamondBankHook().refund(
playerId,
packageInformation.getPrice(),
itemBuyablePackage.getPackageId()
);
} catch (DiamondBankException rollbackException) {
rollbackException.printStackTrace();
p.sendMessage(this.instance.getPrefix() + "There was a problem with the transaction, and we were unable to give you back your money. Please contact an administrator");
this.instance.getCraftingStore().getLogger().error(String.format(
"Unable to give the player's money back. Player: %s, cost: %s.",
playerName,
packageInformation.getPrice()
));
closeInventory(p);
return;
}
p.sendMessage(this.instance.getPrefix() + "A problem occurred while creating your payment. Your money has been given back. Please try again later");
closeInventory(p);
}
} catch (DiamondBankException exception) {
exception.printStackTrace();
closeInventory(p);
p.sendMessage(this.instance.getPrefix()
+ "There was a problem accessing DiamondBank-OG. Please try again later.");
} catch (Exception exception) {
exception.printStackTrace();
closeInventory(p);
p.sendMessage(this.instance.getPrefix() + "A problem occurred. Please try again later.");
}
});
}
}
private void closeInventory(Player p) {
this.instance.runSyncTask(() -> {
if (p.isOnline()) {
p.closeInventory();
}
});
}
}
@@ -1,79 +0,0 @@
package net.craftingstore.bukkit.inventory.handlers;
import java.util.UUID;
import org.bukkit.entity.Player;
import net.craftingstore.bukkit.CraftingStoreBukkit;
import net.craftingstore.bukkit.inventory.BuyInventoryBuilder;
import net.craftingstore.bukkit.inventory.CraftingStoreGUI;
import net.craftingstore.bukkit.inventory.InventoryItemHandler;
import net.craftingstore.bukkit.util.ChatColorUtil;
import net.craftingstore.core.models.api.inventory.types.InventoryItemBuyablePackage;
import net.trueog.diamondbankog.DiamondBankException.EconomyDisabledException;
public class BuyablePackageHandler implements InventoryItemHandler<InventoryItemBuyablePackage> {
private final CraftingStoreBukkit instance;
private final BuyInventoryBuilder buyInventoryBuilder;
public BuyablePackageHandler(CraftingStoreBukkit instance, BuyInventoryBuilder buyInventoryBuilder) {
this.instance = instance;
this.buyInventoryBuilder = buyInventoryBuilder;
}
@Override
public void handle(Player p, InventoryItemBuyablePackage item, CraftingStoreGUI inventory) {
if (!this.instance.isHookedWithDiamondBank()) {
p.sendMessage(instance.getPrefix() + "CraftingStore-OG is not hooked with DiamondBank-OG!");
p.closeInventory();
return;
}
CraftingStoreGUI loading = this.buyInventoryBuilder.buildLoadInventory(p);
loading.open(false);
UUID playerId = p.getUniqueId();
this.instance.getCraftingStore().getImplementation().runAsyncTask(() -> {
try {
if (!this.instance.getDiamondBankHook().hasFunds(playerId, item.getPrice())) {
this.instance.runSyncTask(() -> {
if (p.isOnline()) {
p.sendMessage(ChatColorUtil.translate(this.instance.getCraftingStore().getImplementation()
.getConfiguration().getNotEnoughBalanceMessage()));
for (String message : item.getMessages()) {
p.sendMessage(ChatColorUtil.translate(message));
}
p.closeInventory();
}
});
return;
}
CraftingStoreGUI buyMenu = this.buyInventoryBuilder.build(p, item, inventory);
if (buyMenu != null) {
this.instance.runSyncTask(() -> {
if (p.isOnline()) {
buyMenu.open(false);
}
});
}
} catch (EconomyDisabledException exception) {
exception.printStackTrace();
this.instance.runSyncTask(() -> {
if (p.isOnline()) {
p.sendMessage(instance.getPrefix()
+ "There was a problem accessing DiamondBank-OG. Please try again later.");
p.closeInventory();
}
});
} catch (Exception exception) {
exception.printStackTrace();
this.instance.runSyncTask(() -> {
if (p.isOnline()) {
p.closeInventory();
}
});
}
});
}
}
@@ -1,11 +1,12 @@
package net.craftingstore.bukkit.inventory.handlers;
import net.craftingstore.bukkit.inventory.CraftingStoreGUI;
import net.craftingstore.bukkit.inventory.CraftingStoreInventoryHolder;
import net.craftingstore.bukkit.inventory.InventoryBuilder;
import net.craftingstore.bukkit.inventory.InventoryItemHandler;
import net.craftingstore.core.models.api.inventory.CraftingStoreInventory;
import net.craftingstore.core.models.api.inventory.types.InventoryItemCategory;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
public class CategoryItemHandler implements InventoryItemHandler<InventoryItemCategory> {
@@ -16,8 +17,9 @@ public class CategoryItemHandler implements InventoryItemHandler<InventoryItemCa
}
@Override
public void handle(Player p, InventoryItemCategory category, CraftingStoreGUI inventory) {
public void handle(Player p, InventoryItemCategory category, CraftingStoreInventoryHolder holder) {
CraftingStoreInventory csInventory = new CraftingStoreInventory(category.getTitle(), category.getContent(), category.getSize());
builder.build(p, csInventory, inventory).open(false);
Inventory inventory = builder.buildInventory(csInventory, holder);
p.openInventory(inventory);
}
}
@@ -1,13 +1,13 @@
package net.craftingstore.bukkit.inventory.handlers;
import net.craftingstore.bukkit.inventory.CraftingStoreGUI;
import net.craftingstore.bukkit.inventory.CraftingStoreInventoryHolder;
import net.craftingstore.bukkit.inventory.InventoryItemHandler;
import net.craftingstore.core.models.api.inventory.types.InventoryItemCloseButton;
import org.bukkit.entity.Player;
public class CloseButtonHandler implements InventoryItemHandler<InventoryItemCloseButton> {
@Override
public void handle(Player p, InventoryItemCloseButton item, CraftingStoreGUI inventory) {
public void handle(Player p, InventoryItemCloseButton item, CraftingStoreInventoryHolder holder) {
p.closeInventory();
}
}
@@ -1,6 +1,6 @@
package net.craftingstore.bukkit.inventory.handlers;
import net.craftingstore.bukkit.inventory.CraftingStoreGUI;
import net.craftingstore.bukkit.inventory.CraftingStoreInventoryHolder;
import net.craftingstore.bukkit.inventory.InventoryItemHandler;
import net.craftingstore.bukkit.util.ChatColorUtil;
import net.craftingstore.core.models.api.inventory.types.InventoryItemMessage;
@@ -8,7 +8,7 @@ import org.bukkit.entity.Player;
public class MessageButtonHandler implements InventoryItemHandler<InventoryItemMessage> {
@Override
public void handle(Player p, InventoryItemMessage item, CraftingStoreGUI inventory) {
public void handle(Player p, InventoryItemMessage item, CraftingStoreInventoryHolder holder) {
for (String message : item.getMessages()) {
p.sendMessage(ChatColorUtil.translate(message));
}
@@ -35,9 +35,9 @@ public class AdminJoinListener implements Listener {
if (!instance.getCraftingStore().isEnabled()) {
if (update != null && update.shouldDisable()) {
p.sendMessage(instance.getPrefix() + "The CraftingStore-OG plugin has been disabled because this is an outdated version. Please update the plugin.");
p.sendMessage(instance.getPrefix() + "The CraftingStore plugin has been disabled because this is an outdated version. Please update the plugin.");
} else {
p.sendMessage(instance.getPrefix() + "The CraftingStore-OG plugin has not been set-up correctly. Please set your API key using /craftingstore key <your key>.");
p.sendMessage(instance.getPrefix() + "The CraftingStore plugin has not been set-up correctly. Please set your API key using /craftingstore key <your key>.");
}
}
}
@@ -0,0 +1,64 @@
package net.craftingstore.bukkit.listeners;
import net.craftingstore.bukkit.CraftingStoreBukkit;
import net.craftingstore.bukkit.inventory.CraftingStoreInventoryHolder;
import net.craftingstore.bukkit.inventory.InventoryBuilder;
import net.craftingstore.bukkit.inventory.InventoryItemHandler;
import net.craftingstore.bukkit.inventory.handlers.BackButtonHandler;
import net.craftingstore.bukkit.inventory.handlers.CategoryItemHandler;
import net.craftingstore.bukkit.inventory.handlers.CloseButtonHandler;
import net.craftingstore.bukkit.inventory.handlers.MessageButtonHandler;
import net.craftingstore.core.models.api.inventory.*;
import net.craftingstore.core.models.api.inventory.types.InventoryItemBackButton;
import net.craftingstore.core.models.api.inventory.types.InventoryItemCategory;
import net.craftingstore.core.models.api.inventory.types.InventoryItemCloseButton;
import net.craftingstore.core.models.api.inventory.types.InventoryItemMessage;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import java.util.HashMap;
public class InventoryListener implements Listener {
private HashMap<Class<? extends InventoryItem>, InventoryItemHandler> handlers = new HashMap<>();
private CraftingStoreBukkit instance;
private InventoryBuilder inventoryBuilder;
public InventoryListener(CraftingStoreBukkit instance) {
this.instance = instance;
this.inventoryBuilder = new InventoryBuilder(instance);
this.handlers.put(InventoryItemBackButton.class, new BackButtonHandler(this.inventoryBuilder));
this.handlers.put(InventoryItemCategory.class, new CategoryItemHandler(this.inventoryBuilder));
this.handlers.put(InventoryItemCloseButton.class, new CloseButtonHandler());
this.handlers.put(InventoryItemMessage.class, new MessageButtonHandler());
}
@EventHandler
public void onClick(InventoryClickEvent e) {
// Fix "Negative, non outside slot -1" error.
if (e.getRawSlot() < 0) {
return;
}
if (e.getInventory() == null
|| e.getInventory().getHolder() == null
|| !(e.getInventory().getHolder() instanceof CraftingStoreInventoryHolder)) {
return;
}
e.setCancelled(true);
Player p = (Player) e.getWhoClicked();
CraftingStoreInventoryHolder holder = (CraftingStoreInventoryHolder) e.getInventory().getHolder();
InventoryItem item = holder.getCsInventory().getByIndex(e.getRawSlot());
if (item == null) {
return;
}
if (handlers.containsKey(item.getClass())) {
handlers.get(item.getClass()).handle(p, item, holder);
}
}
}
@@ -4,7 +4,7 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ChatColorUtil {
private static final Pattern HEX_PATTERN = Pattern.compile("&#(\\w{5}[0-9a-f])", Pattern.CASE_INSENSITIVE);
private static final Pattern HEX_PATTERN = Pattern.compile("&#(\\w{5}[0-9a-f])");
public static String translate(String textToTranslate) {
if (VersionUtil.isHexAvailable()) {
@@ -3,8 +3,6 @@ package net.craftingstore.bukkit.util;
public class VersionUtil {
private static boolean hexAvailable = false;
private static boolean customModalDataAvailable = false;
private static boolean guavaAvailable = false;
private static boolean foliaSchedulerAvailable = false;
static {
try {
@@ -17,16 +15,6 @@ public class VersionUtil {
customModalDataAvailable = true;
} catch (NoSuchMethodException | ClassNotFoundException ignored) {
}
try {
Class.forName("com.google.common.cache.CacheBuilder").getMethod("build");
guavaAvailable = true;
} catch (NoSuchMethodException | ClassNotFoundException ignored) {
}
try {
Class.forName("org.bukkit.Bukkit").getMethod("getAsyncScheduler");
foliaSchedulerAvailable = true;
} catch (NoSuchMethodException | ClassNotFoundException ignored) {
}
}
public static boolean isHexAvailable() {
@@ -36,12 +24,4 @@ public class VersionUtil {
public static boolean isCustomModalDataAvailable() {
return customModalDataAvailable;
}
public static boolean isGuavaAvailable() {
return guavaAvailable;
}
public static boolean isFoliaSchedulerAvailable() {
return foliaSchedulerAvailable;
}
}
@@ -894,7 +894,7 @@ public enum XMaterial {
public ItemStack parseItem(int amount) {
Material mat = parseMaterial();
if (isNewVersion()) {
return new ItemStack(mat, amount);
return new ItemStack(mat);
}
return new ItemStack(mat, amount, (byte) data);
}
+2 -2
View File
@@ -1,2 +1,2 @@
api-key: '^{CRAFTINGSTORE_API_TOKEN}'
disable-buy-command: false
api-key: ''
disable-buy-command: false
+7 -7
View File
@@ -1,14 +1,14 @@
name: CraftingStore-OG
name: CraftingStore
main: net.craftingstore.bukkit.CraftingStoreBukkit
version: ${version}
version: ${craftingstore-version}
authors: [Tim_kwakman, thijs_a]
prefix: CraftingStore-OG
softdepend: [PlaceholderAPI, DiamondBank-OG]
api-version: '${apiVersion}'
folia-supported: true
prefix: CraftingStore
softdepend: [PlaceholderAPI]
api-version: "1.13"
commands:
craftingstore:
description: CraftingStore-OG command
description: CraftingStore command
aliases: [cs]
csbuy:
description: Buy command
aliases: [buy]
+54
View File
@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.craftingstore</groupId>
<artifactId>craftingstore</artifactId>
<version>${revision}</version>
</parent>
<artifactId>bungee</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<repositories>
<repository>
<id>bungeecord-repo</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>net.craftingstore</groupId>
<artifactId>core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId>
<version>1.10-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,42 @@
package net.craftingstore.bungee;
import net.craftingstore.core.PluginConfiguration;
public class BungeePluginConfiguration implements PluginConfiguration {
private CraftingStoreBungee plugin;
BungeePluginConfiguration(CraftingStoreBungee plugin) {
this.plugin = plugin;
}
@Override
public String getName() {
return "BungeeCord";
}
@Override
public String[] getMainCommands() {
return new String[]{"csb"};
}
@Override
public String getVersion() {
return plugin.getDescription().getVersion();
}
@Override
public String getPlatform() {
return plugin.getProxy().getVersion();
}
@Override
public boolean isBuyCommandEnabled() {
return false;
}
@Override
public int getTimeBetweenCommands() {
return plugin.getConfig().getInt("time-between-commands", 200);
}
}
@@ -0,0 +1,47 @@
package net.craftingstore.bungee;
import net.craftingstore.bungee.commands.CraftingStoreCommand;
import net.craftingstore.bungee.config.Config;
import net.craftingstore.bungee.listeners.AdminJoinListener;
import net.craftingstore.bungee.listeners.PendingDonationJoinListener;
import net.craftingstore.core.CraftingStore;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.config.Configuration;
public class CraftingStoreBungee extends Plugin {
private Config config;
private CraftingStore craftingStore;
private String prefix = ChatColor.GRAY + "[" + ChatColor.RED + "CraftingStore" + ChatColor.GRAY + "] " + ChatColor.WHITE;
@Override
public void onEnable() {
config = new Config(this, "config.yml");
this.craftingStore = new CraftingStore(new CraftingStoreBungeeImpl(this));
getProxy().getPluginManager().registerCommand(this, new CraftingStoreCommand(this));
getProxy().getPluginManager().registerListener(this, new AdminJoinListener(this));
getProxy().getPluginManager().registerListener(this, new PendingDonationJoinListener(this));
}
@Override
public void onDisable() {
craftingStore.setEnabled(false);
}
public Configuration getConfig() {
return config.getConfig();
}
public Config getConfigWrapper() {
return config;
}
public CraftingStore getCraftingStore() {
return craftingStore;
}
public String getPrefix() {
return prefix;
}
}
@@ -0,0 +1,66 @@
package net.craftingstore.bungee;
import net.craftingstore.bungee.events.DonationReceivedEvent;
import net.craftingstore.core.CraftingStorePlugin;
import net.craftingstore.core.PluginConfiguration;
import net.craftingstore.core.logging.CraftingStoreLogger;
import net.craftingstore.core.logging.impl.JavaLogger;
import net.craftingstore.core.models.donation.Donation;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.concurrent.TimeUnit;
public class CraftingStoreBungeeImpl implements CraftingStorePlugin {
private CraftingStoreBungee bungeePlugin;
private JavaLogger logger;
private BungeePluginConfiguration configuration;
CraftingStoreBungeeImpl(CraftingStoreBungee bungeePlugin) {
this.bungeePlugin = bungeePlugin;
this.configuration = new BungeePluginConfiguration(bungeePlugin);
this.logger = new JavaLogger(bungeePlugin.getLogger());
this.logger.setDebugging(bungeePlugin.getConfig().getBoolean("debug", false));
}
public boolean executeDonation(final Donation donation) {
ProxyServer proxy = bungeePlugin.getProxy();
if (donation.getPlayer().isRequiredOnline()) {
ProxiedPlayer player = proxy.getPlayer(donation.getPlayer().getUsername());
if (player == null || !player.isConnected()) {
return false;
}
}
DonationReceivedEvent event = new DonationReceivedEvent(donation);
proxy.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return false;
}
proxy.getScheduler().runAsync(bungeePlugin, () -> proxy.getPluginManager().dispatchCommand(proxy.getConsole(), donation.getCommand()));
return true;
}
public CraftingStoreLogger getLogger() {
return this.logger;
}
public void registerRunnable(Runnable runnable, int delay, int interval) {
bungeePlugin.getProxy().getScheduler().schedule(bungeePlugin, runnable, delay, interval, TimeUnit.SECONDS);
}
public void runAsyncTask(Runnable runnable) {
bungeePlugin.getProxy().getScheduler().runAsync(bungeePlugin, runnable);
}
public String getToken() {
return bungeePlugin.getConfig().getString("api-key");
}
@Override
public PluginConfiguration getConfiguration() {
return this.configuration;
}
}
@@ -0,0 +1,53 @@
package net.craftingstore.bungee.commands;
import net.craftingstore.bungee.CraftingStoreBungee;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.plugin.Command;
import java.util.concurrent.ExecutionException;
public class CraftingStoreCommand extends Command {
private CraftingStoreBungee instance;
public CraftingStoreCommand(CraftingStoreBungee instance) {
super("csb", instance.getCraftingStore().ADMIN_PERMISSION);
this.instance = instance;
}
@Override
public void execute(CommandSender sender, String[] args) {
if (!sender.hasPermission(instance.getCraftingStore().ADMIN_PERMISSION)) {
sender.sendMessage(new TextComponent(instance.getPrefix() + "You don't have the required permission!"));
return;
}
if (args.length == 1 && args[0].equalsIgnoreCase("reload")) {
instance.getCraftingStore().reload();
sender.sendMessage(new TextComponent(instance.getPrefix() + "The plugin is reloading!"));
return;
}
if (args.length == 2 && args[0].equalsIgnoreCase("key")) {
instance.getConfig().set("api-key", args[1]);
instance.getConfigWrapper().saveConfig();
instance.getProxy().getScheduler().runAsync(instance, () -> {
try {
if (instance.getCraftingStore().reload().get()) {
sender.sendMessage(new TextComponent(instance.getPrefix() + "The new API key has been set in the config, and the plugin has been reloaded."));
} else {
sender.sendMessage(new TextComponent(instance.getPrefix() + "The API key is invalid. The plugin will not work until you set a valid API key."));
}
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
});
return;
}
sender.sendMessage(new TextComponent(ChatColor.GRAY + "" +ChatColor.STRIKETHROUGH + "-----------------------"));
sender.sendMessage(new TextComponent(ChatColor.DARK_GRAY + ">" + ChatColor.GRAY + " /csb reload" + ChatColor.DARK_GRAY + " -> " + ChatColor.GRAY + "Reload the config."));
sender.sendMessage(new TextComponent(ChatColor.DARK_GRAY + ">" + ChatColor.GRAY + " /csb key <your key>" + ChatColor.DARK_GRAY + " -> " + ChatColor.GRAY + "Update the key."));
sender.sendMessage(new TextComponent(ChatColor.GRAY + "" +ChatColor.STRIKETHROUGH + "-----------------------"));
}
}
@@ -0,0 +1,71 @@
package net.craftingstore.bungee.config;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.config.Configuration;
import net.md_5.bungee.config.ConfigurationProvider;
import net.md_5.bungee.config.YamlConfiguration;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.logging.Level;
public class Config {
private Plugin instance;
private Configuration configuration;
private String filename;
public Config(Plugin instance, String filename) {
this.instance = instance;
this.filename = filename;
instance.getDataFolder().mkdir();
File file = new File(instance.getDataFolder(), filename);
if (!file.exists()) {
InputStream is = instance.getResourceAsStream(filename);
if (is != null) {
instance.getLogger().info("Copying default config file.");
try {
Files.copy(is, file.toPath());
} catch (IOException e) {
instance.getLogger().log(Level.SEVERE, "An error occurred while copying the default config file " + filename + ".", e);
}
} else {
try {
file.createNewFile();
} catch (IOException e) {
instance.getLogger().log(Level.SEVERE, "An error occurred while creating the config file " + filename + ".", e);
}
}
}
reload();
}
public void reload() {
try {
configuration = ConfigurationProvider.getProvider(YamlConfiguration.class).load(new File(instance.getDataFolder(), filename));
} catch (IOException e) {
instance.getLogger().log(Level.SEVERE, "An error occurred while loading the config file " + filename + ".", e);
}
}
public Configuration getConfig() {
if (configuration == null) {
reload();
}
return configuration;
}
public void saveConfig() {
try {
ConfigurationProvider.getProvider(YamlConfiguration.class).save(configuration, new File(instance.getDataFolder(), filename));
} catch (IOException e) {
instance.getLogger().log(Level.SEVERE, "An error occured while saving the config file " + filename + ".", e);
}
}
}
@@ -0,0 +1,89 @@
package net.craftingstore.bungee.events;
import net.craftingstore.core.models.donation.Donation;
import net.md_5.bungee.api.plugin.Cancellable;
import net.md_5.bungee.api.plugin.Event;
import java.util.UUID;
public class DonationReceivedEvent extends Event implements Cancellable {
@Deprecated
private String command;
@Deprecated
private String username;
@Deprecated
private UUID uuid;
@Deprecated
private String packageName;
@Deprecated
private int packagePrice;
@Deprecated
private int couponDiscount;
private Donation donation;
private boolean cancelled = false;
@Deprecated
public DonationReceivedEvent(String command, String username, UUID uuid, String packageName, int packagePrice, int couponDiscount) {
this.command = command;
this.username = username;
this.uuid = uuid;
this.packageName = packageName;
this.packagePrice = packagePrice;
this.couponDiscount = couponDiscount;
}
public DonationReceivedEvent(Donation donation) {
this.command = donation.getCommand();
this.username = donation.getPlayer().getUsername();
this.uuid = donation.getPlayer().getUUID();
this.packageName = donation.getPackage().getName();
this.packagePrice = donation.getPackage().getPrice();
this.couponDiscount = donation.getDiscount();
this.donation = donation;
}
public Donation getDonation() {
return this.donation;
}
@Deprecated
public String getCommand() {
return command;
}
@Deprecated
public String getUsername() {
return username;
}
@Deprecated
public UUID getUuid() {
return uuid;
}
@Deprecated
public String getPackageName() {
return packageName;
}
@Deprecated
public int getPackagePrice() {
return packagePrice;
}
@Deprecated
public int getCouponDiscount() {
return couponDiscount;
}
public boolean isCancelled() {
return cancelled;
}
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
}
@@ -0,0 +1,45 @@
package net.craftingstore.bungee.listeners;
import net.craftingstore.bungee.CraftingStoreBungee;
import net.craftingstore.core.models.api.misc.CraftingStoreInformation;
import net.craftingstore.core.models.api.misc.UpdateInformation;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.PostLoginEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
public class AdminJoinListener implements Listener {
private CraftingStoreBungee instance;
public AdminJoinListener(CraftingStoreBungee instance) {
this.instance = instance;
}
@EventHandler
public void onPostLogin(PostLoginEvent e) {
ProxiedPlayer p = e.getPlayer();
if (!p.hasPermission(instance.getCraftingStore().ADMIN_PERMISSION)) {
return;
}
CraftingStoreInformation information = instance.getCraftingStore().getInformation();
UpdateInformation update = null;
if (information != null) {
update = information.getUpdateInformation();
// Update notification
if (update != null) {
p.sendMessage(new TextComponent(instance.getPrefix() + update.getMessage()));
}
}
if (!instance.getCraftingStore().isEnabled()) {
if (update != null && update.shouldDisable()) {
p.sendMessage(new TextComponent(instance.getPrefix() + "The CraftingStore plugin has been disabled because this is an outdated version. Please update the plugin."));
} else {
p.sendMessage(new TextComponent(instance.getPrefix() + "The CraftingStore plugin has not been set-up correctly. Please set your API key using /csb key <your key>."));
}
}
}
}
@@ -0,0 +1,31 @@
package net.craftingstore.bungee.listeners;
import net.craftingstore.bungee.CraftingStoreBungee;
import net.craftingstore.core.exceptions.CraftingStoreApiException;
import net.craftingstore.core.jobs.ProcessPendingPaymentsJob;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.PostLoginEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
public class PendingDonationJoinListener implements Listener {
private final CraftingStoreBungee instance;
public PendingDonationJoinListener(CraftingStoreBungee instance) {
this.instance = instance;
}
@EventHandler
public void onPostLogin(PostLoginEvent e) {
ProxiedPlayer p = e.getPlayer();
String username = p.getName();
instance.getCraftingStore().getImplementation().runAsyncTask(() -> {
try {
new ProcessPendingPaymentsJob(instance.getCraftingStore(), username);
} catch (CraftingStoreApiException ex) {
ex.printStackTrace();
}
});
}
}
+5
View File
@@ -0,0 +1,5 @@
name: CraftingStore
main: net.craftingstore.bungee.CraftingStoreBungee
version: ${craftingstore-version}
author: thijs_a
prefix: CraftingStore
-34
View File
@@ -1,34 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
<property name="severity" value="error"/>
</module>
<module name="TreeWalker">
<module name="FinalLocalVariable"/>
<module name="AvoidStarImport"/>
<module name="Indentation">
<property name="severity" value="ignore"/>
</module>
</module>
<module name="RegexpSingleline">
<property name="format" value="\borg\.junit\.jupiter\.api\.Assertions\.fail\s*\(\s*&quot;Not yet implemented&quot;\s*\)\s*;"/>
<property name="message" value="Remove placeholder fail() and implement the test."/>
<property name="ignoreCase" value="true"/>
<property name="severity" value="warning"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="(?&lt;!\w)fail\s*\(\s*&quot;Not yet implemented&quot;\s*\)\s*;"/>
<property name="message" value="Remove placeholder fail() and implement the test."/>
<property name="severity" value="warning"/>
</module>
</module>
-404
View File
@@ -1,404 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="23">
<profile kind="CodeFormatterProfile" name="TrueOG Network Formatting" version="23">
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_with_spaces" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
<setting id="org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_record_components" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_logical_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_shift_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_loops" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_switch_case_arrow_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_enum_constant" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.text_block_indentation" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_module_statements" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_permitted_types" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_annotations" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines" value="2147483647"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_not_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_permitted_types_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.javadoc_do_not_separate_block_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_tag_description" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_constructor" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_string_concatenation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_shift_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_shift_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_additive_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case_after_arrow" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_relational_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_logical_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.keep_switch_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_arrow" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_method_body_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_additive_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_relational_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_relational_operator" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.align_arrows_in_switch_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_additive_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.align_selector_in_method_invocation_on_expression_first_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_switch_case_with_arrow_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_colon" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_additive_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_line_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_shift_operator" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.keep_code_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_switch_case_with_arrow" value="20"/>
<setting id="org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assertion_message" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_logical_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_relational_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_logical_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_permitted_types" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_string_concatenation" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
</profile>
</profiles>
+53
View File
@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.craftingstore</groupId>
<artifactId>craftingstore</artifactId>
<version>${revision}</version>
</parent>
<artifactId>core</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.thijsa</groupId>
<artifactId>socket.io-client-java</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
</dependencies>
</project>
@@ -141,8 +141,4 @@ public class CraftingStore {
public Map<Integer, Donation> getPendingDonations() {
return pendingDonations;
}
public DonationRunner getDonationRunner() {
return donationRunner;
}
}
@@ -1,11 +1,14 @@
package net.craftingstore.core;
import net.craftingstore.core.exceptions.CraftingStoreApiException;
import net.craftingstore.core.models.api.*;
import net.craftingstore.core.models.api.ApiCategory;
import net.craftingstore.core.models.api.ApiPayment;
import net.craftingstore.core.models.api.ApiTopDonator;
import net.craftingstore.core.models.api.Root;
import net.craftingstore.core.models.api.inventory.CraftingStoreInventory;
import net.craftingstore.core.models.api.misc.CraftingStoreInformation;
import net.craftingstore.core.models.donation.Donation;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
@@ -17,7 +20,7 @@ public abstract class CraftingStoreAPI {
public abstract Future<CraftingStoreInformation> getInformation() throws CraftingStoreApiException;
public abstract Future<Root<?>> checkKey() throws CraftingStoreApiException;
public abstract Future<Root> checkKey() throws CraftingStoreApiException;
public abstract Future<Donation[]> getDonationQueue() throws CraftingStoreApiException;
@@ -25,23 +28,12 @@ public abstract class CraftingStoreAPI {
public abstract Future<ApiPayment[]> getPayments() throws CraftingStoreApiException;
public abstract Future<ApiInventory> getGUI() throws CraftingStoreApiException;
public abstract Future<ApiCategory[]> getCategories() throws CraftingStoreApiException;
public abstract Future<CraftingStoreInventory> getGUI() throws CraftingStoreApiException;
public abstract Future<ApiTopDonator[]> getTopDonators() throws CraftingStoreApiException;
public abstract Future<ApiPackageInformation> getPackageInformation(
String inGameName,
UUID uuid,
String ip,
int packageId
) throws CraftingStoreApiException;
public abstract Future<Boolean> createPayment(
String inGameName,
int price,
int[] packages
) throws CraftingStoreApiException;
public String getToken() {
return this.token;
}
@@ -12,8 +12,4 @@ public interface PluginConfiguration {
boolean isBuyCommandEnabled();
int getTimeBetweenCommands();
String getNotEnoughBalanceMessage();
boolean isUsingAlternativeApi();
}
@@ -5,11 +5,7 @@ import java.io.IOException;
public class CraftingStoreApiException extends Exception {
public CraftingStoreApiException(String s, IOException e) {
super(s, e);
}
@Override
public void printStackTrace() {
super.getCause().printStackTrace();
super(s, e.getCause());
e.printStackTrace();
}
}
@@ -8,13 +8,11 @@ import net.craftingstore.core.exceptions.CraftingStoreApiException;
import net.craftingstore.core.http.util.InformationAdapter;
import net.craftingstore.core.http.util.InventoryAdapter;
import net.craftingstore.core.http.util.JsonResponseHandler;
import net.craftingstore.core.http.util.JsonResponseHandlerV7;
import net.craftingstore.core.models.api.*;
import net.craftingstore.core.models.api.inventory.CraftingStoreInventory;
import net.craftingstore.core.models.api.inventory.InventoryItem;
import net.craftingstore.core.models.api.misc.CraftingStoreInformation;
import net.craftingstore.core.models.api.provider.ProviderInformation;
import net.craftingstore.core.models.api.request.PackageInformationRequest;
import net.craftingstore.core.models.api.request.PaymentCreateRequest;
import net.craftingstore.core.models.donation.Donation;
import net.craftingstore.core.models.donation.DonationPackage;
import net.craftingstore.core.models.donation.DonationPlayer;
@@ -26,8 +24,6 @@ import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
@@ -39,13 +35,11 @@ import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.Future;
public class CraftingStoreAPIImpl extends CraftingStoreAPI {
private final String BASE_URL = "https://api.craftingstore.net/";
private final String ALTERNATIVE_BASE_URL = "https://api-fallback.craftingstore.net/";
private final String BASE_URL = "https://api.craftingstore.net/v4/";
private CraftingStore instance;
private Gson gson;
private HttpClient httpClient;
@@ -70,7 +64,7 @@ public class CraftingStoreAPIImpl extends CraftingStoreAPI {
public Future<CraftingStoreInformation> getInformation() throws CraftingStoreApiException {
return executor.submit(() -> {
try {
HttpPost request = post("v4/info");
HttpPost request = post("info");
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("version", instance.getImplementation().getConfiguration().getVersion()));
params.add(new BasicNameValuePair("platform", instance.getImplementation().getConfiguration().getPlatform()));
@@ -82,10 +76,10 @@ public class CraftingStoreAPIImpl extends CraftingStoreAPI {
});
}
public Future<Root<?>> checkKey() throws CraftingStoreApiException {
public Future<Root> checkKey() throws CraftingStoreApiException {
return executor.submit(() -> {
try {
return httpClient.execute(get("v4/validateToken"), new JsonResponseHandler<>(gson, Root.class));
return httpClient.execute(get("validateToken"), new JsonResponseHandler<>(gson, Root.class));
} catch (IOException e) {
throw new CraftingStoreApiException("Check Key call failed", e);
}
@@ -95,7 +89,7 @@ public class CraftingStoreAPIImpl extends CraftingStoreAPI {
public Future<Donation[]> getDonationQueue() throws CraftingStoreApiException {
return executor.submit(() -> {
try {
ApiDonation[] apiDonations = httpClient.execute(get("v4/queue"), new JsonResponseHandler<>(gson, ApiDonation[].class));
ApiDonation[] apiDonations = httpClient.execute(get("queue"), new JsonResponseHandler<>(gson, ApiDonation[].class));
return Arrays.stream(apiDonations).map(apiDonation -> {
DonationPlayer player = new DonationPlayer(apiDonation.getMcName(), apiDonation.getUuid(), apiDonation.getRequireOnline());
DonationPackage donationPackage = new DonationPackage(apiDonation.getPackageName(), apiDonation.getPackagePriceCents());
@@ -117,7 +111,7 @@ public class CraftingStoreAPIImpl extends CraftingStoreAPI {
public void completeDonations(int[] ids) throws CraftingStoreApiException {
executor.submit(() -> {
try {
HttpPost request = post("v4/queue/markComplete");
HttpPost request = post("queue/markComplete");
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("removeIds", gson.toJson(ids)));
request.setEntity(new UrlEncodedFormEntity(params));
@@ -133,17 +127,28 @@ public class CraftingStoreAPIImpl extends CraftingStoreAPI {
public Future<ApiPayment[]> getPayments() throws CraftingStoreApiException {
return executor.submit(() -> {
try {
return httpClient.execute(get("v4/buyers/recent"), new JsonResponseHandler<>(gson, ApiPayment[].class));
return httpClient.execute(get("buyers/recent"), new JsonResponseHandler<>(gson, ApiPayment[].class));
} catch (IOException e) {
throw new CraftingStoreApiException("Payments call failed", e);
}
});
}
public Future<ApiInventory> getGUI() throws CraftingStoreApiException {
@Deprecated
public Future<ApiCategory[]> getCategories() throws CraftingStoreApiException {
return executor.submit(() -> {
try {
return httpClient.execute(get("v4/plugin/gui"), new JsonResponseHandler<>(gson, ApiInventory.class));
return httpClient.execute(get("plugin/inventory"), new JsonResponseHandler<>(gson, ApiCategory[].class));
} catch (IOException e) {
throw new CraftingStoreApiException("Categories call failed", e);
}
});
}
public Future<CraftingStoreInventory> getGUI() throws CraftingStoreApiException {
return executor.submit(() -> {
try {
return httpClient.execute(get("plugin/gui"), new JsonResponseHandler<>(gson, CraftingStoreInventory.class));
} catch (IOException e) {
throw new CraftingStoreApiException("Inventory call failed", e);
}
@@ -153,67 +158,15 @@ public class CraftingStoreAPIImpl extends CraftingStoreAPI {
public Future<ApiTopDonator[]> getTopDonators() throws CraftingStoreApiException {
return executor.submit(() -> {
try {
return httpClient.execute(get("v4/buyers/top"), new JsonResponseHandler<>(gson, ApiTopDonator[].class));
return httpClient.execute(get("buyers/top"), new JsonResponseHandler<>(gson, ApiTopDonator[].class));
} catch (IOException e) {
throw new CraftingStoreApiException("Top Donators call failed", e);
}
});
}
public Future<ApiPackageInformation> getPackageInformation(
String inGameName,
UUID uuid,
String ip,
int packageId
) throws CraftingStoreApiException {
return executor.submit(() -> {
try {
HttpPost request = post("v7/package/ingame/information");
PackageInformationRequest packageInformationRequest = new PackageInformationRequest(
inGameName,
uuid.toString(),
ip,
packageId
);
request.setEntity(new StringEntity(gson.toJson(packageInformationRequest), ContentType.APPLICATION_JSON));
return httpClient.execute(request, new JsonResponseHandlerV7<>(gson, ApiPackageInformation.class));
} catch (IOException e) {
throw new CraftingStoreApiException("Get package information call failed", e);
}
});
}
public Future<Boolean> createPayment(
String inGameName,
int price,
int[] packages
) throws CraftingStoreApiException {
return executor.submit(() -> {
try {
HttpPost request = post("v7/payments");
PaymentCreateRequest paymentCreateRequest = new PaymentCreateRequest(
inGameName,
"Paid with in-game currency",
"ingame",
price,
null,
true,
packages
);
request.setEntity(new StringEntity(gson.toJson(paymentCreateRequest), ContentType.APPLICATION_JSON));
HttpResponse response = httpClient.execute(request);
EntityUtils.consumeQuietly(response.getEntity());
return true;
} catch (IOException e) {
instance.getLogger().error("Payment create call failed");
e.printStackTrace();
return false;
}
});
}
private HttpGet get(String endpoint) {
HttpGet request = new HttpGet(this.getEndpoint(endpoint));
HttpGet request = new HttpGet(BASE_URL + endpoint);
request.setConfig(RequestConfig.custom()
.setSocketTimeout(10000)
.setConnectTimeout(10000)
@@ -224,7 +177,7 @@ public class CraftingStoreAPIImpl extends CraftingStoreAPI {
}
private HttpPost post(String endpoint) {
HttpPost request = new HttpPost(this.getEndpoint(endpoint));
HttpPost request = new HttpPost(BASE_URL + endpoint);
request.setConfig(RequestConfig.custom()
.setSocketTimeout(10000)
.setConnectTimeout(10000)
@@ -240,11 +193,4 @@ public class CraftingStoreAPIImpl extends CraftingStoreAPI {
request.addHeader("version", this.instance.getImplementation().getConfiguration().getVersion());
request.addHeader("platform", this.instance.getImplementation().getConfiguration().getPlatform());
}
private String getEndpoint(String endpoint) {
if (this.instance.getImplementation().getConfiguration().isUsingAlternativeApi()) {
return this.ALTERNATIVE_BASE_URL + endpoint;
}
return this.BASE_URL + endpoint;
}
}
@@ -2,9 +2,9 @@ package net.craftingstore.core.http;
import net.craftingstore.core.CraftingStore;
import net.craftingstore.core.exceptions.CraftingStoreApiException;
import net.craftingstore.core.models.api.ApiInventory;
import net.craftingstore.core.models.api.ApiPayment;
import net.craftingstore.core.models.api.ApiTopDonator;
import net.craftingstore.core.models.api.inventory.CraftingStoreInventory;
import java.util.HashMap;
import java.util.concurrent.ExecutionException;
@@ -12,20 +12,20 @@ import java.util.concurrent.Future;
public class CraftingStoreCachedAPI extends CraftingStoreAPIImpl {
private final HashMap<String, Object> cache = new HashMap<>();
private HashMap<String, Object> cache = new HashMap<>();
public CraftingStoreCachedAPI(CraftingStore instance) {
super(instance);
}
@Override
public Future<ApiInventory> getGUI() throws CraftingStoreApiException {
public Future<CraftingStoreInventory> getGUI() throws CraftingStoreApiException {
return executor.submit(() -> {
String key = "plugin/inventory";
if (!cache.containsKey(key)) {
cache.put(key, super.getGUI().get());
}
return (ApiInventory) cache.get(key);
return (CraftingStoreInventory) cache.get(key);
});
}
@@ -13,7 +13,7 @@ public class InventoryAdapter implements JsonDeserializer<InventoryItem> {
JsonPrimitive prim = (JsonPrimitive) jsonObject.get("type");
InventoryItemType itemType = InventoryItemType.valueOf(prim.getAsString());
Class<? extends InventoryItem> klass = itemType.getActualClass();
Class klass = itemType.getActualClass();
return context.deserialize(jsonObject, klass);
}
}
@@ -1,45 +0,0 @@
package net.craftingstore.core.http.util;
import com.google.gson.Gson;
import net.craftingstore.core.models.api.RootV7;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpResponseException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
public class JsonResponseHandlerV7<T> implements ResponseHandler<T> {
private Gson gson;
private Class<T> aClass;
public JsonResponseHandlerV7(Gson gson, Class<T> aClass) {
this.gson = gson;
this.aClass = aClass;
}
public T handleResponse(HttpResponse response) throws IOException {
StatusLine statusLine = response.getStatusLine();
HttpEntity entity = response.getEntity();
if (statusLine.getStatusCode() >= 300) {
throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase());
}
if (entity == null) {
throw new ClientProtocolException("Response contains no content");
}
String value = EntityUtils.toString(entity);
if (aClass == RootV7.class) {
return gson.fromJson(value, aClass);
}
RootV7<T> result = gson.fromJson(value, new GenericOf<>(RootV7.class, aClass));
return result.getData();
}
}
@@ -8,9 +8,6 @@ import java.util.*;
import java.util.stream.Stream;
public class ExecuteDonationsJob {
public static final int CHUNK_SIZE = 25;
private CraftingStore instance;
private Donation[] donations;
@@ -21,7 +18,7 @@ public class ExecuteDonationsJob {
}
private void execute() throws CraftingStoreApiException {
this.instance.getLogger().debug(String.format("Executing ExecuteDonationsJob for %d donations.", this.donations.length));
this.instance.getLogger().debug("Executing ExecuteDonationsJob.");
Map<Donation, Boolean> donations = new HashMap<>();
for (int i = 0; i < this.donations.length; i++) {
@@ -64,7 +61,7 @@ public class ExecuteDonationsJob {
// Check if the donation has been executed and is in the cache
if (entry.getValue() && instance.getPendingDonations().containsKey(entry.getKey().getId())) {
instance.getPendingDonations().remove(entry.getKey().getId());
} else if (!entry.getValue()) {
} else if (!entry.getValue()){
// Add the donation to the list of pending donations so it gets executed when the player gets online.
instance.getPendingDonations().put(entry.getKey().getId(), entry.getKey());
}
@@ -1,26 +0,0 @@
package net.craftingstore.core.models.api;
import net.craftingstore.core.models.api.inventory.InventoryItem;
public class ApiInventory {
private String title;
private InventoryItem[] content;
private int size;
private ApiInventory buyMenu;
public String getTitle() {
return title;
}
public InventoryItem[] getContent() {
return content;
}
public int getSize() {
return size;
}
public ApiInventory getBuyMenu() {
return buyMenu;
}
}
@@ -1,19 +0,0 @@
package net.craftingstore.core.models.api;
public class ApiPackageInformation {
private boolean mayBuy;
private int price;
private String message;
public boolean isAllowedToBuy() {
return mayBuy;
}
public int getPrice() {
return price;
}
public String getMessage() {
return message;
}
}
@@ -1,17 +0,0 @@
package net.craftingstore.core.models.api;
public class RootV7<T> {
private T data;
private boolean success;
private String message;
public T getData() {
return data;
}
public boolean isSuccess() {
return success;
}
}
@@ -1,23 +1,11 @@
package net.craftingstore.core.models.api.inventory;
public class InventoryItem {
protected String name;
protected String[] description;
protected InventoryItemType type;
protected InventoryItemIcon icon;
protected int index;
public InventoryItem() {
}
public InventoryItem(String name, String[] description, InventoryItemType type, InventoryItemIcon icon, int index) {
this.name = name;
this.description = description;
this.type = type;
this.icon = icon;
this.index = index;
}
private String name;
private String[] description;
private InventoryItemType type;
private InventoryItemIcon icon;
private int index;
public String getName() {
return name;
@@ -6,16 +6,6 @@ public class InventoryItemIcon {
private int customModelData;
private InventoryItemEnhancement[] enhancements;
public InventoryItemIcon() {
}
public InventoryItemIcon(String material, Integer amount, int customModelData, InventoryItemEnhancement[] enhancements) {
this.material = material;
this.amount = amount;
this.customModelData = customModelData;
this.enhancements = enhancements;
}
public String getMaterial() {
return material;
}
@@ -1,24 +1,23 @@
package net.craftingstore.core.models.api.inventory;
import net.craftingstore.core.models.api.inventory.types.*;
import net.craftingstore.core.models.api.inventory.types.InventoryItemBackButton;
import net.craftingstore.core.models.api.inventory.types.InventoryItemCategory;
import net.craftingstore.core.models.api.inventory.types.InventoryItemCloseButton;
import net.craftingstore.core.models.api.inventory.types.InventoryItemMessage;
public enum InventoryItemType {
NULL(null),
CATEGORY(InventoryItemCategory.class),
MESSAGE(InventoryItemMessage.class),
BACK(InventoryItemBackButton.class),
CLOSE(InventoryItemCloseButton.class),
BUYABLE_PACKAGE(InventoryItemBuyablePackage.class),
BUY_DETAILS(InventoryItemBuyDetails.class),
BUY_BUTTON(InventoryItemBuyButton.class);
CLOSE(InventoryItemCloseButton.class);
private final Class<? extends InventoryItem> c;
private Class c;
InventoryItemType(Class<? extends InventoryItem> c) {
InventoryItemType(Class c) {
this.c = c;
}
public Class<? extends InventoryItem> getActualClass() {
public Class getActualClass() {
return c;
}
}
@@ -1,19 +1,6 @@
package net.craftingstore.core.models.api.inventory.types;
import net.craftingstore.core.models.api.inventory.InventoryItem;
import net.craftingstore.core.models.api.inventory.InventoryItemIcon;
import net.craftingstore.core.models.api.inventory.InventoryItemType;
public class InventoryItemBackButton extends InventoryItem {
public InventoryItemBackButton() {}
public InventoryItemBackButton(
String name,
String[] description,
InventoryItemIcon icon,
int index
) {
super(name, description, InventoryItemType.BACK, icon, index);
}
}
@@ -1,29 +0,0 @@
package net.craftingstore.core.models.api.inventory.types;
import net.craftingstore.core.models.api.inventory.InventoryItem;
import net.craftingstore.core.models.api.inventory.InventoryItemIcon;
import net.craftingstore.core.models.api.inventory.InventoryItemType;
public class InventoryItemBuyButton extends InventoryItem {
private final InventoryItemBuyButtonAction action;
public InventoryItemBuyButton(
String name,
String[] description,
InventoryItemIcon icon,
int index,
InventoryItemBuyButtonAction action
) {
super(name, description, InventoryItemType.BUY_BUTTON, icon, index);
this.action = action;
}
public InventoryItemBuyButtonAction getAction() {
return action;
}
public enum InventoryItemBuyButtonAction {
IN_GAME,
ONLINE,
}
}
@@ -1,19 +0,0 @@
package net.craftingstore.core.models.api.inventory.types;
import net.craftingstore.core.models.api.inventory.InventoryItem;
import net.craftingstore.core.models.api.inventory.InventoryItemIcon;
import net.craftingstore.core.models.api.inventory.InventoryItemType;
public class InventoryItemBuyDetails extends InventoryItem {
public InventoryItemBuyDetails() {}
public InventoryItemBuyDetails(
String name,
String[] description,
InventoryItemIcon icon,
int index
) {
super(name, description, InventoryItemType.BUY_DETAILS, icon, index);
}
}
@@ -1,30 +0,0 @@
package net.craftingstore.core.models.api.inventory.types;
import net.craftingstore.core.models.api.inventory.InventoryItem;
public class InventoryItemBuyablePackage extends InventoryItem {
private int price;
private int packageId;
private String[] messages;
private String successMessage;
public InventoryItemBuyablePackage() {
}
public int getPrice() {
return price;
}
public int getPackageId() {
return packageId;
}
public String[] getMessages() {
return messages;
}
public String getSuccessMessage() {
return successMessage;
}
}
@@ -1,29 +1,11 @@
package net.craftingstore.core.models.api.inventory.types;
import net.craftingstore.core.models.api.inventory.InventoryItem;
import net.craftingstore.core.models.api.inventory.InventoryItemIcon;
import net.craftingstore.core.models.api.inventory.InventoryItemType;
public class InventoryItemMessage extends InventoryItem {
private String[] messages;
private boolean close;
public InventoryItemMessage() {
}
public InventoryItemMessage(
String name,
String[] description,
InventoryItemIcon icon,
int index,
String[] messages,
boolean close
) {
super(name, description, InventoryItemType.MESSAGE, icon, index);
this.messages = messages;
this.close = close;
}
public String[] getMessages() {
return messages;
}
@@ -1,17 +0,0 @@
package net.craftingstore.core.models.api.request;
import java.io.Serializable;
public class PackageInformationRequest implements Serializable {
String inGameName;
String uuid;
String ip;
int packageId;
public PackageInformationRequest(String inGameName, String uuid, String ip, int packageId) {
this.inGameName = inGameName;
this.uuid = uuid;
this.ip = ip;
this.packageId = packageId;
}
}
@@ -1,29 +0,0 @@
package net.craftingstore.core.models.api.request;
public class PaymentCreateRequest {
String inGameName;
String notes;
String gateway;
int inGamePricePaid;
Integer pricePaid;
boolean executeCommands;
int[] packages;
public PaymentCreateRequest(
String inGameName,
String notes,
String gateway,
int inGamePricePaid,
Integer pricePaid,
boolean executeCommands,
int[] packages
) {
this.inGameName = inGameName;
this.notes = notes;
this.gateway = gateway;
this.inGamePricePaid = inGamePricePaid;
this.pricePaid = pricePaid;
this.executeCommands = executeCommands;
this.packages = packages;
}
}
@@ -35,8 +35,6 @@ public class SocketProvider extends CraftingStoreProvider {
break;
}
}
// Wait some time on SocketIO
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
@@ -4,14 +4,10 @@ import net.craftingstore.core.CraftingStore;
import net.craftingstore.core.exceptions.CraftingStoreApiException;
import net.craftingstore.core.jobs.ExecuteDonationsJob;
import net.craftingstore.core.models.donation.Donation;
import net.craftingstore.core.util.ArrayUtil;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Stream;
public class DonationRunner {
@@ -23,18 +19,12 @@ public class DonationRunner {
}
public void runDonations() {
this.craftingStore.getLogger().debug("Scheduling new donation runner job.");
this.craftingStore.getLogger().debug("Scheduling new execute donations job");
this.executor.submit(() -> {
this.craftingStore.getLogger().debug("Requesting donation queue.");
this.craftingStore.getLogger().debug("Executing donation queue.");
try {
Donation[] donationQueue = this.craftingStore.getApi().getDonationQueue().get();
this.craftingStore.getLogger().debug(String.format("Found %d donations in queue.", donationQueue.length));
Donation[][] chunked = ArrayUtil.splitArray(donationQueue, ExecuteDonationsJob.CHUNK_SIZE);
for (int i = 0; i < chunked.length; i++) {
Donation[] chunk = chunked[i];
this.craftingStore.getLogger().debug(String.format("Creating ExecuteDonationsJob for chunk %d/%d", i + 1, chunked.length));
new ExecuteDonationsJob(this.craftingStore, chunk);
}
new ExecuteDonationsJob(this.craftingStore, donationQueue);
} catch (CraftingStoreApiException | InterruptedException | ExecutionException e) {
if (craftingStore.getLogger().isDebugging()) {
e.printStackTrace();
@@ -44,8 +34,4 @@ public class DonationRunner {
}
});
}
public ExecutorService getExecutor() {
return executor;
}
}
@@ -4,9 +4,7 @@ import net.craftingstore.core.CraftingStore;
import net.craftingstore.core.exceptions.CraftingStoreApiException;
import net.craftingstore.core.jobs.ExecuteDonationsJob;
import net.craftingstore.core.models.donation.Donation;
import net.craftingstore.core.util.ArrayUtil;
import java.util.Arrays;
import java.util.concurrent.ExecutionException;
public class DonationChecker implements Runnable {
@@ -23,14 +21,23 @@ public class DonationChecker implements Runnable {
return;
}
if (instance.getProviderSelector().isConnected()) {
// Only run this runnable every 30 minutes when we are connected to a websocket.
long target = System.currentTimeMillis() - (30 * 60 * 1000);
// Only run this runnable every 25 minutes when we are connected to a websocket.
long target = System.currentTimeMillis() - (25 * 60 * 1000);
if (lastRun > target) {
return;
}
}
lastRun = System.currentTimeMillis();
this.instance.getLogger().debug("Checking for donations by interval.");
this.instance.getDonationRunner().runDonations();
this.instance.getLogger().debug("Checking for donations.");
try {
Donation[] donationQueue = instance.getApi().getDonationQueue().get();
new ExecuteDonationsJob(instance, donationQueue);
} catch (CraftingStoreApiException | InterruptedException | ExecutionException e) {
if (instance.getLogger().isDebugging()) {
e.printStackTrace();
} else {
instance.getLogger().error("Failed to check for donations. If this issue persists, please contact support at https://craftingstore.net.");
}
}
}
}
@@ -1,24 +0,0 @@
package net.craftingstore.core.util;
import java.lang.reflect.Array;
import java.util.Arrays;
public class ArrayUtil {
public static <T> T[][] splitArray(T[] arrayToSplit, int chunkSize) {
if (chunkSize <= 0) {
return (T[][]) Array.newInstance(arrayToSplit.getClass(), 0);
}
int rest = arrayToSplit.length % chunkSize;
int chunks = arrayToSplit.length / chunkSize + (rest > 0 ? 1 : 0);
T[][] arrays = (T[][]) Array.newInstance(arrayToSplit.getClass(), chunks);
for (int i = 0; i < (rest > 0 ? chunks - 1 : chunks); i++) {
arrays[i] = Arrays.copyOfRange(arrayToSplit, i * chunkSize, i * chunkSize + chunkSize);
}
if (rest > 0) {
arrays[chunks - 1] = Arrays.copyOfRange(arrayToSplit, (chunks - 1) * chunkSize, (chunks - 1) * chunkSize + rest);
}
return arrays;
}
}
Binary file not shown.
-7
View File
@@ -1,7 +0,0 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Vendored
-251
View File
@@ -1,251 +0,0 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"
Vendored
-94
View File
@@ -1,94 +0,0 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:execute
@rem Setup the command line
set CLASSPATH=
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
Submodule libs/GxUI-OG deleted from 287d0eb3ee.
+55
View File
@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.craftingstore</groupId>
<artifactId>craftingstore</artifactId>
<packaging>pom</packaging>
<version>${revision}</version>
<properties>
<revision>${craftingstore-version}-RELEASE</revision>
<craftingstore-version>2.6.0</craftingstore-version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.1.0</version>
<configuration>
<updatePomFile>true</updatePomFile>
<flattenMode>resolveCiFriendliesOnly</flattenMode>
</configuration>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
<execution>
<id>flatten.clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<modules>
<module>core</module>
<module>bukkit</module>
<module>bungee</module>
<module>sponge</module>
<module>assembly</module>
<module>velocity</module>
</modules>
</project>
-15
View File
@@ -1,15 +0,0 @@
rootProject.name = "CraftingStore-OG"
ProcessBuilder("sh", "bootstrap.sh").directory(rootDir).inheritIO().start().let {
if (it.waitFor() != 0) throw GradleException("bootstrap.sh failed")
}
file("libs")
.listFiles()
?.filter { it.isDirectory && !it.name.startsWith(".") && it.name != "build" }
?.forEach { dir ->
include(":libs:${dir.name}")
project(":libs:${dir.name}").projectDir = dir
}
include(":core", ":bukkit", ":sponge", ":assembly", ":velocity")
+55
View File
@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.craftingstore</groupId>
<artifactId>craftingstore</artifactId>
<version>${revision}</version>
</parent>
<artifactId>sponge</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<repositories>
<repository>
<id>sponge</id>
<url>https://repo.spongepowered.org/maven</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>net.craftingstore</groupId>
<artifactId>core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.spongepowered</groupId>
<artifactId>spongeapi</artifactId>
<version>7.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
@@ -24,7 +24,7 @@ import org.spongepowered.api.text.format.TextColors;
import java.nio.file.Path;
@Plugin(id = "craftingstore", name = "CraftingStore-OG")
@Plugin(id = "craftingstore", name = "CraftingStore")
public class CraftingStoreSponge {
private CraftingStore craftingStore;
@@ -41,7 +41,7 @@ public class CraftingStoreSponge {
private Config config;
private LiteralText prefix = Text.builder("[").color(TextColors.GRAY)
.append(Text.builder("CraftingStore-OG").color(TextColors.RED).build())
.append(Text.builder("CraftingStore").color(TextColors.RED).build())
.append(Text.builder("] ").color(TextColors.WHITE).build()).build();
@Listener
@@ -53,7 +53,7 @@ public class CraftingStoreSponge {
injector = injector.createChildInjector(new CraftingStoreModule(craftingStore));
CommandSpec craftingStoreCommand = CommandSpec.builder()
.description(Text.of("CraftingStore-OG main command"))
.description(Text.of("CraftingStore main command"))
.permission(craftingStore.ADMIN_PERMISSION)
.arguments(
GenericArguments.optional(GenericArguments.string(Text.of("action"))),
@@ -63,7 +63,7 @@ public class CraftingStoreSponge {
.build();
CommandSpec buyCommand = CommandSpec.builder()
.description(Text.of("CraftingStore-OG buy command"))
.description(Text.of("CraftingStore buy command"))
.executor(injector.getInstance(BuyCommand.class))
.build();
game.getCommandManager().register(this, craftingStoreCommand, "craftingstore", "cs");
@@ -48,14 +48,4 @@ public class SpongePluginConfiguration implements PluginConfiguration {
public int getTimeBetweenCommands() {
return craftingStoreSponge.getConfigWrapper().getConfig().getNode("time-between-commands").getInt(200);
}
@Override
public String getNotEnoughBalanceMessage() {
return null;
}
@Override
public boolean isUsingAlternativeApi() {
return craftingStoreSponge.getConfigWrapper().getConfig().getNode("use-alternative-api").getBoolean(false);
}
}
@@ -3,7 +3,6 @@ package net.craftingstore.sponge.commands;
import com.google.inject.Inject;
import net.craftingstore.core.CraftingStore;
import net.craftingstore.core.exceptions.CraftingStoreApiException;
import net.craftingstore.core.models.api.ApiInventory;
import net.craftingstore.core.models.api.inventory.CraftingStoreInventory;
import net.craftingstore.sponge.CraftingStoreSponge;
import net.craftingstore.sponge.inventory.InventoryBuilder;
@@ -44,9 +43,8 @@ public class BuyCommand implements CommandExecutor {
game.getScheduler().createTaskBuilder()
.execute(() -> {
try {
ApiInventory gui = craftingStore.getApi().getGUI().get();
CraftingStoreInventory craftingStoreInventory = new CraftingStoreInventory(gui.getTitle(), gui.getContent(), gui.getSize());
Inventory inventory = this.inventoryBuilder.buildInventory(craftingStoreInventory);
CraftingStoreInventory gui = craftingStore.getApi().getGUI().get();
Inventory inventory = this.inventoryBuilder.buildInventory(gui);
game.getScheduler().createTaskBuilder()
.execute(() -> {
if (p.isOnline()) {
@@ -36,7 +36,7 @@ public class InventoryBuilder {
public Inventory buildInventory(CraftingStoreInventory csInventory, InventoryAttachment parent) {
String title = csInventory.getTitle();
if (title == null || title.isEmpty()) {
title = "CraftingStore-OG";
title = "CraftingStore";
}
Text formattedTitle = TextSerializers.FORMATTING_CODE.deserialize(title).toText();
+75
View File
@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.craftingstore</groupId>
<artifactId>craftingstore</artifactId>
<version>${revision}</version>
</parent>
<artifactId>velocity</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<repositories>
<repository>
<id>velocity</id>
<url>https://repo.velocitypowered.com/snapshots/</url>
</repository>
<repository>
<id>sponge</id>
<url>https://repo.spongepowered.org/maven</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>net.craftingstore</groupId>
<artifactId>core</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.velocitypowered</groupId>
<artifactId>velocity-api</artifactId>
<version>1.0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
@@ -20,7 +20,7 @@ import net.craftingstore.velocity.module.CraftingStoreModule;
import java.nio.file.Path;
@Singleton
@Plugin(id = "craftingstore", name = "CraftingStore-OG")
@Plugin(id = "craftingstore", name = "CraftingStore")
public class CraftingStoreVelocity {
@Inject
@@ -44,7 +44,7 @@ public class CraftingStoreVelocity {
this.craftingStore = new CraftingStore(injector.getInstance(CraftingStoreVelocityImpl.class));
injector = injector.createChildInjector(new CraftingStoreModule(craftingStore));
commandManager.register("csv", injector.getInstance(CraftingStoreCommand.class));
commandManager.register(injector.getInstance(CraftingStoreCommand.class), "csv");
eventManager.register(this, injector.getInstance(PendingDonationJoinListener.class));
}
@@ -53,11 +53,9 @@ public class CraftingStoreVelocityImpl implements CraftingStorePlugin {
return false;
}
proxyServer.getCommandManager().executeAsync(proxyServer.getConsoleCommandSource(), donation.getCommand())
.exceptionally(e -> {
logger.error("Command " + donation.getCommand() + " failed");
return null;
});
if (!proxyServer.getCommandManager().execute(proxyServer.getConsoleCommandSource(), donation.getCommand())) {
logger.error("Command " + donation.getCommand() + " failed");
}
return true;
}
@@ -53,18 +53,4 @@ public class VelocityPluginConfiguration implements PluginConfiguration {
}
throw new RuntimeException("Invalid integer value in time-between-commands");
}
@Override
public String getNotEnoughBalanceMessage() {
return null;
}
@Override
public boolean isUsingAlternativeApi() {
Object value = config.getConfig().getOrDefault("use-alternative-api", false);
if (value instanceof Boolean) {
return (boolean) value;
}
throw new RuntimeException("Invalid boolean value in use-alternative-api");
}
}
@@ -1,27 +1,28 @@
package net.craftingstore.velocity.command;
import com.google.inject.Inject;
import com.velocitypowered.api.command.Command;
import com.velocitypowered.api.command.CommandSource;
import com.velocitypowered.api.command.SimpleCommand;
import com.velocitypowered.api.proxy.ProxyServer;
import net.craftingstore.core.CraftingStore;
import net.craftingstore.velocity.CraftingStoreVelocity;
import net.craftingstore.velocity.annotation.Prefix;
import net.craftingstore.velocity.config.Config;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.text.TextComponent;
import net.kyori.text.format.TextColor;
import net.kyori.text.format.TextDecoration;
import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.concurrent.ExecutionException;
public class CraftingStoreCommand implements SimpleCommand {
public class CraftingStoreCommand implements Command {
@Inject
private CraftingStore craftingStore;
@Inject
@Prefix
private Component prefix;
private TextComponent prefix;
@Inject
private CraftingStoreVelocity velocityPlugin;
@@ -33,14 +34,12 @@ public class CraftingStoreCommand implements SimpleCommand {
private ProxyServer proxyServer;
@Override
public void execute(Invocation invocation) {
String[] args = invocation.arguments();
CommandSource sender = invocation.source();
public void execute(CommandSource sender, @NonNull String[] args) {
if (args.length == 1 && args[0].equalsIgnoreCase("reload")) {
craftingStore.reload();
sender.sendMessage(Component.text()
sender.sendMessage(TextComponent.builder("")
.append(prefix)
.append(Component.text("The plugin is reloading!"))
.append(TextComponent.of("The plugin is reloading!"))
.build());
return;
}
@@ -50,14 +49,14 @@ public class CraftingStoreCommand implements SimpleCommand {
proxyServer.getScheduler().buildTask(velocityPlugin, () -> {
try {
if (craftingStore.reload().get()) {
sender.sendMessage(Component.text()
sender.sendMessage(TextComponent.builder("")
.append(prefix)
.append(Component.text("The new API key has been set in the config, and the plugin has been reloaded."))
.append(TextComponent.of("The new API key has been set in the config, and the plugin has been reloaded."))
.build());
} else {
sender.sendMessage(Component.text()
sender.sendMessage(TextComponent.builder("")
.append(prefix)
.append(Component.text("The API key is invalid. The plugin will not work until you set a valid API key."))
.append(TextComponent.of("The API key is invalid. The plugin will not work until you set a valid API key."))
.build());
}
} catch (InterruptedException | ExecutionException e) {
@@ -68,29 +67,29 @@ public class CraftingStoreCommand implements SimpleCommand {
}
sender.sendMessage(
Component.text("-----------------------", NamedTextColor.GRAY).decoration(TextDecoration.STRIKETHROUGH, true)
TextComponent.of("-----------------------", TextColor.GRAY).decoration(TextDecoration.STRIKETHROUGH, true)
);
sender.sendMessage(Component.text()
.append(Component.text("> ", NamedTextColor.DARK_GRAY))
.append(Component.text("/csv reload", NamedTextColor.GRAY))
.append(Component.text(" -> ", NamedTextColor.DARK_GRAY))
.append(Component.text("Reload the config.", NamedTextColor.GRAY))
sender.sendMessage(TextComponent.builder("")
.append(TextComponent.of("> ", TextColor.DARK_GRAY))
.append(TextComponent.of("/csv reload", TextColor.GRAY))
.append(TextComponent.of(" -> ", TextColor.DARK_GRAY))
.append(TextComponent.of("Reload the config.", TextColor.GRAY))
.build()
);
sender.sendMessage(Component.text()
.append(Component.text("> ", NamedTextColor.DARK_GRAY))
.append(Component.text("/csv key <your key>", NamedTextColor.GRAY))
.append(Component.text(" -> ", NamedTextColor.DARK_GRAY))
.append(Component.text("Update the key.", NamedTextColor.GRAY))
sender.sendMessage(TextComponent.builder("")
.append(TextComponent.of("> ", TextColor.DARK_GRAY))
.append(TextComponent.of("/csv key <your key>", TextColor.GRAY))
.append(TextComponent.of(" -> ", TextColor.DARK_GRAY))
.append(TextComponent.of("Update the key.", TextColor.GRAY))
.build()
);
sender.sendMessage(
Component.text("-----------------------", NamedTextColor.GRAY).decoration(TextDecoration.STRIKETHROUGH, true)
TextComponent.of("-----------------------", TextColor.GRAY).decoration(TextDecoration.STRIKETHROUGH, true)
);
}
@Override
public boolean hasPermission(Invocation invocation) {
return invocation.source().hasPermission("craftingstore.admin");
public boolean hasPermission(CommandSource source, @NonNull String[] args) {
return source.hasPermission("craftingstore.admin");
}
}
@@ -2,19 +2,19 @@ package net.craftingstore.velocity.module;
import com.google.inject.AbstractModule;
import net.craftingstore.core.CraftingStore;
import net.craftingstore.velocity.CraftingStoreVelocity;
import net.craftingstore.velocity.annotation.Prefix;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.text.TextComponent;
import net.kyori.text.format.TextColor;
public class CraftingStoreModule extends AbstractModule {
private CraftingStore craftingStore;
private TextComponent prefix = Component.text()
.append(Component.text("[", NamedTextColor.GRAY))
.append(Component.text("CraftingStore-OG", NamedTextColor.RED))
.append(Component.text("] ", NamedTextColor.GRAY))
.append(Component.text("", NamedTextColor.WHITE))
private TextComponent prefix = TextComponent.builder("")
.append(TextComponent.of("[", TextColor.GRAY))
.append(TextComponent.of("CraftingStore", TextColor.RED))
.append(TextComponent.of("] ", TextColor.GRAY))
.append(TextComponent.of("", TextColor.WHITE))
.build();
public CraftingStoreModule(CraftingStore craftingStore) {
@@ -23,6 +23,6 @@ public class CraftingStoreModule extends AbstractModule {
protected void configure() {
bind(CraftingStore.class).toInstance(craftingStore);
bind(Component.class).annotatedWith(Prefix.class).toInstance(prefix);
bind(TextComponent.class).annotatedWith(Prefix.class).toInstance(prefix);
}
}