Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions CleanerX-Paper/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,14 @@ repositories {
maven("https://oss.sonatype.org/content/groups/public/") {
name = "sonatype"
}
maven {
name = "faststatsReleases"
url = uri("https://repo.faststats.dev/releases")
}
}

dependencies {
compileOnly("io.papermc.paper:paper-api:26.1.1.build.+")
compileOnly("io.papermc.paper:paper-api:1.21.11-R0.1-SNAPSHOT")
compileOnly("org.eclipse.aether:aether-api:1.1.0")
compileOnly("org.yaml:snakeyaml:2.6")
compileOnly("com.google.code.gson:gson:2.13.2")
Expand All @@ -33,18 +37,24 @@ dependencies {
compileOnly("pl.syntaxdevteam:core:1.3.0-R0.2-SNAPSHOT")
compileOnly("pl.syntaxdevteam:messageHandler-paper:1.1.2-R0.1-SNAPSHOT")
compileOnly("pl.syntaxdevteam.punisher:PunisherX:1.6.1")
compileOnly("dev.faststats.metrics:bukkit:0.22.0")

testImplementation(kotlin("test"))
testImplementation("org.junit.jupiter:junit-jupiter:6.0.3")
testImplementation("io.mockk:mockk:1.14.9")
testImplementation("io.papermc.paper:paper-api:26.1.1.build.+")
testImplementation("io.papermc.paper:paper-api:1.21.11-R0.1-SNAPSHOT")
testImplementation("pl.syntaxdevteam:core:1.3.0-R0.1.2-SNAPSHOT")
testImplementation("pl.syntaxdevteam:messageHandler-paper:1.1.2-R0.1-SNAPSHOT")
testImplementation("dev.faststats.metrics:bukkit:0.22.0")
testRuntimeOnly("org.slf4j:slf4j-simple:2.0.17")

}

val targetJavaVersion = 25
val targetJavaVersion = 21
java {
toolchain.languageVersion.set(org.gradle.jvm.toolchain.JavaLanguageVersion.of(targetJavaVersion))
}

kotlin {
jvmToolchain(targetJavaVersion)
}
Expand All @@ -63,6 +73,7 @@ tasks{
useJUnitPlatform()
jvmArgs("-XX:+EnableDynamicAgentLoading", "-Xshare:off")
}

}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ import java.io.File
import java.util.Locale

class CleanerX : JavaPlugin(), Listener {
private val fastStatsBridge: FastStatsBridge by lazy {
FastStatsBridge(this, "f32783ff0554d455034d573bfef0e6c2")
}

private lateinit var pluginInitializer: PluginInitializer

Expand All @@ -45,27 +48,39 @@ class CleanerX : JavaPlugin(), Listener {
var lpcMode: Boolean = false

override fun onEnable() {
SyntaxCore.registerUpdateSources(
GitHubSource("SyntaxDevTeam/CleanerX"),
ModrinthSource("zJ4dsnYc")
)
SyntaxCore.init(this, versionType = "paper")
pluginInitializer = PluginInitializer(this)
pluginInitializer.onEnable()
placeholderFix()
versionChecker.checkAndLog()
try {
SyntaxCore.registerUpdateSources(
GitHubSource("SyntaxDevTeam/CleanerX"),
ModrinthSource("zJ4dsnYc")
)
SyntaxCore.init(this, versionType = "paper")
pluginInitializer = PluginInitializer(this)
pluginInitializer.onEnable()
fastStatsBridge.ready()
placeholderFix()
versionChecker.checkAndLog()
} catch (exception: Exception) {
reportError(exception)
throw exception
}
}

override fun onDisable() {
AsyncChatEvent.getHandlerList().unregister(this as Plugin)
fastStatsBridge.shutdown()
pluginInitializer.onDisable()
}

fun reportError(throwable: Throwable) {
fastStatsBridge.trackError(throwable)
}

fun restartMyTask() {
try {
messageHandler.reloadMessages()
} catch (e: Exception) {
logger.err("${messageHandler.stringMessageToComponent("error", "reload")} ${e.message}")
reportError(e)
}

saveDefaultConfig()
Expand All @@ -78,6 +93,7 @@ class CleanerX : JavaPlugin(), Listener {
pluginInitializer.registerEvents()
} catch (ee: Exception) {
logger.err("An error occurred while reloading the configuration: " + ee.message)
reportError(ee)
}
}

Expand All @@ -103,6 +119,7 @@ class CleanerX : JavaPlugin(), Listener {
logger.success("$prefix Converted placeholders in ${langFile.name}.")
} catch (e: Exception) {
logger.err("$prefix Failed to convert placeholders: ${e.message}")
reportError(e)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package pl.syntaxdevteam.cleanerx

import org.bukkit.plugin.java.JavaPlugin
import java.lang.reflect.Method

class FastStatsBridge(
private val plugin: JavaPlugin,
private val token: String
) {
private var errorTracker: Any? = null
private var metrics: Any? = null
private var available = false

fun ready() {
ensureInitialized()
invokeNoArg(metrics, "ready")
}

fun shutdown() {
invokeNoArg(metrics, "shutdown")
}

fun trackError(throwable: Throwable) {
ensureInitialized()
invokeOneArg(errorTracker, "trackError", Throwable::class.java, throwable)
}

private fun ensureInitialized() {
if (available || metrics != null) {
return
}

try {
val errorTrackerClass = Class.forName("dev.faststats.core.ErrorTracker")
val contextAware = errorTrackerClass.getMethod("contextAware")
errorTracker = contextAware.invoke(null)

val bukkitMetricsClass = Class.forName("dev.faststats.bukkit.BukkitMetrics")
val factory = bukkitMetricsClass.getMethod("factory").invoke(null)
val builderClass = factory.javaClass
invokeCompatible(builderClass, factory, "token", token)
invokeCompatible(builderClass, factory, "errorTracker", errorTracker!!)
metrics = invokeCompatible(builderClass, factory, "create", plugin)
available = true
} catch (exception: Exception) {
plugin.logger.warning("[CleanerX] FastStats is unavailable, metrics disabled: ${exception::class.java.simpleName}: ${exception.message}")
}
}

private fun invokeNoArg(target: Any?, methodName: String) {
if (!available || target == null) {
return
}
try {
target.javaClass.getMethod(methodName).invoke(target)
} catch (_: Exception) {
// no-op
}
}

private fun invokeOneArg(target: Any?, methodName: String, paramType: Class<*>, argument: Any) {
if (!available || target == null) {
return
}
try {
target.javaClass.getMethod(methodName, paramType).invoke(target, argument)
} catch (_: Exception) {
// no-op
}
}

private fun invokeCompatible(targetClass: Class<*>, target: Any, methodName: String, argument: Any): Any? {
val candidate: Method = targetClass.methods.firstOrNull { method ->
method.name == methodName &&
method.parameterCount == 1 &&
method.parameters[0].type.isAssignableFrom(argument.javaClass)
} ?: throw NoSuchMethodException("No compatible '$methodName' method found in ${targetClass.name}")

candidate.isAccessible = true
return candidate.invoke(target, argument)
}

companion object {
fun trackBootstrapError(throwable: Throwable) {
runCatching {
val errorTrackerClass = Class.forName("dev.faststats.core.ErrorTracker")
val tracker = errorTrackerClass.getMethod("contextAware").invoke(null)
tracker.javaClass.getMethod("trackError", Throwable::class.java).invoke(tracker, throwable)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ class BannedWordsSynchronizer(private val plugin: CleanerX) {
complete(onComplete, mergedWords.toList())
} catch (exception: Exception) {
plugin.logger.err("Failed to synchronize banned words: ${exception.message}")
plugin.reportError(exception)
}
}
}
Expand Down Expand Up @@ -120,6 +121,7 @@ class BannedWordsSynchronizer(private val plugin: CleanerX) {
}
}.onFailure { exception ->
plugin.logger.warning("Banned words sync failed for $source: ${exception.message}")
plugin.reportError(exception)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ class CleanerXChat(
plugin.logger.severe(
"Critical error in onLegacyChat: ${e.message}"
)
e.printStackTrace()
plugin.reportError(e)
}
}

Expand Down Expand Up @@ -109,6 +109,7 @@ class CleanerXChat(
"Critical error in onChat: ${e.message}"
)
plugin.logger.severe("[CLX-CHAT-001] Stacktrace: ${e.stackTraceToString()}")
plugin.reportError(e)
}
}

Expand All @@ -127,6 +128,7 @@ class CleanerXChat(
isMuted || isJailed
} catch (exception: Exception) {
plugin.logger.severe("Could not check penalty status for ${player.name}: ${exception.message}")
plugin.reportError(exception)
false
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,16 +97,19 @@ class PluginInitializer(private val plugin: CleanerX) {
Class.forName("pl.syntaxdevteam.punisher.api.PunisherXApi", false, punisherPlugin.javaClass.classLoader)
} catch (exception: ClassNotFoundException) {
plugin.logger.warning("PunisherX wykryty, ale brakuje API (PunisherXApi). Pomijam integrację.")
plugin.reportError(exception)
return
} catch (exception: Throwable) {
plugin.logger.warning("PunisherX wykryty, ale API jest niedostępne (${exception.javaClass.simpleName}). Pomijam integrację.")
plugin.reportError(exception)
return
}

plugin.punisherXApi = try {
plugin.server.servicesManager.load(apiClass)
} catch (exception: Throwable) {
plugin.logger.warning("PunisherX wykryty, ale nie udało się pobrać API (${exception.javaClass.simpleName}). Pomijam integrację.")
plugin.reportError(exception)
return
} ?: run {
plugin.logger.warning("PunisherX wykryty, ale nie udostępnia API. Pomijam integrację.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import org.eclipse.aether.artifact.DefaultArtifact
import org.eclipse.aether.graph.Dependency
import org.eclipse.aether.repository.RemoteRepository
import org.yaml.snakeyaml.Yaml
import pl.syntaxdevteam.cleanerx.FastStatsBridge
import java.io.IOException
import java.io.InputStream
import java.util.logging.Level
Expand All @@ -31,6 +32,8 @@ class SyntaxLoader : PluginLoader {
resolver.addRepository(RemoteRepository.Builder("central-mirror", "default", "https://repo.papermc.io/repository/maven-central/").build())
resolver.addRepository(RemoteRepository.Builder("jitpack", "default", "https://jitpack.io/").build())
resolver.addRepository(RemoteRepository.Builder("codemc-snapshots", "default", "https://repo.codemc.io/repository/maven-snapshots/").build())
resolver.addRepository(RemoteRepository.Builder("faststatsReleases", "default", "https://repo.faststats.dev/releases").build())

pluginClasspath.addLibrary(resolver)
}

Expand All @@ -39,6 +42,7 @@ class SyntaxLoader : PluginLoader {
readLibraryListFromYaml()
} catch (e: IOException) {
LOGGER.log(Level.SEVERE, "Failed to resolve libraries from paper-libraries.yml", e)
FastStatsBridge.trackBootstrapError(e)
emptyList()
}
}
Expand Down
4 changes: 3 additions & 1 deletion CleanerX-Paper/src/main/resources/paper-libraries.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ libraries:
# SyntaxCore dependencies
- com.github.ben-manes.caffeine:caffeine:3.2.3
- pl.syntaxdevteam:core:1.3.0-R0.2-SNAPSHOT
- pl.syntaxdevteam:messageHandler-paper:1.1.2-R0.1-SNAPSHOT
- pl.syntaxdevteam:messageHandler-paper:1.1.2-R0.1-SNAPSHOT
# FastStats dependencies
- dev.faststats.metrics:bukkit:0.22.0
15 changes: 13 additions & 2 deletions CleanerX-Spigot/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,14 @@ repositories {
maven("https://repo.alessiodp.com/releases/") {
name = "alessiodp"
}
maven {
name = "faststatsReleases"
url = uri("https://repo.faststats.dev/releases")
}
}

dependencies {
compileOnly("org.spigotmc:spigot-api:26.1.1-R0.1-SNAPSHOT")
compileOnly("org.spigotmc:spigot-api:1.21.11-R0.1-SNAPSHOT")
compileOnly("org.eclipse.aether:aether-api:1.1.0")
compileOnly("org.yaml:snakeyaml:2.6")
compileOnly("com.google.code.gson:gson:2.13.2")
Expand All @@ -42,14 +46,21 @@ dependencies {
compileOnly("pl.syntaxdevteam:messageHandler-spigot:1.1.2-R0.1-SNAPSHOT")
compileOnly("pl.syntaxdevteam.punisher:PunisherX:1.6.1")
implementation("net.byteflux:libby-bukkit:1.3.1")
compileOnly("dev.faststats.metrics:bukkit:0.21.0")

testImplementation(kotlin("test"))
testImplementation("org.mockito:mockito-core:5.23.0")
testImplementation("org.mockito:mockito-inline:5.2.0")
testImplementation("org.mockito.kotlin:mockito-kotlin:6.3.0")

testImplementation("dev.faststats.metrics:bukkit:0.21.0")
}

val targetJavaVersion = 21
java {
toolchain.languageVersion.set(org.gradle.jvm.toolchain.JavaLanguageVersion.of(targetJavaVersion))
}

val targetJavaVersion = 25
kotlin {
jvmToolchain(targetJavaVersion)
}
Expand Down
Loading
Loading