From afb691112c6b5e9f1bf6811a0080008ae3eaa647 Mon Sep 17 00:00:00 2001 From: Wesley Breukers Date: Thu, 22 Jan 2026 21:59:50 +0200 Subject: [PATCH 1/5] refactor: rename project from Analyse to ServerStats - Updated project group and root name from 'Analyse' to 'ServerStats' across all modules. - Modified relevant documentation, configuration files, and command references to reflect the new project name. - Removed obsolete API classes and methods related to the previous project structure. - Ensured consistency in naming conventions and URLs throughout the codebase. --- README.md | 40 +++---- api/build.gradle | 14 +-- .../serverstats/api/ServerStats.java} | 46 ++++---- .../serverstats/api/ServerStatsProvider.java} | 26 ++--- .../api/exception/ServerStatsException.java} | 10 +- .../api/manager/ABTestManager.java | 4 +- .../api/manager/SessionManager.java | 4 +- .../messaging/ServerStatsMessageParser.java} | 20 ++-- .../api/messaging/ServerStatsMessaging.java} | 16 +-- .../api/object/abtest/ABTest.java | 2 +- .../api/object/abtest/Variant.java | 2 +- .../api/object/builder/EventBuilder.java | 20 ++-- .../api/platform/ServerStatsPlatform.java} | 12 +- .../api/session/PlayerSession.java | 2 +- bungeecord/build.gradle | 2 +- .../bungeecord/ServerStatsBungee.java} | 86 +++++++-------- .../command/ServerStatsCommand.java} | 94 ++++++++-------- .../config/ServerStatsBungeeConfig.java} | 14 +-- .../bungeecord/listener/PlayerListener.java | 58 +++++----- .../listener/PluginMessageListener.java | 38 +++---- .../bungeecord/manager/ABTestManager.java | 68 ++++++------ .../bungeecord/manager/SessionManager.java | 6 +- .../object/action/BungeeAction.java | 14 +-- .../object/action/RunCommandAction.java | 10 +- .../object/action/SendMessageAction.java | 12 +- .../object/session/PlayerSession.java | 4 +- .../bungeecord/task/HeartbeatTask.java | 34 +++--- .../update/BungeeUpdateChecker.java | 12 +- .../bungeecord/util/ComponentUtil.java | 2 +- bungeecord/src/main/resources/bungee.yml | 6 +- docs/README.md | 12 +- docs/api.md | 104 +++++++++--------- docs/commands.md | 54 ++++----- docs/configuration.md | 14 +-- docs/installation.md | 30 ++--- gradle.properties | 2 +- hytale/build.gradle | 4 +- .../serverstats}/hytale/HytalePlugin.java | 96 ++++++++-------- .../hytale/command/ServerStatsCommand.java} | 80 +++++++------- .../config/ServerStatsHytaleConfig.java} | 14 +-- .../hytale/listener/PlayerListener.java | 34 +++--- .../hytale/manager/ABTestManager.java | 52 ++++----- .../hytale}/manager/SessionManager.java | 6 +- .../hytale/object/action/HytaleAction.java | 8 +- .../object/action/RunCommandAction.java | 8 +- .../object/action/SendMessageAction.java | 10 +- .../hytale}/object/session/PlayerSession.java | 4 +- .../hytale/task/HeartbeatTask.java | 28 ++--- .../hytale/update/HytaleUpdateChecker.java | 8 +- .../hytale/util/ComponentUtil.java | 2 +- hytale/src/main/resources/manifest.json | 8 +- paper/build.gradle | 2 +- .../serverstats/paper/ServerStatsPlugin.java} | 98 ++++++++--------- .../paper/command/ServerStatsCommand.java} | 100 ++++++++--------- .../paper/config/ServerStatsPaperConfig.java} | 6 +- .../paper/listener/PlayerListener.java | 40 +++---- .../paper/manager/ABTestManager.java | 62 +++++------ .../paper}/manager/SessionManager.java | 6 +- .../paper/object/action/PaperAction.java | 14 +-- .../paper/object/action/RunCommandAction.java | 10 +- .../object/action/SendMessageAction.java | 12 +- .../paper}/object/session/PlayerSession.java | 4 +- .../paper/task/HeartbeatTask.java | 30 ++--- .../paper/update/PaperUpdateChecker.java | 18 +-- .../paper}/util/ComponentUtil.java | 2 +- paper/src/main/resources/config.yml | 4 +- paper/src/main/resources/paper-plugin.yml | 16 +-- .../serverstats/sdk/ServerStatsCallback.java} | 8 +- .../serverstats/sdk/ServerStatsClient.java} | 66 +++++------ .../sdk/config/ServerStatsConfig.java} | 10 +- .../sdk/http/ServerStatsHttpClient.java} | 44 ++++---- .../sdk/object/abtest/ABTest.java | 8 +- .../sdk/object/abtest/Variant.java | 6 +- .../sdk/object/action/Action.java | 2 +- .../sdk/object/action/ActionData.java | 2 +- .../sdk/object/action/ActionType.java | 2 +- .../sdk/request/ConversionRequest.java | 2 +- .../sdk/request/EventRequest.java | 2 +- .../sdk/request/HeartbeatRequest.java | 2 +- .../serverstats}/sdk/request/JoinRequest.java | 2 +- .../sdk/request/LeaveRequest.java | 2 +- .../serverstats}/sdk/request/PlayerInfo.java | 2 +- .../sdk/request/PlayerInfoRequest.java | 2 +- .../serverstats}/sdk/request/ServerType.java | 2 +- .../sdk/response/ABTestsResponse.java | 4 +- .../sdk/response/ConversionResponse.java | 2 +- .../sdk/response/EventResponse.java | 2 +- .../sdk/response/HeartbeatResponse.java | 2 +- .../sdk/response/JoinResponse.java | 2 +- .../sdk/response/LeaveResponse.java | 2 +- .../sdk/response/PlayerInfoResponse.java | 2 +- .../sdk/response/ServerInfoResponse.java | 2 +- .../sdk/response/VersionResponse.java | 2 +- .../sdk/update/UpdateChecker.java | 20 ++-- settings.gradle | 2 +- velocity/build.gradle | 2 +- .../velocity/ServerStatsVelocity.java} | 96 ++++++++-------- .../velocity/command/ServerStatsCommand.java} | 94 ++++++++-------- .../config/ServerStatsVelocityConfig.java} | 14 +-- .../velocity/listener/PlayerListener.java | 60 +++++----- .../listener/PluginMessageListener.java | 36 +++--- .../velocity/manager/ABTestManager.java | 62 +++++------ .../velocity/manager/SessionManager.java | 6 +- .../object/action/RunCommandAction.java | 10 +- .../object/action/SendMessageAction.java | 12 +- .../object/action/VelocityAction.java | 14 +-- .../object/session/PlayerSession.java | 4 +- .../velocity/task/HeartbeatTask.java | 34 +++--- .../update/VelocityUpdateChecker.java | 12 +- .../velocity}/util/ComponentUtil.java | 2 +- 110 files changed, 1172 insertions(+), 1172 deletions(-) rename api/src/main/java/{net/analyse/api/Analyse.java => com/serverstats/api/ServerStats.java} (80%) rename api/src/main/java/{net/analyse/api/AnalyseProvider.java => com/serverstats/api/ServerStatsProvider.java} (58%) rename api/src/main/java/{net/analyse/api/exception/AnalyseException.java => com/serverstats/api/exception/ServerStatsException.java} (87%) rename api/src/main/java/{net/analyse => com/serverstats}/api/manager/ABTestManager.java (94%) rename api/src/main/java/{net/analyse => com/serverstats}/api/manager/SessionManager.java (91%) rename api/src/main/java/{net/analyse/api/messaging/AnalyseMessageParser.java => com/serverstats/api/messaging/ServerStatsMessageParser.java} (91%) rename api/src/main/java/{net/analyse/api/messaging/AnalyseMessaging.java => com/serverstats/api/messaging/ServerStatsMessaging.java} (91%) rename api/src/main/java/{net/analyse => com/serverstats}/api/object/abtest/ABTest.java (98%) rename api/src/main/java/{net/analyse => com/serverstats}/api/object/abtest/Variant.java (92%) rename api/src/main/java/{net/analyse => com/serverstats}/api/object/builder/EventBuilder.java (85%) rename api/src/main/java/{net/analyse/api/platform/AnalysePlatform.java => com/serverstats/api/platform/ServerStatsPlatform.java} (78%) rename api/src/main/java/{net/analyse => com/serverstats}/api/session/PlayerSession.java (96%) rename bungeecord/src/main/java/{net/analyse/bungeecord/AnalyseBungee.java => com/serverstats/bungeecord/ServerStatsBungee.java} (76%) rename bungeecord/src/main/java/{net/analyse/bungeecord/command/AnalyseCommand.java => com/serverstats/bungeecord/command/ServerStatsCommand.java} (80%) rename bungeecord/src/main/java/{net/analyse/bungeecord/config/AnalyseBungeeConfig.java => com/serverstats/bungeecord/config/ServerStatsBungeeConfig.java} (88%) rename bungeecord/src/main/java/{net/analyse => com/serverstats}/bungeecord/listener/PlayerListener.java (81%) rename bungeecord/src/main/java/{net/analyse => com/serverstats}/bungeecord/listener/PluginMessageListener.java (78%) rename bungeecord/src/main/java/{net/analyse => com/serverstats}/bungeecord/manager/ABTestManager.java (67%) rename bungeecord/src/main/java/{net/analyse => com/serverstats}/bungeecord/manager/SessionManager.java (87%) rename bungeecord/src/main/java/{net/analyse => com/serverstats}/bungeecord/object/action/BungeeAction.java (79%) rename bungeecord/src/main/java/{net/analyse => com/serverstats}/bungeecord/object/action/RunCommandAction.java (80%) rename bungeecord/src/main/java/{net/analyse => com/serverstats}/bungeecord/object/action/SendMessageAction.java (69%) rename {velocity/src/main/java/net/analyse/velocity => bungeecord/src/main/java/com/serverstats/bungeecord}/object/session/PlayerSession.java (90%) rename bungeecord/src/main/java/{net/analyse => com/serverstats}/bungeecord/task/HeartbeatTask.java (70%) rename bungeecord/src/main/java/{net/analyse => com/serverstats}/bungeecord/update/BungeeUpdateChecker.java (87%) rename bungeecord/src/main/java/{net/analyse => com/serverstats}/bungeecord/util/ComponentUtil.java (98%) rename hytale/src/main/java/{net/analyse => com/serverstats}/hytale/HytalePlugin.java (77%) rename hytale/src/main/java/{net/analyse/hytale/command/AnalyseCommand.java => com/serverstats/hytale/command/ServerStatsCommand.java} (83%) rename hytale/src/main/java/{net/analyse/hytale/config/AnalyseHytaleConfig.java => com/serverstats/hytale/config/ServerStatsHytaleConfig.java} (84%) rename hytale/src/main/java/{net/analyse => com/serverstats}/hytale/listener/PlayerListener.java (81%) rename hytale/src/main/java/{net/analyse => com/serverstats}/hytale/manager/ABTestManager.java (73%) rename {paper/src/main/java/net/analyse/paper => hytale/src/main/java/com/serverstats/hytale}/manager/SessionManager.java (89%) rename hytale/src/main/java/{net/analyse => com/serverstats}/hytale/object/action/HytaleAction.java (89%) rename hytale/src/main/java/{net/analyse => com/serverstats}/hytale/object/action/RunCommandAction.java (80%) rename hytale/src/main/java/{net/analyse => com/serverstats}/hytale/object/action/SendMessageAction.java (78%) rename {paper/src/main/java/net/analyse/paper => hytale/src/main/java/com/serverstats/hytale}/object/session/PlayerSession.java (88%) rename hytale/src/main/java/{net/analyse => com/serverstats}/hytale/task/HeartbeatTask.java (72%) rename hytale/src/main/java/{net/analyse => com/serverstats}/hytale/update/HytaleUpdateChecker.java (94%) rename hytale/src/main/java/{net/analyse => com/serverstats}/hytale/util/ComponentUtil.java (99%) rename paper/src/main/java/{net/analyse/paper/AnalysePlugin.java => com/serverstats/paper/ServerStatsPlugin.java} (73%) rename paper/src/main/java/{net/analyse/paper/command/AnalyseCommand.java => com/serverstats/paper/command/ServerStatsCommand.java} (79%) rename paper/src/main/java/{net/analyse/paper/config/AnalysePaperConfig.java => com/serverstats/paper/config/ServerStatsPaperConfig.java} (92%) rename paper/src/main/java/{net/analyse => com/serverstats}/paper/listener/PlayerListener.java (82%) rename paper/src/main/java/{net/analyse => com/serverstats}/paper/manager/ABTestManager.java (72%) rename {hytale/src/main/java/net/analyse/hytale => paper/src/main/java/com/serverstats/paper}/manager/SessionManager.java (89%) rename paper/src/main/java/{net/analyse => com/serverstats}/paper/object/action/PaperAction.java (78%) rename paper/src/main/java/{net/analyse => com/serverstats}/paper/object/action/RunCommandAction.java (80%) rename paper/src/main/java/{net/analyse => com/serverstats}/paper/object/action/SendMessageAction.java (70%) rename {hytale/src/main/java/net/analyse/hytale => paper/src/main/java/com/serverstats/paper}/object/session/PlayerSession.java (88%) rename paper/src/main/java/{net/analyse => com/serverstats}/paper/task/HeartbeatTask.java (67%) rename paper/src/main/java/{net/analyse => com/serverstats}/paper/update/PaperUpdateChecker.java (89%) rename {velocity/src/main/java/net/analyse/velocity => paper/src/main/java/com/serverstats/paper}/util/ComponentUtil.java (99%) rename sdk/src/main/java/{net/analyse/sdk/AnalyseCallback.java => com/serverstats/sdk/ServerStatsCallback.java} (65%) rename sdk/src/main/java/{net/analyse/sdk/AnalyseClient.java => com/serverstats/sdk/ServerStatsClient.java} (62%) rename sdk/src/main/java/{net/analyse/sdk/config/AnalyseConfig.java => com/serverstats/sdk/config/ServerStatsConfig.java} (63%) rename sdk/src/main/java/{net/analyse/sdk/http/AnalyseHttpClient.java => com/serverstats/sdk/http/ServerStatsHttpClient.java} (72%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/object/abtest/ABTest.java (81%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/object/abtest/Variant.java (65%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/object/action/Action.java (91%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/object/action/ActionData.java (97%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/object/action/ActionType.java (75%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/request/ConversionRequest.java (97%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/request/EventRequest.java (96%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/request/HeartbeatRequest.java (96%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/request/JoinRequest.java (97%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/request/LeaveRequest.java (92%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/request/PlayerInfo.java (94%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/request/PlayerInfoRequest.java (95%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/request/ServerType.java (72%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/response/ABTestsResponse.java (85%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/response/ConversionResponse.java (82%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/response/EventResponse.java (81%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/response/HeartbeatResponse.java (81%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/response/JoinResponse.java (87%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/response/LeaveResponse.java (81%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/response/PlayerInfoResponse.java (92%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/response/ServerInfoResponse.java (89%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/response/VersionResponse.java (93%) rename sdk/src/main/java/{net/analyse => com/serverstats}/sdk/update/UpdateChecker.java (88%) rename velocity/src/main/java/{net/analyse/velocity/AnalyseVelocity.java => com/serverstats/velocity/ServerStatsVelocity.java} (78%) rename velocity/src/main/java/{net/analyse/velocity/command/AnalyseCommand.java => com/serverstats/velocity/command/ServerStatsCommand.java} (80%) rename velocity/src/main/java/{net/analyse/velocity/config/AnalyseVelocityConfig.java => com/serverstats/velocity/config/ServerStatsVelocityConfig.java} (88%) rename velocity/src/main/java/{net/analyse => com/serverstats}/velocity/listener/PlayerListener.java (80%) rename velocity/src/main/java/{net/analyse => com/serverstats}/velocity/listener/PluginMessageListener.java (76%) rename velocity/src/main/java/{net/analyse => com/serverstats}/velocity/manager/ABTestManager.java (69%) rename velocity/src/main/java/{net/analyse => com/serverstats}/velocity/manager/SessionManager.java (87%) rename velocity/src/main/java/{net/analyse => com/serverstats}/velocity/object/action/RunCommandAction.java (79%) rename velocity/src/main/java/{net/analyse => com/serverstats}/velocity/object/action/SendMessageAction.java (69%) rename velocity/src/main/java/{net/analyse => com/serverstats}/velocity/object/action/VelocityAction.java (78%) rename {bungeecord/src/main/java/net/analyse/bungeecord => velocity/src/main/java/com/serverstats/velocity}/object/session/PlayerSession.java (91%) rename velocity/src/main/java/{net/analyse => com/serverstats}/velocity/task/HeartbeatTask.java (70%) rename velocity/src/main/java/{net/analyse => com/serverstats}/velocity/update/VelocityUpdateChecker.java (88%) rename {paper/src/main/java/net/analyse/paper => velocity/src/main/java/com/serverstats/velocity}/util/ComponentUtil.java (99%) diff --git a/README.md b/README.md index 05c5d3f..4c44a36 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Analyse Server Plugins +# ServerStats Server Plugins Analytics tracking plugins for Minecraft servers. Supports Paper, Velocity, and BungeeCord. @@ -27,32 +27,32 @@ Download the appropriate plugin for your server: | Platform | Download | |----------|----------| -| Paper/Spigot | `analyse-paper-x.x.x.jar` | -| BungeeCord | `analyse-bungeecord-x.x.x.jar` | -| Velocity | `analyse-velocity-x.x.x.jar` | +| Paper/Spigot | `serverstats-paper-x.x.x.jar` | +| BungeeCord | `serverstats-bungeecord-x.x.x.jar` | +| Velocity | `serverstats-velocity-x.x.x.jar` | ### 2. Configure -Add your API key from [analyse.net](https://analyse.net): +Add your API key from [serverstats.net](https://serverstats.net): ```yaml -# Paper - plugins/Analyse/config.yml +# Paper - plugins/ServerStats/config.yml api-key: "your-api-key-here" ``` ### 3. Verify -Run `/analyse status` to check the connection. +Run `/serverstats status` to check the connection. ## For Developers Track custom events from your plugin: ```java -import net.analyse.api.Analyse; +import net.serverstats.api.ServerStats; // Simple event -Analyse.trackEvent("shop_purchase") +ServerStats.trackEvent("shop_purchase") .withPlayer(player.getUniqueId(), player.getName()) .withData("item", "diamond_sword") .withValue(500.0) @@ -78,9 +78,9 @@ See the [Developer API Documentation](docs/api.md) for more examples. ``` Output JARs: -- `paper/build/libs/analyse-paper-*.jar` -- `velocity/build/libs/analyse-velocity-*.jar` -- `bungeecord/build/libs/analyse-bungeecord-*.jar` +- `paper/build/libs/serverstats-paper-*.jar` +- `velocity/build/libs/serverstats-velocity-*.jar` +- `bungeecord/build/libs/serverstats-bungeecord-*.jar` ## Requirements @@ -92,20 +92,20 @@ Output JARs: ## Commands ``` -/analyse - Show plugin status -/analyse status - Show plugin status -/analyse reload - Reload configuration -/analyse debug - Toggle debug mode -/analyse event - Send a custom event -/analyse help - Show help +/serverstats - Show plugin status +/serverstats status - Show plugin status +/serverstats reload - Reload configuration +/serverstats debug - Toggle debug mode +/serverstats event - Send a custom event +/serverstats help - Show help ``` See [Commands Documentation](docs/commands.md) for details. ## Support -- Website: [analyse.net](https://analyse.net) -- API: [api.analyse.net](https://api.analyse.net) +- Website: [serverstats.net](https://serverstats.net) +- API: [api.serverstats.net](https://api.serverstats.net) ## License diff --git a/api/build.gradle b/api/build.gradle index 7aefc3a..6074787 100644 --- a/api/build.gradle +++ b/api/build.gradle @@ -24,9 +24,9 @@ tasks.register('generateBuildConstants') { outputs.dir(outputDir) doLast { - def constantsFile = new File(outputDir, 'net/analyse/api/BuildConstants.java') + def constantsFile = new File(outputDir, 'com/serverstats/api/BuildConstants.java') constantsFile.parentFile.mkdirs() - constantsFile.text = """package net.analyse.api; + constantsFile.text = """package com.serverstats.api; /** * Auto-generated build constants from Gradle. @@ -52,14 +52,14 @@ publishing { maven(MavenPublication) { from components.java - groupId = 'net.analyse' - artifactId = 'analyse-api' + groupId = 'com.serverstats' + artifactId = 'serverstats-api' version = rootProject.version pom { - name = 'Analyse API' - description = 'Public API for Analyse analytics plugin' - url = 'https://analyse.net' + name = 'ServerStats API' + description = 'Public API for ServerStats analytics plugin' + url = 'https://serverstats.com' licenses { license { diff --git a/api/src/main/java/net/analyse/api/Analyse.java b/api/src/main/java/com/serverstats/api/ServerStats.java similarity index 80% rename from api/src/main/java/net/analyse/api/Analyse.java rename to api/src/main/java/com/serverstats/api/ServerStats.java index 1027a65..fa5af29 100644 --- a/api/src/main/java/net/analyse/api/Analyse.java +++ b/api/src/main/java/com/serverstats/api/ServerStats.java @@ -1,22 +1,22 @@ -package net.analyse.api; +package com.serverstats.api; -import net.analyse.api.manager.ABTestManager; -import net.analyse.api.manager.SessionManager; -import net.analyse.api.object.abtest.ABTest; -import net.analyse.api.object.builder.EventBuilder; -import net.analyse.api.platform.AnalysePlatform; +import com.serverstats.api.manager.ABTestManager; +import com.serverstats.api.manager.SessionManager; +import com.serverstats.api.object.abtest.ABTest; +import com.serverstats.api.object.builder.EventBuilder; +import com.serverstats.api.platform.ServerStatsPlatform; import java.util.List; import java.util.Map; import java.util.UUID; /** - * Main entry point for the Analyse API. + * Main entry point for the ServerStats API. * Use this class to track custom analytics events and interact with A/B tests. * *

Event tracking example:

*
{@code
  * // Track a player completing a quest
- * Analyse.trackEvent("quest_completed")
+ * ServerStats.trackEvent("quest_completed")
  *     .withPlayer(player.getUniqueId(), player.getName())
  *     .withData("quest_id", "dragon_slayer")
  *     .withData("time_taken_seconds", 3600)
@@ -27,53 +27,53 @@
  * 

A/B testing example:

*
{@code
  * // Get the variant assigned to a player
- * String variant = Analyse.getVariant(player.getUniqueId(), "welcome-rewards");
+ * String variant = ServerStats.getVariant(player.getUniqueId(), "welcome-rewards");
  * if ("diamonds".equals(variant)) {
  *     giveWelcomeDiamonds(player);
  * }
  *
  * // Track a conversion event
- * Analyse.trackConversion(player.getUniqueId(), player.getName(), "welcome-rewards", "first_purchase");
+ * ServerStats.trackConversion(player.getUniqueId(), player.getName(), "welcome-rewards", "first_purchase");
  * }
* *

Accessing managers:

*
{@code
  * // Get the platform for advanced usage
- * AnalysePlatform platform = Analyse.get();
+ * ServerStatsPlatform platform = ServerStats.get();
  * SessionManager sessions = platform.getSessionManager();
  * ABTestManager abTests = platform.getABTestManager();
  * }
*/ -public final class Analyse { +public final class ServerStats { private static EventBuilder.EventSender eventSender; - private Analyse() { + private ServerStats() { } /** - * Get the Analyse platform instance for advanced usage. + * Get the ServerStats platform instance for advanced usage. * Use this to access managers and platform-specific functionality. * * @return The platform instance - * @throws IllegalStateException if Analyse is not initialized + * @throws IllegalStateException if ServerStats is not initialized */ - public static AnalysePlatform get() { - AnalysePlatform platform = AnalyseProvider.getPlatform(); + public static ServerStatsPlatform get() { + ServerStatsPlatform platform = ServerStatsProvider.getPlatform(); if (platform == null) { - throw new IllegalStateException("Analyse is not initialized. Make sure the Analyse plugin is enabled."); + throw new IllegalStateException("ServerStats is not initialized. Make sure the ServerStats plugin is enabled."); } return platform; } /** - * Check if Analyse is available and ready to use + * Check if ServerStats is available and ready to use * - * @return true if Analyse is initialized and ready + * @return true if ServerStats is initialized and ready */ public static boolean isAvailable() { - return AnalyseProvider.isRegistered(); + return ServerStatsProvider.isRegistered(); } /** @@ -203,7 +203,7 @@ public static void trackConversion(UUID playerUuid, String playerUsername, Strin * Get the session manager * * @return The session manager - * @throws IllegalStateException if Analyse is not initialized + * @throws IllegalStateException if ServerStats is not initialized */ public static SessionManager sessions() { return get().getSessionManager(); @@ -213,7 +213,7 @@ public static SessionManager sessions() { * Get the A/B test manager * * @return The A/B test manager, or null if not available - * @throws IllegalStateException if Analyse is not initialized + * @throws IllegalStateException if ServerStats is not initialized */ public static ABTestManager abTests() { return get().getABTestManager(); diff --git a/api/src/main/java/net/analyse/api/AnalyseProvider.java b/api/src/main/java/com/serverstats/api/ServerStatsProvider.java similarity index 58% rename from api/src/main/java/net/analyse/api/AnalyseProvider.java rename to api/src/main/java/com/serverstats/api/ServerStatsProvider.java index c164a50..8f61703 100644 --- a/api/src/main/java/net/analyse/api/AnalyseProvider.java +++ b/api/src/main/java/com/serverstats/api/ServerStatsProvider.java @@ -1,21 +1,21 @@ -package net.analyse.api; +package com.serverstats.api; -import net.analyse.api.platform.AnalysePlatform; +import com.serverstats.api.platform.ServerStatsPlatform; /** * Internal provider that holds the reference to the active platform plugin. - * This allows the static Analyse API to access the underlying implementation. + * This allows the static ServerStats API to access the underlying implementation. * - *

For plugin developers: Use {@link Analyse} instead of this class.

+ *

For plugin developers: Use {@link ServerStats} instead of this class.

* - *

For platform implementations: Call {@link #register(AnalysePlatform)} + *

For platform implementations: Call {@link #register(ServerStatsPlatform)} * in your onEnable and {@link #unregister()} in your onDisable.

*/ -public final class AnalyseProvider { +public final class ServerStatsProvider { - private static AnalysePlatform platform; + private static ServerStatsPlatform platform; - private AnalyseProvider() { + private ServerStatsProvider() { } /** @@ -24,12 +24,12 @@ private AnalyseProvider() { * @param platform The platform implementation * @throws IllegalStateException if a platform is already registered */ - public static void register(AnalysePlatform platform) { - if (AnalyseProvider.platform != null) { - throw new IllegalStateException("Analyse platform is already registered"); + public static void register(ServerStatsPlatform platform) { + if (ServerStatsProvider.platform != null) { + throw new IllegalStateException("ServerStats platform is already registered"); } - AnalyseProvider.platform = platform; + ServerStatsProvider.platform = platform; } /** @@ -44,7 +44,7 @@ public static void unregister() { * * @return The platform implementation, or null if not registered */ - public static AnalysePlatform getPlatform() { + public static ServerStatsPlatform getPlatform() { return platform; } diff --git a/api/src/main/java/net/analyse/api/exception/AnalyseException.java b/api/src/main/java/com/serverstats/api/exception/ServerStatsException.java similarity index 87% rename from api/src/main/java/net/analyse/api/exception/AnalyseException.java rename to api/src/main/java/com/serverstats/api/exception/ServerStatsException.java index 19cb0fe..c53f75b 100644 --- a/api/src/main/java/net/analyse/api/exception/AnalyseException.java +++ b/api/src/main/java/com/serverstats/api/exception/ServerStatsException.java @@ -1,9 +1,9 @@ -package net.analyse.api.exception; +package com.serverstats.api.exception; /** - * Exception thrown when an Analyse API operation fails + * Exception thrown when an ServerStats API operation fails */ -public class AnalyseException extends Exception { +public class ServerStatsException extends Exception { private final int statusCode; private final ErrorType errorType; @@ -14,7 +14,7 @@ public class AnalyseException extends Exception { * @param statusCode The HTTP status code * @param message The error message */ - public AnalyseException(int statusCode, String message) { + public ServerStatsException(int statusCode, String message) { super(message); this.statusCode = statusCode; this.errorType = ErrorType.fromStatusCode(statusCode); @@ -26,7 +26,7 @@ public AnalyseException(int statusCode, String message) { * @param message The error message * @param cause The underlying cause */ - public AnalyseException(String message, Throwable cause) { + public ServerStatsException(String message, Throwable cause) { super(message, cause); this.statusCode = 0; this.errorType = ErrorType.NETWORK_ERROR; diff --git a/api/src/main/java/net/analyse/api/manager/ABTestManager.java b/api/src/main/java/com/serverstats/api/manager/ABTestManager.java similarity index 94% rename from api/src/main/java/net/analyse/api/manager/ABTestManager.java rename to api/src/main/java/com/serverstats/api/manager/ABTestManager.java index 69e8acd..bef9857 100644 --- a/api/src/main/java/net/analyse/api/manager/ABTestManager.java +++ b/api/src/main/java/com/serverstats/api/manager/ABTestManager.java @@ -1,6 +1,6 @@ -package net.analyse.api.manager; +package com.serverstats.api.manager; -import net.analyse.api.object.abtest.ABTest; +import com.serverstats.api.object.abtest.ABTest; import java.util.List; import java.util.UUID; diff --git a/api/src/main/java/net/analyse/api/manager/SessionManager.java b/api/src/main/java/com/serverstats/api/manager/SessionManager.java similarity index 91% rename from api/src/main/java/net/analyse/api/manager/SessionManager.java rename to api/src/main/java/com/serverstats/api/manager/SessionManager.java index dd3ffa4..5aa57ee 100644 --- a/api/src/main/java/net/analyse/api/manager/SessionManager.java +++ b/api/src/main/java/com/serverstats/api/manager/SessionManager.java @@ -1,6 +1,6 @@ -package net.analyse.api.manager; +package com.serverstats.api.manager; -import net.analyse.api.session.PlayerSession; +import com.serverstats.api.session.PlayerSession; import java.util.Collection; import java.util.Optional; import java.util.UUID; diff --git a/api/src/main/java/net/analyse/api/messaging/AnalyseMessageParser.java b/api/src/main/java/com/serverstats/api/messaging/ServerStatsMessageParser.java similarity index 91% rename from api/src/main/java/net/analyse/api/messaging/AnalyseMessageParser.java rename to api/src/main/java/com/serverstats/api/messaging/ServerStatsMessageParser.java index b444201..96b6602 100644 --- a/api/src/main/java/net/analyse/api/messaging/AnalyseMessageParser.java +++ b/api/src/main/java/com/serverstats/api/messaging/ServerStatsMessageParser.java @@ -1,4 +1,4 @@ -package net.analyse.api.messaging; +package com.serverstats.api.messaging; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -11,15 +11,15 @@ import java.util.UUID; /** - * Parser for Analyse plugin messages. + * Parser for ServerStats plugin messages. * Used by proxy plugins to parse incoming messages from backend servers. */ -public final class AnalyseMessageParser { +public final class ServerStatsMessageParser { private static final Gson GSON = new GsonBuilder().create(); private static final Type MAP_TYPE = new TypeToken>() {}.getType(); - private AnalyseMessageParser() { + private ServerStatsMessageParser() { } /** @@ -34,9 +34,9 @@ public static ParsedMessage parse(byte[] data) throws IOException { String type = in.readUTF(); - if (AnalyseMessaging.TYPE_EVENT.equals(type)) { + if (ServerStatsMessaging.TYPE_EVENT.equals(type)) { return parseEventMessage(in); - } else if (AnalyseMessaging.TYPE_CONVERSION.equals(type)) { + } else if (ServerStatsMessaging.TYPE_CONVERSION.equals(type)) { return parseConversionMessage(in); } else { throw new IOException("Unknown message type: " + type); @@ -117,7 +117,7 @@ public String getType() { * @return true if event message */ public boolean isEvent() { - return AnalyseMessaging.TYPE_EVENT.equals(type); + return ServerStatsMessaging.TYPE_EVENT.equals(type); } /** @@ -126,7 +126,7 @@ public boolean isEvent() { * @return true if conversion message */ public boolean isConversion() { - return AnalyseMessaging.TYPE_CONVERSION.equals(type); + return ServerStatsMessaging.TYPE_CONVERSION.equals(type); } } @@ -157,7 +157,7 @@ public EventMessage( Map data, Double value ) { - super(AnalyseMessaging.TYPE_EVENT); + super(ServerStatsMessaging.TYPE_EVENT); this.eventName = eventName; this.playerUuid = playerUuid; this.playerUsername = playerUsername; @@ -210,7 +210,7 @@ public ConversionMessage( String testKey, String conversionEvent ) { - super(AnalyseMessaging.TYPE_CONVERSION); + super(ServerStatsMessaging.TYPE_CONVERSION); this.playerUuid = playerUuid; this.playerUsername = playerUsername; this.testKey = testKey; diff --git a/api/src/main/java/net/analyse/api/messaging/AnalyseMessaging.java b/api/src/main/java/com/serverstats/api/messaging/ServerStatsMessaging.java similarity index 91% rename from api/src/main/java/net/analyse/api/messaging/AnalyseMessaging.java rename to api/src/main/java/com/serverstats/api/messaging/ServerStatsMessaging.java index 8c958be..316bff1 100644 --- a/api/src/main/java/net/analyse/api/messaging/AnalyseMessaging.java +++ b/api/src/main/java/com/serverstats/api/messaging/ServerStatsMessaging.java @@ -1,4 +1,4 @@ -package net.analyse.api.messaging; +package com.serverstats.api.messaging; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -10,13 +10,13 @@ import java.util.UUID; /** - * Utility class for sending Analyse events via plugin messaging. + * Utility class for sending ServerStats events via plugin messaging. * Use this on backend servers to send events through the proxy. * *

Example usage on a Paper backend server:

*
{@code
  * // Send an event through the proxy
- * byte[] message = AnalyseMessaging.createEventMessage(
+ * byte[] message = ServerStatsMessaging.createEventMessage(
  *     "crate_opened",
  *     player.getUniqueId(),
  *     player.getName(),
@@ -24,15 +24,15 @@
  *     100.0
  * );
  *
- * player.sendPluginMessage(plugin, AnalyseMessaging.CHANNEL, message);
+ * player.sendPluginMessage(plugin, ServerStatsMessaging.CHANNEL, message);
  * }
*/ -public final class AnalyseMessaging { +public final class ServerStatsMessaging { /** - * The plugin messaging channel for Analyse events + * The plugin messaging channel for ServerStats events */ - public static final String CHANNEL = "analyse:events"; + public static final String CHANNEL = "serverstats:events"; /** * Message type for custom events @@ -46,7 +46,7 @@ public final class AnalyseMessaging { private static final Gson GSON = new GsonBuilder().create(); - private AnalyseMessaging() { + private ServerStatsMessaging() { } /** diff --git a/api/src/main/java/net/analyse/api/object/abtest/ABTest.java b/api/src/main/java/com/serverstats/api/object/abtest/ABTest.java similarity index 98% rename from api/src/main/java/net/analyse/api/object/abtest/ABTest.java rename to api/src/main/java/com/serverstats/api/object/abtest/ABTest.java index 2739ae8..41438f8 100644 --- a/api/src/main/java/net/analyse/api/object/abtest/ABTest.java +++ b/api/src/main/java/com/serverstats/api/object/abtest/ABTest.java @@ -1,4 +1,4 @@ -package net.analyse.api.object.abtest; +package com.serverstats.api.object.abtest; import java.util.List; import java.util.UUID; diff --git a/api/src/main/java/net/analyse/api/object/abtest/Variant.java b/api/src/main/java/com/serverstats/api/object/abtest/Variant.java similarity index 92% rename from api/src/main/java/net/analyse/api/object/abtest/Variant.java rename to api/src/main/java/com/serverstats/api/object/abtest/Variant.java index 8737f01..e4fcd2f 100644 --- a/api/src/main/java/net/analyse/api/object/abtest/Variant.java +++ b/api/src/main/java/com/serverstats/api/object/abtest/Variant.java @@ -1,4 +1,4 @@ -package net.analyse.api.object.abtest; +package com.serverstats.api.object.abtest; /** * Represents a variant in an A/B test diff --git a/api/src/main/java/net/analyse/api/object/builder/EventBuilder.java b/api/src/main/java/com/serverstats/api/object/builder/EventBuilder.java similarity index 85% rename from api/src/main/java/net/analyse/api/object/builder/EventBuilder.java rename to api/src/main/java/com/serverstats/api/object/builder/EventBuilder.java index 59cd0eb..8ded4ce 100644 --- a/api/src/main/java/net/analyse/api/object/builder/EventBuilder.java +++ b/api/src/main/java/com/serverstats/api/object/builder/EventBuilder.java @@ -1,8 +1,8 @@ -package net.analyse.api.object.builder; +package com.serverstats.api.object.builder; -import net.analyse.api.Analyse; -import net.analyse.api.AnalyseProvider; -import net.analyse.api.platform.AnalysePlatform; +import com.serverstats.api.ServerStats; +import com.serverstats.api.ServerStatsProvider; +import com.serverstats.api.platform.ServerStatsPlatform; import java.util.HashMap; import java.util.Map; import java.util.UUID; @@ -10,11 +10,11 @@ /** * Fluent builder for constructing and sending custom events. - * Use {@link Analyse#trackEvent(String)} to create a new builder. + * Use {@link ServerStats#trackEvent(String)} to create a new builder. * *

Example:

*
{@code
- * Analyse.trackEvent("purchase")
+ * ServerStats.trackEvent("purchase")
  *     .withPlayer(player.getUniqueId(), player.getName())
  *     .withData("item", "diamond_sword")
  *     .withData("price", 100)
@@ -163,15 +163,15 @@ public void send() {
    * @param callback Optional callback to receive success (true) or failure (false)
    */
   public void send(Consumer callback) {
-    AnalysePlatform platform = AnalyseProvider.getPlatform();
+    ServerStatsPlatform platform = ServerStatsProvider.getPlatform();
     if (platform == null) {
-      throw new IllegalStateException("Analyse is not initialized. Make sure the Analyse plugin is enabled.");
+      throw new IllegalStateException("ServerStats is not initialized. Make sure the ServerStats plugin is enabled.");
     }
 
     // Delegate to internal sender - this will be set by the platform implementation
-    EventSender sender = Analyse.getEventSender();
+    EventSender sender = ServerStats.getEventSender();
     if (sender == null) {
-      throw new IllegalStateException("Analyse event sender is not available. Check your configuration.");
+      throw new IllegalStateException("ServerStats event sender is not available. Check your configuration.");
     }
 
     sender.send(this, callback);
diff --git a/api/src/main/java/net/analyse/api/platform/AnalysePlatform.java b/api/src/main/java/com/serverstats/api/platform/ServerStatsPlatform.java
similarity index 78%
rename from api/src/main/java/net/analyse/api/platform/AnalysePlatform.java
rename to api/src/main/java/com/serverstats/api/platform/ServerStatsPlatform.java
index 533072f..1397689 100644
--- a/api/src/main/java/net/analyse/api/platform/AnalysePlatform.java
+++ b/api/src/main/java/com/serverstats/api/platform/ServerStatsPlatform.java
@@ -1,22 +1,22 @@
-package net.analyse.api.platform;
+package com.serverstats.api.platform;
 
-import net.analyse.api.manager.ABTestManager;
-import net.analyse.api.manager.SessionManager;
+import com.serverstats.api.manager.ABTestManager;
+import com.serverstats.api.manager.SessionManager;
 
 /**
  * Interface for platform-specific plugin implementations.
  * Each platform (Paper, BungeeCord, Velocity) implements this to provide
  * access to managers and logging.
  *
- * 

Other plugins should use {@link net.analyse.api.Analyse} for most operations, + *

Other plugins should use {@link com.serverstats.api.ServerStats} for most operations, * but can access this interface for advanced functionality:

*
{@code
- * AnalysePlatform platform = Analyse.get();
+ * ServerStatsPlatform platform = ServerStats.get();
  * SessionManager sessions = platform.getSessionManager();
  * ABTestManager abTests = platform.getABTestManager();
  * }
*/ -public interface AnalysePlatform { +public interface ServerStatsPlatform { /** * Get the session manager for accessing player sessions diff --git a/api/src/main/java/net/analyse/api/session/PlayerSession.java b/api/src/main/java/com/serverstats/api/session/PlayerSession.java similarity index 96% rename from api/src/main/java/net/analyse/api/session/PlayerSession.java rename to api/src/main/java/com/serverstats/api/session/PlayerSession.java index e29b9ab..edb4e2e 100644 --- a/api/src/main/java/net/analyse/api/session/PlayerSession.java +++ b/api/src/main/java/com/serverstats/api/session/PlayerSession.java @@ -1,4 +1,4 @@ -package net.analyse.api.session; +package com.serverstats.api.session; import java.time.Instant; import java.util.UUID; diff --git a/bungeecord/build.gradle b/bungeecord/build.gradle index 72d57b2..91d4091 100644 --- a/bungeecord/build.gradle +++ b/bungeecord/build.gradle @@ -11,7 +11,7 @@ dependencies { } tasks.named('shadowJar', com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) { - archiveBaseName.set('analyse-bungeecord') + archiveBaseName.set('serverstats-bungeecord') archiveClassifier.set('') // BungeeCord already includes Gson, so exclude it dependencies { diff --git a/bungeecord/src/main/java/net/analyse/bungeecord/AnalyseBungee.java b/bungeecord/src/main/java/com/serverstats/bungeecord/ServerStatsBungee.java similarity index 76% rename from bungeecord/src/main/java/net/analyse/bungeecord/AnalyseBungee.java rename to bungeecord/src/main/java/com/serverstats/bungeecord/ServerStatsBungee.java index 93410c1..9e2f7bf 100644 --- a/bungeecord/src/main/java/net/analyse/bungeecord/AnalyseBungee.java +++ b/bungeecord/src/main/java/com/serverstats/bungeecord/ServerStatsBungee.java @@ -1,25 +1,25 @@ -package net.analyse.bungeecord; +package com.serverstats.bungeecord; import co.aikar.commands.BungeeCommandManager; -import net.analyse.api.Analyse; -import net.analyse.api.AnalyseProvider; -import net.analyse.api.BuildConstants; -import net.analyse.api.exception.AnalyseException; -import net.analyse.api.object.builder.EventBuilder; -import net.analyse.api.platform.AnalysePlatform; -import net.analyse.api.messaging.AnalyseMessaging; -import net.analyse.bungeecord.manager.ABTestManager; -import net.analyse.bungeecord.command.AnalyseCommand; -import net.analyse.bungeecord.config.AnalyseBungeeConfig; -import net.analyse.bungeecord.listener.PlayerListener; -import net.analyse.bungeecord.listener.PluginMessageListener; -import net.analyse.bungeecord.manager.SessionManager; -import net.analyse.bungeecord.task.HeartbeatTask; -import net.analyse.bungeecord.update.BungeeUpdateChecker; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.AnalyseClient; -import net.analyse.sdk.request.EventRequest; -import net.analyse.sdk.response.EventResponse; +import com.serverstats.api.ServerStats; +import com.serverstats.api.ServerStatsProvider; +import com.serverstats.api.BuildConstants; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.api.object.builder.EventBuilder; +import com.serverstats.api.platform.ServerStatsPlatform; +import com.serverstats.api.messaging.ServerStatsMessaging; +import com.serverstats.bungeecord.manager.ABTestManager; +import com.serverstats.bungeecord.command.ServerStatsCommand; +import com.serverstats.bungeecord.config.ServerStatsBungeeConfig; +import com.serverstats.bungeecord.listener.PlayerListener; +import com.serverstats.bungeecord.listener.PluginMessageListener; +import com.serverstats.bungeecord.manager.SessionManager; +import com.serverstats.bungeecord.task.HeartbeatTask; +import com.serverstats.bungeecord.update.BungeeUpdateChecker; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.ServerStatsClient; +import com.serverstats.sdk.request.EventRequest; +import com.serverstats.sdk.response.EventResponse; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.scheduler.ScheduledTask; @@ -29,13 +29,13 @@ import java.util.function.Consumer; /** - * Analyse plugin for BungeeCord proxy + * ServerStats plugin for BungeeCord proxy */ -public class AnalyseBungee extends Plugin implements AnalysePlatform { +public class ServerStatsBungee extends Plugin implements ServerStatsPlatform { private static final int HEARTBEAT_INTERVAL_SECONDS = 30; - private AnalyseBungeeConfig pluginConfig; + private ServerStatsBungeeConfig pluginConfig; private SessionManager sessionManager; private ABTestManager abTestManager; private PlayerListener playerListener; @@ -44,7 +44,7 @@ public class AnalyseBungee extends Plugin implements AnalysePlatform { @Override public void onEnable() { - getLogger().info("Initializing Analyse..."); + getLogger().info("Initializing ServerStats..."); // Load configuration if (!loadConfig()) { @@ -59,16 +59,16 @@ public void onEnable() { getProxy().getPluginManager().registerListener(this, playerListener); // Register plugin message channel for backend server communication - getProxy().registerChannel(AnalyseMessaging.CHANNEL); + getProxy().registerChannel(ServerStatsMessaging.CHANNEL); getProxy().getPluginManager().registerListener(this, new PluginMessageListener(this)); - getLogger().info("Registered plugin message channel: " + AnalyseMessaging.CHANNEL); + getLogger().info("Registered plugin message channel: " + ServerStatsMessaging.CHANNEL); // Register with the API provider if a default server is configured if (playerListener.getDefaultClient() != null) { - AnalyseProvider.register(this); + ServerStatsProvider.register(this); - // Set up the event sender for Analyse.trackEvent() - Analyse.setEventSender(this::sendEvent); + // Set up the event sender for ServerStats.trackEvent() + ServerStats.setEventSender(this::sendEvent); // Initialize A/B test manager abTestManager = new ABTestManager(this); @@ -77,7 +77,7 @@ public void onEnable() { // Register commands using ACF BungeeCommandManager commandManager = new BungeeCommandManager(this); - commandManager.registerCommand(new AnalyseCommand(this)); + commandManager.registerCommand(new ServerStatsCommand(this)); // Start heartbeat task (after playerListener is initialized) startHeartbeatTask(); @@ -91,7 +91,7 @@ public void onEnable() { // Initialize sessions for players already online (in case of reload) initializeOnlinePlayers(); - getLogger().info(String.format("Analyse initialized with %d server(s) configured", + getLogger().info(String.format("ServerStats initialized with %d server(s) configured", pluginConfig.getServers().size())); } @@ -102,7 +102,7 @@ public void onEnable() { * @param callback Optional callback for result */ private void sendEvent(EventBuilder event, Consumer callback) { - AnalyseClient client = getClient(); + ServerStatsClient client = getClient(); if (client == null) { if (callback != null) { callback.accept(false); @@ -127,7 +127,7 @@ private void sendEvent(EventBuilder event, Consumer callback) { event.getValue() ); - client.trackEvent(request, new AnalyseCallback<>() { + client.trackEvent(request, new ServerStatsCallback<>() { @Override public void onSuccess(EventResponse response) { if (isDebugEnabled()) { @@ -141,7 +141,7 @@ public void onSuccess(EventResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { logWarning(String.format("Failed to track event '%s': %s", event.getName(), exception.getMessage())); @@ -190,13 +190,13 @@ private void initializeOnlinePlayers() { @Override public void onDisable() { - getLogger().info("Shutting down Analyse..."); + getLogger().info("Shutting down ServerStats..."); // Unregister from the API provider - AnalyseProvider.unregister(); + ServerStatsProvider.unregister(); // Clear the event sender - Analyse.setEventSender(null); + ServerStats.setEventSender(null); // Stop A/B test manager if (abTestManager != null) { @@ -213,7 +213,7 @@ public void onDisable() { playerListener.shutdown(); } - getLogger().info("Analyse shutdown complete"); + getLogger().info("ServerStats shutdown complete"); } /** @@ -223,7 +223,7 @@ public void onDisable() { */ private boolean loadConfig() { try { - pluginConfig = AnalyseBungeeConfig.load(getDataFolder().toPath()); + pluginConfig = ServerStatsBungeeConfig.load(getDataFolder().toPath()); } catch (IOException e) { getLogger().severe(String.format("Failed to load configuration: %s", e.getMessage())); return false; @@ -274,7 +274,7 @@ public void debug(String format, Object... args) { } } - // ========== AnalysePlatform Interface Methods ========== + // ========== ServerStatsPlatform Interface Methods ========== @Override public SessionManager getSessionManager() { @@ -313,16 +313,16 @@ public String getVersion() { * * @return The plugin config */ - public AnalyseBungeeConfig getPluginConfig() { + public ServerStatsBungeeConfig getPluginConfig() { return pluginConfig; } /** * Get the SDK client (from player listener) * - * @return The Analyse client, or null + * @return The ServerStats client, or null */ - public AnalyseClient getClient() { + public ServerStatsClient getClient() { return playerListener != null ? playerListener.getDefaultClient() : null; } diff --git a/bungeecord/src/main/java/net/analyse/bungeecord/command/AnalyseCommand.java b/bungeecord/src/main/java/com/serverstats/bungeecord/command/ServerStatsCommand.java similarity index 80% rename from bungeecord/src/main/java/net/analyse/bungeecord/command/AnalyseCommand.java rename to bungeecord/src/main/java/com/serverstats/bungeecord/command/ServerStatsCommand.java index 548ffe7..15f3d46 100644 --- a/bungeecord/src/main/java/net/analyse/bungeecord/command/AnalyseCommand.java +++ b/bungeecord/src/main/java/com/serverstats/bungeecord/command/ServerStatsCommand.java @@ -1,4 +1,4 @@ -package net.analyse.bungeecord.command; +package com.serverstats.bungeecord.command; import co.aikar.commands.BaseCommand; import co.aikar.commands.annotation.CommandAlias; @@ -8,17 +8,17 @@ import co.aikar.commands.annotation.Description; import co.aikar.commands.annotation.Subcommand; import co.aikar.commands.annotation.Syntax; -import net.analyse.api.Analyse; -import net.analyse.api.BuildConstants; -import net.analyse.api.exception.AnalyseException; -import net.analyse.api.object.builder.EventBuilder; -import net.analyse.bungeecord.AnalyseBungee; -import net.analyse.bungeecord.object.session.PlayerSession; -import net.analyse.bungeecord.util.ComponentUtil; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.request.PlayerInfoRequest; -import net.analyse.sdk.response.PlayerInfoResponse; -import net.analyse.sdk.response.ServerInfoResponse; +import com.serverstats.api.ServerStats; +import com.serverstats.api.BuildConstants; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.api.object.builder.EventBuilder; +import com.serverstats.bungeecord.ServerStatsBungee; +import com.serverstats.bungeecord.object.session.PlayerSession; +import com.serverstats.bungeecord.util.ComponentUtil; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.request.PlayerInfoRequest; +import com.serverstats.sdk.response.PlayerInfoResponse; +import com.serverstats.sdk.response.ServerInfoResponse; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.connection.ProxiedPlayer; import java.time.Duration; @@ -27,14 +27,14 @@ import java.util.Map; /** - * Main command handler for the Analyse plugin using ACF + * Main command handler for the ServerStats plugin using ACF */ -@CommandAlias("analyse|analytics|anl") -public class AnalyseCommand extends BaseCommand { +@CommandAlias("serverstats|analyse|ss") +public class ServerStatsCommand extends BaseCommand { - private final AnalyseBungee plugin; + private final ServerStatsBungee plugin; - public AnalyseCommand(AnalyseBungee plugin) { + public ServerStatsCommand(ServerStatsBungee plugin) { this.plugin = plugin; } @@ -42,7 +42,7 @@ public AnalyseCommand(AnalyseBungee plugin) { @Description("Show plugin info") public void onDefault(CommandSender sender) { // Check if user has admin permission - if (sender.hasPermission("analyse.command.status")) { + if (sender.hasPermission("serverstats.command.status")) { showStatus(sender); } else { showPublicInfo(sender); @@ -51,7 +51,7 @@ public void onDefault(CommandSender sender) { @Subcommand("status") @Description("Show plugin status") - @CommandPermission("analyse.command.status") + @CommandPermission("serverstats.command.status") public void onStatus(CommandSender sender) { showStatus(sender); } @@ -63,11 +63,11 @@ public void onStatus(CommandSender sender) { */ private void showPublicInfo(CommandSender sender) { StringBuilder message = new StringBuilder(); - message.append("#3498db&l「 Analyse 」&r\n"); - message.append(" #5dade2┃ &7This server uses &fAnalyse &7to track\n"); + message.append("#3498db&l「 ServerStats 」&r\n"); + message.append(" #5dade2┃ &7This server uses &fServerStats &7to track\n"); message.append(" #5dade2┃ &7player analytics and sessions.&r\n"); message.append("&r\n"); - message.append(" &7→ &fanalyse.net&r\n"); + message.append(" &7→ &fserverstats.com&r\n"); send(sender, message.toString()); } @@ -77,15 +77,15 @@ private void showPublicInfo(CommandSender sender) { * @param sender The command sender */ private void showStatus(CommandSender sender) { - boolean connected = Analyse.isAvailable(); + boolean connected = ServerStats.isAvailable(); int trackedPlayers = plugin.getSessionManager().getSessionCount(); boolean debugEnabled = plugin.isDebugEnabled(); int configuredServers = plugin.getPluginConfig().getServers().size(); StringBuilder message = new StringBuilder(); - message.append("#3498db&l「 Analyse &r&fv").append(BuildConstants.VERSION).append(" #3498db&l」&r\n"); + message.append("#3498db&l「 ServerStats &r&fv").append(BuildConstants.VERSION).append(" #3498db&l」&r\n"); message.append(" #5dade2┃ &fStatus: ").append(connected ? "&a● Connected" : "&c● Disconnected").append("&r\n"); - message.append(" #5dade2┃ &fAPI: &7api.analyse.net&r\n"); + message.append(" #5dade2┃ &fAPI: &7api.serverstats.com&r\n"); message.append(" #5dade2┃ &fServers Configured: &7").append(configuredServers).append("&r\n"); message.append(" #5dade2┃ &fPlayers Tracked: &7").append(trackedPlayers).append("&r\n"); message.append(" #5dade2┃ &fDebug: ").append(debugEnabled ? "&aEnabled" : "&7Disabled").append("&r\n"); @@ -94,7 +94,7 @@ private void showStatus(CommandSender sender) { @Subcommand("debug") @Description("Toggle debug mode") - @CommandPermission("analyse.command.debug") + @CommandPermission("serverstats.command.debug") public void onDebug(CommandSender sender) { boolean newState = !plugin.getPluginConfig().isDebug(); plugin.getPluginConfig().setDebug(newState); @@ -108,17 +108,17 @@ public void onDebug(CommandSender sender) { @Subcommand("event") @Description("Send a custom event") - @CommandPermission("analyse.command.event") + @CommandPermission("serverstats.command.event") @Syntax(" [--player ] [--value ] [--data ...]") @CommandCompletion("test_event|custom_event @players") public void onEvent(CommandSender sender, String[] args) { if (args.length == 0) { - send(sender, "&cUsage: /analyse event [--player ] [--value ] [--data key=value...]"); + send(sender, "&cUsage: /serverstats event [--player ] [--value ] [--data key=value...]"); return; } - if (!Analyse.isAvailable()) { - send(sender, "&cAnalyse is not connected. Make sure a default server is configured."); + if (!ServerStats.isAvailable()) { + send(sender, "&cServerStats is not connected. Make sure a default server is configured."); return; } @@ -156,7 +156,7 @@ public void onEvent(CommandSender sender, String[] args) { } // Build the event - EventBuilder builder = Analyse.trackEvent(eventName); + EventBuilder builder = ServerStats.trackEvent(eventName); // Add player if specified if (playerName != null) { @@ -204,12 +204,12 @@ public void onEvent(CommandSender sender, String[] args) { @Subcommand("info") @Description("View server or player analytics") - @CommandPermission("analyse.command.info") + @CommandPermission("serverstats.command.info") @Syntax("[player]") @CommandCompletion("@players") public void onInfo(CommandSender sender, String[] args) { - if (!Analyse.isAvailable()) { - send(sender, "&cAnalyse is not connected. Make sure a default server is configured."); + if (!ServerStats.isAvailable()) { + send(sender, "&cServerStats is not connected. Make sure a default server is configured."); return; } @@ -232,7 +232,7 @@ private void showServerInfo(CommandSender sender) { int onlinePlayers = plugin.getProxy().getOnlineCount(); // Fetch additional data from API - plugin.getClient().getServerInfo(new AnalyseCallback<>() { + plugin.getClient().getServerInfo(new ServerStatsCallback<>() { @Override public void onSuccess(ServerInfoResponse response) { plugin.getProxy().getScheduler().runAsync(plugin, () -> { @@ -254,7 +254,7 @@ public void onSuccess(ServerInfoResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { plugin.getProxy().getScheduler().runAsync(plugin, () -> { StringBuilder message = new StringBuilder(); message.append("#3498db&l「 Server Analytics 」&r\n"); @@ -283,7 +283,7 @@ private void showPlayerInfo(CommandSender sender, String playerName) { PlayerSession session = plugin.getSessionManager().getSession(player.getUniqueId()).orElse(null); // Fetch additional data from API - plugin.getClient().getPlayerInfo(new PlayerInfoRequest(player.getUniqueId()), new AnalyseCallback<>() { + plugin.getClient().getPlayerInfo(new PlayerInfoRequest(player.getUniqueId()), new ServerStatsCallback<>() { @Override public void onSuccess(PlayerInfoResponse response) { plugin.getProxy().getScheduler().runAsync(plugin, () -> { @@ -292,7 +292,7 @@ public void onSuccess(PlayerInfoResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { plugin.getProxy().getScheduler().runAsync(plugin, () -> { send(sender, buildPlayerInfoMessage(player.getName(), session, null)); }); @@ -380,17 +380,17 @@ private String formatDuration(Duration duration) { @Subcommand("help") @Description("Show help information") - @CommandPermission("analyse.command.help") + @CommandPermission("serverstats.command.help") public void onHelp(CommandSender sender) { StringBuilder message = new StringBuilder(); - message.append("#3498db&l「 Analyse Commands 」&r\n"); - message.append(" #5dade2┃ &f/analyse &7- Show plugin info&r\n"); - message.append(" #5dade2┃ &f/analyse status &7- Show plugin status&r\n"); - message.append(" #5dade2┃ &f/analyse info &7- View server analytics&r\n"); - message.append(" #5dade2┃ &f/analyse info &7- View player analytics&r\n"); - message.append(" #5dade2┃ &f/analyse debug &7- Toggle debug mode&r\n"); - message.append(" #5dade2┃ &f/analyse event &7- Send custom event&r\n"); - message.append(" #5dade2┃ &f/analyse help &7- Show this help&r\n"); + message.append("#3498db&l「 ServerStats Commands 」&r\n"); + message.append(" #5dade2┃ &f/serverstats &7- Show plugin info&r\n"); + message.append(" #5dade2┃ &f/serverstats status &7- Show plugin status&r\n"); + message.append(" #5dade2┃ &f/serverstats info &7- View server analytics&r\n"); + message.append(" #5dade2┃ &f/serverstats info &7- View player analytics&r\n"); + message.append(" #5dade2┃ &f/serverstats debug &7- Toggle debug mode&r\n"); + message.append(" #5dade2┃ &f/serverstats event &7- Send custom event&r\n"); + message.append(" #5dade2┃ &f/serverstats help &7- Show this help&r\n"); send(sender, message.toString()); } diff --git a/bungeecord/src/main/java/net/analyse/bungeecord/config/AnalyseBungeeConfig.java b/bungeecord/src/main/java/com/serverstats/bungeecord/config/ServerStatsBungeeConfig.java similarity index 88% rename from bungeecord/src/main/java/net/analyse/bungeecord/config/AnalyseBungeeConfig.java rename to bungeecord/src/main/java/com/serverstats/bungeecord/config/ServerStatsBungeeConfig.java index 5755f64..2d385d7 100644 --- a/bungeecord/src/main/java/net/analyse/bungeecord/config/AnalyseBungeeConfig.java +++ b/bungeecord/src/main/java/com/serverstats/bungeecord/config/ServerStatsBungeeConfig.java @@ -1,4 +1,4 @@ -package net.analyse.bungeecord.config; +package com.serverstats.bungeecord.config; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -17,7 +17,7 @@ * Configuration for the BungeeCord plugin */ @Getter -public class AnalyseBungeeConfig { +public class ServerStatsBungeeConfig { private static final String CONFIG_FILE = "config.json"; @@ -50,7 +50,7 @@ public ServerConfig(String apiKey) { * @return The loaded configuration * @throws IOException If the config cannot be read or written */ - public static AnalyseBungeeConfig load(Path dataDirectory) throws IOException { + public static ServerStatsBungeeConfig load(Path dataDirectory) throws IOException { Gson gson = new GsonBuilder().setPrettyPrinting().create(); Path configPath = dataDirectory.resolve(CONFIG_FILE); @@ -61,7 +61,7 @@ public static AnalyseBungeeConfig load(Path dataDirectory) throws IOException { // Create default config if it doesn't exist if (!Files.exists(configPath)) { - AnalyseBungeeConfig defaultConfig = createDefault(); + ServerStatsBungeeConfig defaultConfig = createDefault(); try (Writer writer = Files.newBufferedWriter(configPath, StandardCharsets.UTF_8)) { gson.toJson(defaultConfig, writer); } @@ -71,7 +71,7 @@ public static AnalyseBungeeConfig load(Path dataDirectory) throws IOException { // Load existing config try (Reader reader = Files.newBufferedReader(configPath, StandardCharsets.UTF_8)) { - return gson.fromJson(reader, AnalyseBungeeConfig.class); + return gson.fromJson(reader, ServerStatsBungeeConfig.class); } } @@ -80,8 +80,8 @@ public static AnalyseBungeeConfig load(Path dataDirectory) throws IOException { * * @return The default configuration */ - private static AnalyseBungeeConfig createDefault() { - AnalyseBungeeConfig config = new AnalyseBungeeConfig(); + private static ServerStatsBungeeConfig createDefault() { + ServerStatsBungeeConfig config = new ServerStatsBungeeConfig(); config.debug = false; config.bedrockPrefix = "."; config.instanceId = "default"; diff --git a/bungeecord/src/main/java/net/analyse/bungeecord/listener/PlayerListener.java b/bungeecord/src/main/java/com/serverstats/bungeecord/listener/PlayerListener.java similarity index 81% rename from bungeecord/src/main/java/net/analyse/bungeecord/listener/PlayerListener.java rename to bungeecord/src/main/java/com/serverstats/bungeecord/listener/PlayerListener.java index 0695c99..caf3595 100644 --- a/bungeecord/src/main/java/net/analyse/bungeecord/listener/PlayerListener.java +++ b/bungeecord/src/main/java/com/serverstats/bungeecord/listener/PlayerListener.java @@ -1,16 +1,16 @@ -package net.analyse.bungeecord.listener; - -import net.analyse.bungeecord.AnalyseBungee; -import net.analyse.bungeecord.manager.SessionManager; -import net.analyse.bungeecord.object.session.PlayerSession; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.AnalyseClient; -import net.analyse.api.exception.AnalyseException; -import net.analyse.sdk.config.AnalyseConfig; -import net.analyse.sdk.request.JoinRequest; -import net.analyse.sdk.request.LeaveRequest; -import net.analyse.sdk.response.JoinResponse; -import net.analyse.sdk.response.LeaveResponse; +package com.serverstats.bungeecord.listener; + +import com.serverstats.bungeecord.ServerStatsBungee; +import com.serverstats.bungeecord.manager.SessionManager; +import com.serverstats.bungeecord.object.session.PlayerSession; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.ServerStatsClient; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.sdk.config.ServerStatsConfig; +import com.serverstats.sdk.request.JoinRequest; +import com.serverstats.sdk.request.LeaveRequest; +import com.serverstats.sdk.response.JoinResponse; +import com.serverstats.sdk.response.LeaveResponse; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.event.PlayerDisconnectEvent; import net.md_5.bungee.api.event.PostLoginEvent; @@ -29,12 +29,12 @@ */ public class PlayerListener implements Listener { - private final AnalyseBungee plugin; + private final ServerStatsBungee plugin; private final Logger logger; private final SessionManager sessionManager; - private final Map serverClients = new HashMap<>(); + private final Map serverClients = new HashMap<>(); - public PlayerListener(AnalyseBungee plugin) { + public PlayerListener(ServerStatsBungee plugin) { this.plugin = plugin; this.logger = plugin.getLogger(); this.sessionManager = plugin.getSessionManager(); @@ -50,8 +50,8 @@ private void initializeClients() { plugin.getPluginConfig().getServers().forEach((serverName, serverConfig) -> { String apiKey = serverConfig.getApiKey(); if (apiKey != null && !apiKey.isBlank() && !apiKey.startsWith("anl_your_")) { - AnalyseConfig config = new AnalyseConfig(apiKey); - serverClients.put(serverName, new AnalyseClient(config)); + ServerStatsConfig config = new ServerStatsConfig(apiKey); + serverClients.put(serverName, new ServerStatsClient(config)); logger.info(String.format("Initialized analytics client for server: %s", serverName)); } }); @@ -63,7 +63,7 @@ private void initializeClients() { * @param serverName The server name * @return The client, or empty if not configured */ - public Optional getClientForServer(String serverName) { + public Optional getClientForServer(String serverName) { return Optional.ofNullable(serverClients.get(serverName)); } @@ -72,7 +72,7 @@ public Optional getClientForServer(String serverName) { * * @return The default client, or null if not configured */ - public AnalyseClient getDefaultClient() { + public ServerStatsClient getDefaultClient() { String defaultServer = plugin.getPluginConfig().getDefaultServer(); if (defaultServer == null || defaultServer.isBlank()) { return null; @@ -148,20 +148,20 @@ public void onPlayerDisconnect(PlayerDisconnectEvent event) { * Send a join event to the API */ private void sendJoinEvent(UUID uuid, String username, PlayerSession session, String serverName) { - Optional clientOpt = getClientForServer(serverName); + Optional clientOpt = getClientForServer(serverName); if (clientOpt.isEmpty()) { plugin.debug("Server %s not configured, skipping join event for %s", serverName, username); return; } - AnalyseClient client = clientOpt.get(); + ServerStatsClient client = clientOpt.get(); // Check if player is a Bedrock player boolean isBedrock = plugin.getPluginConfig().isBedrock(username); JoinRequest request = new JoinRequest(uuid, username, session.getHostname(), session.getIp(), isBedrock); - client.join(request, new AnalyseCallback<>() { + client.join(request, new ServerStatsCallback<>() { @Override public void onSuccess(JoinResponse response) { session.setCurrentSession(serverName, response.getSessionId()); @@ -170,7 +170,7 @@ public void onSuccess(JoinResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { logger.warning(String.format("Failed to send join event for %s on %s: %s", username, serverName, exception.getMessage())); } @@ -185,15 +185,15 @@ private void sendLeaveEvent(UUID uuid, String username, PlayerSession session, S return; } - Optional clientOpt = getClientForServer(serverName); + Optional clientOpt = getClientForServer(serverName); if (clientOpt.isEmpty()) { return; } - AnalyseClient client = clientOpt.get(); + ServerStatsClient client = clientOpt.get(); LeaveRequest request = new LeaveRequest(session.getSessionId()); - client.leave(request, new AnalyseCallback<>() { + client.leave(request, new ServerStatsCallback<>() { @Override public void onSuccess(LeaveResponse response) { plugin.debug("Leave event sent for %s on %s (duration: %ds)", @@ -201,7 +201,7 @@ public void onSuccess(LeaveResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { logger.warning(String.format("Failed to send leave event for %s on %s: %s", username, serverName, exception.getMessage())); } @@ -266,7 +266,7 @@ public void reinitialize() { * Shutdown all API clients */ public void shutdown() { - serverClients.values().forEach(AnalyseClient::shutdown); + serverClients.values().forEach(ServerStatsClient::shutdown); serverClients.clear(); } } diff --git a/bungeecord/src/main/java/net/analyse/bungeecord/listener/PluginMessageListener.java b/bungeecord/src/main/java/com/serverstats/bungeecord/listener/PluginMessageListener.java similarity index 78% rename from bungeecord/src/main/java/net/analyse/bungeecord/listener/PluginMessageListener.java rename to bungeecord/src/main/java/com/serverstats/bungeecord/listener/PluginMessageListener.java index 40384a3..31c0993 100644 --- a/bungeecord/src/main/java/net/analyse/bungeecord/listener/PluginMessageListener.java +++ b/bungeecord/src/main/java/com/serverstats/bungeecord/listener/PluginMessageListener.java @@ -1,12 +1,12 @@ -package net.analyse.bungeecord.listener; - -import net.analyse.api.Analyse; -import net.analyse.api.messaging.AnalyseMessageParser; -import net.analyse.api.messaging.AnalyseMessageParser.ConversionMessage; -import net.analyse.api.messaging.AnalyseMessageParser.EventMessage; -import net.analyse.api.messaging.AnalyseMessageParser.ParsedMessage; -import net.analyse.api.messaging.AnalyseMessaging; -import net.analyse.bungeecord.AnalyseBungee; +package com.serverstats.bungeecord.listener; + +import com.serverstats.api.ServerStats; +import com.serverstats.api.messaging.ServerStatsMessageParser; +import com.serverstats.api.messaging.ServerStatsMessageParser.ConversionMessage; +import com.serverstats.api.messaging.ServerStatsMessageParser.EventMessage; +import com.serverstats.api.messaging.ServerStatsMessageParser.ParsedMessage; +import com.serverstats.api.messaging.ServerStatsMessaging; +import com.serverstats.bungeecord.ServerStatsBungee; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.event.PluginMessageEvent; @@ -20,14 +20,14 @@ */ public class PluginMessageListener implements Listener { - private final AnalyseBungee plugin; + private final ServerStatsBungee plugin; /** * Create a new plugin message listener * * @param plugin The plugin instance */ - public PluginMessageListener(AnalyseBungee plugin) { + public PluginMessageListener(ServerStatsBungee plugin) { this.plugin = plugin; } @@ -39,7 +39,7 @@ public void onPluginMessage(PluginMessageEvent event) { } // Only handle our channel - if (!event.getTag().equals(AnalyseMessaging.CHANNEL)) { + if (!event.getTag().equals(ServerStatsMessaging.CHANNEL)) { return; } @@ -53,7 +53,7 @@ public void onPluginMessage(PluginMessageEvent event) { plugin.debug("Received plugin message from %s on server %s", player.getName(), serverName); try { - ParsedMessage message = AnalyseMessageParser.parse(event.getData()); + ParsedMessage message = ServerStatsMessageParser.parse(event.getData()); handleMessage(message, player, serverName); } catch (IOException e) { plugin.getLogger().warning(String.format("Failed to parse plugin message from %s: %s", @@ -83,8 +83,8 @@ private void handleMessage(ParsedMessage message, ProxiedPlayer player, String s * @param serverName The source server */ private void handleEventMessage(EventMessage message, String serverName) { - if (!Analyse.isAvailable()) { - plugin.getLogger().warning("Received event message but Analyse is not available"); + if (!ServerStats.isAvailable()) { + plugin.getLogger().warning("Received event message but ServerStats is not available"); return; } @@ -92,7 +92,7 @@ private void handleEventMessage(EventMessage message, String serverName) { message.getEventName(), message.getPlayerUsername(), serverName); // Build and send the event - var builder = Analyse.trackEvent(message.getEventName()) + var builder = ServerStats.trackEvent(message.getEventName()) .withPlayer(message.getPlayerUuid(), message.getPlayerUsername()); if (message.getData() != null) { @@ -124,8 +124,8 @@ private void handleEventMessage(EventMessage message, String serverName) { * @param serverName The source server */ private void handleConversionMessage(ConversionMessage message, String serverName) { - if (!Analyse.isAvailable()) { - plugin.getLogger().warning("Received conversion message but Analyse is not available"); + if (!ServerStats.isAvailable()) { + plugin.getLogger().warning("Received conversion message but ServerStats is not available"); return; } @@ -133,7 +133,7 @@ private void handleConversionMessage(ConversionMessage message, String serverNam message.getTestKey(), message.getConversionEvent(), message.getPlayerUsername(), serverName); - Analyse.trackConversion( + ServerStats.trackConversion( message.getPlayerUuid(), message.getPlayerUsername(), message.getTestKey(), diff --git a/bungeecord/src/main/java/net/analyse/bungeecord/manager/ABTestManager.java b/bungeecord/src/main/java/com/serverstats/bungeecord/manager/ABTestManager.java similarity index 67% rename from bungeecord/src/main/java/net/analyse/bungeecord/manager/ABTestManager.java rename to bungeecord/src/main/java/com/serverstats/bungeecord/manager/ABTestManager.java index ce8db45..ab7a247 100644 --- a/bungeecord/src/main/java/net/analyse/bungeecord/manager/ABTestManager.java +++ b/bungeecord/src/main/java/com/serverstats/bungeecord/manager/ABTestManager.java @@ -1,16 +1,16 @@ -package net.analyse.bungeecord.manager; - -import net.analyse.api.exception.AnalyseException; -import net.analyse.api.object.abtest.ABTest; -import net.analyse.bungeecord.AnalyseBungee; -import net.analyse.bungeecord.object.action.BungeeAction; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.AnalyseClient; -import net.analyse.sdk.object.abtest.Variant; -import net.analyse.sdk.object.action.ActionData; -import net.analyse.sdk.request.ConversionRequest; -import net.analyse.sdk.response.ABTestsResponse; -import net.analyse.sdk.response.ConversionResponse; +package com.serverstats.bungeecord.manager; + +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.api.object.abtest.ABTest; +import com.serverstats.bungeecord.ServerStatsBungee; +import com.serverstats.bungeecord.object.action.BungeeAction; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.ServerStatsClient; +import com.serverstats.sdk.object.abtest.Variant; +import com.serverstats.sdk.object.action.ActionData; +import com.serverstats.sdk.request.ConversionRequest; +import com.serverstats.sdk.response.ABTestsResponse; +import com.serverstats.sdk.response.ConversionResponse; import net.md_5.bungee.api.connection.ProxiedPlayer; import java.util.List; import java.util.Map; @@ -22,14 +22,14 @@ * Manages A/B tests for the BungeeCord plugin. * Supports SEND_MESSAGE and RUN_COMMAND actions on proxies. */ -public class ABTestManager implements net.analyse.api.manager.ABTestManager { +public class ABTestManager implements com.serverstats.api.manager.ABTestManager { private static final long SYNC_INTERVAL_MINUTES = 5; - private final AnalyseBungee plugin; - private final Map testsCache = new ConcurrentHashMap<>(); + private final ServerStatsBungee plugin; + private final Map testsCache = new ConcurrentHashMap<>(); - public ABTestManager(AnalyseBungee plugin) { + public ABTestManager(ServerStatsBungee plugin) { this.plugin = plugin; } @@ -63,17 +63,17 @@ public void stop() { * Sync tests from the API */ private void syncTests() { - AnalyseClient client = plugin.getClient(); + ServerStatsClient client = plugin.getClient(); if (client == null) { return; } - client.getABTests(new AnalyseCallback<>() { + client.getABTests(new ServerStatsCallback<>() { @Override public void onSuccess(ABTestsResponse response) { if (response.isSuccess() && response.getTests() != null) { testsCache.clear(); - for (net.analyse.sdk.object.abtest.ABTest test : response.getTests()) { + for (com.serverstats.sdk.object.abtest.ABTest test : response.getTests()) { if (test.isActive()) { testsCache.put(test.getKey(), test); } @@ -86,7 +86,7 @@ public void onSuccess(ABTestsResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { plugin.logWarning(String.format("Failed to sync A/B tests: %s", exception.getMessage())); } }); @@ -94,7 +94,7 @@ public void onError(AnalyseException exception) { @Override @SuppressWarnings("unchecked") - public List getActiveTests() { + public List getActiveTests() { return List.copyOf(testsCache.values()); } @@ -105,12 +105,12 @@ public ABTest getTest(String testKey) { @Override public String getVariant(UUID playerUuid, String testKey) { - net.analyse.sdk.object.abtest.ABTest test = testsCache.get(testKey); + com.serverstats.sdk.object.abtest.ABTest test = testsCache.get(testKey); if (test == null) { return null; } - net.analyse.api.object.abtest.Variant variant = test.assignVariant(playerUuid); + com.serverstats.api.object.abtest.Variant variant = test.assignVariant(playerUuid); return variant != null ? variant.getKey() : null; } @@ -129,7 +129,7 @@ public boolean isTestActive(String testKey) { public void processJoin(ProxiedPlayer player, boolean firstJoin) { ABTest.Trigger trigger = firstJoin ? ABTest.Trigger.FIRST_JOIN : ABTest.Trigger.EVERY_JOIN; - for (net.analyse.sdk.object.abtest.ABTest test : testsCache.values()) { + for (com.serverstats.sdk.object.abtest.ABTest test : testsCache.values()) { if (!test.matchesTrigger(trigger)) { continue; } @@ -137,7 +137,7 @@ public void processJoin(ProxiedPlayer player, boolean firstJoin) { // Assign variant and execute actions var variant = test.assignVariant(player.getUniqueId()); if (variant != null && variant.hasActions()) { - executeActions(player, test, (net.analyse.sdk.object.abtest.Variant) variant); + executeActions(player, test, (com.serverstats.sdk.object.abtest.Variant) variant); } } } @@ -149,7 +149,7 @@ public void processJoin(ProxiedPlayer player, boolean firstJoin) { * @param eventName The event name */ public void processEvent(ProxiedPlayer player, String eventName) { - for (net.analyse.sdk.object.abtest.ABTest test : testsCache.values()) { + for (com.serverstats.sdk.object.abtest.ABTest test : testsCache.values()) { if (!test.matchesEvent(eventName)) { continue; } @@ -157,7 +157,7 @@ public void processEvent(ProxiedPlayer player, String eventName) { // Assign variant and execute actions var variant = test.assignVariant(player.getUniqueId()); if (variant != null && variant.hasActions()) { - executeActions(player, test, (net.analyse.sdk.object.abtest.Variant) variant); + executeActions(player, test, (com.serverstats.sdk.object.abtest.Variant) variant); } } } @@ -169,8 +169,8 @@ public void processEvent(ProxiedPlayer player, String eventName) { * @param test The A/B test * @param variant The assigned variant */ - private void executeActions(ProxiedPlayer player, net.analyse.sdk.object.abtest.ABTest test, - net.analyse.sdk.object.abtest.Variant variant) { + private void executeActions(ProxiedPlayer player, com.serverstats.sdk.object.abtest.ABTest test, + com.serverstats.sdk.object.abtest.Variant variant) { if (plugin.isDebugEnabled()) { plugin.logInfo(String.format("[DEBUG] Player %s assigned to variant '%s' for test '%s'", player.getName(), variant.getKey(), test.getKey())); @@ -186,12 +186,12 @@ private void executeActions(ProxiedPlayer player, net.analyse.sdk.object.abtest. @Override public void trackConversion(UUID playerUuid, String playerUsername, String testKey, String eventName) { - net.analyse.sdk.object.abtest.ABTest test = testsCache.get(testKey); + com.serverstats.sdk.object.abtest.ABTest test = testsCache.get(testKey); if (test == null) { return; } - AnalyseClient client = plugin.getClient(); + ServerStatsClient client = plugin.getClient(); if (client == null) { return; } @@ -203,7 +203,7 @@ public void trackConversion(UUID playerUuid, String playerUsername, String testK testKey, variantKey, playerUuid, playerUsername, eventName, null ); - client.trackConversion(request, new AnalyseCallback<>() { + client.trackConversion(request, new ServerStatsCallback<>() { @Override public void onSuccess(ConversionResponse response) { if (plugin.isDebugEnabled()) { @@ -213,7 +213,7 @@ public void onSuccess(ConversionResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { plugin.logWarning(String.format("Failed to track conversion: %s", exception.getMessage())); } }); diff --git a/bungeecord/src/main/java/net/analyse/bungeecord/manager/SessionManager.java b/bungeecord/src/main/java/com/serverstats/bungeecord/manager/SessionManager.java similarity index 87% rename from bungeecord/src/main/java/net/analyse/bungeecord/manager/SessionManager.java rename to bungeecord/src/main/java/com/serverstats/bungeecord/manager/SessionManager.java index 2308f05..0528200 100644 --- a/bungeecord/src/main/java/net/analyse/bungeecord/manager/SessionManager.java +++ b/bungeecord/src/main/java/com/serverstats/bungeecord/manager/SessionManager.java @@ -1,6 +1,6 @@ -package net.analyse.bungeecord.manager; +package com.serverstats.bungeecord.manager; -import net.analyse.bungeecord.object.session.PlayerSession; +import com.serverstats.bungeecord.object.session.PlayerSession; import java.util.Collection; import java.util.Map; import java.util.Optional; @@ -10,7 +10,7 @@ /** * Thread-safe manager for player sessions */ -public class SessionManager implements net.analyse.api.manager.SessionManager { +public class SessionManager implements com.serverstats.api.manager.SessionManager { private final Map sessions = new ConcurrentHashMap<>(); diff --git a/bungeecord/src/main/java/net/analyse/bungeecord/object/action/BungeeAction.java b/bungeecord/src/main/java/com/serverstats/bungeecord/object/action/BungeeAction.java similarity index 79% rename from bungeecord/src/main/java/net/analyse/bungeecord/object/action/BungeeAction.java rename to bungeecord/src/main/java/com/serverstats/bungeecord/object/action/BungeeAction.java index ebe1d6c..6273a58 100644 --- a/bungeecord/src/main/java/net/analyse/bungeecord/object/action/BungeeAction.java +++ b/bungeecord/src/main/java/com/serverstats/bungeecord/object/action/BungeeAction.java @@ -1,8 +1,8 @@ -package net.analyse.bungeecord.object.action; +package com.serverstats.bungeecord.object.action; -import net.analyse.bungeecord.AnalyseBungee; -import net.analyse.sdk.object.action.Action; -import net.analyse.sdk.object.action.ActionData; +import com.serverstats.bungeecord.ServerStatsBungee; +import com.serverstats.sdk.object.action.Action; +import com.serverstats.sdk.object.action.ActionData; import net.md_5.bungee.api.connection.ProxiedPlayer; /** @@ -11,10 +11,10 @@ */ public abstract class BungeeAction implements Action { - protected final AnalyseBungee plugin; + protected final ServerStatsBungee plugin; protected final ActionData data; - protected BungeeAction(AnalyseBungee plugin, ActionData data) { + protected BungeeAction(ServerStatsBungee plugin, ActionData data) { this.plugin = plugin; this.data = data; } @@ -26,7 +26,7 @@ protected BungeeAction(AnalyseBungee plugin, ActionData data) { * @param data The action data from the API * @return The appropriate BungeeAction, or null if type is unsupported */ - public static BungeeAction create(AnalyseBungee plugin, ActionData data) { + public static BungeeAction create(ServerStatsBungee plugin, ActionData data) { if (data == null || data.getType() == null) { return null; } diff --git a/bungeecord/src/main/java/net/analyse/bungeecord/object/action/RunCommandAction.java b/bungeecord/src/main/java/com/serverstats/bungeecord/object/action/RunCommandAction.java similarity index 80% rename from bungeecord/src/main/java/net/analyse/bungeecord/object/action/RunCommandAction.java rename to bungeecord/src/main/java/com/serverstats/bungeecord/object/action/RunCommandAction.java index 2cc06f8..5ca85e4 100644 --- a/bungeecord/src/main/java/net/analyse/bungeecord/object/action/RunCommandAction.java +++ b/bungeecord/src/main/java/com/serverstats/bungeecord/object/action/RunCommandAction.java @@ -1,8 +1,8 @@ -package net.analyse.bungeecord.object.action; +package com.serverstats.bungeecord.object.action; -import net.analyse.bungeecord.AnalyseBungee; -import net.analyse.sdk.object.action.ActionData; -import net.analyse.sdk.object.action.ActionType; +import com.serverstats.bungeecord.ServerStatsBungee; +import com.serverstats.sdk.object.action.ActionData; +import com.serverstats.sdk.object.action.ActionType; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.connection.ProxiedPlayer; @@ -12,7 +12,7 @@ */ public class RunCommandAction extends BungeeAction { - public RunCommandAction(AnalyseBungee plugin, ActionData data) { + public RunCommandAction(ServerStatsBungee plugin, ActionData data) { super(plugin, data); } diff --git a/bungeecord/src/main/java/net/analyse/bungeecord/object/action/SendMessageAction.java b/bungeecord/src/main/java/com/serverstats/bungeecord/object/action/SendMessageAction.java similarity index 69% rename from bungeecord/src/main/java/net/analyse/bungeecord/object/action/SendMessageAction.java rename to bungeecord/src/main/java/com/serverstats/bungeecord/object/action/SendMessageAction.java index adae3a5..8366262 100644 --- a/bungeecord/src/main/java/net/analyse/bungeecord/object/action/SendMessageAction.java +++ b/bungeecord/src/main/java/com/serverstats/bungeecord/object/action/SendMessageAction.java @@ -1,9 +1,9 @@ -package net.analyse.bungeecord.object.action; +package com.serverstats.bungeecord.object.action; -import net.analyse.bungeecord.AnalyseBungee; -import net.analyse.bungeecord.util.ComponentUtil; -import net.analyse.sdk.object.action.ActionData; -import net.analyse.sdk.object.action.ActionType; +import com.serverstats.bungeecord.ServerStatsBungee; +import com.serverstats.bungeecord.util.ComponentUtil; +import com.serverstats.sdk.object.action.ActionData; +import com.serverstats.sdk.object.action.ActionType; import net.md_5.bungee.api.connection.ProxiedPlayer; /** @@ -12,7 +12,7 @@ */ public class SendMessageAction extends BungeeAction { - public SendMessageAction(AnalyseBungee plugin, ActionData data) { + public SendMessageAction(ServerStatsBungee plugin, ActionData data) { super(plugin, data); } diff --git a/velocity/src/main/java/net/analyse/velocity/object/session/PlayerSession.java b/bungeecord/src/main/java/com/serverstats/bungeecord/object/session/PlayerSession.java similarity index 90% rename from velocity/src/main/java/net/analyse/velocity/object/session/PlayerSession.java rename to bungeecord/src/main/java/com/serverstats/bungeecord/object/session/PlayerSession.java index fbdb5b2..1dac70c 100644 --- a/velocity/src/main/java/net/analyse/velocity/object/session/PlayerSession.java +++ b/bungeecord/src/main/java/com/serverstats/bungeecord/object/session/PlayerSession.java @@ -1,4 +1,4 @@ -package net.analyse.velocity.object.session; +package com.serverstats.bungeecord.object.session; import lombok.Getter; import java.time.Instant; @@ -8,7 +8,7 @@ * Stores session data for a connected player */ @Getter -public class PlayerSession implements net.analyse.api.session.PlayerSession { +public class PlayerSession implements com.serverstats.api.session.PlayerSession { private final UUID playerUuid; private final String hostname; diff --git a/bungeecord/src/main/java/net/analyse/bungeecord/task/HeartbeatTask.java b/bungeecord/src/main/java/com/serverstats/bungeecord/task/HeartbeatTask.java similarity index 70% rename from bungeecord/src/main/java/net/analyse/bungeecord/task/HeartbeatTask.java rename to bungeecord/src/main/java/com/serverstats/bungeecord/task/HeartbeatTask.java index 754a09d..5036666 100644 --- a/bungeecord/src/main/java/net/analyse/bungeecord/task/HeartbeatTask.java +++ b/bungeecord/src/main/java/com/serverstats/bungeecord/task/HeartbeatTask.java @@ -1,15 +1,15 @@ -package net.analyse.bungeecord.task; +package com.serverstats.bungeecord.task; -import net.analyse.bungeecord.AnalyseBungee; -import net.analyse.bungeecord.listener.PlayerListener; -import net.analyse.bungeecord.object.session.PlayerSession; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.AnalyseClient; -import net.analyse.api.exception.AnalyseException; -import net.analyse.sdk.request.HeartbeatRequest; -import net.analyse.sdk.request.PlayerInfo; -import net.analyse.sdk.request.ServerType; -import net.analyse.sdk.response.HeartbeatResponse; +import com.serverstats.bungeecord.ServerStatsBungee; +import com.serverstats.bungeecord.listener.PlayerListener; +import com.serverstats.bungeecord.object.session.PlayerSession; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.ServerStatsClient; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.sdk.request.HeartbeatRequest; +import com.serverstats.sdk.request.PlayerInfo; +import com.serverstats.sdk.request.ServerType; +import com.serverstats.sdk.response.HeartbeatResponse; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; import java.util.List; @@ -21,11 +21,11 @@ */ public class HeartbeatTask implements Runnable { - private final AnalyseBungee plugin; + private final ServerStatsBungee plugin; private final Logger logger; private final PlayerListener playerListener; - public HeartbeatTask(AnalyseBungee plugin, PlayerListener playerListener) { + public HeartbeatTask(ServerStatsBungee plugin, PlayerListener playerListener) { this.plugin = plugin; this.logger = plugin.getLogger(); this.playerListener = playerListener; @@ -43,7 +43,7 @@ public void run() { * @param serverName The server name */ private void sendHeartbeatForServer(String serverName) { - Optional clientOpt = playerListener.getClientForServer(serverName); + Optional clientOpt = playerListener.getClientForServer(serverName); if (clientOpt.isEmpty()) { return; } @@ -54,7 +54,7 @@ private void sendHeartbeatForServer(String serverName) { return; } - AnalyseClient client = clientOpt.get(); + ServerStatsClient client = clientOpt.get(); // Collect player info with hostnames for players on this server List onlinePlayers = serverInfo.getPlayers().stream() @@ -64,14 +64,14 @@ private void sendHeartbeatForServer(String serverName) { String instanceId = plugin.getPluginConfig().getInstanceId(); HeartbeatRequest request = new HeartbeatRequest(instanceId, ServerType.MINECRAFT, onlinePlayers); - client.heartbeat(request, new AnalyseCallback<>() { + client.heartbeat(request, new ServerStatsCallback<>() { @Override public void onSuccess(HeartbeatResponse response) { plugin.debug("Heartbeat sent for %s (%d players)", serverName, response.getOnlineCount()); } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { logger.warning(String.format("Failed to send heartbeat for %s: %s", serverName, exception.getMessage())); } diff --git a/bungeecord/src/main/java/net/analyse/bungeecord/update/BungeeUpdateChecker.java b/bungeecord/src/main/java/com/serverstats/bungeecord/update/BungeeUpdateChecker.java similarity index 87% rename from bungeecord/src/main/java/net/analyse/bungeecord/update/BungeeUpdateChecker.java rename to bungeecord/src/main/java/com/serverstats/bungeecord/update/BungeeUpdateChecker.java index dce20cb..f244197 100644 --- a/bungeecord/src/main/java/net/analyse/bungeecord/update/BungeeUpdateChecker.java +++ b/bungeecord/src/main/java/com/serverstats/bungeecord/update/BungeeUpdateChecker.java @@ -1,7 +1,7 @@ -package net.analyse.bungeecord.update; +package com.serverstats.bungeecord.update; -import net.analyse.bungeecord.AnalyseBungee; -import net.analyse.sdk.update.UpdateChecker; +import com.serverstats.bungeecord.ServerStatsBungee; +import com.serverstats.sdk.update.UpdateChecker; import java.util.concurrent.TimeUnit; /** @@ -11,7 +11,7 @@ public class BungeeUpdateChecker { private static final long CHECK_INTERVAL_MINUTES = 30; - private final AnalyseBungee plugin; + private final ServerStatsBungee plugin; private final UpdateChecker checker; /** @@ -20,7 +20,7 @@ public class BungeeUpdateChecker { * @param plugin The plugin instance * @param currentVersion The current plugin version */ - public BungeeUpdateChecker(AnalyseBungee plugin, String currentVersion) { + public BungeeUpdateChecker(ServerStatsBungee plugin, String currentVersion) { this.plugin = plugin; this.checker = new UpdateChecker(plugin.getClient(), currentVersion, "bungeecord"); } @@ -52,7 +52,7 @@ private void check() { @Override public void onUpdateAvailable(String currentVersion, String newVersion, String downloadUrl) { plugin.logInfo("╔════════════════════════════════════════════════════════════╗"); - plugin.logInfo("║ A new version of Analyse is available! ║"); + plugin.logInfo("║ A new version of ServerStats is available! ║"); plugin.logInfo("║ Current: " + padRight(currentVersion, 20) + " Latest: " + padRight(newVersion, 20) + "║"); plugin.logInfo("║ Download: " + padRight(downloadUrl, 47) + "║"); plugin.logInfo("╚════════════════════════════════════════════════════════════╝"); diff --git a/bungeecord/src/main/java/net/analyse/bungeecord/util/ComponentUtil.java b/bungeecord/src/main/java/com/serverstats/bungeecord/util/ComponentUtil.java similarity index 98% rename from bungeecord/src/main/java/net/analyse/bungeecord/util/ComponentUtil.java rename to bungeecord/src/main/java/com/serverstats/bungeecord/util/ComponentUtil.java index e605a9a..13ce4c1 100644 --- a/bungeecord/src/main/java/net/analyse/bungeecord/util/ComponentUtil.java +++ b/bungeecord/src/main/java/com/serverstats/bungeecord/util/ComponentUtil.java @@ -1,4 +1,4 @@ -package net.analyse.bungeecord.util; +package com.serverstats.bungeecord.util; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; diff --git a/bungeecord/src/main/resources/bungee.yml b/bungeecord/src/main/resources/bungee.yml index c54ebaf..8a808e1 100644 --- a/bungeecord/src/main/resources/bungee.yml +++ b/bungeecord/src/main/resources/bungee.yml @@ -1,6 +1,6 @@ -name: Analyse +name: ServerStats version: ${version} -main: net.analyse.bungeecord.AnalyseBungee -description: Analyse tracking plugin +main: com.serverstats.bungeecord.ServerStatsBungee +description: ServerStats tracking plugin author: VertCode diff --git a/docs/README.md b/docs/README.md index 1c8f437..0fdacd1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ -# Analyse Plugin Documentation +# ServerStats Plugin Documentation -Welcome to the Analyse plugin documentation. This guide covers installation, configuration, commands, and API usage for developers. +Welcome to the ServerStats plugin documentation. This guide covers installation, configuration, commands, and API usage for developers. ## Table of Contents @@ -13,7 +13,7 @@ Welcome to the Analyse plugin documentation. This guide covers installation, con ## Overview -Analyse is a comprehensive analytics plugin for Minecraft servers. It provides: +ServerStats is a comprehensive analytics plugin for Minecraft servers. It provides: - **Player Session Tracking** - Automatically tracks player joins, leaves, and playtime - **Heartbeat System** - Regular server health checks with online player data @@ -50,7 +50,7 @@ Analyse is a comprehensive analytics plugin for Minecraft servers. It provides: 1. Download the appropriate plugin jar for your platform 2. Place it in your `plugins` folder 3. Start the server to generate the config -4. Add your API key from [analyse.net](https://analyse.net) +4. Add your API key from [serverstats.net](https://serverstats.net) 5. Restart the server ```yaml @@ -62,5 +62,5 @@ instance-id: "auto-generated" ## Support -- Website: [analyse.net](https://analyse.net) -- API Documentation: [api.analyse.net](https://api.analyse.net) +- Website: [serverstats.net](https://serverstats.net) +- API Documentation: [api.serverstats.net](https://api.serverstats.net) diff --git a/docs/api.md b/docs/api.md index b028691..38a8ace 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1,6 +1,6 @@ # Developer API -The Analyse plugin provides a simple, fluent static API for other plugins to track custom analytics events and interact with A/B tests. +The ServerStats plugin provides a simple, fluent static API for other plugins to track custom analytics events and interact with A/B tests. ## Maven/Gradle Setup @@ -8,11 +8,11 @@ The Analyse plugin provides a simple, fluent static API for other plugins to tra ```kotlin repositories { - maven("https://repo.analyse.net/releases") + maven("https://repo.serverstats.net/releases") } dependencies { - compileOnly("net.analyse:api:0.1.0") + compileOnly("net.serverstats:api:0.1.0") } ``` @@ -20,11 +20,11 @@ dependencies { ```groovy repositories { - maven { url 'https://repo.analyse.net/releases' } + maven { url 'https://repo.serverstats.net/releases' } } dependencies { - compileOnly 'net.analyse:api:0.1.0' + compileOnly 'net.serverstats:api:0.1.0' } ``` @@ -32,12 +32,12 @@ dependencies { ```xml - analyse - https://repo.analyse.net/releases + serverstats + https://repo.serverstats.net/releases - net.analyse + net.serverstats api 0.1.0 provided @@ -47,18 +47,18 @@ dependencies { ## Quick Start ```java -import net.analyse.api.Analyse; +import net.serverstats.api.ServerStats; // Simple event -Analyse.trackEvent("my_event").send(); +ServerStats.trackEvent("my_event").send(); // Event with player -Analyse.trackEvent("player_action") +ServerStats.trackEvent("player_action") .withPlayer(player.getUniqueId(), player.getName()) .send(); // Event with data -Analyse.trackEvent("shop_purchase") +ServerStats.trackEvent("shop_purchase") .withPlayer(player.getUniqueId(), player.getName()) .withData("item", "diamond_sword") .withData("price", 500) @@ -68,7 +68,7 @@ Analyse.trackEvent("shop_purchase") ## Custom Events API -### Analyse Class +### ServerStats Class The main entry point for tracking events. @@ -77,7 +77,7 @@ The main entry point for tracking events. Creates a new event builder. ```java -EventBuilder builder = Analyse.trackEvent("event_name"); +EventBuilder builder = ServerStats.trackEvent("event_name"); ``` **Parameters:** @@ -89,15 +89,15 @@ EventBuilder builder = Analyse.trackEvent("event_name"); #### isAvailable() -Checks if Analyse is ready to track events. +Checks if ServerStats is ready to track events. ```java -if (Analyse.isAvailable()) { - Analyse.trackEvent("my_event").send(); +if (ServerStats.isAvailable()) { + ServerStats.trackEvent("my_event").send(); } ``` -**Returns:** `true` if Analyse is initialized and connected +**Returns:** `true` if ServerStats is initialized and connected ### EventBuilder Class @@ -108,7 +108,7 @@ Fluent builder for configuring events. Associates the event with a player. ```java -Analyse.trackEvent("login") +ServerStats.trackEvent("login") .withPlayer(player.getUniqueId(), player.getName()) .send(); ``` @@ -118,7 +118,7 @@ Analyse.trackEvent("login") Associates the event with a player using only UUID. ```java -Analyse.trackEvent("achievement") +ServerStats.trackEvent("achievement") .withPlayer(player.getUniqueId()) .send(); ``` @@ -128,7 +128,7 @@ Analyse.trackEvent("achievement") Adds a custom data field to the event. ```java -Analyse.trackEvent("purchase") +ServerStats.trackEvent("purchase") .withData("item", "diamond_sword") .withData("quantity", 1) .withData("total_price", 500) @@ -145,7 +145,7 @@ eventData.put("quest_id", "dragon_slayer"); eventData.put("difficulty", "hard"); eventData.put("time_seconds", 3600); -Analyse.trackEvent("quest_completed") +ServerStats.trackEvent("quest_completed") .withData(eventData) .send(); ``` @@ -155,7 +155,7 @@ Analyse.trackEvent("quest_completed") Sets a numeric value for aggregations (sum, average, etc.). ```java -Analyse.trackEvent("coins_earned") +ServerStats.trackEvent("coins_earned") .withPlayer(player.getUniqueId(), player.getName()) .withValue(1000.0) .send(); @@ -166,7 +166,7 @@ Analyse.trackEvent("coins_earned") Sends the event asynchronously (fire and forget). ```java -Analyse.trackEvent("server_start").send(); +ServerStats.trackEvent("server_start").send(); ``` #### send(Consumer callback) @@ -174,7 +174,7 @@ Analyse.trackEvent("server_start").send(); Sends the event with a callback for the response. ```java -Analyse.trackEvent("important_event") +ServerStats.trackEvent("important_event") .send(response -> { if (response != null && response.isSuccess()) { System.out.println("Event tracked: " + response.getEventId()); @@ -186,12 +186,12 @@ Analyse.trackEvent("important_event") ## A/B Testing API -The Analyse API provides built-in support for A/B testing. +The ServerStats API provides built-in support for A/B testing. ### Get Active Tests ```java -List tests = Analyse.getActiveTests(); +List tests = ServerStats.getActiveTests(); for (ABTest test : tests) { System.out.println("Test: " + test.getKey() + " - " + test.getName()); } @@ -200,7 +200,7 @@ for (ABTest test : tests) { ### Check if Test is Active ```java -if (Analyse.isTestActive("welcome_message_test")) { +if (ServerStats.isTestActive("welcome_message_test")) { // Test is running } ``` @@ -208,7 +208,7 @@ if (Analyse.isTestActive("welcome_message_test")) { ### Get Player's Variant ```java -String variant = Analyse.getVariant(player.getUniqueId(), "welcome_message_test"); +String variant = ServerStats.getVariant(player.getUniqueId(), "welcome_message_test"); if ("variant_a".equals(variant)) { // Show variant A experience } else if ("variant_b".equals(variant)) { @@ -219,7 +219,7 @@ if ("variant_a".equals(variant)) { ### Track Conversion ```java -Analyse.trackConversion( +ServerStats.trackConversion( player.getUniqueId(), player.getName(), "welcome_message_test", @@ -240,13 +240,13 @@ A/B tests can be triggered by: #### ON_EVENT Trigger -The `ON_EVENT` trigger allows A/B tests to activate when you track a custom event with `Analyse.trackEvent()`. This is useful for triggering experiments based on in-game milestones. +The `ON_EVENT` trigger allows A/B tests to activate when you track a custom event with `ServerStats.trackEvent()`. This is useful for triggering experiments based on in-game milestones. ```java // When this event is tracked, any A/B test configured // with trigger "ON_EVENT" and event name "tutorial_completed" // will automatically execute its variant actions -Analyse.trackEvent("tutorial_completed") +ServerStats.trackEvent("tutorial_completed") .withPlayer(player.getUniqueId(), player.getName()) .withData("time_seconds", 300) .send(); @@ -269,11 +269,11 @@ When a test triggers, it can execute actions for the assigned variant: ```java public void onQuestComplete(Player player, Quest quest) { - if (!Analyse.isAvailable()) { + if (!ServerStats.isAvailable()) { return; } - Analyse.trackEvent("quest_completed") + ServerStats.trackEvent("quest_completed") .withPlayer(player.getUniqueId(), player.getName()) .withData("quest_id", quest.getId()) .withData("quest_name", quest.getName()) @@ -288,7 +288,7 @@ public void onQuestComplete(Player player, Quest quest) { ```java public void onTransaction(Player player, double amount, String type) { - Analyse.trackEvent("economy_transaction") + ServerStats.trackEvent("economy_transaction") .withPlayer(player.getUniqueId(), player.getName()) .withData("type", type) // "deposit", "withdraw", "transfer" .withData("currency", "coins") @@ -301,7 +301,7 @@ public void onTransaction(Player player, double amount, String type) { ```java public void onPlayerKill(Player killer, Player victim) { - Analyse.trackEvent("pvp_kill") + ServerStats.trackEvent("pvp_kill") .withPlayer(killer.getUniqueId(), killer.getName()) .withData("victim_uuid", victim.getUniqueId().toString()) .withData("victim_name", victim.getName()) @@ -315,13 +315,13 @@ public void onPlayerKill(Player killer, Player victim) { ```java public void showWelcomeMessage(Player player) { - if (!Analyse.isAvailable() || !Analyse.isTestActive("welcome_test")) { + if (!ServerStats.isAvailable() || !ServerStats.isTestActive("welcome_test")) { // Default behavior player.sendMessage("Welcome to the server!"); return; } - String variant = Analyse.getVariant(player.getUniqueId(), "welcome_test"); + String variant = ServerStats.getVariant(player.getUniqueId(), "welcome_test"); switch (variant) { case "control" -> player.sendMessage("Welcome to the server!"); @@ -333,7 +333,7 @@ public void showWelcomeMessage(Player player) { } // Track that the player saw the welcome message - Analyse.trackConversion( + ServerStats.trackConversion( player.getUniqueId(), player.getName(), "welcome_test", @@ -346,7 +346,7 @@ public void showWelcomeMessage(Player player) { ```java public void trackImportantEvent(Player player, String action) { - Analyse.trackEvent("important_action") + ServerStats.trackEvent("important_action") .withPlayer(player.getUniqueId(), player.getName()) .withData("action", action) .send(response -> { @@ -364,11 +364,11 @@ public void trackImportantEvent(Player player, String action) { ### 1. Check Availability -Always check if Analyse is available before tracking: +Always check if ServerStats is available before tracking: ```java -if (Analyse.isAvailable()) { - Analyse.trackEvent("my_event").send(); +if (ServerStats.isAvailable()) { + ServerStats.trackEvent("my_event").send(); } ``` @@ -432,25 +432,25 @@ The `send()` method is asynchronous and won't block. Don't add callbacks that do ## Soft Dependency -To make Analyse a soft dependency, check for its presence: +To make ServerStats a soft dependency, check for its presence: ```java public class MyPlugin extends JavaPlugin { - private boolean analyseEnabled = false; + private boolean serverstatsEnabled = false; @Override public void onEnable() { - // Check if Analyse is installed - if (getServer().getPluginManager().getPlugin("Analyse") != null) { - analyseEnabled = true; - getLogger().info("Analyse integration enabled"); + // Check if ServerStats is installed + if (getServer().getPluginManager().getPlugin("ServerStats") != null) { + serverstatsEnabled = true; + getLogger().info("ServerStats integration enabled"); } } public void trackEvent(String name) { - if (analyseEnabled && Analyse.isAvailable()) { - Analyse.trackEvent(name).send(); + if (serverstatsEnabled && ServerStats.isAvailable()) { + ServerStats.trackEvent(name).send(); } } } @@ -460,5 +460,5 @@ Or use `plugin.yml` / `paper-plugin.yml` soft dependency: ```yaml name: MyPlugin -softdepend: [Analyse] +softdepend: [ServerStats] ``` diff --git a/docs/commands.md b/docs/commands.md index ed80adf..413e1ee 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -1,16 +1,16 @@ # Commands -The Analyse plugin provides commands to manage the plugin and send test events. +The ServerStats plugin provides commands to manage the plugin and send test events. ## Base Command ``` -/analyse +/serverstats ``` **Aliases**: `/analytics`, `/anl` -**Permission**: `analyse.command` +**Permission**: `serverstats.command` ## Subcommands @@ -19,18 +19,18 @@ The Analyse plugin provides commands to manage the plugin and send test events. Shows the current plugin status and connection information. ``` -/analyse status +/serverstats status ``` -**Permission**: `analyse.command` +**Permission**: `serverstats.command` **Output**: ``` ────────────────────────────── - Analyse v0.1.0 + ServerStats v0.1.0 ────────────────────────────── Status: ● Connected - API: api.analyse.net + API: api.serverstats.net Players Tracked: 5 Debug: Disabled ────────────────────────────── @@ -46,30 +46,30 @@ On proxy servers (BungeeCord/Velocity), additional info is shown: Reloads the plugin configuration from disk. ``` -/analyse reload +/serverstats reload ``` -**Permission**: `analyse.command.reload` +**Permission**: `serverstats.command.reload` ### Debug Toggles debug mode on/off. Debug mode provides verbose logging for troubleshooting. ``` -/analyse debug +/serverstats debug ``` -**Permission**: `analyse.command.debug` +**Permission**: `serverstats.command.debug` ### Event -Sends a custom event to the Analyse API. Useful for testing. +Sends a custom event to the ServerStats API. Useful for testing. ``` -/analyse event [options] +/serverstats event [options] ``` -**Permission**: `analyse.command.event` +**Permission**: `serverstats.command.event` #### Options @@ -83,19 +83,19 @@ Sends a custom event to the Analyse API. Useful for testing. ```bash # Simple test event -/analyse event test_event +/serverstats event test_event # Event with player -/analyse event player_action --player Steve +/serverstats event player_action --player Steve # Event with value -/analyse event purchase --value 500.00 +/serverstats event purchase --value 500.00 # Event with custom data -/analyse event shop_purchase --player Steve --value 100 --data item=diamond_sword --data quantity=1 +/serverstats event shop_purchase --player Steve --value 100 --data item=diamond_sword --data quantity=1 # Complex event -/analyse event quest_completed --player Steve --data quest_id=dragon_slayer --data difficulty=hard --value 1000 +/serverstats event quest_completed --player Steve --data quest_id=dragon_slayer --data difficulty=hard --value 1000 ``` ### Help @@ -103,19 +103,19 @@ Sends a custom event to the Analyse API. Useful for testing. Shows the help menu with all available commands. ``` -/analyse help +/serverstats help ``` -**Permission**: `analyse.command` +**Permission**: `serverstats.command` ## Permissions | Permission | Description | Default | |------------|-------------|---------| -| `analyse.command` | Base permission for all commands | OP | -| `analyse.command.reload` | Permission to reload configuration (Paper only) | OP | -| `analyse.command.debug` | Permission to toggle debug mode | OP | -| `analyse.command.event` | Permission to send custom events | OP | +| `serverstats.command` | Base permission for all commands | OP | +| `serverstats.command.reload` | Permission to reload configuration (Paper only) | OP | +| `serverstats.command.debug` | Permission to toggle debug mode | OP | +| `serverstats.command.event` | Permission to send custom events | OP | ## Tab Completion @@ -130,6 +130,6 @@ The plugin provides intelligent tab completion powered by ACF (Annotation Comman All commands work from the console without the leading slash: ``` -analyse status -analyse event server_restart --data reason=update +serverstats status +serverstats event server_restart --data reason=update ``` diff --git a/docs/configuration.md b/docs/configuration.md index d08c412..432fd0c 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -4,11 +4,11 @@ This guide covers all configuration options for each platform. ## Paper Configuration -Location: `plugins/Analyse/config.yml` +Location: `plugins/ServerStats/config.yml` ```yaml -# Your Analyse API key -# Get this from your dashboard at https://analyse.net +# Your ServerStats API key +# Get this from your dashboard at https://serverstats.net api-key: "your-api-key-here" # Enable debug mode for verbose logging @@ -24,13 +24,13 @@ instance-id: "auto-generated-uuid" | Option | Type | Default | Description | |--------|------|---------|-------------| -| `api-key` | String | `""` | Your Analyse API key (required) | +| `api-key` | String | `""` | Your ServerStats API key (required) | | `debug` | Boolean | `false` | Enable verbose debug logging | | `instance-id` | String | Auto | Unique identifier for this server | ## BungeeCord Configuration -Location: `plugins/Analyse/config.yml` +Location: `plugins/ServerStats/config.yml` ```yaml # Enable debug mode @@ -63,7 +63,7 @@ servers: ## Velocity Configuration -Location: `plugins/analyse/config.yml` +Location: `plugins/serverstats/config.yml` ```yaml # Enable debug mode @@ -115,7 +115,7 @@ api-key: ${ANALYSE_API_KEY} After making changes, reload the configuration: ``` -/analyse reload +/serverstats reload ``` Note: Some changes (like adding new server entries on proxies) may require a full restart. diff --git a/docs/installation.md b/docs/installation.md index 8605559..e950265 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -1,6 +1,6 @@ # Installation -This guide covers installing the Analyse plugin on different platforms. +This guide covers installing the ServerStats plugin on different platforms. ## Requirements @@ -9,66 +9,66 @@ This guide covers installing the Analyse plugin on different platforms. ## Paper Installation -1. Download `analyse-paper-x.x.x.jar` from the releases +1. Download `serverstats-paper-x.x.x.jar` from the releases 2. Place the jar file in your server's `plugins` folder 3. Start the server to generate the configuration file -4. Edit `plugins/Analyse/config.yml` with your API key -5. Restart the server or run `/analyse reload` +4. Edit `plugins/ServerStats/config.yml` with your API key +5. Restart the server or run `/serverstats reload` ### Paper Config Location ``` plugins/ -└── Analyse/ +└── ServerStats/ └── config.yml ``` ## BungeeCord Installation -1. Download `analyse-bungeecord-x.x.x.jar` from the releases +1. Download `serverstats-bungeecord-x.x.x.jar` from the releases 2. Place the jar file in your proxy's `plugins` folder 3. Start the proxy to generate the configuration file -4. Edit `plugins/Analyse/config.yml` with your server API keys +4. Edit `plugins/ServerStats/config.yml` with your server API keys 5. Restart the proxy ### BungeeCord Config Location ``` plugins/ -└── Analyse/ +└── ServerStats/ └── config.yml ``` ## Velocity Installation -1. Download `analyse-velocity-x.x.x.jar` from the releases +1. Download `serverstats-velocity-x.x.x.jar` from the releases 2. Place the jar file in your proxy's `plugins` folder 3. Start the proxy to generate the configuration file -4. Edit `plugins/analyse/config.yml` with your server API keys +4. Edit `plugins/serverstats/config.yml` with your server API keys 5. Restart the proxy ### Velocity Config Location ``` plugins/ -└── analyse/ +└── serverstats/ └── config.yml ``` ## Getting Your API Key -1. Log in to your [Analyse Dashboard](https://analyse.net) +1. Log in to your [ServerStats Dashboard](https://serverstats.net) 2. Navigate to your server settings 3. Copy your API key 4. Paste it in your configuration file ## Verifying Installation -After configuration, run `/analyse status` in-game or console to verify: +After configuration, run `/serverstats status` in-game or console to verify: ``` ────────────────────────────── - Analyse v0.1.0 + ServerStats v0.1.0 ────────────────────────────── Status: ● Connected - API: api.analyse.net + API: api.serverstats.net Players Tracked: 10 Debug: Disabled ────────────────────────────── diff --git a/gradle.properties b/gradle.properties index 1d3c3cd..5bffadf 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ # Project -group=com.vcdanalytics +group=com.serverstats version=0.5.0 # Java diff --git a/hytale/build.gradle b/hytale/build.gradle index 2f5bf84..efc8776 100644 --- a/hytale/build.gradle +++ b/hytale/build.gradle @@ -24,11 +24,11 @@ dependencies { } tasks.named('shadowJar', com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) { - archiveBaseName.set('analyse-hytale') + archiveBaseName.set('serverstats-hytale') archiveClassifier.set('') // Relocate Adventure/MiniMessage to avoid conflicts - relocate 'net.kyori', 'net.analyse.libs.kyori' + relocate 'net.kyori', 'com.serverstats.libs.kyori' } tasks.named('build') { diff --git a/hytale/src/main/java/net/analyse/hytale/HytalePlugin.java b/hytale/src/main/java/com/serverstats/hytale/HytalePlugin.java similarity index 77% rename from hytale/src/main/java/net/analyse/hytale/HytalePlugin.java rename to hytale/src/main/java/com/serverstats/hytale/HytalePlugin.java index f36b597..b353a1a 100644 --- a/hytale/src/main/java/net/analyse/hytale/HytalePlugin.java +++ b/hytale/src/main/java/com/serverstats/hytale/HytalePlugin.java @@ -1,4 +1,4 @@ -package net.analyse.hytale; +package com.serverstats.hytale; import com.google.common.flogger.FluentLogger; import com.hypixel.hytale.server.core.event.events.player.PlayerConnectEvent; @@ -16,36 +16,36 @@ import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import javax.annotation.Nonnull; -import net.analyse.api.Analyse; -import net.analyse.api.AnalyseProvider; -import net.analyse.api.exception.AnalyseException; -import net.analyse.api.object.builder.EventBuilder; -import net.analyse.api.platform.AnalysePlatform; -import net.analyse.hytale.command.AnalyseCommand; -import net.analyse.hytale.config.AnalyseHytaleConfig; -import net.analyse.hytale.listener.PlayerListener; -import net.analyse.hytale.manager.ABTestManager; -import net.analyse.hytale.manager.SessionManager; -import net.analyse.hytale.task.HeartbeatTask; -import net.analyse.hytale.update.HytaleUpdateChecker; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.AnalyseClient; -import net.analyse.sdk.config.AnalyseConfig; -import net.analyse.sdk.request.EventRequest; -import net.analyse.sdk.request.JoinRequest; -import net.analyse.sdk.response.EventResponse; -import net.analyse.sdk.response.JoinResponse; +import com.serverstats.api.ServerStats; +import com.serverstats.api.ServerStatsProvider; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.api.object.builder.EventBuilder; +import com.serverstats.api.platform.ServerStatsPlatform; +import com.serverstats.hytale.command.ServerStatsCommand; +import com.serverstats.hytale.config.ServerStatsHytaleConfig; +import com.serverstats.hytale.listener.PlayerListener; +import com.serverstats.hytale.manager.ABTestManager; +import com.serverstats.hytale.manager.SessionManager; +import com.serverstats.hytale.task.HeartbeatTask; +import com.serverstats.hytale.update.HytaleUpdateChecker; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.ServerStatsClient; +import com.serverstats.sdk.config.ServerStatsConfig; +import com.serverstats.sdk.request.EventRequest; +import com.serverstats.sdk.request.JoinRequest; +import com.serverstats.sdk.response.EventResponse; +import com.serverstats.sdk.response.JoinResponse; /** - * Analyse plugin for Hytale servers + * ServerStats plugin for Hytale servers */ -public class HytalePlugin extends JavaPlugin implements AnalysePlatform { +public class HytalePlugin extends JavaPlugin implements ServerStatsPlatform { - private AnalyseHytaleConfig pluginConfig; + private ServerStatsHytaleConfig pluginConfig; private SessionManager sessionManager; private ABTestManager abTestManager; private HytaleUpdateChecker updateChecker; - private AnalyseClient client; + private ServerStatsClient client; private ScheduledExecutorService scheduler; private ScheduledFuture heartbeatTask; private boolean configValid = false; @@ -60,10 +60,10 @@ public HytalePlugin(@Nonnull JavaPluginInit init) { @Override protected void setup() { super.setup(); - getLogger().atInfo().log("Loading Analyse..."); + getLogger().atInfo().log("Loading ServerStats..."); // Load configuration - pluginConfig = AnalyseHytaleConfig.load(this); + pluginConfig = ServerStatsHytaleConfig.load(this); // Validate configuration if (!pluginConfig.isValid()) { @@ -85,21 +85,21 @@ protected void start() { if (!configValid) { getLogger() .atSevere() - .log("Cannot enable Analyse - invalid configuration!"); + .log("Cannot enable ServerStats - invalid configuration!"); return; } - getLogger().atInfo().log("Enabling Analyse..."); + getLogger().atInfo().log("Enabling ServerStats..."); // Initialize SDK client - AnalyseConfig sdkConfig = new AnalyseConfig(pluginConfig.getApiKey()); - client = new AnalyseClient(sdkConfig); + ServerStatsConfig sdkConfig = new ServerStatsConfig(pluginConfig.getApiKey()); + client = new ServerStatsClient(sdkConfig); - // Register with the API provider so other plugins can use Analyse.get() - AnalyseProvider.register(this); + // Register with the API provider so other plugins can use ServerStats.get() + ServerStatsProvider.register(this); - // Set up the event sender for Analyse.trackEvent() - Analyse.setEventSender(this::sendEvent); + // Set up the event sender for ServerStats.trackEvent() + ServerStats.setEventSender(this::sendEvent); // Initialize session manager sessionManager = new SessionManager(); @@ -115,7 +115,7 @@ protected void start() { ); // Register commands - getCommandRegistry().registerCommand(new AnalyseCommand(this)); + getCommandRegistry().registerCommand(new ServerStatsCommand(this)); // Start heartbeat task (every 30 seconds) scheduler = Executors.newScheduledThreadPool(3); @@ -137,7 +137,7 @@ protected void start() { // Initialize sessions for players already online (in case of reload) initializeOnlinePlayers(); - getLogger().atInfo().log("Analyse enabled successfully!"); + getLogger().atInfo().log("ServerStats enabled successfully!"); } /** @@ -158,7 +158,7 @@ private void sendEvent(EventBuilder event, Consumer callback) { client.trackEvent( request, - new AnalyseCallback<>() { + new ServerStatsCallback<>() { @Override public void onSuccess(EventResponse response) { if (isDebugEnabled()) { @@ -177,7 +177,7 @@ public void onSuccess(EventResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { logWarning( String.format( "Failed to track event '%s': %s", @@ -237,7 +237,7 @@ private void initializeOnlinePlayers() { client.join( request, - new AnalyseCallback<>() { + new ServerStatsCallback<>() { @Override public void onSuccess(JoinResponse response) { sessionManager @@ -253,7 +253,7 @@ public void onSuccess(JoinResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { getLogger() .atWarning() .log( @@ -292,13 +292,13 @@ private String getPlayerIp(PlayerRef playerRef) { @Override protected void shutdown() { - getLogger().atInfo().log("Disabling Analyse..."); + getLogger().atInfo().log("Disabling ServerStats..."); // Unregister from the API provider - AnalyseProvider.unregister(); + ServerStatsProvider.unregister(); // Clear the event sender - Analyse.setEventSender(null); + ServerStats.setEventSender(null); // Stop A/B test manager if (abTestManager != null) { @@ -325,7 +325,7 @@ protected void shutdown() { client.shutdown(); } - getLogger().atInfo().log("Analyse disabled"); + getLogger().atInfo().log("ServerStats disabled"); super.shutdown(); } @@ -352,7 +352,7 @@ public void debug(String format, Object... args) { } } - // ========== AnalysePlatform Interface Methods ========== + // ========== ServerStatsPlatform Interface Methods ========== @Override public SessionManager getSessionManager() { @@ -391,16 +391,16 @@ public String getVersion() { * * @return The plugin config */ - public AnalyseHytaleConfig getPluginConfig() { + public ServerStatsHytaleConfig getPluginConfig() { return pluginConfig; } /** * Get the SDK client * - * @return The Analyse client + * @return The ServerStats client */ - public AnalyseClient getClient() { + public ServerStatsClient getClient() { return client; } diff --git a/hytale/src/main/java/net/analyse/hytale/command/AnalyseCommand.java b/hytale/src/main/java/com/serverstats/hytale/command/ServerStatsCommand.java similarity index 83% rename from hytale/src/main/java/net/analyse/hytale/command/AnalyseCommand.java rename to hytale/src/main/java/com/serverstats/hytale/command/ServerStatsCommand.java index 43cfd1f..f67d7dc 100644 --- a/hytale/src/main/java/net/analyse/hytale/command/AnalyseCommand.java +++ b/hytale/src/main/java/com/serverstats/hytale/command/ServerStatsCommand.java @@ -1,4 +1,4 @@ -package net.analyse.hytale.command; +package com.serverstats.hytale.command; import com.hypixel.hytale.server.core.Message; import com.hypixel.hytale.server.core.command.system.AbstractCommand; @@ -7,16 +7,16 @@ import com.hypixel.hytale.server.core.command.system.ParseResult; import com.hypixel.hytale.server.core.command.system.ParserContext; -import net.analyse.api.Analyse; -import net.analyse.api.exception.AnalyseException; -import net.analyse.api.object.builder.EventBuilder; -import net.analyse.hytale.HytalePlugin; -import net.analyse.hytale.object.session.PlayerSession; -import net.analyse.hytale.util.ComponentUtil; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.request.PlayerInfoRequest; -import net.analyse.sdk.response.PlayerInfoResponse; -import net.analyse.sdk.response.ServerInfoResponse; +import com.serverstats.api.ServerStats; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.api.object.builder.EventBuilder; +import com.serverstats.hytale.HytalePlugin; +import com.serverstats.hytale.object.session.PlayerSession; +import com.serverstats.hytale.util.ComponentUtil; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.request.PlayerInfoRequest; +import com.serverstats.sdk.response.PlayerInfoResponse; +import com.serverstats.sdk.response.ServerInfoResponse; import com.hypixel.hytale.server.core.universe.PlayerRef; import javax.annotation.Nonnull; @@ -28,15 +28,15 @@ import java.util.concurrent.CompletableFuture; /** - * Main command handler for the Analyse plugin + * Main command handler for the ServerStats plugin */ -public class AnalyseCommand extends AbstractCommand { +public class ServerStatsCommand extends AbstractCommand { private final HytalePlugin plugin; - public AnalyseCommand(HytalePlugin plugin) { - super("analyse", "Analyse analytics plugin command"); - addAliases("analytics", "anl"); + public ServerStatsCommand(HytalePlugin plugin) { + super("serverstats", "ServerStats analytics plugin command"); + addAliases("analyse", "ss"); setAllowsExtraArguments(true); this.plugin = plugin; } @@ -112,11 +112,11 @@ private void onStatus(CommandSender sender) { */ private void showPublicInfo(CommandSender sender) { StringBuilder message = new StringBuilder(); - message.append("#3498db&l「 Analyse 」&r\n"); - message.append(" #5dade2┃ &7This server uses &fAnalyse &7to track\n"); + message.append("#3498db&l「 ServerStats 」&r\n"); + message.append(" #5dade2┃ &7This server uses &fServerStats &7to track\n"); message.append(" #5dade2┃ &7player analytics and sessions.&r\n"); message.append("&r\n"); - message.append(" &7→ &fanalyse.net&r\n"); + message.append(" &7→ &fserverstats.com&r\n"); send(sender, message.toString()); } @@ -126,14 +126,14 @@ private void showPublicInfo(CommandSender sender) { * @param sender The command sender */ private void showStatus(CommandSender sender) { - boolean connected = Analyse.isAvailable(); + boolean connected = ServerStats.isAvailable(); int trackedPlayers = plugin.getSessionManager().getSessionCount(); boolean debugEnabled = plugin.isDebugEnabled(); StringBuilder message = new StringBuilder(); - message.append("#3498db&l「 Analyse &r&fv").append(plugin.getVersion()).append(" #3498db&l」&r\n"); + message.append("#3498db&l「 ServerStats &r&fv").append(plugin.getVersion()).append(" #3498db&l」&r\n"); message.append(" #5dade2┃ &fStatus: ").append(connected ? "&a● Connected" : "&c● Disconnected").append("&r\n"); - message.append(" #5dade2┃ &fAPI: &7api.analyse.net&r\n"); + message.append(" #5dade2┃ &fAPI: &7api.serverstats.com&r\n"); message.append(" #5dade2┃ &fPlayers Tracked: &7").append(trackedPlayers).append("&r\n"); message.append(" #5dade2┃ &fDebug: ").append(debugEnabled ? "&aEnabled" : "&7Disabled").append("&r\n"); send(sender, message.toString()); @@ -163,12 +163,12 @@ private void onDebug(CommandSender sender) { */ private void onEvent(CommandSender sender, String[] args) { if (args.length == 0) { - send(sender, "&cUsage: /analyse event [--value ] [--data key=value...]"); + send(sender, "&cUsage: /serverstats event [--value ] [--data key=value...]"); return; } - if (!Analyse.isAvailable()) { - send(sender, "&cAnalyse is not connected. Cannot send events."); + if (!ServerStats.isAvailable()) { + send(sender, "&cServerStats is not connected. Cannot send events."); return; } @@ -204,7 +204,7 @@ private void onEvent(CommandSender sender, String[] args) { } // Build the event - EventBuilder builder = Analyse.trackEvent(eventName); + EventBuilder builder = ServerStats.trackEvent(eventName); // Add value if specified if (value != null) { @@ -240,8 +240,8 @@ private void onEvent(CommandSender sender, String[] args) { * @param args The command arguments */ private void onInfo(CommandSender sender, String[] args) { - if (!Analyse.isAvailable()) { - send(sender, "&cAnalyse is not connected."); + if (!ServerStats.isAvailable()) { + send(sender, "&cServerStats is not connected."); return; } @@ -264,7 +264,7 @@ private void showServerInfo(CommandSender sender) { int onlinePlayers = plugin.getUniverse().getPlayers().size(); // Fetch additional data from API - plugin.getClient().getServerInfo(new AnalyseCallback<>() { + plugin.getClient().getServerInfo(new ServerStatsCallback<>() { @Override public void onSuccess(ServerInfoResponse response) { StringBuilder message = new StringBuilder(); @@ -284,7 +284,7 @@ public void onSuccess(ServerInfoResponse response) { } @Override -public void onError(AnalyseException exception) { +public void onError(ServerStatsException exception) { StringBuilder message = new StringBuilder(); message.append("#3498db&l「 Server Analytics 」&r\n"); message.append(" #5dade2┃ &fOnline Players: &7").append(onlinePlayers).append("&r\n"); @@ -320,14 +320,14 @@ private void showPlayerInfo(CommandSender sender, String playerName) { String username = player.getUsername(); // Fetch additional data from API - plugin.getClient().getPlayerInfo(new PlayerInfoRequest(player.getUuid()), new AnalyseCallback<>() { + plugin.getClient().getPlayerInfo(new PlayerInfoRequest(player.getUuid()), new ServerStatsCallback<>() { @Override public void onSuccess(PlayerInfoResponse response) { send(sender, buildPlayerInfoMessage(username, session, response)); } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { send(sender, buildPlayerInfoMessage(username, session, null)); } }); @@ -415,14 +415,14 @@ private String formatDuration(Duration duration) { */ private void onHelp(CommandSender sender) { StringBuilder message = new StringBuilder(); - message.append("#3498db&l「 Analyse Commands 」&r\n"); - message.append(" #5dade2┃ &f/analyse &7- Show plugin info&r\n"); - message.append(" #5dade2┃ &f/analyse status &7- Show plugin status&r\n"); - message.append(" #5dade2┃ &f/analyse info &7- View server analytics&r\n"); - message.append(" #5dade2┃ &f/analyse info &7- View player analytics&r\n"); - message.append(" #5dade2┃ &f/analyse debug &7- Toggle debug mode&r\n"); - message.append(" #5dade2┃ &f/analyse event &7- Send custom event&r\n"); - message.append(" #5dade2┃ &f/analyse help &7- Show this help&r\n"); + message.append("#3498db&l「 ServerStats Commands 」&r\n"); + message.append(" #5dade2┃ &f/serverstats &7- Show plugin info&r\n"); + message.append(" #5dade2┃ &f/serverstats status &7- Show plugin status&r\n"); + message.append(" #5dade2┃ &f/serverstats info &7- View server analytics&r\n"); + message.append(" #5dade2┃ &f/serverstats info &7- View player analytics&r\n"); + message.append(" #5dade2┃ &f/serverstats debug &7- Toggle debug mode&r\n"); + message.append(" #5dade2┃ &f/serverstats event &7- Send custom event&r\n"); + message.append(" #5dade2┃ &f/serverstats help &7- Show this help&r\n"); send(sender, message.toString()); } diff --git a/hytale/src/main/java/net/analyse/hytale/config/AnalyseHytaleConfig.java b/hytale/src/main/java/com/serverstats/hytale/config/ServerStatsHytaleConfig.java similarity index 84% rename from hytale/src/main/java/net/analyse/hytale/config/AnalyseHytaleConfig.java rename to hytale/src/main/java/com/serverstats/hytale/config/ServerStatsHytaleConfig.java index b70f701..aa07486 100644 --- a/hytale/src/main/java/net/analyse/hytale/config/AnalyseHytaleConfig.java +++ b/hytale/src/main/java/com/serverstats/hytale/config/ServerStatsHytaleConfig.java @@ -1,4 +1,4 @@ -package net.analyse.hytale.config; +package com.serverstats.hytale.config; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -17,7 +17,7 @@ * Configuration for the Hytale plugin */ @Getter -public class AnalyseHytaleConfig { +public class ServerStatsHytaleConfig { private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); @@ -31,19 +31,19 @@ public class AnalyseHytaleConfig { * @param plugin The plugin instance * @return The loaded configuration */ - public static AnalyseHytaleConfig load(JavaPlugin plugin) { + public static ServerStatsHytaleConfig load(JavaPlugin plugin) { Path configPath = plugin.getDataDirectory().resolve("config.json"); // If config doesn't exist, create default if (!Files.exists(configPath)) { - AnalyseHytaleConfig defaultConfig = createDefault(); + ServerStatsHytaleConfig defaultConfig = createDefault(); defaultConfig.save(configPath); return defaultConfig; } // Load existing config try (Reader reader = Files.newBufferedReader(configPath, StandardCharsets.UTF_8)) { - return GSON.fromJson(reader, AnalyseHytaleConfig.class); + return GSON.fromJson(reader, ServerStatsHytaleConfig.class); } catch (IOException e) { plugin.getLogger().atWarning().log("Failed to load config.json, using defaults: %s", e.getMessage()); return createDefault(); @@ -55,8 +55,8 @@ public static AnalyseHytaleConfig load(JavaPlugin plugin) { * * @return The default config */ - private static AnalyseHytaleConfig createDefault() { - AnalyseHytaleConfig config = new AnalyseHytaleConfig(); + private static ServerStatsHytaleConfig createDefault() { + ServerStatsHytaleConfig config = new ServerStatsHytaleConfig(); config.debug = false; config.apiKey = ""; config.instanceId = "default"; diff --git a/hytale/src/main/java/net/analyse/hytale/listener/PlayerListener.java b/hytale/src/main/java/com/serverstats/hytale/listener/PlayerListener.java similarity index 81% rename from hytale/src/main/java/net/analyse/hytale/listener/PlayerListener.java rename to hytale/src/main/java/com/serverstats/hytale/listener/PlayerListener.java index fba4990..ce1a199 100644 --- a/hytale/src/main/java/net/analyse/hytale/listener/PlayerListener.java +++ b/hytale/src/main/java/com/serverstats/hytale/listener/PlayerListener.java @@ -1,4 +1,4 @@ -package net.analyse.hytale.listener; +package com.serverstats.hytale.listener; import com.hypixel.hytale.server.core.event.events.player.PlayerConnectEvent; import com.hypixel.hytale.server.core.event.events.player.PlayerDisconnectEvent; @@ -7,16 +7,16 @@ import com.hypixel.hytale.server.core.universe.PlayerRef; import com.hypixel.hytale.server.core.universe.Universe; -import net.analyse.api.exception.AnalyseException; -import net.analyse.hytale.HytalePlugin; -import net.analyse.hytale.manager.SessionManager; -import net.analyse.hytale.object.session.PlayerSession; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.AnalyseClient; -import net.analyse.sdk.request.JoinRequest; -import net.analyse.sdk.request.LeaveRequest; -import net.analyse.sdk.response.JoinResponse; -import net.analyse.sdk.response.LeaveResponse; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.hytale.HytalePlugin; +import com.serverstats.hytale.manager.SessionManager; +import com.serverstats.hytale.object.session.PlayerSession; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.ServerStatsClient; +import com.serverstats.sdk.request.JoinRequest; +import com.serverstats.sdk.request.LeaveRequest; +import com.serverstats.sdk.response.JoinResponse; +import com.serverstats.sdk.response.LeaveResponse; import java.net.InetSocketAddress; import java.net.SocketAddress; @@ -32,11 +32,11 @@ public class PlayerListener { private final HytalePlugin plugin; private final SessionManager sessionManager; - private final AnalyseClient client; + private final ServerStatsClient client; private final Map hostnameMap = new HashMap<>(); - public PlayerListener(HytalePlugin plugin, AnalyseClient client) { + public PlayerListener(HytalePlugin plugin, ServerStatsClient client) { this.plugin = plugin; this.sessionManager = plugin.getSessionManager(); this.client = client; @@ -75,7 +75,7 @@ public void onPlayerConnect(PlayerConnectEvent event) { // Send join event to the API JoinRequest request = new JoinRequest(uuid, username, hostname, ip, false); - client.join(request, new AnalyseCallback<>() { + client.join(request, new ServerStatsCallback<>() { @Override public void onSuccess(JoinResponse response) { sessionManager.getSession(uuid).ifPresent(session -> session.setSessionId(response.getSessionId())); @@ -83,7 +83,7 @@ public void onSuccess(JoinResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { plugin.logWarning(String.format("Failed to send join event for %s: %s", username, exception.getMessage())); } }); @@ -112,14 +112,14 @@ public void onPlayerDisconnect(PlayerDisconnectEvent event) { // Send leave event to the API LeaveRequest request = new LeaveRequest(session.getSessionId()); - client.leave(request, new AnalyseCallback<>() { + client.leave(request, new ServerStatsCallback<>() { @Override public void onSuccess(LeaveResponse response) { plugin.debug("Leave event sent for %s (duration: %ds)", username, response.getDuration()); } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { plugin.logWarning(String.format("Failed to send leave event for %s: %s", username, exception.getMessage())); } }); diff --git a/hytale/src/main/java/net/analyse/hytale/manager/ABTestManager.java b/hytale/src/main/java/com/serverstats/hytale/manager/ABTestManager.java similarity index 73% rename from hytale/src/main/java/net/analyse/hytale/manager/ABTestManager.java rename to hytale/src/main/java/com/serverstats/hytale/manager/ABTestManager.java index 53076bb..ba2a265 100644 --- a/hytale/src/main/java/net/analyse/hytale/manager/ABTestManager.java +++ b/hytale/src/main/java/com/serverstats/hytale/manager/ABTestManager.java @@ -1,15 +1,15 @@ -package net.analyse.hytale.manager; +package com.serverstats.hytale.manager; import com.hypixel.hytale.server.core.universe.PlayerRef; -import net.analyse.api.exception.AnalyseException; -import net.analyse.api.object.abtest.ABTest; -import net.analyse.hytale.HytalePlugin; -import net.analyse.hytale.object.action.HytaleAction; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.object.action.ActionData; -import net.analyse.sdk.request.ConversionRequest; -import net.analyse.sdk.response.ABTestsResponse; -import net.analyse.sdk.response.ConversionResponse; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.api.object.abtest.ABTest; +import com.serverstats.hytale.HytalePlugin; +import com.serverstats.hytale.object.action.HytaleAction; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.object.action.ActionData; +import com.serverstats.sdk.request.ConversionRequest; +import com.serverstats.sdk.response.ABTestsResponse; +import com.serverstats.sdk.response.ConversionResponse; import java.util.List; import java.util.Map; @@ -23,13 +23,13 @@ * Manages A/B tests for the Hytale plugin. * Handles fetching, caching, and executing tests. */ -public class ABTestManager implements net.analyse.api.manager.ABTestManager { +public class ABTestManager implements com.serverstats.api.manager.ABTestManager { private static final long SYNC_INTERVAL_MINUTES = 5; private final HytalePlugin plugin; private final ScheduledExecutorService scheduler; - private final Map testsCache = new ConcurrentHashMap<>(); + private final Map testsCache = new ConcurrentHashMap<>(); private ScheduledFuture syncTask; public ABTestManager(HytalePlugin plugin, ScheduledExecutorService scheduler) { @@ -75,12 +75,12 @@ private void syncTests() { return; } - plugin.getClient().getABTests(new AnalyseCallback<>() { + plugin.getClient().getABTests(new ServerStatsCallback<>() { @Override public void onSuccess(ABTestsResponse response) { if (response.isSuccess() && response.getTests() != null) { testsCache.clear(); - for (net.analyse.sdk.object.abtest.ABTest test : response.getTests()) { + for (com.serverstats.sdk.object.abtest.ABTest test : response.getTests()) { if (test.isActive()) { testsCache.put(test.getKey(), test); } @@ -93,7 +93,7 @@ public void onSuccess(ABTestsResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { plugin.logWarning(String.format("Failed to sync A/B tests: %s", exception.getMessage())); } }); @@ -101,7 +101,7 @@ public void onError(AnalyseException exception) { @Override @SuppressWarnings("unchecked") - public List getActiveTests() { + public List getActiveTests() { return List.copyOf(testsCache.values()); } @@ -112,7 +112,7 @@ public ABTest getTest(String testKey) { @Override public String getVariant(UUID playerUuid, String testKey) { - net.analyse.sdk.object.abtest.ABTest test = testsCache.get(testKey); + com.serverstats.sdk.object.abtest.ABTest test = testsCache.get(testKey); if (test == null) { return null; } @@ -136,7 +136,7 @@ public boolean isTestActive(String testKey) { public void processJoin(PlayerRef playerRef, boolean firstJoin) { ABTest.Trigger trigger = firstJoin ? ABTest.Trigger.FIRST_JOIN : ABTest.Trigger.EVERY_JOIN; - for (net.analyse.sdk.object.abtest.ABTest test : testsCache.values()) { + for (com.serverstats.sdk.object.abtest.ABTest test : testsCache.values()) { if (!test.matchesTrigger(trigger)) { continue; } @@ -144,7 +144,7 @@ public void processJoin(PlayerRef playerRef, boolean firstJoin) { // Assign variant and execute actions var variant = test.assignVariant(playerRef.getUuid()); if (variant != null && variant.hasActions()) { - executeActions(playerRef, test, (net.analyse.sdk.object.abtest.Variant) variant); + executeActions(playerRef, test, (com.serverstats.sdk.object.abtest.Variant) variant); } } } @@ -156,7 +156,7 @@ public void processJoin(PlayerRef playerRef, boolean firstJoin) { * @param eventName The event name */ public void processEvent(PlayerRef playerRef, String eventName) { - for (net.analyse.sdk.object.abtest.ABTest test : testsCache.values()) { + for (com.serverstats.sdk.object.abtest.ABTest test : testsCache.values()) { if (!test.matchesEvent(eventName)) { continue; } @@ -164,7 +164,7 @@ public void processEvent(PlayerRef playerRef, String eventName) { // Assign variant and execute actions var variant = test.assignVariant(playerRef.getUuid()); if (variant != null && variant.hasActions()) { - executeActions(playerRef, test, (net.analyse.sdk.object.abtest.Variant) variant); + executeActions(playerRef, test, (com.serverstats.sdk.object.abtest.Variant) variant); } } } @@ -176,8 +176,8 @@ public void processEvent(PlayerRef playerRef, String eventName) { * @param test The A/B test * @param variant The assigned variant */ - private void executeActions(PlayerRef playerRef, net.analyse.sdk.object.abtest.ABTest test, - net.analyse.sdk.object.abtest.Variant variant) { + private void executeActions(PlayerRef playerRef, com.serverstats.sdk.object.abtest.ABTest test, + com.serverstats.sdk.object.abtest.Variant variant) { if (plugin.isDebugEnabled()) { plugin.logInfo(String.format("[DEBUG] Player %s assigned to variant '%s' for test '%s'", playerRef.getUsername(), variant.getKey(), test.getKey())); @@ -193,7 +193,7 @@ private void executeActions(PlayerRef playerRef, net.analyse.sdk.object.abtest.A @Override public void trackConversion(UUID playerUuid, String playerUsername, String testKey, String eventName) { - net.analyse.sdk.object.abtest.ABTest test = testsCache.get(testKey); + com.serverstats.sdk.object.abtest.ABTest test = testsCache.get(testKey); if (test == null) { return; } @@ -205,7 +205,7 @@ public void trackConversion(UUID playerUuid, String playerUsername, String testK testKey, variantKey, playerUuid, playerUsername, eventName, null ); - plugin.getClient().trackConversion(request, new AnalyseCallback<>() { + plugin.getClient().trackConversion(request, new ServerStatsCallback<>() { @Override public void onSuccess(ConversionResponse response) { if (plugin.isDebugEnabled()) { @@ -215,7 +215,7 @@ public void onSuccess(ConversionResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { plugin.logWarning(String.format("Failed to track conversion: %s", exception.getMessage())); } }); diff --git a/paper/src/main/java/net/analyse/paper/manager/SessionManager.java b/hytale/src/main/java/com/serverstats/hytale/manager/SessionManager.java similarity index 89% rename from paper/src/main/java/net/analyse/paper/manager/SessionManager.java rename to hytale/src/main/java/com/serverstats/hytale/manager/SessionManager.java index 2680edd..66a4e42 100644 --- a/paper/src/main/java/net/analyse/paper/manager/SessionManager.java +++ b/hytale/src/main/java/com/serverstats/hytale/manager/SessionManager.java @@ -1,6 +1,6 @@ -package net.analyse.paper.manager; +package com.serverstats.hytale.manager; -import net.analyse.paper.object.session.PlayerSession; +import com.serverstats.hytale.object.session.PlayerSession; import java.util.Collection; import java.util.Map; import java.util.Optional; @@ -10,7 +10,7 @@ /** * Thread-safe manager for player sessions */ -public class SessionManager implements net.analyse.api.manager.SessionManager { +public class SessionManager implements com.serverstats.api.manager.SessionManager { private final Map sessions = new ConcurrentHashMap<>(); diff --git a/hytale/src/main/java/net/analyse/hytale/object/action/HytaleAction.java b/hytale/src/main/java/com/serverstats/hytale/object/action/HytaleAction.java similarity index 89% rename from hytale/src/main/java/net/analyse/hytale/object/action/HytaleAction.java rename to hytale/src/main/java/com/serverstats/hytale/object/action/HytaleAction.java index 17a0e27..eac6fa5 100644 --- a/hytale/src/main/java/net/analyse/hytale/object/action/HytaleAction.java +++ b/hytale/src/main/java/com/serverstats/hytale/object/action/HytaleAction.java @@ -1,9 +1,9 @@ -package net.analyse.hytale.object.action; +package com.serverstats.hytale.object.action; import com.hypixel.hytale.server.core.universe.PlayerRef; -import net.analyse.hytale.HytalePlugin; -import net.analyse.sdk.object.action.Action; -import net.analyse.sdk.object.action.ActionData; +import com.serverstats.hytale.HytalePlugin; +import com.serverstats.sdk.object.action.Action; +import com.serverstats.sdk.object.action.ActionData; /** * Base class for Hytale-specific A/B test actions. diff --git a/hytale/src/main/java/net/analyse/hytale/object/action/RunCommandAction.java b/hytale/src/main/java/com/serverstats/hytale/object/action/RunCommandAction.java similarity index 80% rename from hytale/src/main/java/net/analyse/hytale/object/action/RunCommandAction.java rename to hytale/src/main/java/com/serverstats/hytale/object/action/RunCommandAction.java index 7b89e08..0610c16 100644 --- a/hytale/src/main/java/net/analyse/hytale/object/action/RunCommandAction.java +++ b/hytale/src/main/java/com/serverstats/hytale/object/action/RunCommandAction.java @@ -1,10 +1,10 @@ -package net.analyse.hytale.object.action; +package com.serverstats.hytale.object.action; import com.hypixel.hytale.server.core.universe.PlayerRef; -import net.analyse.hytale.HytalePlugin; -import net.analyse.sdk.object.action.ActionData; -import net.analyse.sdk.object.action.ActionType; +import com.serverstats.hytale.HytalePlugin; +import com.serverstats.sdk.object.action.ActionData; +import com.serverstats.sdk.object.action.ActionType; /** * Action that runs a command. diff --git a/hytale/src/main/java/net/analyse/hytale/object/action/SendMessageAction.java b/hytale/src/main/java/com/serverstats/hytale/object/action/SendMessageAction.java similarity index 78% rename from hytale/src/main/java/net/analyse/hytale/object/action/SendMessageAction.java rename to hytale/src/main/java/com/serverstats/hytale/object/action/SendMessageAction.java index 364afbc..751e1c1 100644 --- a/hytale/src/main/java/net/analyse/hytale/object/action/SendMessageAction.java +++ b/hytale/src/main/java/com/serverstats/hytale/object/action/SendMessageAction.java @@ -1,11 +1,11 @@ -package net.analyse.hytale.object.action; +package com.serverstats.hytale.object.action; import com.hypixel.hytale.server.core.Message; import com.hypixel.hytale.server.core.universe.PlayerRef; -import net.analyse.hytale.HytalePlugin; -import net.analyse.hytale.util.ComponentUtil; -import net.analyse.sdk.object.action.ActionData; -import net.analyse.sdk.object.action.ActionType; +import com.serverstats.hytale.HytalePlugin; +import com.serverstats.hytale.util.ComponentUtil; +import com.serverstats.sdk.object.action.ActionData; +import com.serverstats.sdk.object.action.ActionType; import net.kyori.adventure.text.Component; /** diff --git a/paper/src/main/java/net/analyse/paper/object/session/PlayerSession.java b/hytale/src/main/java/com/serverstats/hytale/object/session/PlayerSession.java similarity index 88% rename from paper/src/main/java/net/analyse/paper/object/session/PlayerSession.java rename to hytale/src/main/java/com/serverstats/hytale/object/session/PlayerSession.java index 17181f1..b48d745 100644 --- a/paper/src/main/java/net/analyse/paper/object/session/PlayerSession.java +++ b/hytale/src/main/java/com/serverstats/hytale/object/session/PlayerSession.java @@ -1,4 +1,4 @@ -package net.analyse.paper.object.session; +package com.serverstats.hytale.object.session; import lombok.Getter; import java.time.Instant; @@ -8,7 +8,7 @@ * Stores session data for a connected player */ @Getter -public class PlayerSession implements net.analyse.api.session.PlayerSession { +public class PlayerSession implements com.serverstats.api.session.PlayerSession { private final UUID playerUuid; private final String hostname; diff --git a/hytale/src/main/java/net/analyse/hytale/task/HeartbeatTask.java b/hytale/src/main/java/com/serverstats/hytale/task/HeartbeatTask.java similarity index 72% rename from hytale/src/main/java/net/analyse/hytale/task/HeartbeatTask.java rename to hytale/src/main/java/com/serverstats/hytale/task/HeartbeatTask.java index e64bac5..47cb69f 100644 --- a/hytale/src/main/java/net/analyse/hytale/task/HeartbeatTask.java +++ b/hytale/src/main/java/com/serverstats/hytale/task/HeartbeatTask.java @@ -1,18 +1,18 @@ -package net.analyse.hytale.task; +package com.serverstats.hytale.task; import com.hypixel.hytale.server.core.universe.PlayerRef; import com.hypixel.hytale.server.core.universe.Universe; import java.util.List; import java.util.Optional; -import net.analyse.api.exception.AnalyseException; -import net.analyse.hytale.HytalePlugin; -import net.analyse.hytale.object.session.PlayerSession; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.AnalyseClient; -import net.analyse.sdk.request.HeartbeatRequest; -import net.analyse.sdk.request.PlayerInfo; -import net.analyse.sdk.request.ServerType; -import net.analyse.sdk.response.HeartbeatResponse; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.hytale.HytalePlugin; +import com.serverstats.hytale.object.session.PlayerSession; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.ServerStatsClient; +import com.serverstats.sdk.request.HeartbeatRequest; +import com.serverstats.sdk.request.PlayerInfo; +import com.serverstats.sdk.request.ServerType; +import com.serverstats.sdk.response.HeartbeatResponse; /** * Sends periodic heartbeats to the API with online players @@ -20,9 +20,9 @@ public class HeartbeatTask implements Runnable { private final HytalePlugin plugin; - private final AnalyseClient client; + private final ServerStatsClient client; - public HeartbeatTask(HytalePlugin plugin, AnalyseClient client) { + public HeartbeatTask(HytalePlugin plugin, ServerStatsClient client) { this.plugin = plugin; this.client = client; } @@ -42,7 +42,7 @@ public void run() { client.heartbeat( request, - new AnalyseCallback<>() { + new ServerStatsCallback<>() { @Override public void onSuccess(HeartbeatResponse response) { plugin.debug( @@ -52,7 +52,7 @@ public void onSuccess(HeartbeatResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { plugin.logWarning( String.format( "Failed to send heartbeat: %s", diff --git a/hytale/src/main/java/net/analyse/hytale/update/HytaleUpdateChecker.java b/hytale/src/main/java/com/serverstats/hytale/update/HytaleUpdateChecker.java similarity index 94% rename from hytale/src/main/java/net/analyse/hytale/update/HytaleUpdateChecker.java rename to hytale/src/main/java/com/serverstats/hytale/update/HytaleUpdateChecker.java index 90093b7..f5f7f95 100644 --- a/hytale/src/main/java/net/analyse/hytale/update/HytaleUpdateChecker.java +++ b/hytale/src/main/java/com/serverstats/hytale/update/HytaleUpdateChecker.java @@ -1,7 +1,7 @@ -package net.analyse.hytale.update; +package com.serverstats.hytale.update; -import net.analyse.hytale.HytalePlugin; -import net.analyse.sdk.update.UpdateChecker; +import com.serverstats.hytale.HytalePlugin; +import com.serverstats.sdk.update.UpdateChecker; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; @@ -71,7 +71,7 @@ public void check(boolean force) { public void onUpdateAvailable(String currentVersion, String newVersion, String downloadUrl) { // Log to console plugin.logInfo("╔════════════════════════════════════════════════════════════╗"); - plugin.logInfo("║ A new version of Analyse is available! ║"); + plugin.logInfo("║ A new version of ServerStats is available! ║"); plugin.logInfo("║ Current: " + padRight(currentVersion, 20) + " Latest: " + padRight(newVersion, 20) + "║"); plugin.logInfo("║ Download: " + padRight(downloadUrl, 47) + "║"); plugin.logInfo("╚════════════════════════════════════════════════════════════╝"); diff --git a/hytale/src/main/java/net/analyse/hytale/util/ComponentUtil.java b/hytale/src/main/java/com/serverstats/hytale/util/ComponentUtil.java similarity index 99% rename from hytale/src/main/java/net/analyse/hytale/util/ComponentUtil.java rename to hytale/src/main/java/com/serverstats/hytale/util/ComponentUtil.java index 95dc943..a974950 100644 --- a/hytale/src/main/java/net/analyse/hytale/util/ComponentUtil.java +++ b/hytale/src/main/java/com/serverstats/hytale/util/ComponentUtil.java @@ -1,4 +1,4 @@ -package net.analyse.hytale.util; +package com.serverstats.hytale.util; import com.hypixel.hytale.server.core.Message; import java.util.Map; diff --git a/hytale/src/main/resources/manifest.json b/hytale/src/main/resources/manifest.json index 727233a..00f84b3 100644 --- a/hytale/src/main/resources/manifest.json +++ b/hytale/src/main/resources/manifest.json @@ -1,14 +1,14 @@ { - "Group": "Analyse", - "Name": "Analyse", + "Group": "ServerStats", + "Name": "ServerStats", "Version": "${version}", "Description": "Analytics plugin for Hytale servers", "Authors": [{"Name": "VertCode"}], - "Website": "https://analyse.net", + "Website": "https://serverstats.com", "ServerVersion": "*", "Dependencies": {}, "OptionalDependencies": {}, "DisabledByDefault": false, - "Main": "net.analyse.hytale.HytalePlugin", + "Main": "com.serverstats.hytale.HytalePlugin", "IncludesAssetPack": false } diff --git a/paper/build.gradle b/paper/build.gradle index 954f095..d8344dc 100644 --- a/paper/build.gradle +++ b/paper/build.gradle @@ -22,7 +22,7 @@ java { } tasks.named('shadowJar', com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) { - archiveBaseName.set('analyse-paper') + archiveBaseName.set('serverstats-paper') archiveClassifier.set('') } diff --git a/paper/src/main/java/net/analyse/paper/AnalysePlugin.java b/paper/src/main/java/com/serverstats/paper/ServerStatsPlugin.java similarity index 73% rename from paper/src/main/java/net/analyse/paper/AnalysePlugin.java rename to paper/src/main/java/com/serverstats/paper/ServerStatsPlugin.java index f886d44..d0a0b96 100644 --- a/paper/src/main/java/net/analyse/paper/AnalysePlugin.java +++ b/paper/src/main/java/com/serverstats/paper/ServerStatsPlugin.java @@ -1,26 +1,26 @@ -package net.analyse.paper; +package com.serverstats.paper; import co.aikar.commands.PaperCommandManager; -import net.analyse.api.Analyse; -import net.analyse.api.AnalyseProvider; -import net.analyse.api.BuildConstants; -import net.analyse.api.exception.AnalyseException; -import net.analyse.api.object.builder.EventBuilder; -import net.analyse.api.platform.AnalysePlatform; -import net.analyse.paper.manager.ABTestManager; -import net.analyse.paper.command.AnalyseCommand; -import net.analyse.paper.config.AnalysePaperConfig; -import net.analyse.paper.listener.PlayerListener; -import net.analyse.paper.manager.SessionManager; -import net.analyse.paper.task.HeartbeatTask; -import net.analyse.paper.update.PaperUpdateChecker; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.AnalyseClient; -import net.analyse.sdk.config.AnalyseConfig; -import net.analyse.sdk.request.EventRequest; -import net.analyse.sdk.request.JoinRequest; -import net.analyse.sdk.response.EventResponse; -import net.analyse.sdk.response.JoinResponse; +import com.serverstats.api.ServerStats; +import com.serverstats.api.ServerStatsProvider; +import com.serverstats.api.BuildConstants; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.api.object.builder.EventBuilder; +import com.serverstats.api.platform.ServerStatsPlatform; +import com.serverstats.paper.manager.ABTestManager; +import com.serverstats.paper.command.ServerStatsCommand; +import com.serverstats.paper.config.ServerStatsPaperConfig; +import com.serverstats.paper.listener.PlayerListener; +import com.serverstats.paper.manager.SessionManager; +import com.serverstats.paper.task.HeartbeatTask; +import com.serverstats.paper.update.PaperUpdateChecker; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.ServerStatsClient; +import com.serverstats.sdk.config.ServerStatsConfig; +import com.serverstats.sdk.request.EventRequest; +import com.serverstats.sdk.request.JoinRequest; +import com.serverstats.sdk.response.EventResponse; +import com.serverstats.sdk.response.JoinResponse; import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.scheduler.BukkitTask; @@ -29,24 +29,24 @@ import java.util.function.Consumer; /** - * Analyse plugin for Paper/Spigot/Bukkit servers + * ServerStats plugin for Paper/Spigot/Bukkit servers */ -public class AnalysePlugin extends JavaPlugin implements AnalysePlatform { +public class ServerStatsPlugin extends JavaPlugin implements ServerStatsPlatform { - private AnalysePaperConfig pluginConfig; + private ServerStatsPaperConfig pluginConfig; private SessionManager sessionManager; private ABTestManager abTestManager; - private AnalyseClient client; + private ServerStatsClient client; private BukkitTask heartbeatTask; private PaperUpdateChecker updateChecker; private boolean configValid = false; @Override public void onLoad() { - getLogger().info("Loading Analyse..."); + getLogger().info("Loading ServerStats..."); // Load configuration - pluginConfig = new AnalysePaperConfig(this); + pluginConfig = new ServerStatsPaperConfig(this); // Validate configuration if (!pluginConfig.isValid()) { @@ -62,22 +62,22 @@ public void onLoad() { public void onEnable() { // Check if config was valid if (!configValid) { - getLogger().severe("Cannot enable Analyse - invalid configuration!"); + getLogger().severe("Cannot enable ServerStats - invalid configuration!"); getServer().getPluginManager().disablePlugin(this); return; } - getLogger().info("Enabling Analyse..."); + getLogger().info("Enabling ServerStats..."); // Initialize SDK client - AnalyseConfig sdkConfig = new AnalyseConfig(pluginConfig.getApiKey()); - client = new AnalyseClient(sdkConfig); + ServerStatsConfig sdkConfig = new ServerStatsConfig(pluginConfig.getApiKey()); + client = new ServerStatsClient(sdkConfig); - // Register with the API provider so other plugins can use Analyse.get() - AnalyseProvider.register(this); + // Register with the API provider so other plugins can use ServerStats.get() + ServerStatsProvider.register(this); - // Set up the event sender for Analyse.trackEvent() - Analyse.setEventSender(this::sendEvent); + // Set up the event sender for ServerStats.trackEvent() + ServerStats.setEventSender(this::sendEvent); // Initialize session manager sessionManager = new SessionManager(); @@ -88,7 +88,7 @@ public void onEnable() { // Register commands using ACF PaperCommandManager commandManager = new PaperCommandManager(this); - commandManager.registerCommand(new AnalyseCommand(this)); + commandManager.registerCommand(new ServerStatsCommand(this)); // Start heartbeat task (every 30 seconds = 600 ticks) heartbeatTask = getServer().getScheduler().runTaskTimerAsynchronously( @@ -109,7 +109,7 @@ public void onEnable() { // Initialize sessions for players already online (in case of reload) initializeOnlinePlayers(); - getLogger().info("Analyse enabled successfully!"); + getLogger().info("ServerStats enabled successfully!"); } /** @@ -136,7 +136,7 @@ private void sendEvent(EventBuilder event, Consumer callback) { event.getValue() ); - client.trackEvent(request, new AnalyseCallback<>() { + client.trackEvent(request, new ServerStatsCallback<>() { @Override public void onSuccess(EventResponse response) { if (isDebugEnabled()) { @@ -150,7 +150,7 @@ public void onSuccess(EventResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { logWarning(String.format("Failed to track event '%s': %s", event.getName(), exception.getMessage())); @@ -200,7 +200,7 @@ private void initializeOnlinePlayers() { // Send join event to the API JoinRequest request = new JoinRequest(uuid, username, hostname, ip, isBedrock); - client.join(request, new AnalyseCallback<>() { + client.join(request, new ServerStatsCallback<>() { @Override public void onSuccess(JoinResponse response) { sessionManager.getSession(uuid).ifPresent(session -> session.setSessionId(response.getSessionId())); @@ -209,7 +209,7 @@ public void onSuccess(JoinResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { getLogger().warning(String.format("Failed to send join event for existing player %s: %s", username, exception.getMessage())); } @@ -219,13 +219,13 @@ public void onError(AnalyseException exception) { @Override public void onDisable() { - getLogger().info("Disabling Analyse..."); + getLogger().info("Disabling ServerStats..."); // Unregister from the API provider - AnalyseProvider.unregister(); + ServerStatsProvider.unregister(); // Clear the event sender - Analyse.setEventSender(null); + ServerStats.setEventSender(null); // Stop A/B test manager if (abTestManager != null) { @@ -247,7 +247,7 @@ public void onDisable() { client.shutdown(); } - getLogger().info("Analyse disabled"); + getLogger().info("ServerStats disabled"); } /** @@ -273,7 +273,7 @@ public void debug(String format, Object... args) { } } - // ========== AnalysePlatform Interface Methods ========== + // ========== ServerStatsPlatform Interface Methods ========== @Override public SessionManager getSessionManager() { @@ -312,16 +312,16 @@ public String getVersion() { * * @return The plugin config */ - public AnalysePaperConfig getPluginConfig() { + public ServerStatsPaperConfig getPluginConfig() { return pluginConfig; } /** * Get the SDK client * - * @return The Analyse client + * @return The ServerStats client */ - public AnalyseClient getClient() { + public ServerStatsClient getClient() { return client; } diff --git a/paper/src/main/java/net/analyse/paper/command/AnalyseCommand.java b/paper/src/main/java/com/serverstats/paper/command/ServerStatsCommand.java similarity index 79% rename from paper/src/main/java/net/analyse/paper/command/AnalyseCommand.java rename to paper/src/main/java/com/serverstats/paper/command/ServerStatsCommand.java index c5d7d4c..6081633 100644 --- a/paper/src/main/java/net/analyse/paper/command/AnalyseCommand.java +++ b/paper/src/main/java/com/serverstats/paper/command/ServerStatsCommand.java @@ -1,4 +1,4 @@ -package net.analyse.paper.command; +package com.serverstats.paper.command; import co.aikar.commands.BaseCommand; import co.aikar.commands.annotation.CommandAlias; @@ -8,17 +8,17 @@ import co.aikar.commands.annotation.Description; import co.aikar.commands.annotation.Subcommand; import co.aikar.commands.annotation.Syntax; -import net.analyse.api.Analyse; -import net.analyse.api.BuildConstants; -import net.analyse.api.exception.AnalyseException; -import net.analyse.api.object.builder.EventBuilder; -import net.analyse.paper.AnalysePlugin; -import net.analyse.paper.object.session.PlayerSession; -import net.analyse.paper.util.ComponentUtil; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.request.PlayerInfoRequest; -import net.analyse.sdk.response.PlayerInfoResponse; -import net.analyse.sdk.response.ServerInfoResponse; +import com.serverstats.api.ServerStats; +import com.serverstats.api.BuildConstants; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.api.object.builder.EventBuilder; +import com.serverstats.paper.ServerStatsPlugin; +import com.serverstats.paper.object.session.PlayerSession; +import com.serverstats.paper.util.ComponentUtil; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.request.PlayerInfoRequest; +import com.serverstats.sdk.response.PlayerInfoResponse; +import com.serverstats.sdk.response.ServerInfoResponse; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -28,14 +28,14 @@ import java.util.Map; /** - * Main command handler for the Analyse plugin using ACF + * Main command handler for the ServerStats plugin using ACF */ -@CommandAlias("analyse|analytics|anl") -public class AnalyseCommand extends BaseCommand { +@CommandAlias("serverstats|analyse|ss") +public class ServerStatsCommand extends BaseCommand { - private final AnalysePlugin plugin; + private final ServerStatsPlugin plugin; - public AnalyseCommand(AnalysePlugin plugin) { + public ServerStatsCommand(ServerStatsPlugin plugin) { this.plugin = plugin; } @@ -43,7 +43,7 @@ public AnalyseCommand(AnalysePlugin plugin) { @Description("Show plugin info") public void onDefault(CommandSender sender) { // Check if user has admin permission - if (sender.hasPermission("analyse.command.status")) { + if (sender.hasPermission("serverstats.command.status")) { showStatus(sender); } else { showPublicInfo(sender); @@ -52,7 +52,7 @@ public void onDefault(CommandSender sender) { @Subcommand("status") @Description("Show plugin status") - @CommandPermission("analyse.command.status") + @CommandPermission("serverstats.command.status") public void onStatus(CommandSender sender) { showStatus(sender); } @@ -64,11 +64,11 @@ public void onStatus(CommandSender sender) { */ private void showPublicInfo(CommandSender sender) { StringBuilder message = new StringBuilder(); - message.append("#3498db&l「 Analyse 」&r\n"); - message.append(" #5dade2┃ &7This server uses &fAnalyse &7to track\n"); + message.append("#3498db&l「 ServerStats 」&r\n"); + message.append(" #5dade2┃ &7This server uses &fServerStats &7to track\n"); message.append(" #5dade2┃ &7player analytics and sessions.&r\n"); message.append("&r\n"); - message.append(" &7→ &fanalyse.net&r\n"); + message.append(" &7→ &fserverstats.com&r\n"); send(sender, message.toString()); } @@ -78,14 +78,14 @@ private void showPublicInfo(CommandSender sender) { * @param sender The command sender */ private void showStatus(CommandSender sender) { - boolean connected = Analyse.isAvailable(); + boolean connected = ServerStats.isAvailable(); int trackedPlayers = plugin.getSessionManager().getSessionCount(); boolean debugEnabled = plugin.isDebugEnabled(); StringBuilder message = new StringBuilder(); - message.append("#3498db&l「 Analyse &r&fv").append(BuildConstants.VERSION).append(" #3498db&l」&r\n"); + message.append("#3498db&l「 ServerStats &r&fv").append(BuildConstants.VERSION).append(" #3498db&l」&r\n"); message.append(" #5dade2┃ &fStatus: ").append(connected ? "&a● Connected" : "&c● Disconnected").append("&r\n"); - message.append(" #5dade2┃ &fAPI: &7api.analyse.net&r\n"); + message.append(" #5dade2┃ &fAPI: &7api.serverstats.com&r\n"); message.append(" #5dade2┃ &fPlayers Tracked: &7").append(trackedPlayers).append("&r\n"); message.append(" #5dade2┃ &fDebug: ").append(debugEnabled ? "&aEnabled" : "&7Disabled").append("&r\n"); send(sender, message.toString()); @@ -93,15 +93,15 @@ private void showStatus(CommandSender sender) { @Subcommand("reload") @Description("Reload configuration") - @CommandPermission("analyse.command.reload") + @CommandPermission("serverstats.command.reload") public void onReload(CommandSender sender) { plugin.reloadConfig(); - send(sender, "&aAnalyse configuration reloaded."); + send(sender, "&aServerStats configuration reloaded."); } @Subcommand("debug") @Description("Toggle debug mode") - @CommandPermission("analyse.command.debug") + @CommandPermission("serverstats.command.debug") public void onDebug(CommandSender sender) { boolean newState = !plugin.getPluginConfig().isDebug(); plugin.getPluginConfig().setDebug(newState); @@ -115,17 +115,17 @@ public void onDebug(CommandSender sender) { @Subcommand("event") @Description("Send a custom event") - @CommandPermission("analyse.command.event") + @CommandPermission("serverstats.command.event") @Syntax(" [--player ] [--value ] [--data ...]") @CommandCompletion("test_event|custom_event @players") public void onEvent(CommandSender sender, String[] args) { if (args.length == 0) { - send(sender, "&cUsage: /analyse event [--player ] [--value ] [--data key=value...]"); + send(sender, "&cUsage: /serverstats event [--player ] [--value ] [--data key=value...]"); return; } - if (!Analyse.isAvailable()) { - send(sender, "&cAnalyse is not connected. Cannot send events."); + if (!ServerStats.isAvailable()) { + send(sender, "&cServerStats is not connected. Cannot send events."); return; } @@ -164,7 +164,7 @@ public void onEvent(CommandSender sender, String[] args) { } // Build the event - EventBuilder builder = Analyse.trackEvent(eventName); + EventBuilder builder = ServerStats.trackEvent(eventName); // Add player if specified if (playerName != null) { @@ -214,12 +214,12 @@ public void onEvent(CommandSender sender, String[] args) { @Subcommand("info") @Description("View server or player analytics") - @CommandPermission("analyse.command.info") + @CommandPermission("serverstats.command.info") @Syntax("[player]") @CommandCompletion("@players") public void onInfo(CommandSender sender, String[] args) { - if (!Analyse.isAvailable()) { - send(sender, "&cAnalyse is not connected."); + if (!ServerStats.isAvailable()) { + send(sender, "&cServerStats is not connected."); return; } @@ -242,7 +242,7 @@ private void showServerInfo(CommandSender sender) { int onlinePlayers = Bukkit.getOnlinePlayers().size(); // Fetch additional data from API - plugin.getClient().getServerInfo(new AnalyseCallback<>() { + plugin.getClient().getServerInfo(new ServerStatsCallback<>() { @Override public void onSuccess(ServerInfoResponse response) { Bukkit.getScheduler().runTask(plugin, () -> { @@ -264,7 +264,7 @@ public void onSuccess(ServerInfoResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { Bukkit.getScheduler().runTask(plugin, () -> { StringBuilder message = new StringBuilder(); message.append("#3498db&l「 Server Analytics 」&r\n"); @@ -293,7 +293,7 @@ private void showPlayerInfo(CommandSender sender, String playerName) { PlayerSession session = plugin.getSessionManager().getSession(player.getUniqueId()).orElse(null); // Fetch additional data from API - plugin.getClient().getPlayerInfo(new PlayerInfoRequest(player.getUniqueId()), new AnalyseCallback<>() { + plugin.getClient().getPlayerInfo(new PlayerInfoRequest(player.getUniqueId()), new ServerStatsCallback<>() { @Override public void onSuccess(PlayerInfoResponse response) { Bukkit.getScheduler().runTask(plugin, () -> { @@ -302,7 +302,7 @@ public void onSuccess(PlayerInfoResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { Bukkit.getScheduler().runTask(plugin, () -> { send(sender, buildPlayerInfoMessage(player.getName(), session, null)); }); @@ -387,18 +387,18 @@ private String formatDuration(Duration duration) { @Subcommand("help") @Description("Show help information") - @CommandPermission("analyse.command.help") + @CommandPermission("serverstats.command.help") public void onHelp(CommandSender sender) { StringBuilder message = new StringBuilder(); - message.append("#3498db&l「 Analyse Commands 」&r\n"); - message.append(" #5dade2┃ &f/analyse &7- Show plugin info&r\n"); - message.append(" #5dade2┃ &f/analyse status &7- Show plugin status&r\n"); - message.append(" #5dade2┃ &f/analyse info &7- View server analytics&r\n"); - message.append(" #5dade2┃ &f/analyse info &7- View player analytics&r\n"); - message.append(" #5dade2┃ &f/analyse reload &7- Reload configuration&r\n"); - message.append(" #5dade2┃ &f/analyse debug &7- Toggle debug mode&r\n"); - message.append(" #5dade2┃ &f/analyse event &7- Send custom event&r\n"); - message.append(" #5dade2┃ &f/analyse help &7- Show this help&r\n"); + message.append("#3498db&l「 ServerStats Commands 」&r\n"); + message.append(" #5dade2┃ &f/serverstats &7- Show plugin info&r\n"); + message.append(" #5dade2┃ &f/serverstats status &7- Show plugin status&r\n"); + message.append(" #5dade2┃ &f/serverstats info &7- View server analytics&r\n"); + message.append(" #5dade2┃ &f/serverstats info &7- View player analytics&r\n"); + message.append(" #5dade2┃ &f/serverstats reload &7- Reload configuration&r\n"); + message.append(" #5dade2┃ &f/serverstats debug &7- Toggle debug mode&r\n"); + message.append(" #5dade2┃ &f/serverstats event &7- Send custom event&r\n"); + message.append(" #5dade2┃ &f/serverstats help &7- Show this help&r\n"); send(sender, message.toString()); } diff --git a/paper/src/main/java/net/analyse/paper/config/AnalysePaperConfig.java b/paper/src/main/java/com/serverstats/paper/config/ServerStatsPaperConfig.java similarity index 92% rename from paper/src/main/java/net/analyse/paper/config/AnalysePaperConfig.java rename to paper/src/main/java/com/serverstats/paper/config/ServerStatsPaperConfig.java index 2bac389..1388ea6 100644 --- a/paper/src/main/java/net/analyse/paper/config/AnalysePaperConfig.java +++ b/paper/src/main/java/com/serverstats/paper/config/ServerStatsPaperConfig.java @@ -1,4 +1,4 @@ -package net.analyse.paper.config; +package com.serverstats.paper.config; import lombok.Getter; import org.bukkit.configuration.file.FileConfiguration; @@ -8,7 +8,7 @@ * Configuration for the Paper plugin */ @Getter -public class AnalysePaperConfig { +public class ServerStatsPaperConfig { private boolean debug; private final String apiKey; @@ -20,7 +20,7 @@ public class AnalysePaperConfig { * * @param plugin The plugin instance */ - public AnalysePaperConfig(JavaPlugin plugin) { + public ServerStatsPaperConfig(JavaPlugin plugin) { plugin.saveDefaultConfig(); FileConfiguration config = plugin.getConfig(); diff --git a/paper/src/main/java/net/analyse/paper/listener/PlayerListener.java b/paper/src/main/java/com/serverstats/paper/listener/PlayerListener.java similarity index 82% rename from paper/src/main/java/net/analyse/paper/listener/PlayerListener.java rename to paper/src/main/java/com/serverstats/paper/listener/PlayerListener.java index 2e5d47d..20345c6 100644 --- a/paper/src/main/java/net/analyse/paper/listener/PlayerListener.java +++ b/paper/src/main/java/com/serverstats/paper/listener/PlayerListener.java @@ -1,15 +1,15 @@ -package net.analyse.paper.listener; - -import net.analyse.paper.AnalysePlugin; -import net.analyse.paper.manager.SessionManager; -import net.analyse.paper.object.session.PlayerSession; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.AnalyseClient; -import net.analyse.api.exception.AnalyseException; -import net.analyse.sdk.request.JoinRequest; -import net.analyse.sdk.request.LeaveRequest; -import net.analyse.sdk.response.JoinResponse; -import net.analyse.sdk.response.LeaveResponse; +package com.serverstats.paper.listener; + +import com.serverstats.paper.ServerStatsPlugin; +import com.serverstats.paper.manager.SessionManager; +import com.serverstats.paper.object.session.PlayerSession; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.ServerStatsClient; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.sdk.request.JoinRequest; +import com.serverstats.sdk.request.LeaveRequest; +import com.serverstats.sdk.response.JoinResponse; +import com.serverstats.sdk.response.LeaveResponse; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -26,12 +26,12 @@ */ public class PlayerListener implements Listener { - private final AnalysePlugin plugin; + private final ServerStatsPlugin plugin; private final Logger logger; private final SessionManager sessionManager; - private final AnalyseClient client; + private final ServerStatsClient client; - public PlayerListener(AnalysePlugin plugin, AnalyseClient client) { + public PlayerListener(ServerStatsPlugin plugin, ServerStatsClient client) { this.plugin = plugin; this.logger = plugin.getLogger(); this.sessionManager = plugin.getSessionManager(); @@ -87,7 +87,7 @@ public void onPlayerJoin(PlayerJoinEvent event) { // Send join event to the API JoinRequest request = new JoinRequest(uuid, username, session.getHostname(), session.getIp(), isBedrock); - client.join(request, new AnalyseCallback<>() { + client.join(request, new ServerStatsCallback<>() { @Override public void onSuccess(JoinResponse response) { session.setSessionId(response.getSessionId()); @@ -96,7 +96,7 @@ public void onSuccess(JoinResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { logger.warning(String.format("Failed to send join event for %s: %s", username, exception.getMessage())); } @@ -109,7 +109,7 @@ public void onError(AnalyseException exception) { } // Notify admins about updates on join - if (player.hasPermission("analyse.admin") && plugin.getUpdateChecker() != null) { + if (player.hasPermission("serverstats.admin") && plugin.getUpdateChecker() != null) { if (plugin.getUpdateChecker().isUpdateAvailable()) { // Delay slightly so it appears after other join messages plugin.getServer().getScheduler().runTaskLater(plugin, () -> { @@ -143,14 +143,14 @@ public void onPlayerQuit(PlayerQuitEvent event) { // Send leave event to the API LeaveRequest request = new LeaveRequest(session.getSessionId()); - client.leave(request, new AnalyseCallback<>() { + client.leave(request, new ServerStatsCallback<>() { @Override public void onSuccess(LeaveResponse response) { plugin.debug("Leave event sent for %s (duration: %ds)", username, response.getDuration()); } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { logger.warning(String.format("Failed to send leave event for %s: %s", username, exception.getMessage())); } diff --git a/paper/src/main/java/net/analyse/paper/manager/ABTestManager.java b/paper/src/main/java/com/serverstats/paper/manager/ABTestManager.java similarity index 72% rename from paper/src/main/java/net/analyse/paper/manager/ABTestManager.java rename to paper/src/main/java/com/serverstats/paper/manager/ABTestManager.java index 045aa10..845cd5c 100644 --- a/paper/src/main/java/net/analyse/paper/manager/ABTestManager.java +++ b/paper/src/main/java/com/serverstats/paper/manager/ABTestManager.java @@ -1,14 +1,14 @@ -package net.analyse.paper.manager; - -import net.analyse.api.exception.AnalyseException; -import net.analyse.api.object.abtest.ABTest; -import net.analyse.paper.AnalysePlugin; -import net.analyse.paper.object.action.PaperAction; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.object.action.ActionData; -import net.analyse.sdk.request.ConversionRequest; -import net.analyse.sdk.response.ABTestsResponse; -import net.analyse.sdk.response.ConversionResponse; +package com.serverstats.paper.manager; + +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.api.object.abtest.ABTest; +import com.serverstats.paper.ServerStatsPlugin; +import com.serverstats.paper.object.action.PaperAction; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.object.action.ActionData; +import com.serverstats.sdk.request.ConversionRequest; +import com.serverstats.sdk.response.ABTestsResponse; +import com.serverstats.sdk.response.ConversionResponse; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitTask; import java.util.List; @@ -20,15 +20,15 @@ * Manages A/B tests for the Paper plugin. * Handles fetching, caching, and executing tests. */ -public class ABTestManager implements net.analyse.api.manager.ABTestManager { +public class ABTestManager implements com.serverstats.api.manager.ABTestManager { private static final long SYNC_INTERVAL_TICKS = 20 * 60 * 5; // 5 minutes - private final AnalysePlugin plugin; - private final Map testsCache = new ConcurrentHashMap<>(); + private final ServerStatsPlugin plugin; + private final Map testsCache = new ConcurrentHashMap<>(); private BukkitTask syncTask; - public ABTestManager(AnalysePlugin plugin) { + public ABTestManager(ServerStatsPlugin plugin) { this.plugin = plugin; } @@ -70,12 +70,12 @@ private void syncTests() { return; } - plugin.getClient().getABTests(new AnalyseCallback<>() { + plugin.getClient().getABTests(new ServerStatsCallback<>() { @Override public void onSuccess(ABTestsResponse response) { if (response.isSuccess() && response.getTests() != null) { testsCache.clear(); - for (net.analyse.sdk.object.abtest.ABTest test : response.getTests()) { + for (com.serverstats.sdk.object.abtest.ABTest test : response.getTests()) { if (test.isActive()) { testsCache.put(test.getKey(), test); } @@ -88,7 +88,7 @@ public void onSuccess(ABTestsResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { plugin.logWarning(String.format("Failed to sync A/B tests: %s", exception.getMessage())); } }); @@ -96,7 +96,7 @@ public void onError(AnalyseException exception) { @Override @SuppressWarnings("unchecked") - public List getActiveTests() { + public List getActiveTests() { return List.copyOf(testsCache.values()); } @@ -107,7 +107,7 @@ public ABTest getTest(String testKey) { @Override public String getVariant(UUID playerUuid, String testKey) { - net.analyse.sdk.object.abtest.ABTest test = testsCache.get(testKey); + com.serverstats.sdk.object.abtest.ABTest test = testsCache.get(testKey); if (test == null) { return null; } @@ -131,7 +131,7 @@ public boolean isTestActive(String testKey) { public void processJoin(Player player, boolean firstJoin) { ABTest.Trigger trigger = firstJoin ? ABTest.Trigger.FIRST_JOIN : ABTest.Trigger.EVERY_JOIN; - for (net.analyse.sdk.object.abtest.ABTest test : testsCache.values()) { + for (com.serverstats.sdk.object.abtest.ABTest test : testsCache.values()) { if (!test.matchesTrigger(trigger)) { continue; } @@ -139,7 +139,7 @@ public void processJoin(Player player, boolean firstJoin) { // Assign variant and execute actions var variant = test.assignVariant(player.getUniqueId()); if (variant != null && variant.hasActions()) { - executeActions(player, test, (net.analyse.sdk.object.abtest.Variant) variant); + executeActions(player, test, (com.serverstats.sdk.object.abtest.Variant) variant); } } } @@ -152,7 +152,7 @@ public void processJoin(Player player, boolean firstJoin) { * @return true if the command should be cancelled */ public boolean processCommand(Player player, String command) { - for (net.analyse.sdk.object.abtest.ABTest test : testsCache.values()) { + for (com.serverstats.sdk.object.abtest.ABTest test : testsCache.values()) { if (!test.matchesCommand(command)) { continue; } @@ -160,7 +160,7 @@ public boolean processCommand(Player player, String command) { // Assign variant and execute actions var variant = test.assignVariant(player.getUniqueId()); if (variant != null && variant.hasActions()) { - executeActions(player, test, (net.analyse.sdk.object.abtest.Variant) variant); + executeActions(player, test, (com.serverstats.sdk.object.abtest.Variant) variant); } // Return whether to cancel the original command @@ -177,7 +177,7 @@ public boolean processCommand(Player player, String command) { * @param eventName The event name */ public void processEvent(Player player, String eventName) { - for (net.analyse.sdk.object.abtest.ABTest test : testsCache.values()) { + for (com.serverstats.sdk.object.abtest.ABTest test : testsCache.values()) { if (!test.matchesEvent(eventName)) { continue; } @@ -185,7 +185,7 @@ public void processEvent(Player player, String eventName) { // Assign variant and execute actions var variant = test.assignVariant(player.getUniqueId()); if (variant != null && variant.hasActions()) { - executeActions(player, test, (net.analyse.sdk.object.abtest.Variant) variant); + executeActions(player, test, (com.serverstats.sdk.object.abtest.Variant) variant); } } } @@ -197,8 +197,8 @@ public void processEvent(Player player, String eventName) { * @param test The A/B test * @param variant The assigned variant */ - private void executeActions(Player player, net.analyse.sdk.object.abtest.ABTest test, - net.analyse.sdk.object.abtest.Variant variant) { + private void executeActions(Player player, com.serverstats.sdk.object.abtest.ABTest test, + com.serverstats.sdk.object.abtest.Variant variant) { if (plugin.isDebugEnabled()) { plugin.logInfo(String.format("[DEBUG] Player %s assigned to variant '%s' for test '%s'", player.getName(), variant.getKey(), test.getKey())); @@ -214,7 +214,7 @@ private void executeActions(Player player, net.analyse.sdk.object.abtest.ABTest @Override public void trackConversion(UUID playerUuid, String playerUsername, String testKey, String eventName) { - net.analyse.sdk.object.abtest.ABTest test = testsCache.get(testKey); + com.serverstats.sdk.object.abtest.ABTest test = testsCache.get(testKey); if (test == null) { return; } @@ -226,7 +226,7 @@ public void trackConversion(UUID playerUuid, String playerUsername, String testK testKey, variantKey, playerUuid, playerUsername, eventName, null ); - plugin.getClient().trackConversion(request, new AnalyseCallback<>() { + plugin.getClient().trackConversion(request, new ServerStatsCallback<>() { @Override public void onSuccess(ConversionResponse response) { if (plugin.isDebugEnabled()) { @@ -236,7 +236,7 @@ public void onSuccess(ConversionResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { plugin.logWarning(String.format("Failed to track conversion: %s", exception.getMessage())); } }); diff --git a/hytale/src/main/java/net/analyse/hytale/manager/SessionManager.java b/paper/src/main/java/com/serverstats/paper/manager/SessionManager.java similarity index 89% rename from hytale/src/main/java/net/analyse/hytale/manager/SessionManager.java rename to paper/src/main/java/com/serverstats/paper/manager/SessionManager.java index a200168..d849554 100644 --- a/hytale/src/main/java/net/analyse/hytale/manager/SessionManager.java +++ b/paper/src/main/java/com/serverstats/paper/manager/SessionManager.java @@ -1,6 +1,6 @@ -package net.analyse.hytale.manager; +package com.serverstats.paper.manager; -import net.analyse.hytale.object.session.PlayerSession; +import com.serverstats.paper.object.session.PlayerSession; import java.util.Collection; import java.util.Map; import java.util.Optional; @@ -10,7 +10,7 @@ /** * Thread-safe manager for player sessions */ -public class SessionManager implements net.analyse.api.manager.SessionManager { +public class SessionManager implements com.serverstats.api.manager.SessionManager { private final Map sessions = new ConcurrentHashMap<>(); diff --git a/paper/src/main/java/net/analyse/paper/object/action/PaperAction.java b/paper/src/main/java/com/serverstats/paper/object/action/PaperAction.java similarity index 78% rename from paper/src/main/java/net/analyse/paper/object/action/PaperAction.java rename to paper/src/main/java/com/serverstats/paper/object/action/PaperAction.java index 939e2ea..ac1287f 100644 --- a/paper/src/main/java/net/analyse/paper/object/action/PaperAction.java +++ b/paper/src/main/java/com/serverstats/paper/object/action/PaperAction.java @@ -1,8 +1,8 @@ -package net.analyse.paper.object.action; +package com.serverstats.paper.object.action; -import net.analyse.paper.AnalysePlugin; -import net.analyse.sdk.object.action.Action; -import net.analyse.sdk.object.action.ActionData; +import com.serverstats.paper.ServerStatsPlugin; +import com.serverstats.sdk.object.action.Action; +import com.serverstats.sdk.object.action.ActionData; import org.bukkit.entity.Player; /** @@ -11,10 +11,10 @@ */ public abstract class PaperAction implements Action { - protected final AnalysePlugin plugin; + protected final ServerStatsPlugin plugin; protected final ActionData data; - protected PaperAction(AnalysePlugin plugin, ActionData data) { + protected PaperAction(ServerStatsPlugin plugin, ActionData data) { this.plugin = plugin; this.data = data; } @@ -26,7 +26,7 @@ protected PaperAction(AnalysePlugin plugin, ActionData data) { * @param data The action data from the API * @return The appropriate PaperAction, or null if type is unknown */ - public static PaperAction create(AnalysePlugin plugin, ActionData data) { + public static PaperAction create(ServerStatsPlugin plugin, ActionData data) { if (data == null || data.getType() == null) { return null; } diff --git a/paper/src/main/java/net/analyse/paper/object/action/RunCommandAction.java b/paper/src/main/java/com/serverstats/paper/object/action/RunCommandAction.java similarity index 80% rename from paper/src/main/java/net/analyse/paper/object/action/RunCommandAction.java rename to paper/src/main/java/com/serverstats/paper/object/action/RunCommandAction.java index f233388..6684baa 100644 --- a/paper/src/main/java/net/analyse/paper/object/action/RunCommandAction.java +++ b/paper/src/main/java/com/serverstats/paper/object/action/RunCommandAction.java @@ -1,8 +1,8 @@ -package net.analyse.paper.object.action; +package com.serverstats.paper.object.action; -import net.analyse.paper.AnalysePlugin; -import net.analyse.sdk.object.action.ActionData; -import net.analyse.sdk.object.action.ActionType; +import com.serverstats.paper.ServerStatsPlugin; +import com.serverstats.sdk.object.action.ActionData; +import com.serverstats.sdk.object.action.ActionType; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -12,7 +12,7 @@ */ public class RunCommandAction extends PaperAction { - public RunCommandAction(AnalysePlugin plugin, ActionData data) { + public RunCommandAction(ServerStatsPlugin plugin, ActionData data) { super(plugin, data); } diff --git a/paper/src/main/java/net/analyse/paper/object/action/SendMessageAction.java b/paper/src/main/java/com/serverstats/paper/object/action/SendMessageAction.java similarity index 70% rename from paper/src/main/java/net/analyse/paper/object/action/SendMessageAction.java rename to paper/src/main/java/com/serverstats/paper/object/action/SendMessageAction.java index a4686d6..d34f288 100644 --- a/paper/src/main/java/net/analyse/paper/object/action/SendMessageAction.java +++ b/paper/src/main/java/com/serverstats/paper/object/action/SendMessageAction.java @@ -1,9 +1,9 @@ -package net.analyse.paper.object.action; +package com.serverstats.paper.object.action; -import net.analyse.paper.AnalysePlugin; -import net.analyse.paper.util.ComponentUtil; -import net.analyse.sdk.object.action.ActionData; -import net.analyse.sdk.object.action.ActionType; +import com.serverstats.paper.ServerStatsPlugin; +import com.serverstats.paper.util.ComponentUtil; +import com.serverstats.sdk.object.action.ActionData; +import com.serverstats.sdk.object.action.ActionType; import org.bukkit.entity.Player; /** @@ -12,7 +12,7 @@ */ public class SendMessageAction extends PaperAction { - public SendMessageAction(AnalysePlugin plugin, ActionData data) { + public SendMessageAction(ServerStatsPlugin plugin, ActionData data) { super(plugin, data); } diff --git a/hytale/src/main/java/net/analyse/hytale/object/session/PlayerSession.java b/paper/src/main/java/com/serverstats/paper/object/session/PlayerSession.java similarity index 88% rename from hytale/src/main/java/net/analyse/hytale/object/session/PlayerSession.java rename to paper/src/main/java/com/serverstats/paper/object/session/PlayerSession.java index b34d37d..880f41d 100644 --- a/hytale/src/main/java/net/analyse/hytale/object/session/PlayerSession.java +++ b/paper/src/main/java/com/serverstats/paper/object/session/PlayerSession.java @@ -1,4 +1,4 @@ -package net.analyse.hytale.object.session; +package com.serverstats.paper.object.session; import lombok.Getter; import java.time.Instant; @@ -8,7 +8,7 @@ * Stores session data for a connected player */ @Getter -public class PlayerSession implements net.analyse.api.session.PlayerSession { +public class PlayerSession implements com.serverstats.api.session.PlayerSession { private final UUID playerUuid; private final String hostname; diff --git a/paper/src/main/java/net/analyse/paper/task/HeartbeatTask.java b/paper/src/main/java/com/serverstats/paper/task/HeartbeatTask.java similarity index 67% rename from paper/src/main/java/net/analyse/paper/task/HeartbeatTask.java rename to paper/src/main/java/com/serverstats/paper/task/HeartbeatTask.java index f73c207..1ad4347 100644 --- a/paper/src/main/java/net/analyse/paper/task/HeartbeatTask.java +++ b/paper/src/main/java/com/serverstats/paper/task/HeartbeatTask.java @@ -1,14 +1,14 @@ -package net.analyse.paper.task; +package com.serverstats.paper.task; -import net.analyse.paper.AnalysePlugin; -import net.analyse.paper.object.session.PlayerSession; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.AnalyseClient; -import net.analyse.api.exception.AnalyseException; -import net.analyse.sdk.request.HeartbeatRequest; -import net.analyse.sdk.request.PlayerInfo; -import net.analyse.sdk.request.ServerType; -import net.analyse.sdk.response.HeartbeatResponse; +import com.serverstats.paper.ServerStatsPlugin; +import com.serverstats.paper.object.session.PlayerSession; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.ServerStatsClient; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.sdk.request.HeartbeatRequest; +import com.serverstats.sdk.request.PlayerInfo; +import com.serverstats.sdk.request.ServerType; +import com.serverstats.sdk.response.HeartbeatResponse; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import java.util.List; @@ -20,11 +20,11 @@ */ public class HeartbeatTask implements Runnable { - private final AnalysePlugin plugin; + private final ServerStatsPlugin plugin; private final Logger logger; - private final AnalyseClient client; + private final ServerStatsClient client; - public HeartbeatTask(AnalysePlugin plugin, AnalyseClient client) { + public HeartbeatTask(ServerStatsPlugin plugin, ServerStatsClient client) { this.plugin = plugin; this.logger = plugin.getLogger(); this.client = client; @@ -40,14 +40,14 @@ public void run() { String instanceId = plugin.getPluginConfig().getInstanceId(); HeartbeatRequest request = new HeartbeatRequest(instanceId, ServerType.MINECRAFT, onlinePlayers); - client.heartbeat(request, new AnalyseCallback<>() { + client.heartbeat(request, new ServerStatsCallback<>() { @Override public void onSuccess(HeartbeatResponse response) { plugin.debug("Heartbeat sent (%d players)", response.getOnlineCount()); } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { logger.warning(String.format("Failed to send heartbeat: %s", exception.getMessage())); } }); diff --git a/paper/src/main/java/net/analyse/paper/update/PaperUpdateChecker.java b/paper/src/main/java/com/serverstats/paper/update/PaperUpdateChecker.java similarity index 89% rename from paper/src/main/java/net/analyse/paper/update/PaperUpdateChecker.java rename to paper/src/main/java/com/serverstats/paper/update/PaperUpdateChecker.java index 5b91312..a74cf2f 100644 --- a/paper/src/main/java/net/analyse/paper/update/PaperUpdateChecker.java +++ b/paper/src/main/java/com/serverstats/paper/update/PaperUpdateChecker.java @@ -1,8 +1,8 @@ -package net.analyse.paper.update; +package com.serverstats.paper.update; -import net.analyse.paper.AnalysePlugin; -import net.analyse.paper.util.ComponentUtil; -import net.analyse.sdk.update.UpdateChecker; +import com.serverstats.paper.ServerStatsPlugin; +import com.serverstats.paper.util.ComponentUtil; +import com.serverstats.sdk.update.UpdateChecker; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitTask; @@ -12,9 +12,9 @@ public class PaperUpdateChecker { private static final long CHECK_INTERVAL_TICKS = 20 * 60 * 30; // 30 minutes - private static final String ADMIN_PERMISSION = "analyse.admin"; + private static final String ADMIN_PERMISSION = "serverstats.admin"; - private final AnalysePlugin plugin; + private final ServerStatsPlugin plugin; private final UpdateChecker checker; private BukkitTask task; @@ -24,7 +24,7 @@ public class PaperUpdateChecker { * @param plugin The plugin instance * @param currentVersion The current plugin version */ - public PaperUpdateChecker(AnalysePlugin plugin, String currentVersion) { + public PaperUpdateChecker(ServerStatsPlugin plugin, String currentVersion) { this.plugin = plugin; this.checker = new UpdateChecker(plugin.getClient(), currentVersion, "paper"); } @@ -68,7 +68,7 @@ public void check(boolean force) { public void onUpdateAvailable(String currentVersion, String newVersion, String downloadUrl) { // Log to console plugin.logInfo("╔════════════════════════════════════════════════════════════╗"); - plugin.logInfo("║ A new version of Analyse is available! ║"); + plugin.logInfo("║ A new version of ServerStats is available! ║"); plugin.logInfo("║ Current: " + padRight(currentVersion, 20) + " Latest: " + padRight(newVersion, 20) + "║"); plugin.logInfo("║ Download: " + padRight(downloadUrl, 47) + "║"); plugin.logInfo("╚════════════════════════════════════════════════════════════╝"); @@ -120,7 +120,7 @@ private void notifyAdmins(String currentVersion, String newVersion, String downl */ public void sendUpdateMessage(Player player, String currentVersion, String newVersion, String downloadUrl) { player.sendMessage(ComponentUtil.parse(" ")); - player.sendMessage(ComponentUtil.parse("Analyse » A new version is available!")); + player.sendMessage(ComponentUtil.parse("ServerStats » A new version is available!")); player.sendMessage(ComponentUtil.parse("Current: %current% Latest: %latest%", "current", currentVersion, "latest", newVersion)); player.sendMessage(ComponentUtil.parse("Download: %url%", "url", downloadUrl)); diff --git a/velocity/src/main/java/net/analyse/velocity/util/ComponentUtil.java b/paper/src/main/java/com/serverstats/paper/util/ComponentUtil.java similarity index 99% rename from velocity/src/main/java/net/analyse/velocity/util/ComponentUtil.java rename to paper/src/main/java/com/serverstats/paper/util/ComponentUtil.java index d0f7147..115c6ad 100644 --- a/velocity/src/main/java/net/analyse/velocity/util/ComponentUtil.java +++ b/paper/src/main/java/com/serverstats/paper/util/ComponentUtil.java @@ -1,4 +1,4 @@ -package net.analyse.velocity.util; +package com.serverstats.paper.util; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; diff --git a/paper/src/main/resources/config.yml b/paper/src/main/resources/config.yml index 6204cc1..3feb0ee 100644 --- a/paper/src/main/resources/config.yml +++ b/paper/src/main/resources/config.yml @@ -1,9 +1,9 @@ -# Analyse Plugin Configuration +# ServerStats Plugin Configuration # Enable debug logging for troubleshooting debug: false -# Your server's API key from the Analyse dashboard +# Your server's API key from the ServerStats dashboard api-key: "anl_your_api_key_here" # Bedrock player username prefix (used by Floodgate/Geyser) diff --git a/paper/src/main/resources/paper-plugin.yml b/paper/src/main/resources/paper-plugin.yml index 07f8b30..ec14c9c 100644 --- a/paper/src/main/resources/paper-plugin.yml +++ b/paper/src/main/resources/paper-plugin.yml @@ -1,20 +1,20 @@ -name: Analyse +name: ServerStats version: ${version} -main: net.analyse.paper.AnalysePlugin +main: com.serverstats.paper.ServerStatsPlugin api-version: "1.21" -description: Analyse tracking plugin +description: ServerStats tracking plugin author: VertCode permissions: - analyse.command: - description: Base permission for analyse commands + serverstats.command: + description: Base permission for serverstats commands default: op - analyse.command.reload: + serverstats.command.reload: description: Permission to reload the plugin default: op - analyse.command.debug: + serverstats.command.debug: description: Permission to toggle debug mode default: op - analyse.command.event: + serverstats.command.event: description: Permission to send custom events default: op diff --git a/sdk/src/main/java/net/analyse/sdk/AnalyseCallback.java b/sdk/src/main/java/com/serverstats/sdk/ServerStatsCallback.java similarity index 65% rename from sdk/src/main/java/net/analyse/sdk/AnalyseCallback.java rename to sdk/src/main/java/com/serverstats/sdk/ServerStatsCallback.java index 80106f3..8510bee 100644 --- a/sdk/src/main/java/net/analyse/sdk/AnalyseCallback.java +++ b/sdk/src/main/java/com/serverstats/sdk/ServerStatsCallback.java @@ -1,13 +1,13 @@ -package net.analyse.sdk; +package com.serverstats.sdk; -import net.analyse.api.exception.AnalyseException; +import com.serverstats.api.exception.ServerStatsException; /** * Callback interface for async API responses * * @param The response type */ -public interface AnalyseCallback { +public interface ServerStatsCallback { /** * Called when the API request succeeds @@ -21,6 +21,6 @@ public interface AnalyseCallback { * * @param exception The exception that occurred */ - void onError(AnalyseException exception); + void onError(ServerStatsException exception); } diff --git a/sdk/src/main/java/net/analyse/sdk/AnalyseClient.java b/sdk/src/main/java/com/serverstats/sdk/ServerStatsClient.java similarity index 62% rename from sdk/src/main/java/net/analyse/sdk/AnalyseClient.java rename to sdk/src/main/java/com/serverstats/sdk/ServerStatsClient.java index b9f19cc..607b43c 100644 --- a/sdk/src/main/java/net/analyse/sdk/AnalyseClient.java +++ b/sdk/src/main/java/com/serverstats/sdk/ServerStatsClient.java @@ -1,27 +1,27 @@ -package net.analyse.sdk; - -import net.analyse.sdk.config.AnalyseConfig; -import net.analyse.sdk.http.AnalyseHttpClient; -import net.analyse.sdk.request.ConversionRequest; -import net.analyse.sdk.request.EventRequest; -import net.analyse.sdk.request.HeartbeatRequest; -import net.analyse.sdk.request.JoinRequest; -import net.analyse.sdk.request.LeaveRequest; -import net.analyse.sdk.request.PlayerInfoRequest; -import net.analyse.sdk.response.ABTestsResponse; -import net.analyse.sdk.response.ConversionResponse; -import net.analyse.sdk.response.EventResponse; -import net.analyse.sdk.response.HeartbeatResponse; -import net.analyse.sdk.response.JoinResponse; -import net.analyse.sdk.response.LeaveResponse; -import net.analyse.sdk.response.PlayerInfoResponse; -import net.analyse.sdk.response.ServerInfoResponse; -import net.analyse.sdk.response.VersionResponse; +package com.serverstats.sdk; + +import com.serverstats.sdk.config.ServerStatsConfig; +import com.serverstats.sdk.http.ServerStatsHttpClient; +import com.serverstats.sdk.request.ConversionRequest; +import com.serverstats.sdk.request.EventRequest; +import com.serverstats.sdk.request.HeartbeatRequest; +import com.serverstats.sdk.request.JoinRequest; +import com.serverstats.sdk.request.LeaveRequest; +import com.serverstats.sdk.request.PlayerInfoRequest; +import com.serverstats.sdk.response.ABTestsResponse; +import com.serverstats.sdk.response.ConversionResponse; +import com.serverstats.sdk.response.EventResponse; +import com.serverstats.sdk.response.HeartbeatResponse; +import com.serverstats.sdk.response.JoinResponse; +import com.serverstats.sdk.response.LeaveResponse; +import com.serverstats.sdk.response.PlayerInfoResponse; +import com.serverstats.sdk.response.ServerInfoResponse; +import com.serverstats.sdk.response.VersionResponse; /** - * Main client for interacting with the Analyse API + * Main client for interacting with the ServerStats API */ -public class AnalyseClient { +public class ServerStatsClient { private static final String ENDPOINT_JOIN = "/v1/plugin/join"; private static final String ENDPOINT_LEAVE = "/v1/plugin/leave"; @@ -33,15 +33,15 @@ public class AnalyseClient { private static final String ENDPOINT_SERVER_INFO = "/v1/plugin/info"; private static final String ENDPOINT_PLAYER_INFO = "/v1/plugin/player"; - private final AnalyseHttpClient httpClient; + private final ServerStatsHttpClient httpClient; /** * Create a new client with the given configuration * * @param config The SDK configuration */ - public AnalyseClient(AnalyseConfig config) { - this.httpClient = new AnalyseHttpClient(config); + public ServerStatsClient(ServerStatsConfig config) { + this.httpClient = new ServerStatsHttpClient(config); } /** @@ -50,7 +50,7 @@ public AnalyseClient(AnalyseConfig config) { * @param request The join request containing player details * @param callback The callback to invoke on success or failure */ - public void join(JoinRequest request, AnalyseCallback callback) { + public void join(JoinRequest request, ServerStatsCallback callback) { httpClient.post(ENDPOINT_JOIN, request, JoinResponse.class, callback); } @@ -60,7 +60,7 @@ public void join(JoinRequest request, AnalyseCallback callback) { * @param request The leave request containing the session ID * @param callback The callback to invoke on success or failure */ - public void leave(LeaveRequest request, AnalyseCallback callback) { + public void leave(LeaveRequest request, ServerStatsCallback callback) { httpClient.post(ENDPOINT_LEAVE, request, LeaveResponse.class, callback); } @@ -70,7 +70,7 @@ public void leave(LeaveRequest request, AnalyseCallback callback) * @param request The heartbeat request containing online player UUIDs * @param callback The callback to invoke on success or failure */ - public void heartbeat(HeartbeatRequest request, AnalyseCallback callback) { + public void heartbeat(HeartbeatRequest request, ServerStatsCallback callback) { httpClient.post(ENDPOINT_HEARTBEAT, request, HeartbeatResponse.class, callback); } @@ -80,7 +80,7 @@ public void heartbeat(HeartbeatRequest request, AnalyseCallback callback) { + public void trackEvent(EventRequest request, ServerStatsCallback callback) { httpClient.post(ENDPOINT_EVENT, request, EventResponse.class, callback); } @@ -89,7 +89,7 @@ public void trackEvent(EventRequest request, AnalyseCallback call * * @param callback The callback to invoke on success or failure */ - public void getABTests(AnalyseCallback callback) { + public void getABTests(ServerStatsCallback callback) { httpClient.get(ENDPOINT_AB_TESTS, ABTestsResponse.class, callback); } @@ -99,7 +99,7 @@ public void getABTests(AnalyseCallback callback) { * @param request The conversion request containing test and event details * @param callback The callback to invoke on success or failure */ - public void trackConversion(ConversionRequest request, AnalyseCallback callback) { + public void trackConversion(ConversionRequest request, ServerStatsCallback callback) { httpClient.post(ENDPOINT_CONVERSION, request, ConversionResponse.class, callback); } @@ -108,7 +108,7 @@ public void trackConversion(ConversionRequest request, AnalyseCallback callback) { + public void checkVersion(ServerStatsCallback callback) { httpClient.get(ENDPOINT_VERSION, VersionResponse.class, callback); } @@ -117,7 +117,7 @@ public void checkVersion(AnalyseCallback callback) { * * @param callback The callback to invoke on success or failure */ - public void getServerInfo(AnalyseCallback callback) { + public void getServerInfo(ServerStatsCallback callback) { httpClient.get(ENDPOINT_SERVER_INFO, ServerInfoResponse.class, callback); } @@ -127,7 +127,7 @@ public void getServerInfo(AnalyseCallback callback) { * @param request The player info request containing the player UUID * @param callback The callback to invoke on success or failure */ - public void getPlayerInfo(PlayerInfoRequest request, AnalyseCallback callback) { + public void getPlayerInfo(PlayerInfoRequest request, ServerStatsCallback callback) { String endpoint = ENDPOINT_PLAYER_INFO + "/" + request.getUuid(); httpClient.get(endpoint, PlayerInfoResponse.class, callback); } diff --git a/sdk/src/main/java/net/analyse/sdk/config/AnalyseConfig.java b/sdk/src/main/java/com/serverstats/sdk/config/ServerStatsConfig.java similarity index 63% rename from sdk/src/main/java/net/analyse/sdk/config/AnalyseConfig.java rename to sdk/src/main/java/com/serverstats/sdk/config/ServerStatsConfig.java index 647780a..6ee378f 100644 --- a/sdk/src/main/java/net/analyse/sdk/config/AnalyseConfig.java +++ b/sdk/src/main/java/com/serverstats/sdk/config/ServerStatsConfig.java @@ -1,14 +1,14 @@ -package net.analyse.sdk.config; +package com.serverstats.sdk.config; import lombok.Getter; /** - * Configuration for the Analyse SDK + * Configuration for the ServerStats SDK */ @Getter -public class AnalyseConfig { +public class ServerStatsConfig { - private static final String API_URL = "https://api.analyse.net"; + private static final String API_URL = "https://api.serverstats.com"; private final String apiUrl; private final String apiKey; @@ -18,7 +18,7 @@ public class AnalyseConfig { * * @param apiKey The API key for authentication */ - public AnalyseConfig(String apiKey) { + public ServerStatsConfig(String apiKey) { if (apiKey == null || apiKey.isBlank()) { throw new IllegalArgumentException("API key cannot be null or blank"); } diff --git a/sdk/src/main/java/net/analyse/sdk/http/AnalyseHttpClient.java b/sdk/src/main/java/com/serverstats/sdk/http/ServerStatsHttpClient.java similarity index 72% rename from sdk/src/main/java/net/analyse/sdk/http/AnalyseHttpClient.java rename to sdk/src/main/java/com/serverstats/sdk/http/ServerStatsHttpClient.java index c9fcec0..321326e 100644 --- a/sdk/src/main/java/net/analyse/sdk/http/AnalyseHttpClient.java +++ b/sdk/src/main/java/com/serverstats/sdk/http/ServerStatsHttpClient.java @@ -1,10 +1,10 @@ -package net.analyse.sdk.http; +package com.serverstats.sdk.http; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.api.exception.AnalyseException; -import net.analyse.sdk.config.AnalyseConfig; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.sdk.config.ServerStatsConfig; import okhttp3.Call; import okhttp3.Callback; import okhttp3.MediaType; @@ -18,23 +18,23 @@ import java.util.concurrent.TimeUnit; /** - * HTTP client for making async requests to the Analyse API + * HTTP client for making async requests to the ServerStats API */ -public class AnalyseHttpClient { +public class ServerStatsHttpClient { private static final MediaType JSON = MediaType.get("application/json; charset=utf-8"); private static final int TIMEOUT_SECONDS = 10; private final OkHttpClient httpClient; private final Gson gson; - private final AnalyseConfig config; + private final ServerStatsConfig config; /** * Create a new HTTP client with the given configuration * * @param config The SDK configuration */ - public AnalyseHttpClient(AnalyseConfig config) { + public ServerStatsHttpClient(ServerStatsConfig config) { this.config = config; this.gson = new GsonBuilder().create(); this.httpClient = new OkHttpClient.Builder() @@ -53,14 +53,14 @@ public AnalyseHttpClient(AnalyseConfig config) { * @param callback The callback to invoke on success or failure * @param The response type */ - public void post(String endpoint, Object requestBody, Class responseClass, AnalyseCallback callback) { + public void post(String endpoint, Object requestBody, Class responseClass, ServerStatsCallback callback) { String url = config.getApiUrl() + endpoint; String json = gson.toJson(requestBody); String apiKey = config.getApiKey(); // Validate API key before making request if (apiKey == null || apiKey.isBlank()) { - callback.onError(new AnalyseException(401, "API key is not configured")); + callback.onError(new ServerStatsException(401, "API key is not configured")); return; } @@ -75,7 +75,7 @@ public void post(String endpoint, Object requestBody, Class responseClass httpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { - callback.onError(new AnalyseException("Network error: " + e.getMessage(), e)); + callback.onError(new ServerStatsException("Network error: " + e.getMessage(), e)); } @Override @@ -83,12 +83,12 @@ public void onResponse(@NotNull Call call, @NotNull Response response) { try (ResponseBody body = response.body()) { if (!response.isSuccessful()) { String errorMessage = body != null ? body.string() : "Unknown error"; - callback.onError(new AnalyseException(response.code(), errorMessage)); + callback.onError(new ServerStatsException(response.code(), errorMessage)); return; } if (body == null) { - callback.onError(new AnalyseException(500, "Empty response body")); + callback.onError(new ServerStatsException(500, "Empty response body")); return; } @@ -96,9 +96,9 @@ public void onResponse(@NotNull Call call, @NotNull Response response) { T result = gson.fromJson(responseJson, responseClass); callback.onSuccess(result); } catch (IOException e) { - callback.onError(new AnalyseException("Failed to read response: " + e.getMessage(), e)); + callback.onError(new ServerStatsException("Failed to read response: " + e.getMessage(), e)); } catch (Exception e) { - callback.onError(new AnalyseException("Failed to parse response: " + e.getMessage(), e)); + callback.onError(new ServerStatsException("Failed to parse response: " + e.getMessage(), e)); } } }); @@ -112,13 +112,13 @@ public void onResponse(@NotNull Call call, @NotNull Response response) { * @param callback The callback to invoke on success or failure * @param The response type */ - public void get(String endpoint, Class responseClass, AnalyseCallback callback) { + public void get(String endpoint, Class responseClass, ServerStatsCallback callback) { String url = config.getApiUrl() + endpoint; String apiKey = config.getApiKey(); // Validate API key before making request if (apiKey == null || apiKey.isBlank()) { - callback.onError(new AnalyseException(401, "API key is not configured")); + callback.onError(new ServerStatsException(401, "API key is not configured")); return; } @@ -132,7 +132,7 @@ public void get(String endpoint, Class responseClass, AnalyseCallback httpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { - callback.onError(new AnalyseException("Network error: " + e.getMessage(), e)); + callback.onError(new ServerStatsException("Network error: " + e.getMessage(), e)); } @Override @@ -140,12 +140,12 @@ public void onResponse(@NotNull Call call, @NotNull Response response) { try (ResponseBody body = response.body()) { if (!response.isSuccessful()) { String errorMessage = body != null ? body.string() : "Unknown error"; - callback.onError(new AnalyseException(response.code(), errorMessage)); + callback.onError(new ServerStatsException(response.code(), errorMessage)); return; } if (body == null) { - callback.onError(new AnalyseException(500, "Empty response body")); + callback.onError(new ServerStatsException(500, "Empty response body")); return; } @@ -153,9 +153,9 @@ public void onResponse(@NotNull Call call, @NotNull Response response) { T result = gson.fromJson(responseJson, responseClass); callback.onSuccess(result); } catch (IOException e) { - callback.onError(new AnalyseException("Failed to read response: " + e.getMessage(), e)); + callback.onError(new ServerStatsException("Failed to read response: " + e.getMessage(), e)); } catch (Exception e) { - callback.onError(new AnalyseException("Failed to parse response: " + e.getMessage(), e)); + callback.onError(new ServerStatsException("Failed to parse response: " + e.getMessage(), e)); } } }); diff --git a/sdk/src/main/java/net/analyse/sdk/object/abtest/ABTest.java b/sdk/src/main/java/com/serverstats/sdk/object/abtest/ABTest.java similarity index 81% rename from sdk/src/main/java/net/analyse/sdk/object/abtest/ABTest.java rename to sdk/src/main/java/com/serverstats/sdk/object/abtest/ABTest.java index c56cdd3..fa66072 100644 --- a/sdk/src/main/java/net/analyse/sdk/object/abtest/ABTest.java +++ b/sdk/src/main/java/com/serverstats/sdk/object/abtest/ABTest.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.object.abtest; +package com.serverstats.sdk.object.abtest; import lombok.Getter; import java.util.List; @@ -8,7 +8,7 @@ * Concrete implementation of an A/B test configuration */ @Getter -public class ABTest implements net.analyse.api.object.abtest.ABTest { +public class ABTest implements com.serverstats.api.object.abtest.ABTest { private String id; private String key; @@ -27,7 +27,7 @@ public List getVariants() { } @Override - public net.analyse.api.object.abtest.Variant assignVariant(UUID playerUuid) { + public com.serverstats.api.object.abtest.Variant assignVariant(UUID playerUuid) { if (variants == null || variants.isEmpty()) { return null; } @@ -50,7 +50,7 @@ public net.analyse.api.object.abtest.Variant assignVariant(UUID playerUuid) { } @Override - public net.analyse.api.object.abtest.Variant getVariant(String variantKey) { + public com.serverstats.api.object.abtest.Variant getVariant(String variantKey) { if (variants == null) { return null; } diff --git a/sdk/src/main/java/net/analyse/sdk/object/abtest/Variant.java b/sdk/src/main/java/com/serverstats/sdk/object/abtest/Variant.java similarity index 65% rename from sdk/src/main/java/net/analyse/sdk/object/abtest/Variant.java rename to sdk/src/main/java/com/serverstats/sdk/object/abtest/Variant.java index 4686996..47813c6 100644 --- a/sdk/src/main/java/net/analyse/sdk/object/abtest/Variant.java +++ b/sdk/src/main/java/com/serverstats/sdk/object/abtest/Variant.java @@ -1,14 +1,14 @@ -package net.analyse.sdk.object.abtest; +package com.serverstats.sdk.object.abtest; import lombok.Getter; -import net.analyse.sdk.object.action.ActionData; +import com.serverstats.sdk.object.action.ActionData; import java.util.List; /** * Concrete implementation of a variant in an A/B test */ @Getter -public class Variant implements net.analyse.api.object.abtest.Variant { +public class Variant implements com.serverstats.api.object.abtest.Variant { private String key; private String name; diff --git a/sdk/src/main/java/net/analyse/sdk/object/action/Action.java b/sdk/src/main/java/com/serverstats/sdk/object/action/Action.java similarity index 91% rename from sdk/src/main/java/net/analyse/sdk/object/action/Action.java rename to sdk/src/main/java/com/serverstats/sdk/object/action/Action.java index 7140283..2bfad31 100644 --- a/sdk/src/main/java/net/analyse/sdk/object/action/Action.java +++ b/sdk/src/main/java/com/serverstats/sdk/object/action/Action.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.object.action; +package com.serverstats.sdk.object.action; /** * Interface for executable A/B test actions. diff --git a/sdk/src/main/java/net/analyse/sdk/object/action/ActionData.java b/sdk/src/main/java/com/serverstats/sdk/object/action/ActionData.java similarity index 97% rename from sdk/src/main/java/net/analyse/sdk/object/action/ActionData.java rename to sdk/src/main/java/com/serverstats/sdk/object/action/ActionData.java index 3b86ca5..4b6cd6f 100644 --- a/sdk/src/main/java/net/analyse/sdk/object/action/ActionData.java +++ b/sdk/src/main/java/com/serverstats/sdk/object/action/ActionData.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.object.action; +package com.serverstats.sdk.object.action; import lombok.Getter; import java.util.Map; diff --git a/sdk/src/main/java/net/analyse/sdk/object/action/ActionType.java b/sdk/src/main/java/com/serverstats/sdk/object/action/ActionType.java similarity index 75% rename from sdk/src/main/java/net/analyse/sdk/object/action/ActionType.java rename to sdk/src/main/java/com/serverstats/sdk/object/action/ActionType.java index 185dd39..30382bf 100644 --- a/sdk/src/main/java/net/analyse/sdk/object/action/ActionType.java +++ b/sdk/src/main/java/com/serverstats/sdk/object/action/ActionType.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.object.action; +package com.serverstats.sdk.object.action; /** * Types of actions that can be executed for A/B test variants diff --git a/sdk/src/main/java/net/analyse/sdk/request/ConversionRequest.java b/sdk/src/main/java/com/serverstats/sdk/request/ConversionRequest.java similarity index 97% rename from sdk/src/main/java/net/analyse/sdk/request/ConversionRequest.java rename to sdk/src/main/java/com/serverstats/sdk/request/ConversionRequest.java index 7eb7f66..f5278e4 100644 --- a/sdk/src/main/java/net/analyse/sdk/request/ConversionRequest.java +++ b/sdk/src/main/java/com/serverstats/sdk/request/ConversionRequest.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.request; +package com.serverstats.sdk.request; import lombok.Getter; import java.util.Map; diff --git a/sdk/src/main/java/net/analyse/sdk/request/EventRequest.java b/sdk/src/main/java/com/serverstats/sdk/request/EventRequest.java similarity index 96% rename from sdk/src/main/java/net/analyse/sdk/request/EventRequest.java rename to sdk/src/main/java/com/serverstats/sdk/request/EventRequest.java index a3ebf45..6f2fe39 100644 --- a/sdk/src/main/java/net/analyse/sdk/request/EventRequest.java +++ b/sdk/src/main/java/com/serverstats/sdk/request/EventRequest.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.request; +package com.serverstats.sdk.request; import lombok.Getter; import java.util.Map; diff --git a/sdk/src/main/java/net/analyse/sdk/request/HeartbeatRequest.java b/sdk/src/main/java/com/serverstats/sdk/request/HeartbeatRequest.java similarity index 96% rename from sdk/src/main/java/net/analyse/sdk/request/HeartbeatRequest.java rename to sdk/src/main/java/com/serverstats/sdk/request/HeartbeatRequest.java index ff416e8..c58acaf 100644 --- a/sdk/src/main/java/net/analyse/sdk/request/HeartbeatRequest.java +++ b/sdk/src/main/java/com/serverstats/sdk/request/HeartbeatRequest.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.request; +package com.serverstats.sdk.request; import lombok.Getter; import java.util.List; diff --git a/sdk/src/main/java/net/analyse/sdk/request/JoinRequest.java b/sdk/src/main/java/com/serverstats/sdk/request/JoinRequest.java similarity index 97% rename from sdk/src/main/java/net/analyse/sdk/request/JoinRequest.java rename to sdk/src/main/java/com/serverstats/sdk/request/JoinRequest.java index 1d85e94..5176397 100644 --- a/sdk/src/main/java/net/analyse/sdk/request/JoinRequest.java +++ b/sdk/src/main/java/com/serverstats/sdk/request/JoinRequest.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.request; +package com.serverstats.sdk.request; import lombok.Getter; import java.util.UUID; diff --git a/sdk/src/main/java/net/analyse/sdk/request/LeaveRequest.java b/sdk/src/main/java/com/serverstats/sdk/request/LeaveRequest.java similarity index 92% rename from sdk/src/main/java/net/analyse/sdk/request/LeaveRequest.java rename to sdk/src/main/java/com/serverstats/sdk/request/LeaveRequest.java index 4fb2da4..74283ce 100644 --- a/sdk/src/main/java/net/analyse/sdk/request/LeaveRequest.java +++ b/sdk/src/main/java/com/serverstats/sdk/request/LeaveRequest.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.request; +package com.serverstats.sdk.request; import lombok.Getter; diff --git a/sdk/src/main/java/net/analyse/sdk/request/PlayerInfo.java b/sdk/src/main/java/com/serverstats/sdk/request/PlayerInfo.java similarity index 94% rename from sdk/src/main/java/net/analyse/sdk/request/PlayerInfo.java rename to sdk/src/main/java/com/serverstats/sdk/request/PlayerInfo.java index 6d738e4..7a559cd 100644 --- a/sdk/src/main/java/net/analyse/sdk/request/PlayerInfo.java +++ b/sdk/src/main/java/com/serverstats/sdk/request/PlayerInfo.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.request; +package com.serverstats.sdk.request; import lombok.Getter; import java.util.UUID; diff --git a/sdk/src/main/java/net/analyse/sdk/request/PlayerInfoRequest.java b/sdk/src/main/java/com/serverstats/sdk/request/PlayerInfoRequest.java similarity index 95% rename from sdk/src/main/java/net/analyse/sdk/request/PlayerInfoRequest.java rename to sdk/src/main/java/com/serverstats/sdk/request/PlayerInfoRequest.java index d47f467..4f0d07a 100644 --- a/sdk/src/main/java/net/analyse/sdk/request/PlayerInfoRequest.java +++ b/sdk/src/main/java/com/serverstats/sdk/request/PlayerInfoRequest.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.request; +package com.serverstats.sdk.request; import lombok.Getter; import java.util.UUID; diff --git a/sdk/src/main/java/net/analyse/sdk/request/ServerType.java b/sdk/src/main/java/com/serverstats/sdk/request/ServerType.java similarity index 72% rename from sdk/src/main/java/net/analyse/sdk/request/ServerType.java rename to sdk/src/main/java/com/serverstats/sdk/request/ServerType.java index ab5a4e8..b235546 100644 --- a/sdk/src/main/java/net/analyse/sdk/request/ServerType.java +++ b/sdk/src/main/java/com/serverstats/sdk/request/ServerType.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.request; +package com.serverstats.sdk.request; /** * Type of server sending the heartbeat diff --git a/sdk/src/main/java/net/analyse/sdk/response/ABTestsResponse.java b/sdk/src/main/java/com/serverstats/sdk/response/ABTestsResponse.java similarity index 85% rename from sdk/src/main/java/net/analyse/sdk/response/ABTestsResponse.java rename to sdk/src/main/java/com/serverstats/sdk/response/ABTestsResponse.java index c6b130a..79c859b 100644 --- a/sdk/src/main/java/net/analyse/sdk/response/ABTestsResponse.java +++ b/sdk/src/main/java/com/serverstats/sdk/response/ABTestsResponse.java @@ -1,7 +1,7 @@ -package net.analyse.sdk.response; +package com.serverstats.sdk.response; import lombok.Getter; -import net.analyse.sdk.object.abtest.ABTest; +import com.serverstats.sdk.object.abtest.ABTest; import java.util.List; /** diff --git a/sdk/src/main/java/net/analyse/sdk/response/ConversionResponse.java b/sdk/src/main/java/com/serverstats/sdk/response/ConversionResponse.java similarity index 82% rename from sdk/src/main/java/net/analyse/sdk/response/ConversionResponse.java rename to sdk/src/main/java/com/serverstats/sdk/response/ConversionResponse.java index b3502a5..86c76c8 100644 --- a/sdk/src/main/java/net/analyse/sdk/response/ConversionResponse.java +++ b/sdk/src/main/java/com/serverstats/sdk/response/ConversionResponse.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.response; +package com.serverstats.sdk.response; import lombok.Getter; diff --git a/sdk/src/main/java/net/analyse/sdk/response/EventResponse.java b/sdk/src/main/java/com/serverstats/sdk/response/EventResponse.java similarity index 81% rename from sdk/src/main/java/net/analyse/sdk/response/EventResponse.java rename to sdk/src/main/java/com/serverstats/sdk/response/EventResponse.java index 8eeb048..e59a9f1 100644 --- a/sdk/src/main/java/net/analyse/sdk/response/EventResponse.java +++ b/sdk/src/main/java/com/serverstats/sdk/response/EventResponse.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.response; +package com.serverstats.sdk.response; import lombok.Getter; diff --git a/sdk/src/main/java/net/analyse/sdk/response/HeartbeatResponse.java b/sdk/src/main/java/com/serverstats/sdk/response/HeartbeatResponse.java similarity index 81% rename from sdk/src/main/java/net/analyse/sdk/response/HeartbeatResponse.java rename to sdk/src/main/java/com/serverstats/sdk/response/HeartbeatResponse.java index ce6f707..0fd3cda 100644 --- a/sdk/src/main/java/net/analyse/sdk/response/HeartbeatResponse.java +++ b/sdk/src/main/java/com/serverstats/sdk/response/HeartbeatResponse.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.response; +package com.serverstats.sdk.response; import lombok.Getter; diff --git a/sdk/src/main/java/net/analyse/sdk/response/JoinResponse.java b/sdk/src/main/java/com/serverstats/sdk/response/JoinResponse.java similarity index 87% rename from sdk/src/main/java/net/analyse/sdk/response/JoinResponse.java rename to sdk/src/main/java/com/serverstats/sdk/response/JoinResponse.java index 8177cca..e0d727e 100644 --- a/sdk/src/main/java/net/analyse/sdk/response/JoinResponse.java +++ b/sdk/src/main/java/com/serverstats/sdk/response/JoinResponse.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.response; +package com.serverstats.sdk.response; import lombok.Getter; diff --git a/sdk/src/main/java/net/analyse/sdk/response/LeaveResponse.java b/sdk/src/main/java/com/serverstats/sdk/response/LeaveResponse.java similarity index 81% rename from sdk/src/main/java/net/analyse/sdk/response/LeaveResponse.java rename to sdk/src/main/java/com/serverstats/sdk/response/LeaveResponse.java index c9773d6..d8324d2 100644 --- a/sdk/src/main/java/net/analyse/sdk/response/LeaveResponse.java +++ b/sdk/src/main/java/com/serverstats/sdk/response/LeaveResponse.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.response; +package com.serverstats.sdk.response; import lombok.Getter; diff --git a/sdk/src/main/java/net/analyse/sdk/response/PlayerInfoResponse.java b/sdk/src/main/java/com/serverstats/sdk/response/PlayerInfoResponse.java similarity index 92% rename from sdk/src/main/java/net/analyse/sdk/response/PlayerInfoResponse.java rename to sdk/src/main/java/com/serverstats/sdk/response/PlayerInfoResponse.java index 9bbba52..23db458 100644 --- a/sdk/src/main/java/net/analyse/sdk/response/PlayerInfoResponse.java +++ b/sdk/src/main/java/com/serverstats/sdk/response/PlayerInfoResponse.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.response; +package com.serverstats.sdk.response; import lombok.Getter; diff --git a/sdk/src/main/java/net/analyse/sdk/response/ServerInfoResponse.java b/sdk/src/main/java/com/serverstats/sdk/response/ServerInfoResponse.java similarity index 89% rename from sdk/src/main/java/net/analyse/sdk/response/ServerInfoResponse.java rename to sdk/src/main/java/com/serverstats/sdk/response/ServerInfoResponse.java index 33ae7a7..2072745 100644 --- a/sdk/src/main/java/net/analyse/sdk/response/ServerInfoResponse.java +++ b/sdk/src/main/java/com/serverstats/sdk/response/ServerInfoResponse.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.response; +package com.serverstats.sdk.response; import lombok.Getter; diff --git a/sdk/src/main/java/net/analyse/sdk/response/VersionResponse.java b/sdk/src/main/java/com/serverstats/sdk/response/VersionResponse.java similarity index 93% rename from sdk/src/main/java/net/analyse/sdk/response/VersionResponse.java rename to sdk/src/main/java/com/serverstats/sdk/response/VersionResponse.java index 954b674..c9ed748 100644 --- a/sdk/src/main/java/net/analyse/sdk/response/VersionResponse.java +++ b/sdk/src/main/java/com/serverstats/sdk/response/VersionResponse.java @@ -1,4 +1,4 @@ -package net.analyse.sdk.response; +package com.serverstats.sdk.response; import lombok.Getter; import java.util.Map; diff --git a/sdk/src/main/java/net/analyse/sdk/update/UpdateChecker.java b/sdk/src/main/java/com/serverstats/sdk/update/UpdateChecker.java similarity index 88% rename from sdk/src/main/java/net/analyse/sdk/update/UpdateChecker.java rename to sdk/src/main/java/com/serverstats/sdk/update/UpdateChecker.java index e1828bf..dc297de 100644 --- a/sdk/src/main/java/net/analyse/sdk/update/UpdateChecker.java +++ b/sdk/src/main/java/com/serverstats/sdk/update/UpdateChecker.java @@ -1,10 +1,10 @@ -package net.analyse.sdk.update; +package com.serverstats.sdk.update; import lombok.Getter; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.AnalyseClient; -import net.analyse.api.exception.AnalyseException; -import net.analyse.sdk.response.VersionResponse; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.ServerStatsClient; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.sdk.response.VersionResponse; /** * Shared update checker for all platforms @@ -41,7 +41,7 @@ public interface UpdateListener { void onCheckFailed(String error); } - private final AnalyseClient client; + private final ServerStatsClient client; private final String currentVersion; private final String platform; @@ -53,11 +53,11 @@ public interface UpdateListener { /** * Create a new update checker * - * @param client The Analyse client + * @param client The ServerStats client * @param currentVersion The current plugin version * @param platform The platform identifier (paper, velocity, bungeecord) */ - public UpdateChecker(AnalyseClient client, String currentVersion, String platform) { + public UpdateChecker(ServerStatsClient client, String currentVersion, String platform) { this.client = client; this.currentVersion = currentVersion; this.platform = platform; @@ -70,7 +70,7 @@ public UpdateChecker(AnalyseClient client, String currentVersion, String platfor * @param force If true, notify even if already notified for this version */ public void check(UpdateListener listener, boolean force) { - client.checkVersion(new AnalyseCallback() { + client.checkVersion(new ServerStatsCallback() { @Override public void onSuccess(VersionResponse response) { if (!response.isSuccess() || response.getPlatforms() == null) { @@ -102,7 +102,7 @@ public void onSuccess(VersionResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { listener.onCheckFailed(exception.getMessage()); } }); diff --git a/settings.gradle b/settings.gradle index a653697..fe5e214 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,4 @@ -rootProject.name = 'analyse' +rootProject.name = 'serverstats' include 'sdk' include 'api' diff --git a/velocity/build.gradle b/velocity/build.gradle index 2424d4d..a9d490a 100644 --- a/velocity/build.gradle +++ b/velocity/build.gradle @@ -19,7 +19,7 @@ dependencies { } tasks.named('shadowJar', com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) { - archiveBaseName.set('analyse-velocity') + archiveBaseName.set('serverstats-velocity') archiveClassifier.set('') } diff --git a/velocity/src/main/java/net/analyse/velocity/AnalyseVelocity.java b/velocity/src/main/java/com/serverstats/velocity/ServerStatsVelocity.java similarity index 78% rename from velocity/src/main/java/net/analyse/velocity/AnalyseVelocity.java rename to velocity/src/main/java/com/serverstats/velocity/ServerStatsVelocity.java index 9d219d4..7ad9722 100644 --- a/velocity/src/main/java/net/analyse/velocity/AnalyseVelocity.java +++ b/velocity/src/main/java/com/serverstats/velocity/ServerStatsVelocity.java @@ -1,4 +1,4 @@ -package net.analyse.velocity; +package com.serverstats.velocity; import com.google.inject.Inject; import com.velocitypowered.api.event.Subscribe; @@ -11,25 +11,25 @@ import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.scheduler.ScheduledTask; import co.aikar.commands.VelocityCommandManager; -import net.analyse.api.Analyse; -import net.analyse.api.AnalyseProvider; -import net.analyse.api.BuildConstants; -import net.analyse.api.exception.AnalyseException; -import net.analyse.api.object.builder.EventBuilder; -import net.analyse.api.platform.AnalysePlatform; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.AnalyseClient; -import net.analyse.sdk.request.EventRequest; -import net.analyse.sdk.response.EventResponse; -import net.analyse.api.messaging.AnalyseMessaging; -import net.analyse.velocity.command.AnalyseCommand; -import net.analyse.velocity.config.AnalyseVelocityConfig; -import net.analyse.velocity.listener.PlayerListener; -import net.analyse.velocity.listener.PluginMessageListener; -import net.analyse.velocity.manager.ABTestManager; -import net.analyse.velocity.manager.SessionManager; -import net.analyse.velocity.task.HeartbeatTask; -import net.analyse.velocity.update.VelocityUpdateChecker; +import com.serverstats.api.ServerStats; +import com.serverstats.api.ServerStatsProvider; +import com.serverstats.api.BuildConstants; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.api.object.builder.EventBuilder; +import com.serverstats.api.platform.ServerStatsPlatform; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.ServerStatsClient; +import com.serverstats.sdk.request.EventRequest; +import com.serverstats.sdk.response.EventResponse; +import com.serverstats.api.messaging.ServerStatsMessaging; +import com.serverstats.velocity.command.ServerStatsCommand; +import com.serverstats.velocity.config.ServerStatsVelocityConfig; +import com.serverstats.velocity.listener.PlayerListener; +import com.serverstats.velocity.listener.PluginMessageListener; +import com.serverstats.velocity.manager.ABTestManager; +import com.serverstats.velocity.manager.SessionManager; +import com.serverstats.velocity.task.HeartbeatTask; +import com.serverstats.velocity.update.VelocityUpdateChecker; import org.slf4j.Logger; import java.io.IOException; import java.net.InetSocketAddress; @@ -38,22 +38,22 @@ import java.util.function.Consumer; /** - * Analyse plugin for Velocity proxy + * ServerStats plugin for Velocity proxy */ @Plugin( - id = "analyse", - name = "Analyse", + id = "serverstats", + name = "ServerStats", version = BuildConstants.VERSION, description = "Analytics tracking plugin for Minecraft servers", authors = {"VertCode"} ) -public class AnalyseVelocity implements AnalysePlatform { +public class ServerStatsVelocity implements ServerStatsPlatform { private final ProxyServer server; private final Logger logger; private final Path dataDirectory; - private AnalyseVelocityConfig pluginConfig; + private ServerStatsVelocityConfig pluginConfig; private SessionManager sessionManager; private ABTestManager abTestManager; private PlayerListener playerListener; @@ -61,7 +61,7 @@ public class AnalyseVelocity implements AnalysePlatform { private VelocityUpdateChecker updateChecker; @Inject - public AnalyseVelocity(ProxyServer server, Logger logger, @DataDirectory Path dataDirectory) { + public ServerStatsVelocity(ProxyServer server, Logger logger, @DataDirectory Path dataDirectory) { this.server = server; this.logger = logger; this.dataDirectory = dataDirectory; @@ -69,7 +69,7 @@ public AnalyseVelocity(ProxyServer server, Logger logger, @DataDirectory Path da @Subscribe public void onProxyInitialize(ProxyInitializeEvent event) { - logger.info("Initializing Analyse..."); + logger.info("Initializing ServerStats..."); // Load configuration if (!loadConfig()) { @@ -85,17 +85,17 @@ public void onProxyInitialize(ProxyInitializeEvent event) { // Register plugin message channel for backend server communication server.getChannelRegistrar().register( - com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier.from(AnalyseMessaging.CHANNEL) + com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier.from(ServerStatsMessaging.CHANNEL) ); server.getEventManager().register(this, new PluginMessageListener(this)); - logger.info("Registered plugin message channel: " + AnalyseMessaging.CHANNEL); + logger.info("Registered plugin message channel: " + ServerStatsMessaging.CHANNEL); // Register with the API provider if at least one server is configured if (playerListener.hasAnyClient()) { - AnalyseProvider.register(this); + ServerStatsProvider.register(this); - // Set up the event sender for Analyse.trackEvent() - Analyse.setEventSender(this::sendEvent); + // Set up the event sender for ServerStats.trackEvent() + ServerStats.setEventSender(this::sendEvent); // Initialize A/B test manager abTestManager = new ABTestManager(this); @@ -104,7 +104,7 @@ public void onProxyInitialize(ProxyInitializeEvent event) { // Register commands using ACF VelocityCommandManager commandManager = new VelocityCommandManager(server, this); - commandManager.registerCommand(new AnalyseCommand(this)); + commandManager.registerCommand(new ServerStatsCommand(this)); // Start heartbeat task (after playerListener is initialized) startHeartbeatTask(); @@ -118,7 +118,7 @@ public void onProxyInitialize(ProxyInitializeEvent event) { // Initialize sessions for players already online (in case of reload) initializeOnlinePlayers(); - logger.info(String.format("Analyse initialized with %d server(s) configured", + logger.info(String.format("ServerStats initialized with %d server(s) configured", pluginConfig.getServers().size())); } @@ -129,7 +129,7 @@ public void onProxyInitialize(ProxyInitializeEvent event) { * @param callback Optional callback for result */ private void sendEvent(EventBuilder event, Consumer callback) { - AnalyseClient client = getClient(); + ServerStatsClient client = getClient(); if (client == null) { if (callback != null) { callback.accept(false); @@ -153,7 +153,7 @@ private void sendEvent(EventBuilder event, Consumer callback) { event.getValue() ); - client.trackEvent(request, new AnalyseCallback<>() { + client.trackEvent(request, new ServerStatsCallback<>() { @Override public void onSuccess(EventResponse response) { if (isDebugEnabled()) { @@ -167,7 +167,7 @@ public void onSuccess(EventResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { logWarning(String.format("Failed to track event '%s': %s", event.getName(), exception.getMessage())); @@ -214,7 +214,7 @@ private void initializeOnlinePlayers() { @Subscribe public void onProxyReload(ProxyReloadEvent event) { - logger.info("Reloading Analyse configuration..."); + logger.info("Reloading ServerStats configuration..."); // Cancel existing heartbeat task if (heartbeatTask != null) { @@ -240,19 +240,19 @@ public void onProxyReload(ProxyReloadEvent event) { // Restart heartbeat task startHeartbeatTask(); - logger.info(String.format("Analyse reloaded with %d server(s) configured", + logger.info(String.format("ServerStats reloaded with %d server(s) configured", pluginConfig.getServers().size())); } @Subscribe public void onProxyShutdown(ProxyShutdownEvent event) { - logger.info("Shutting down Analyse..."); + logger.info("Shutting down ServerStats..."); // Unregister from the API provider - AnalyseProvider.unregister(); + ServerStatsProvider.unregister(); // Clear the event sender - Analyse.setEventSender(null); + ServerStats.setEventSender(null); // Stop A/B test manager if (abTestManager != null) { @@ -274,7 +274,7 @@ public void onProxyShutdown(ProxyShutdownEvent event) { playerListener.shutdown(); } - logger.info("Analyse shutdown complete"); + logger.info("ServerStats shutdown complete"); } /** @@ -284,7 +284,7 @@ public void onProxyShutdown(ProxyShutdownEvent event) { */ private boolean loadConfig() { try { - pluginConfig = AnalyseVelocityConfig.load(dataDirectory); + pluginConfig = ServerStatsVelocityConfig.load(dataDirectory); } catch (IOException e) { logger.error("Failed to load configuration", e); return false; @@ -332,7 +332,7 @@ public void debug(String format, Object... args) { } } - // ========== AnalysePlatform Interface Methods ========== + // ========== ServerStatsPlatform Interface Methods ========== @Override public SessionManager getSessionManager() { @@ -389,7 +389,7 @@ public Logger getLogger() { * * @return The plugin config */ - public AnalyseVelocityConfig getPluginConfig() { + public ServerStatsVelocityConfig getPluginConfig() { return pluginConfig; } @@ -397,9 +397,9 @@ public AnalyseVelocityConfig getPluginConfig() { * Get an SDK client for API operations. * Uses the configured default server if set, otherwise returns any available client. * - * @return The Analyse client, or null if none available + * @return The ServerStats client, or null if none available */ - public AnalyseClient getClient() { + public ServerStatsClient getClient() { return playerListener != null ? playerListener.getAvailableClient() : null; } diff --git a/velocity/src/main/java/net/analyse/velocity/command/AnalyseCommand.java b/velocity/src/main/java/com/serverstats/velocity/command/ServerStatsCommand.java similarity index 80% rename from velocity/src/main/java/net/analyse/velocity/command/AnalyseCommand.java rename to velocity/src/main/java/com/serverstats/velocity/command/ServerStatsCommand.java index b8c9187..dd2bf4d 100644 --- a/velocity/src/main/java/net/analyse/velocity/command/AnalyseCommand.java +++ b/velocity/src/main/java/com/serverstats/velocity/command/ServerStatsCommand.java @@ -1,4 +1,4 @@ -package net.analyse.velocity.command; +package com.serverstats.velocity.command; import co.aikar.commands.BaseCommand; import co.aikar.commands.annotation.CommandAlias; @@ -10,31 +10,31 @@ import co.aikar.commands.annotation.Syntax; import com.velocitypowered.api.command.CommandSource; import com.velocitypowered.api.proxy.Player; -import net.analyse.api.Analyse; -import net.analyse.api.exception.AnalyseException; -import net.analyse.api.object.builder.EventBuilder; -import net.analyse.api.BuildConstants; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.request.PlayerInfoRequest; -import net.analyse.sdk.response.PlayerInfoResponse; -import net.analyse.sdk.response.ServerInfoResponse; -import net.analyse.velocity.AnalyseVelocity; -import net.analyse.velocity.object.session.PlayerSession; -import net.analyse.velocity.util.ComponentUtil; +import com.serverstats.api.ServerStats; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.api.object.builder.EventBuilder; +import com.serverstats.api.BuildConstants; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.request.PlayerInfoRequest; +import com.serverstats.sdk.response.PlayerInfoResponse; +import com.serverstats.sdk.response.ServerInfoResponse; +import com.serverstats.velocity.ServerStatsVelocity; +import com.serverstats.velocity.object.session.PlayerSession; +import com.serverstats.velocity.util.ComponentUtil; import java.time.Duration; import java.time.Instant; import java.util.HashMap; import java.util.Map; /** - * Main command handler for the Analyse plugin using ACF + * Main command handler for the ServerStats plugin using ACF */ -@CommandAlias("analyse|analytics|anl") -public class AnalyseCommand extends BaseCommand { +@CommandAlias("serverstats|analyse|ss") +public class ServerStatsCommand extends BaseCommand { - private final AnalyseVelocity plugin; + private final ServerStatsVelocity plugin; - public AnalyseCommand(AnalyseVelocity plugin) { + public ServerStatsCommand(ServerStatsVelocity plugin) { this.plugin = plugin; } @@ -42,7 +42,7 @@ public AnalyseCommand(AnalyseVelocity plugin) { @Description("Show plugin info") public void onDefault(CommandSource sender) { // Check if user has admin permission - if (sender.hasPermission("analyse.command.status")) { + if (sender.hasPermission("serverstats.command.status")) { showStatus(sender); } else { showPublicInfo(sender); @@ -51,7 +51,7 @@ public void onDefault(CommandSource sender) { @Subcommand("status") @Description("Show plugin status") - @CommandPermission("analyse.command.status") + @CommandPermission("serverstats.command.status") public void onStatus(CommandSource sender) { showStatus(sender); } @@ -63,11 +63,11 @@ public void onStatus(CommandSource sender) { */ private void showPublicInfo(CommandSource sender) { StringBuilder message = new StringBuilder(); - message.append("#3498db&l「 Analyse 」&r\n"); - message.append(" #5dade2┃ &7This server uses &fAnalyse &7to track\n"); + message.append("#3498db&l「 ServerStats 」&r\n"); + message.append(" #5dade2┃ &7This server uses &fServerStats &7to track\n"); message.append(" #5dade2┃ &7player analytics and sessions.&r\n"); message.append("&r\n"); - message.append(" &7→ &fanalyse.net&r\n"); + message.append(" &7→ &fserverstats.com&r\n"); send(sender, message.toString()); } @@ -77,15 +77,15 @@ private void showPublicInfo(CommandSource sender) { * @param sender The command sender */ private void showStatus(CommandSource sender) { - boolean connected = Analyse.isAvailable(); + boolean connected = ServerStats.isAvailable(); int trackedPlayers = plugin.getSessionManager().getSessionCount(); boolean debugEnabled = plugin.isDebugEnabled(); int configuredServers = plugin.getPluginConfig().getServers().size(); StringBuilder message = new StringBuilder(); - message.append("#3498db&l「 Analyse &r&fv").append(BuildConstants.VERSION).append(" #3498db&l」&r\n"); + message.append("#3498db&l「 ServerStats &r&fv").append(BuildConstants.VERSION).append(" #3498db&l」&r\n"); message.append(" #5dade2┃ &fStatus: ").append(connected ? "&a● Connected" : "&c● Disconnected").append("&r\n"); - message.append(" #5dade2┃ &fAPI: &7api.analyse.net&r\n"); + message.append(" #5dade2┃ &fAPI: &7api.serverstats.com&r\n"); message.append(" #5dade2┃ &fServers Configured: &7").append(configuredServers).append("&r\n"); message.append(" #5dade2┃ &fPlayers Tracked: &7").append(trackedPlayers).append("&r\n"); message.append(" #5dade2┃ &fDebug: ").append(debugEnabled ? "&aEnabled" : "&7Disabled").append("&r\n"); @@ -94,7 +94,7 @@ private void showStatus(CommandSource sender) { @Subcommand("debug") @Description("Toggle debug mode") - @CommandPermission("analyse.command.debug") + @CommandPermission("serverstats.command.debug") public void onDebug(CommandSource sender) { boolean newState = !plugin.getPluginConfig().isDebug(); plugin.getPluginConfig().setDebug(newState); @@ -108,17 +108,17 @@ public void onDebug(CommandSource sender) { @Subcommand("event") @Description("Send a custom event") - @CommandPermission("analyse.command.event") + @CommandPermission("serverstats.command.event") @Syntax(" [--player ] [--value ] [--data ...]") @CommandCompletion("test_event|custom_event @players") public void onEvent(CommandSource sender, String[] args) { if (args.length == 0) { - send(sender, "&cUsage: /analyse event [--player ] [--value ] [--data key=value...]"); + send(sender, "&cUsage: /serverstats event [--player ] [--value ] [--data key=value...]"); return; } - if (!Analyse.isAvailable()) { - send(sender, "&cAnalyse is not connected. Make sure a default server is configured."); + if (!ServerStats.isAvailable()) { + send(sender, "&cServerStats is not connected. Make sure a default server is configured."); return; } @@ -156,7 +156,7 @@ public void onEvent(CommandSource sender, String[] args) { } // Build the event - EventBuilder builder = Analyse.trackEvent(eventName); + EventBuilder builder = ServerStats.trackEvent(eventName); // Add player if specified if (playerName != null) { @@ -202,12 +202,12 @@ public void onEvent(CommandSource sender, String[] args) { @Subcommand("info") @Description("View server or player analytics") - @CommandPermission("analyse.command.info") + @CommandPermission("serverstats.command.info") @Syntax("[player]") @CommandCompletion("@players") public void onInfo(CommandSource sender, String[] args) { - if (!Analyse.isAvailable()) { - send(sender, "&cAnalyse is not connected. Make sure a default server is configured."); + if (!ServerStats.isAvailable()) { + send(sender, "&cServerStats is not connected. Make sure a default server is configured."); return; } @@ -230,7 +230,7 @@ private void showServerInfo(CommandSource sender) { int onlinePlayers = plugin.getServer().getPlayerCount(); // Fetch additional data from API - plugin.getClient().getServerInfo(new AnalyseCallback<>() { + plugin.getClient().getServerInfo(new ServerStatsCallback<>() { @Override public void onSuccess(ServerInfoResponse response) { StringBuilder message = new StringBuilder(); @@ -250,7 +250,7 @@ public void onSuccess(ServerInfoResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { StringBuilder message = new StringBuilder(); message.append("#3498db&l「 Server Analytics 」&r\n"); message.append(" #5dade2┃ &fOnline Players: &7").append(onlinePlayers).append("&r\n"); @@ -277,14 +277,14 @@ private void showPlayerInfo(CommandSource sender, String playerName) { PlayerSession session = plugin.getSessionManager().getSession(player.getUniqueId()).orElse(null); // Fetch additional data from API - plugin.getClient().getPlayerInfo(new PlayerInfoRequest(player.getUniqueId()), new AnalyseCallback<>() { + plugin.getClient().getPlayerInfo(new PlayerInfoRequest(player.getUniqueId()), new ServerStatsCallback<>() { @Override public void onSuccess(PlayerInfoResponse response) { send(sender, buildPlayerInfoMessage(player.getUsername(), session, response)); } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { send(sender, buildPlayerInfoMessage(player.getUsername(), session, null)); } }); @@ -370,17 +370,17 @@ private String formatDuration(Duration duration) { @Subcommand("help") @Description("Show help information") - @CommandPermission("analyse.command.help") + @CommandPermission("serverstats.command.help") public void onHelp(CommandSource sender) { StringBuilder message = new StringBuilder(); - message.append("#3498db&l「 Analyse Commands 」&r\n"); - message.append(" #5dade2┃ &f/analyse &7- Show plugin info&r\n"); - message.append(" #5dade2┃ &f/analyse status &7- Show plugin status&r\n"); - message.append(" #5dade2┃ &f/analyse info &7- View server analytics&r\n"); - message.append(" #5dade2┃ &f/analyse info &7- View player analytics&r\n"); - message.append(" #5dade2┃ &f/analyse debug &7- Toggle debug mode&r\n"); - message.append(" #5dade2┃ &f/analyse event &7- Send custom event&r\n"); - message.append(" #5dade2┃ &f/analyse help &7- Show this help&r\n"); + message.append("#3498db&l「 ServerStats Commands 」&r\n"); + message.append(" #5dade2┃ &f/serverstats &7- Show plugin info&r\n"); + message.append(" #5dade2┃ &f/serverstats status &7- Show plugin status&r\n"); + message.append(" #5dade2┃ &f/serverstats info &7- View server analytics&r\n"); + message.append(" #5dade2┃ &f/serverstats info &7- View player analytics&r\n"); + message.append(" #5dade2┃ &f/serverstats debug &7- Toggle debug mode&r\n"); + message.append(" #5dade2┃ &f/serverstats event &7- Send custom event&r\n"); + message.append(" #5dade2┃ &f/serverstats help &7- Show this help&r\n"); send(sender, message.toString()); } diff --git a/velocity/src/main/java/net/analyse/velocity/config/AnalyseVelocityConfig.java b/velocity/src/main/java/com/serverstats/velocity/config/ServerStatsVelocityConfig.java similarity index 88% rename from velocity/src/main/java/net/analyse/velocity/config/AnalyseVelocityConfig.java rename to velocity/src/main/java/com/serverstats/velocity/config/ServerStatsVelocityConfig.java index 1c4537f..b6cb58d 100644 --- a/velocity/src/main/java/net/analyse/velocity/config/AnalyseVelocityConfig.java +++ b/velocity/src/main/java/com/serverstats/velocity/config/ServerStatsVelocityConfig.java @@ -1,4 +1,4 @@ -package net.analyse.velocity.config; +package com.serverstats.velocity.config; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -17,7 +17,7 @@ * Configuration for the Velocity plugin */ @Getter -public class AnalyseVelocityConfig { +public class ServerStatsVelocityConfig { private static final String CONFIG_FILE = "config.json"; @@ -50,7 +50,7 @@ public ServerConfig(String apiKey) { * @return The loaded configuration * @throws IOException If the config cannot be read or written */ - public static AnalyseVelocityConfig load(Path dataDirectory) throws IOException { + public static ServerStatsVelocityConfig load(Path dataDirectory) throws IOException { Gson gson = new GsonBuilder().setPrettyPrinting().create(); Path configPath = dataDirectory.resolve(CONFIG_FILE); @@ -61,7 +61,7 @@ public static AnalyseVelocityConfig load(Path dataDirectory) throws IOException // Create default config if it doesn't exist if (!Files.exists(configPath)) { - AnalyseVelocityConfig defaultConfig = createDefault(); + ServerStatsVelocityConfig defaultConfig = createDefault(); try (Writer writer = Files.newBufferedWriter(configPath, StandardCharsets.UTF_8)) { gson.toJson(defaultConfig, writer); } @@ -71,7 +71,7 @@ public static AnalyseVelocityConfig load(Path dataDirectory) throws IOException // Load existing config try (Reader reader = Files.newBufferedReader(configPath, StandardCharsets.UTF_8)) { - return gson.fromJson(reader, AnalyseVelocityConfig.class); + return gson.fromJson(reader, ServerStatsVelocityConfig.class); } } @@ -80,8 +80,8 @@ public static AnalyseVelocityConfig load(Path dataDirectory) throws IOException * * @return The default configuration */ - private static AnalyseVelocityConfig createDefault() { - AnalyseVelocityConfig config = new AnalyseVelocityConfig(); + private static ServerStatsVelocityConfig createDefault() { + ServerStatsVelocityConfig config = new ServerStatsVelocityConfig(); config.debug = false; config.bedrockPrefix = "."; config.instanceId = "default"; diff --git a/velocity/src/main/java/net/analyse/velocity/listener/PlayerListener.java b/velocity/src/main/java/com/serverstats/velocity/listener/PlayerListener.java similarity index 80% rename from velocity/src/main/java/net/analyse/velocity/listener/PlayerListener.java rename to velocity/src/main/java/com/serverstats/velocity/listener/PlayerListener.java index 3d03e45..6f0f094 100644 --- a/velocity/src/main/java/net/analyse/velocity/listener/PlayerListener.java +++ b/velocity/src/main/java/com/serverstats/velocity/listener/PlayerListener.java @@ -1,4 +1,4 @@ -package net.analyse.velocity.listener; +package com.serverstats.velocity.listener; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.connection.DisconnectEvent; @@ -6,17 +6,17 @@ import com.velocitypowered.api.event.player.ServerConnectedEvent; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.server.RegisteredServer; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.AnalyseClient; -import net.analyse.api.exception.AnalyseException; -import net.analyse.sdk.config.AnalyseConfig; -import net.analyse.sdk.request.JoinRequest; -import net.analyse.sdk.request.LeaveRequest; -import net.analyse.sdk.response.JoinResponse; -import net.analyse.sdk.response.LeaveResponse; -import net.analyse.velocity.AnalyseVelocity; -import net.analyse.velocity.manager.SessionManager; -import net.analyse.velocity.object.session.PlayerSession; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.ServerStatsClient; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.sdk.config.ServerStatsConfig; +import com.serverstats.sdk.request.JoinRequest; +import com.serverstats.sdk.request.LeaveRequest; +import com.serverstats.sdk.response.JoinResponse; +import com.serverstats.sdk.response.LeaveResponse; +import com.serverstats.velocity.ServerStatsVelocity; +import com.serverstats.velocity.manager.SessionManager; +import com.serverstats.velocity.object.session.PlayerSession; import org.slf4j.Logger; import java.net.InetSocketAddress; import java.util.HashMap; @@ -29,12 +29,12 @@ */ public class PlayerListener { - private final AnalyseVelocity plugin; + private final ServerStatsVelocity plugin; private final Logger logger; private final SessionManager sessionManager; - private final Map serverClients = new HashMap<>(); + private final Map serverClients = new HashMap<>(); - public PlayerListener(AnalyseVelocity plugin) { + public PlayerListener(ServerStatsVelocity plugin) { this.plugin = plugin; this.logger = plugin.getLogger(); this.sessionManager = plugin.getSessionManager(); @@ -50,8 +50,8 @@ private void initializeClients() { plugin.getPluginConfig().getServers().forEach((serverName, serverConfig) -> { String apiKey = serverConfig.getApiKey(); if (apiKey != null && !apiKey.isBlank() && !apiKey.startsWith("anl_your_")) { - AnalyseConfig config = new AnalyseConfig(apiKey); - serverClients.put(serverName, new AnalyseClient(config)); + ServerStatsConfig config = new ServerStatsConfig(apiKey); + serverClients.put(serverName, new ServerStatsClient(config)); logger.info(String.format("Initialized analytics client for server: %s", serverName)); } }); @@ -63,21 +63,21 @@ private void initializeClients() { * @param serverName The server name * @return The client, or empty if not configured */ - public Optional getClientForServer(String serverName) { + public Optional getClientForServer(String serverName) { return Optional.ofNullable(serverClients.get(serverName)); } /** - * Get an API client for use with the Analyse API. + * Get an API client for use with the ServerStats API. * Returns the configured default server's client if set, otherwise returns the first available client. * * @return An available client, or null if none configured */ - public AnalyseClient getAvailableClient() { + public ServerStatsClient getAvailableClient() { // Try configured default server first String defaultServer = plugin.getPluginConfig().getDefaultServer(); if (defaultServer != null && !defaultServer.isBlank()) { - AnalyseClient client = serverClients.get(defaultServer); + ServerStatsClient client = serverClients.get(defaultServer); if (client != null) { return client; } @@ -166,20 +166,20 @@ public void onDisconnect(DisconnectEvent event) { * Send a join event to the API */ private void sendJoinEvent(UUID uuid, String username, PlayerSession session, String serverName) { - Optional clientOpt = getClientForServer(serverName); + Optional clientOpt = getClientForServer(serverName); if (clientOpt.isEmpty()) { plugin.debug("Server %s not configured, skipping join event for %s", serverName, username); return; } - AnalyseClient client = clientOpt.get(); + ServerStatsClient client = clientOpt.get(); // Check if player is a Bedrock player boolean isBedrock = plugin.getPluginConfig().isBedrock(username); JoinRequest request = new JoinRequest(uuid, username, session.getHostname(), session.getIp(), isBedrock); - client.join(request, new AnalyseCallback<>() { + client.join(request, new ServerStatsCallback<>() { @Override public void onSuccess(JoinResponse response) { session.setCurrentSession(serverName, response.getSessionId()); @@ -188,7 +188,7 @@ public void onSuccess(JoinResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { logger.warn(String.format("Failed to send join event for %s on %s: %s", username, serverName, exception.getMessage())); } @@ -203,15 +203,15 @@ private void sendLeaveEvent(UUID uuid, String username, PlayerSession session, S return; } - Optional clientOpt = getClientForServer(serverName); + Optional clientOpt = getClientForServer(serverName); if (clientOpt.isEmpty()) { return; } - AnalyseClient client = clientOpt.get(); + ServerStatsClient client = clientOpt.get(); LeaveRequest request = new LeaveRequest(session.getSessionId()); - client.leave(request, new AnalyseCallback<>() { + client.leave(request, new ServerStatsCallback<>() { @Override public void onSuccess(LeaveResponse response) { plugin.debug("Leave event sent for %s on %s (duration: %ds)", @@ -219,7 +219,7 @@ public void onSuccess(LeaveResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { logger.warn(String.format("Failed to send leave event for %s on %s: %s", username, serverName, exception.getMessage())); } @@ -269,7 +269,7 @@ public void reinitialize() { * Shutdown all API clients */ public void shutdown() { - serverClients.values().forEach(AnalyseClient::shutdown); + serverClients.values().forEach(ServerStatsClient::shutdown); serverClients.clear(); } } diff --git a/velocity/src/main/java/net/analyse/velocity/listener/PluginMessageListener.java b/velocity/src/main/java/com/serverstats/velocity/listener/PluginMessageListener.java similarity index 76% rename from velocity/src/main/java/net/analyse/velocity/listener/PluginMessageListener.java rename to velocity/src/main/java/com/serverstats/velocity/listener/PluginMessageListener.java index 83ff3eb..28c59ec 100644 --- a/velocity/src/main/java/net/analyse/velocity/listener/PluginMessageListener.java +++ b/velocity/src/main/java/com/serverstats/velocity/listener/PluginMessageListener.java @@ -1,16 +1,16 @@ -package net.analyse.velocity.listener; +package com.serverstats.velocity.listener; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.connection.PluginMessageEvent; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ServerConnection; -import net.analyse.api.Analyse; -import net.analyse.api.messaging.AnalyseMessageParser; -import net.analyse.api.messaging.AnalyseMessageParser.ConversionMessage; -import net.analyse.api.messaging.AnalyseMessageParser.EventMessage; -import net.analyse.api.messaging.AnalyseMessageParser.ParsedMessage; -import net.analyse.api.messaging.AnalyseMessaging; -import net.analyse.velocity.AnalyseVelocity; +import com.serverstats.api.ServerStats; +import com.serverstats.api.messaging.ServerStatsMessageParser; +import com.serverstats.api.messaging.ServerStatsMessageParser.ConversionMessage; +import com.serverstats.api.messaging.ServerStatsMessageParser.EventMessage; +import com.serverstats.api.messaging.ServerStatsMessageParser.ParsedMessage; +import com.serverstats.api.messaging.ServerStatsMessaging; +import com.serverstats.velocity.ServerStatsVelocity; import java.io.IOException; /** @@ -19,14 +19,14 @@ */ public class PluginMessageListener { - private final AnalyseVelocity plugin; + private final ServerStatsVelocity plugin; /** * Create a new plugin message listener * * @param plugin The plugin instance */ - public PluginMessageListener(AnalyseVelocity plugin) { + public PluginMessageListener(ServerStatsVelocity plugin) { this.plugin = plugin; } @@ -38,7 +38,7 @@ public void onPluginMessage(PluginMessageEvent event) { } // Only handle our channel - if (!event.getIdentifier().getId().equals(AnalyseMessaging.CHANNEL)) { + if (!event.getIdentifier().getId().equals(ServerStatsMessaging.CHANNEL)) { return; } @@ -52,7 +52,7 @@ public void onPluginMessage(PluginMessageEvent event) { plugin.debug("Received plugin message from %s on server %s", player.getUsername(), serverName); try { - ParsedMessage message = AnalyseMessageParser.parse(event.getData()); + ParsedMessage message = ServerStatsMessageParser.parse(event.getData()); handleMessage(message, player, serverName); } catch (IOException e) { plugin.getLogger().warn(String.format("Failed to parse plugin message from %s: %s", @@ -82,8 +82,8 @@ private void handleMessage(ParsedMessage message, Player player, String serverNa * @param serverName The source server */ private void handleEventMessage(EventMessage message, String serverName) { - if (!Analyse.isAvailable()) { - plugin.getLogger().warn("Received event message but Analyse is not available"); + if (!ServerStats.isAvailable()) { + plugin.getLogger().warn("Received event message but ServerStats is not available"); return; } @@ -91,7 +91,7 @@ private void handleEventMessage(EventMessage message, String serverName) { message.getEventName(), message.getPlayerUsername(), serverName); // Build and send the event - var builder = Analyse.trackEvent(message.getEventName()) + var builder = ServerStats.trackEvent(message.getEventName()) .withPlayer(message.getPlayerUuid(), message.getPlayerUsername()); if (message.getData() != null) { @@ -123,8 +123,8 @@ private void handleEventMessage(EventMessage message, String serverName) { * @param serverName The source server */ private void handleConversionMessage(ConversionMessage message, String serverName) { - if (!Analyse.isAvailable()) { - plugin.getLogger().warn("Received conversion message but Analyse is not available"); + if (!ServerStats.isAvailable()) { + plugin.getLogger().warn("Received conversion message but ServerStats is not available"); return; } @@ -132,7 +132,7 @@ private void handleConversionMessage(ConversionMessage message, String serverNam message.getTestKey(), message.getConversionEvent(), message.getPlayerUsername(), serverName); - Analyse.trackConversion( + ServerStats.trackConversion( message.getPlayerUuid(), message.getPlayerUsername(), message.getTestKey(), diff --git a/velocity/src/main/java/net/analyse/velocity/manager/ABTestManager.java b/velocity/src/main/java/com/serverstats/velocity/manager/ABTestManager.java similarity index 69% rename from velocity/src/main/java/net/analyse/velocity/manager/ABTestManager.java rename to velocity/src/main/java/com/serverstats/velocity/manager/ABTestManager.java index 73f7cd7..f0a00b3 100644 --- a/velocity/src/main/java/net/analyse/velocity/manager/ABTestManager.java +++ b/velocity/src/main/java/com/serverstats/velocity/manager/ABTestManager.java @@ -1,16 +1,16 @@ -package net.analyse.velocity.manager; +package com.serverstats.velocity.manager; import com.velocitypowered.api.proxy.Player; -import net.analyse.api.exception.AnalyseException; -import net.analyse.api.object.abtest.ABTest; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.AnalyseClient; -import net.analyse.sdk.object.action.ActionData; -import net.analyse.sdk.request.ConversionRequest; -import net.analyse.sdk.response.ABTestsResponse; -import net.analyse.sdk.response.ConversionResponse; -import net.analyse.velocity.AnalyseVelocity; -import net.analyse.velocity.object.action.VelocityAction; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.api.object.abtest.ABTest; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.ServerStatsClient; +import com.serverstats.sdk.object.action.ActionData; +import com.serverstats.sdk.request.ConversionRequest; +import com.serverstats.sdk.response.ABTestsResponse; +import com.serverstats.sdk.response.ConversionResponse; +import com.serverstats.velocity.ServerStatsVelocity; +import com.serverstats.velocity.object.action.VelocityAction; import java.util.List; import java.util.Map; import java.util.UUID; @@ -21,14 +21,14 @@ * Manages A/B tests for the Velocity plugin. * Supports SEND_MESSAGE and RUN_COMMAND actions on proxies. */ -public class ABTestManager implements net.analyse.api.manager.ABTestManager { +public class ABTestManager implements com.serverstats.api.manager.ABTestManager { private static final long SYNC_INTERVAL_MINUTES = 5; - private final AnalyseVelocity plugin; - private final Map testsCache = new ConcurrentHashMap<>(); + private final ServerStatsVelocity plugin; + private final Map testsCache = new ConcurrentHashMap<>(); - public ABTestManager(AnalyseVelocity plugin) { + public ABTestManager(ServerStatsVelocity plugin) { this.plugin = plugin; } @@ -59,17 +59,17 @@ public void stop() { * Sync tests from the API */ private void syncTests() { - AnalyseClient client = plugin.getClient(); + ServerStatsClient client = plugin.getClient(); if (client == null) { return; } - client.getABTests(new AnalyseCallback<>() { + client.getABTests(new ServerStatsCallback<>() { @Override public void onSuccess(ABTestsResponse response) { if (response.isSuccess() && response.getTests() != null) { testsCache.clear(); - for (net.analyse.sdk.object.abtest.ABTest test : response.getTests()) { + for (com.serverstats.sdk.object.abtest.ABTest test : response.getTests()) { if (test.isActive()) { testsCache.put(test.getKey(), test); } @@ -82,7 +82,7 @@ public void onSuccess(ABTestsResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { plugin.logWarning(String.format("Failed to sync A/B tests: %s", exception.getMessage())); } }); @@ -90,7 +90,7 @@ public void onError(AnalyseException exception) { @Override @SuppressWarnings("unchecked") - public List getActiveTests() { + public List getActiveTests() { return List.copyOf(testsCache.values()); } @@ -101,7 +101,7 @@ public ABTest getTest(String testKey) { @Override public String getVariant(UUID playerUuid, String testKey) { - net.analyse.sdk.object.abtest.ABTest test = testsCache.get(testKey); + com.serverstats.sdk.object.abtest.ABTest test = testsCache.get(testKey); if (test == null) { return null; } @@ -125,7 +125,7 @@ public boolean isTestActive(String testKey) { public void processJoin(Player player, boolean firstJoin) { ABTest.Trigger trigger = firstJoin ? ABTest.Trigger.FIRST_JOIN : ABTest.Trigger.EVERY_JOIN; - for (net.analyse.sdk.object.abtest.ABTest test : testsCache.values()) { + for (com.serverstats.sdk.object.abtest.ABTest test : testsCache.values()) { if (!test.matchesTrigger(trigger)) { continue; } @@ -133,7 +133,7 @@ public void processJoin(Player player, boolean firstJoin) { // Assign variant and execute actions var variant = test.assignVariant(player.getUniqueId()); if (variant != null && variant.hasActions()) { - executeActions(player, test, (net.analyse.sdk.object.abtest.Variant) variant); + executeActions(player, test, (com.serverstats.sdk.object.abtest.Variant) variant); } } } @@ -145,7 +145,7 @@ public void processJoin(Player player, boolean firstJoin) { * @param eventName The event name */ public void processEvent(Player player, String eventName) { - for (net.analyse.sdk.object.abtest.ABTest test : testsCache.values()) { + for (com.serverstats.sdk.object.abtest.ABTest test : testsCache.values()) { if (!test.matchesEvent(eventName)) { continue; } @@ -153,7 +153,7 @@ public void processEvent(Player player, String eventName) { // Assign variant and execute actions var variant = test.assignVariant(player.getUniqueId()); if (variant != null && variant.hasActions()) { - executeActions(player, test, (net.analyse.sdk.object.abtest.Variant) variant); + executeActions(player, test, (com.serverstats.sdk.object.abtest.Variant) variant); } } } @@ -165,8 +165,8 @@ public void processEvent(Player player, String eventName) { * @param test The A/B test * @param variant The assigned variant */ - private void executeActions(Player player, net.analyse.sdk.object.abtest.ABTest test, - net.analyse.sdk.object.abtest.Variant variant) { + private void executeActions(Player player, com.serverstats.sdk.object.abtest.ABTest test, + com.serverstats.sdk.object.abtest.Variant variant) { if (plugin.isDebugEnabled()) { plugin.logInfo(String.format("[DEBUG] Player %s assigned to variant '%s' for test '%s'", player.getUsername(), variant.getKey(), test.getKey())); @@ -182,12 +182,12 @@ private void executeActions(Player player, net.analyse.sdk.object.abtest.ABTest @Override public void trackConversion(UUID playerUuid, String playerUsername, String testKey, String eventName) { - net.analyse.sdk.object.abtest.ABTest test = testsCache.get(testKey); + com.serverstats.sdk.object.abtest.ABTest test = testsCache.get(testKey); if (test == null) { return; } - AnalyseClient client = plugin.getClient(); + ServerStatsClient client = plugin.getClient(); if (client == null) { return; } @@ -199,7 +199,7 @@ public void trackConversion(UUID playerUuid, String playerUsername, String testK testKey, variantKey, playerUuid, playerUsername, eventName, null ); - client.trackConversion(request, new AnalyseCallback<>() { + client.trackConversion(request, new ServerStatsCallback<>() { @Override public void onSuccess(ConversionResponse response) { if (plugin.isDebugEnabled()) { @@ -209,7 +209,7 @@ public void onSuccess(ConversionResponse response) { } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { plugin.logWarning(String.format("Failed to track conversion: %s", exception.getMessage())); } }); diff --git a/velocity/src/main/java/net/analyse/velocity/manager/SessionManager.java b/velocity/src/main/java/com/serverstats/velocity/manager/SessionManager.java similarity index 87% rename from velocity/src/main/java/net/analyse/velocity/manager/SessionManager.java rename to velocity/src/main/java/com/serverstats/velocity/manager/SessionManager.java index b6a9748..6c24bc1 100644 --- a/velocity/src/main/java/net/analyse/velocity/manager/SessionManager.java +++ b/velocity/src/main/java/com/serverstats/velocity/manager/SessionManager.java @@ -1,6 +1,6 @@ -package net.analyse.velocity.manager; +package com.serverstats.velocity.manager; -import net.analyse.velocity.object.session.PlayerSession; +import com.serverstats.velocity.object.session.PlayerSession; import java.util.Collection; import java.util.Map; import java.util.Optional; @@ -10,7 +10,7 @@ /** * Thread-safe manager for player sessions */ -public class SessionManager implements net.analyse.api.manager.SessionManager { +public class SessionManager implements com.serverstats.api.manager.SessionManager { private final Map sessions = new ConcurrentHashMap<>(); diff --git a/velocity/src/main/java/net/analyse/velocity/object/action/RunCommandAction.java b/velocity/src/main/java/com/serverstats/velocity/object/action/RunCommandAction.java similarity index 79% rename from velocity/src/main/java/net/analyse/velocity/object/action/RunCommandAction.java rename to velocity/src/main/java/com/serverstats/velocity/object/action/RunCommandAction.java index 4a40632..b999dd9 100644 --- a/velocity/src/main/java/net/analyse/velocity/object/action/RunCommandAction.java +++ b/velocity/src/main/java/com/serverstats/velocity/object/action/RunCommandAction.java @@ -1,9 +1,9 @@ -package net.analyse.velocity.object.action; +package com.serverstats.velocity.object.action; import com.velocitypowered.api.proxy.Player; -import net.analyse.sdk.object.action.ActionData; -import net.analyse.sdk.object.action.ActionType; -import net.analyse.velocity.AnalyseVelocity; +import com.serverstats.sdk.object.action.ActionData; +import com.serverstats.sdk.object.action.ActionType; +import com.serverstats.velocity.ServerStatsVelocity; /** * Action that runs a command on the proxy. @@ -11,7 +11,7 @@ */ public class RunCommandAction extends VelocityAction { - public RunCommandAction(AnalyseVelocity plugin, ActionData data) { + public RunCommandAction(ServerStatsVelocity plugin, ActionData data) { super(plugin, data); } diff --git a/velocity/src/main/java/net/analyse/velocity/object/action/SendMessageAction.java b/velocity/src/main/java/com/serverstats/velocity/object/action/SendMessageAction.java similarity index 69% rename from velocity/src/main/java/net/analyse/velocity/object/action/SendMessageAction.java rename to velocity/src/main/java/com/serverstats/velocity/object/action/SendMessageAction.java index d1bc554..57e4b54 100644 --- a/velocity/src/main/java/net/analyse/velocity/object/action/SendMessageAction.java +++ b/velocity/src/main/java/com/serverstats/velocity/object/action/SendMessageAction.java @@ -1,10 +1,10 @@ -package net.analyse.velocity.object.action; +package com.serverstats.velocity.object.action; import com.velocitypowered.api.proxy.Player; -import net.analyse.sdk.object.action.ActionData; -import net.analyse.sdk.object.action.ActionType; -import net.analyse.velocity.AnalyseVelocity; -import net.analyse.velocity.util.ComponentUtil; +import com.serverstats.sdk.object.action.ActionData; +import com.serverstats.sdk.object.action.ActionType; +import com.serverstats.velocity.ServerStatsVelocity; +import com.serverstats.velocity.util.ComponentUtil; /** * Action that sends a message to the player. @@ -12,7 +12,7 @@ */ public class SendMessageAction extends VelocityAction { - public SendMessageAction(AnalyseVelocity plugin, ActionData data) { + public SendMessageAction(ServerStatsVelocity plugin, ActionData data) { super(plugin, data); } diff --git a/velocity/src/main/java/net/analyse/velocity/object/action/VelocityAction.java b/velocity/src/main/java/com/serverstats/velocity/object/action/VelocityAction.java similarity index 78% rename from velocity/src/main/java/net/analyse/velocity/object/action/VelocityAction.java rename to velocity/src/main/java/com/serverstats/velocity/object/action/VelocityAction.java index d11eacd..b11ed31 100644 --- a/velocity/src/main/java/net/analyse/velocity/object/action/VelocityAction.java +++ b/velocity/src/main/java/com/serverstats/velocity/object/action/VelocityAction.java @@ -1,9 +1,9 @@ -package net.analyse.velocity.object.action; +package com.serverstats.velocity.object.action; import com.velocitypowered.api.proxy.Player; -import net.analyse.sdk.object.action.Action; -import net.analyse.sdk.object.action.ActionData; -import net.analyse.velocity.AnalyseVelocity; +import com.serverstats.sdk.object.action.Action; +import com.serverstats.sdk.object.action.ActionData; +import com.serverstats.velocity.ServerStatsVelocity; /** * Base class for Velocity-specific A/B test actions. @@ -11,10 +11,10 @@ */ public abstract class VelocityAction implements Action { - protected final AnalyseVelocity plugin; + protected final ServerStatsVelocity plugin; protected final ActionData data; - protected VelocityAction(AnalyseVelocity plugin, ActionData data) { + protected VelocityAction(ServerStatsVelocity plugin, ActionData data) { this.plugin = plugin; this.data = data; } @@ -26,7 +26,7 @@ protected VelocityAction(AnalyseVelocity plugin, ActionData data) { * @param data The action data from the API * @return The appropriate VelocityAction, or null if type is unsupported */ - public static VelocityAction create(AnalyseVelocity plugin, ActionData data) { + public static VelocityAction create(ServerStatsVelocity plugin, ActionData data) { if (data == null || data.getType() == null) { return null; } diff --git a/bungeecord/src/main/java/net/analyse/bungeecord/object/session/PlayerSession.java b/velocity/src/main/java/com/serverstats/velocity/object/session/PlayerSession.java similarity index 91% rename from bungeecord/src/main/java/net/analyse/bungeecord/object/session/PlayerSession.java rename to velocity/src/main/java/com/serverstats/velocity/object/session/PlayerSession.java index 44fefcf..a374244 100644 --- a/bungeecord/src/main/java/net/analyse/bungeecord/object/session/PlayerSession.java +++ b/velocity/src/main/java/com/serverstats/velocity/object/session/PlayerSession.java @@ -1,4 +1,4 @@ -package net.analyse.bungeecord.object.session; +package com.serverstats.velocity.object.session; import lombok.Getter; import java.time.Instant; @@ -8,7 +8,7 @@ * Stores session data for a connected player */ @Getter -public class PlayerSession implements net.analyse.api.session.PlayerSession { +public class PlayerSession implements com.serverstats.api.session.PlayerSession { private final UUID playerUuid; private final String hostname; diff --git a/velocity/src/main/java/net/analyse/velocity/task/HeartbeatTask.java b/velocity/src/main/java/com/serverstats/velocity/task/HeartbeatTask.java similarity index 70% rename from velocity/src/main/java/net/analyse/velocity/task/HeartbeatTask.java rename to velocity/src/main/java/com/serverstats/velocity/task/HeartbeatTask.java index 978fc8c..10132d6 100644 --- a/velocity/src/main/java/net/analyse/velocity/task/HeartbeatTask.java +++ b/velocity/src/main/java/com/serverstats/velocity/task/HeartbeatTask.java @@ -1,17 +1,17 @@ -package net.analyse.velocity.task; +package com.serverstats.velocity.task; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.server.RegisteredServer; -import net.analyse.sdk.AnalyseCallback; -import net.analyse.sdk.AnalyseClient; -import net.analyse.api.exception.AnalyseException; -import net.analyse.sdk.request.HeartbeatRequest; -import net.analyse.sdk.request.PlayerInfo; -import net.analyse.sdk.request.ServerType; -import net.analyse.sdk.response.HeartbeatResponse; -import net.analyse.velocity.AnalyseVelocity; -import net.analyse.velocity.listener.PlayerListener; -import net.analyse.velocity.object.session.PlayerSession; +import com.serverstats.sdk.ServerStatsCallback; +import com.serverstats.sdk.ServerStatsClient; +import com.serverstats.api.exception.ServerStatsException; +import com.serverstats.sdk.request.HeartbeatRequest; +import com.serverstats.sdk.request.PlayerInfo; +import com.serverstats.sdk.request.ServerType; +import com.serverstats.sdk.response.HeartbeatResponse; +import com.serverstats.velocity.ServerStatsVelocity; +import com.serverstats.velocity.listener.PlayerListener; +import com.serverstats.velocity.object.session.PlayerSession; import org.slf4j.Logger; import java.util.List; import java.util.Optional; @@ -21,11 +21,11 @@ */ public class HeartbeatTask implements Runnable { - private final AnalyseVelocity plugin; + private final ServerStatsVelocity plugin; private final Logger logger; private final PlayerListener playerListener; - public HeartbeatTask(AnalyseVelocity plugin, PlayerListener playerListener) { + public HeartbeatTask(ServerStatsVelocity plugin, PlayerListener playerListener) { this.plugin = plugin; this.logger = plugin.getLogger(); this.playerListener = playerListener; @@ -43,7 +43,7 @@ public void run() { * @param serverName The server name */ private void sendHeartbeatForServer(String serverName) { - Optional clientOpt = playerListener.getClientForServer(serverName); + Optional clientOpt = playerListener.getClientForServer(serverName); if (clientOpt.isEmpty()) { return; } @@ -55,7 +55,7 @@ private void sendHeartbeatForServer(String serverName) { } RegisteredServer server = serverOpt.get(); - AnalyseClient client = clientOpt.get(); + ServerStatsClient client = clientOpt.get(); // Collect player info with hostnames for players on this server List onlinePlayers = server.getPlayersConnected().stream() @@ -65,14 +65,14 @@ private void sendHeartbeatForServer(String serverName) { String instanceId = plugin.getPluginConfig().getInstanceId(); HeartbeatRequest request = new HeartbeatRequest(instanceId, ServerType.MINECRAFT, onlinePlayers); - client.heartbeat(request, new AnalyseCallback<>() { + client.heartbeat(request, new ServerStatsCallback<>() { @Override public void onSuccess(HeartbeatResponse response) { plugin.debug("Heartbeat sent for %s (%d players)", serverName, response.getOnlineCount()); } @Override - public void onError(AnalyseException exception) { + public void onError(ServerStatsException exception) { logger.warn(String.format("Failed to send heartbeat for %s: %s", serverName, exception.getMessage())); } diff --git a/velocity/src/main/java/net/analyse/velocity/update/VelocityUpdateChecker.java b/velocity/src/main/java/com/serverstats/velocity/update/VelocityUpdateChecker.java similarity index 88% rename from velocity/src/main/java/net/analyse/velocity/update/VelocityUpdateChecker.java rename to velocity/src/main/java/com/serverstats/velocity/update/VelocityUpdateChecker.java index c418860..65c98d4 100644 --- a/velocity/src/main/java/net/analyse/velocity/update/VelocityUpdateChecker.java +++ b/velocity/src/main/java/com/serverstats/velocity/update/VelocityUpdateChecker.java @@ -1,8 +1,8 @@ -package net.analyse.velocity.update; +package com.serverstats.velocity.update; import com.velocitypowered.api.scheduler.ScheduledTask; -import net.analyse.sdk.update.UpdateChecker; -import net.analyse.velocity.AnalyseVelocity; +import com.serverstats.sdk.update.UpdateChecker; +import com.serverstats.velocity.ServerStatsVelocity; import java.util.concurrent.TimeUnit; /** @@ -12,7 +12,7 @@ public class VelocityUpdateChecker { private static final long CHECK_INTERVAL_MINUTES = 30; - private final AnalyseVelocity plugin; + private final ServerStatsVelocity plugin; private final UpdateChecker checker; private ScheduledTask task; @@ -22,7 +22,7 @@ public class VelocityUpdateChecker { * @param plugin The plugin instance * @param currentVersion The current plugin version */ - public VelocityUpdateChecker(AnalyseVelocity plugin, String currentVersion) { + public VelocityUpdateChecker(ServerStatsVelocity plugin, String currentVersion) { this.plugin = plugin; this.checker = new UpdateChecker(plugin.getClient(), currentVersion, "velocity"); } @@ -62,7 +62,7 @@ private void check() { @Override public void onUpdateAvailable(String currentVersion, String newVersion, String downloadUrl) { plugin.logInfo("╔════════════════════════════════════════════════════════════╗"); - plugin.logInfo("║ A new version of Analyse is available! ║"); + plugin.logInfo("║ A new version of ServerStats is available! ║"); plugin.logInfo("║ Current: " + padRight(currentVersion, 20) + " Latest: " + padRight(newVersion, 20) + "║"); plugin.logInfo("║ Download: " + padRight(downloadUrl, 47) + "║"); plugin.logInfo("╚════════════════════════════════════════════════════════════╝"); diff --git a/paper/src/main/java/net/analyse/paper/util/ComponentUtil.java b/velocity/src/main/java/com/serverstats/velocity/util/ComponentUtil.java similarity index 99% rename from paper/src/main/java/net/analyse/paper/util/ComponentUtil.java rename to velocity/src/main/java/com/serverstats/velocity/util/ComponentUtil.java index d685695..7049e65 100644 --- a/paper/src/main/java/net/analyse/paper/util/ComponentUtil.java +++ b/velocity/src/main/java/com/serverstats/velocity/util/ComponentUtil.java @@ -1,4 +1,4 @@ -package net.analyse.paper.util; +package com.serverstats.velocity.util; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; From 251298e2e6dba2c017748c446d47d194e063fdd4 Mon Sep 17 00:00:00 2001 From: Wesley Breukers Date: Sat, 24 Jan 2026 14:03:59 +0200 Subject: [PATCH 2/5] fix(PlayerListener): enhance IP retrieval error handling and logging - Added try-catch block in getPlayerIp method to handle exceptions during IP retrieval. - Improved debug logging to provide clearer messages when player IP retrieval fails due to null packet handler or incorrect address type. --- .../hytale/listener/PlayerListener.java | 123 +++++++++++++----- 1 file changed, 90 insertions(+), 33 deletions(-) diff --git a/hytale/src/main/java/com/serverstats/hytale/listener/PlayerListener.java b/hytale/src/main/java/com/serverstats/hytale/listener/PlayerListener.java index ce1a199..3f797d2 100644 --- a/hytale/src/main/java/com/serverstats/hytale/listener/PlayerListener.java +++ b/hytale/src/main/java/com/serverstats/hytale/listener/PlayerListener.java @@ -6,7 +6,6 @@ import com.hypixel.hytale.server.core.io.PacketHandler; import com.hypixel.hytale.server.core.universe.PlayerRef; import com.hypixel.hytale.server.core.universe.Universe; - import com.serverstats.api.exception.ServerStatsException; import com.serverstats.hytale.HytalePlugin; import com.serverstats.hytale.manager.SessionManager; @@ -17,7 +16,6 @@ import com.serverstats.sdk.request.LeaveRequest; import com.serverstats.sdk.response.JoinResponse; import com.serverstats.sdk.response.LeaveResponse; - import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.HashMap; @@ -70,23 +68,44 @@ public void onPlayerConnect(PlayerConnectEvent event) { // Create session for this player sessionManager.createSession(uuid, hostname, ip); - plugin.debug("Created session for %s (hostname: %s, ip: %s)", username, hostname, ip); + plugin.debug( + "Created session for %s (hostname: %s, ip: %s)", + username, + hostname, + ip + ); // Send join event to the API JoinRequest request = new JoinRequest(uuid, username, hostname, ip, false); - client.join(request, new ServerStatsCallback<>() { - @Override - public void onSuccess(JoinResponse response) { - sessionManager.getSession(uuid).ifPresent(session -> session.setSessionId(response.getSessionId())); - plugin.debug("Join event sent for %s (sessionId: %s)", username, response.getSessionId()); - } - - @Override - public void onError(ServerStatsException exception) { - plugin.logWarning(String.format("Failed to send join event for %s: %s", username, exception.getMessage())); + client.join( + request, + new ServerStatsCallback<>() { + @Override + public void onSuccess(JoinResponse response) { + sessionManager + .getSession(uuid) + .ifPresent(session -> session.setSessionId(response.getSessionId()) + ); + plugin.debug( + "Join event sent for %s (sessionId: %s)", + username, + response.getSessionId() + ); + } + + @Override + public void onError(ServerStatsException exception) { + plugin.logWarning( + String.format( + "Failed to send join event for %s: %s", + username, + exception.getMessage() + ) + ); + } } - }); + ); } /** @@ -112,17 +131,30 @@ public void onPlayerDisconnect(PlayerDisconnectEvent event) { // Send leave event to the API LeaveRequest request = new LeaveRequest(session.getSessionId()); - client.leave(request, new ServerStatsCallback<>() { - @Override - public void onSuccess(LeaveResponse response) { - plugin.debug("Leave event sent for %s (duration: %ds)", username, response.getDuration()); - } - - @Override - public void onError(ServerStatsException exception) { - plugin.logWarning(String.format("Failed to send leave event for %s: %s", username, exception.getMessage())); + client.leave( + request, + new ServerStatsCallback<>() { + @Override + public void onSuccess(LeaveResponse response) { + plugin.debug( + "Leave event sent for %s (duration: %ds)", + username, + response.getDuration() + ); + } + + @Override + public void onError(ServerStatsException exception) { + plugin.logWarning( + String.format( + "Failed to send leave event for %s: %s", + username, + exception.getMessage() + ) + ); + } } - }); + ); } /** @@ -132,17 +164,42 @@ public void onError(ServerStatsException exception) { * @return The IP address string */ private String getPlayerIp(PlayerRef playerRef) { - PacketHandler packetHandler = playerRef.getPacketHandler(); - if (packetHandler == null) { - return "unknown"; - } + try { + PacketHandler packetHandler = playerRef.getPacketHandler(); + if (packetHandler == null) { + plugin.debug( + String.format( + "Failed to get player IP for %s: %s", + playerRef.getUsername(), + "packetHandler is null" + ) + ); + return "unknown"; + } - SocketAddress address = packetHandler.getChannel().remoteAddress(); - if (!(address instanceof InetSocketAddress socketAddress)) { + SocketAddress address = packetHandler.getChannel().remoteAddress(); + if (!(address instanceof InetSocketAddress socketAddress)) { + plugin.debug( + String.format( + "Failed to get player IP for %s: %s", + playerRef.getUsername(), + "address is not an InetSocketAddress" + ) + ); + return "unknown"; + } + + String ip = socketAddress.getAddress().getHostAddress(); + return ip != null ? ip : "unknown"; + } catch (Exception e) { + plugin.debug( + String.format( + "Failed to get player IP for %s: %s", + playerRef.getUsername(), + e.getMessage() + ) + ); return "unknown"; } - - String ip = socketAddress.getAddress().getHostAddress(); - return ip != null ? ip : "unknown"; } } From 1202bc8c3bc66784ccef8393677052c65de57faa Mon Sep 17 00:00:00 2001 From: Wesley Breukers Date: Sat, 24 Jan 2026 14:09:32 +0200 Subject: [PATCH 3/5] refactor(manifest): update project name from ServerStats to Hytale in manifest.json --- hytale/src/main/resources/manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hytale/src/main/resources/manifest.json b/hytale/src/main/resources/manifest.json index 00f84b3..c15bdc6 100644 --- a/hytale/src/main/resources/manifest.json +++ b/hytale/src/main/resources/manifest.json @@ -1,6 +1,6 @@ { "Group": "ServerStats", - "Name": "ServerStats", + "Name": "Hytale", "Version": "${version}", "Description": "Analytics plugin for Hytale servers", "Authors": [{"Name": "VertCode"}], From 2e3fb60b004c62bf5e35127be0d6eb9f6e81b669 Mon Sep 17 00:00:00 2001 From: Wesley Breukers Date: Sat, 24 Jan 2026 20:36:33 +0200 Subject: [PATCH 4/5] feat(PlayerListener): implement player ready event handling and improve session management - Added handling for PlayerReadyEvent to create player sessions upon readiness. - Enhanced IP and hostname retrieval methods for better error handling and logging. - Updated HytalePlugin to register the new PlayerReadyEvent listener. - Refactored code for clarity and improved debugging output. --- .../com/serverstats/hytale/HytalePlugin.java | 28 +-- .../hytale/listener/PlayerListener.java | 168 ++++++++++-------- hytale/src/main/resources/manifest.json | 4 +- 3 files changed, 115 insertions(+), 85 deletions(-) diff --git a/hytale/src/main/java/com/serverstats/hytale/HytalePlugin.java b/hytale/src/main/java/com/serverstats/hytale/HytalePlugin.java index b353a1a..6d26218 100644 --- a/hytale/src/main/java/com/serverstats/hytale/HytalePlugin.java +++ b/hytale/src/main/java/com/serverstats/hytale/HytalePlugin.java @@ -3,19 +3,11 @@ import com.google.common.flogger.FluentLogger; import com.hypixel.hytale.server.core.event.events.player.PlayerConnectEvent; import com.hypixel.hytale.server.core.event.events.player.PlayerDisconnectEvent; +import com.hypixel.hytale.server.core.event.events.player.PlayerReadyEvent; import com.hypixel.hytale.server.core.plugin.JavaPlugin; import com.hypixel.hytale.server.core.plugin.JavaPluginInit; import com.hypixel.hytale.server.core.universe.PlayerRef; import com.hypixel.hytale.server.core.universe.Universe; -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.util.UUID; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; -import javax.annotation.Nonnull; import com.serverstats.api.ServerStats; import com.serverstats.api.ServerStatsProvider; import com.serverstats.api.exception.ServerStatsException; @@ -35,6 +27,15 @@ import com.serverstats.sdk.request.JoinRequest; import com.serverstats.sdk.response.EventResponse; import com.serverstats.sdk.response.JoinResponse; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.util.UUID; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; +import javax.annotation.Nonnull; /** * ServerStats plugin for Hytale servers @@ -53,7 +54,6 @@ public class HytalePlugin extends JavaPlugin implements ServerStatsPlatform { public HytalePlugin(@Nonnull JavaPluginInit init) { super(init); - this.version = init.getPluginManifest().getVersion().toString(); } @@ -92,7 +92,9 @@ protected void start() { getLogger().atInfo().log("Enabling ServerStats..."); // Initialize SDK client - ServerStatsConfig sdkConfig = new ServerStatsConfig(pluginConfig.getApiKey()); + ServerStatsConfig sdkConfig = new ServerStatsConfig( + pluginConfig.getApiKey() + ); client = new ServerStatsClient(sdkConfig); // Register with the API provider so other plugins can use ServerStats.get() @@ -107,9 +109,9 @@ protected void start() { // Register player listener PlayerListener playerListener = new PlayerListener(this, client); getEventRegistry() - .register(PlayerConnectEvent.class, playerListener::onPlayerConnect); + .registerGlobal(PlayerReadyEvent.class, playerListener::onPlayerReady); getEventRegistry() - .register( + .registerGlobal( PlayerDisconnectEvent.class, playerListener::onPlayerDisconnect ); diff --git a/hytale/src/main/java/com/serverstats/hytale/listener/PlayerListener.java b/hytale/src/main/java/com/serverstats/hytale/listener/PlayerListener.java index 3f797d2..d1d139b 100644 --- a/hytale/src/main/java/com/serverstats/hytale/listener/PlayerListener.java +++ b/hytale/src/main/java/com/serverstats/hytale/listener/PlayerListener.java @@ -1,11 +1,15 @@ package com.serverstats.hytale.listener; -import com.hypixel.hytale.server.core.event.events.player.PlayerConnectEvent; +import com.hypixel.hytale.component.Ref; +import com.hypixel.hytale.component.Store; +import com.hypixel.hytale.protocol.HostAddress; +import com.hypixel.hytale.server.core.auth.PlayerAuthentication; import com.hypixel.hytale.server.core.event.events.player.PlayerDisconnectEvent; -import com.hypixel.hytale.server.core.event.events.player.PlayerSetupConnectEvent; +import com.hypixel.hytale.server.core.event.events.player.PlayerReadyEvent; import com.hypixel.hytale.server.core.io.PacketHandler; +import com.hypixel.hytale.server.core.io.handlers.login.HandshakeHandler; import com.hypixel.hytale.server.core.universe.PlayerRef; -import com.hypixel.hytale.server.core.universe.Universe; +import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; import com.serverstats.api.exception.ServerStatsException; import com.serverstats.hytale.HytalePlugin; import com.serverstats.hytale.manager.SessionManager; @@ -16,10 +20,9 @@ import com.serverstats.sdk.request.LeaveRequest; import com.serverstats.sdk.response.JoinResponse; import com.serverstats.sdk.response.LeaveResponse; +import io.netty.handler.codec.quic.QuicStreamChannel; import java.net.InetSocketAddress; import java.net.SocketAddress; -import java.util.HashMap; -import java.util.Map; import java.util.Optional; import java.util.UUID; @@ -32,82 +35,54 @@ public class PlayerListener { private final SessionManager sessionManager; private final ServerStatsClient client; - private final Map hostnameMap = new HashMap<>(); - public PlayerListener(HytalePlugin plugin, ServerStatsClient client) { this.plugin = plugin; this.sessionManager = plugin.getSessionManager(); this.client = client; } - public void onPlayerSetupConnect(PlayerSetupConnectEvent event) { - UUID uuid = event.getUuid(); - String hostname = event.getReferralSource().host; - - hostnameMap.put(uuid, hostname); - - plugin.debug("Hostname set for %s: %s", uuid, hostname); - } - /** - * Handle player connect event + * Handle player ready event * - * @param event The connect event + * @param event The ready event */ - public void onPlayerConnect(PlayerConnectEvent event) { - PlayerRef playerRef = event.getPlayerRef(); - UUID uuid = playerRef.getUuid(); - String username = playerRef.getUsername(); - - // Get player's IP address - String ip = getPlayerIp(playerRef); + public void onPlayerReady(PlayerReadyEvent event) { + Ref ref = event.getPlayerRef(); + if (!ref.isValid()) { + return; + } - // Get hostname (Hytale doesn't seem to expose this yet, use unknown) - String hostname = hostnameMap.getOrDefault(uuid, "unknown"); + Store store = ref.getStore(); + PlayerRef playerRef = store.getComponent(ref, PlayerRef.getComponentType()); + if (playerRef == null) { + return; + } - // Create session for this player - sessionManager.createSession(uuid, hostname, ip); + UUID playerUuid = playerRef.getUuid(); + String playerName = playerRef.getUsername(); + String ip = getPlayerIp(playerRef); + String hostname = getPlayerHostname(playerRef); - plugin.debug( - "Created session for %s (hostname: %s, ip: %s)", - username, - hostname, - ip - ); + sessionManager.createSession(playerUuid, hostname, ip); + plugin.debug("Created session for %s (hostname: %s, ip: %s)", playerName, hostname, ip); // Send join event to the API - JoinRequest request = new JoinRequest(uuid, username, hostname, ip, false); - - client.join( - request, - new ServerStatsCallback<>() { - @Override - public void onSuccess(JoinResponse response) { - sessionManager - .getSession(uuid) - .ifPresent(session -> session.setSessionId(response.getSessionId()) - ); - plugin.debug( - "Join event sent for %s (sessionId: %s)", - username, - response.getSessionId() - ); - } + JoinRequest request = new JoinRequest(playerUuid, playerName, hostname, ip, false); + client.join(request, new ServerStatsCallback<>() { + @Override + public void onSuccess(JoinResponse response) { + sessionManager.getSession(playerUuid).ifPresent(session -> session.setSessionId(response.getSessionId())); + plugin.debug("Join event sent for %s (sessionId: %s)", playerName, response.getSessionId()); + } - @Override - public void onError(ServerStatsException exception) { - plugin.logWarning( - String.format( - "Failed to send join event for %s: %s", - username, - exception.getMessage() - ) - ); - } + @Override + public void onError(ServerStatsException exception) { + plugin.logWarning(String.format("Failed to send join event for %s: %s", playerName, exception.getMessage())); } - ); + }); } + /** * Handle player disconnect event * @@ -177,24 +152,77 @@ private String getPlayerIp(PlayerRef playerRef) { return "unknown"; } - SocketAddress address = packetHandler.getChannel().remoteAddress(); - if (!(address instanceof InetSocketAddress socketAddress)) { + String ip = null; + SocketAddress sa = (packetHandler.getChannel() instanceof + QuicStreamChannel quic) + ? quic.parent().remoteSocketAddress() + : packetHandler.getChannel().remoteAddress(); + if (sa instanceof InetSocketAddress inet) { + ip = inet.getAddress().getHostAddress(); + } + + return ip != null ? ip : "unknown"; + } catch (Exception e) { + plugin.debug( + String.format( + "Failed to get player IP for %s: %s", + playerRef.getUsername(), + e.getMessage() + ) + ); + return "unknown"; + } + } + + /** + * Get the player's hostname from the player reference + * + * @param playerRef The player reference + * @return The IP address string + */ + private String getPlayerHostname(PlayerRef playerRef) { + try { + PacketHandler packetHandler = playerRef.getPacketHandler(); + if (packetHandler == null) { plugin.debug( String.format( - "Failed to get player IP for %s: %s", + "Failed to get player hostname for %s: %s", playerRef.getUsername(), - "address is not an InetSocketAddress" + "packetHandler is null" ) ); return "unknown"; } - String ip = socketAddress.getAddress().getHostAddress(); - return ip != null ? ip : "unknown"; + PlayerAuthentication authentication = packetHandler.getAuth(); + if (authentication == null) { + plugin.debug( + String.format( + "Failed to get player hostname for %s: %s", + playerRef.getUsername(), + "authentication is null" + ) + ); + return "unknown"; + } + + HostAddress referralSource = authentication.getReferralSource(); + if (referralSource == null) { + plugin.debug( + String.format( + "Failed to get player hostname for %s: %s", + playerRef.getUsername(), + "referralSource is null" + ) + ); + return "unknown"; + } + + return referralSource.host != null ? referralSource.host : "unknown"; } catch (Exception e) { plugin.debug( String.format( - "Failed to get player IP for %s: %s", + "Failed to get player hostname for %s: %s", playerRef.getUsername(), e.getMessage() ) diff --git a/hytale/src/main/resources/manifest.json b/hytale/src/main/resources/manifest.json index c15bdc6..47b41b1 100644 --- a/hytale/src/main/resources/manifest.json +++ b/hytale/src/main/resources/manifest.json @@ -1,6 +1,6 @@ { - "Group": "ServerStats", - "Name": "Hytale", + "Group": "Hytale", + "Name": "ServerStats", "Version": "${version}", "Description": "Analytics plugin for Hytale servers", "Authors": [{"Name": "VertCode"}], From 68a9b950a1107b44ee797f9f544cea0fa5e6321d Mon Sep 17 00:00:00 2001 From: Wesley Breukers Date: Sun, 25 Jan 2026 01:31:38 +0200 Subject: [PATCH 5/5] refactor(HytalePlugin, PlayerListener): remove unused imports and clean up code - Removed unused imports from HytalePlugin and PlayerListener classes to improve code clarity. - Ensured consistent formatting by removing trailing whitespace in PlayerListener. --- hytale/src/main/java/com/serverstats/hytale/HytalePlugin.java | 2 -- .../java/com/serverstats/hytale/listener/PlayerListener.java | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/hytale/src/main/java/com/serverstats/hytale/HytalePlugin.java b/hytale/src/main/java/com/serverstats/hytale/HytalePlugin.java index 6d26218..2460e2d 100644 --- a/hytale/src/main/java/com/serverstats/hytale/HytalePlugin.java +++ b/hytale/src/main/java/com/serverstats/hytale/HytalePlugin.java @@ -1,7 +1,5 @@ package com.serverstats.hytale; -import com.google.common.flogger.FluentLogger; -import com.hypixel.hytale.server.core.event.events.player.PlayerConnectEvent; import com.hypixel.hytale.server.core.event.events.player.PlayerDisconnectEvent; import com.hypixel.hytale.server.core.event.events.player.PlayerReadyEvent; import com.hypixel.hytale.server.core.plugin.JavaPlugin; diff --git a/hytale/src/main/java/com/serverstats/hytale/listener/PlayerListener.java b/hytale/src/main/java/com/serverstats/hytale/listener/PlayerListener.java index d1d139b..d09f836 100644 --- a/hytale/src/main/java/com/serverstats/hytale/listener/PlayerListener.java +++ b/hytale/src/main/java/com/serverstats/hytale/listener/PlayerListener.java @@ -7,7 +7,6 @@ import com.hypixel.hytale.server.core.event.events.player.PlayerDisconnectEvent; import com.hypixel.hytale.server.core.event.events.player.PlayerReadyEvent; import com.hypixel.hytale.server.core.io.PacketHandler; -import com.hypixel.hytale.server.core.io.handlers.login.HandshakeHandler; import com.hypixel.hytale.server.core.universe.PlayerRef; import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; import com.serverstats.api.exception.ServerStatsException; @@ -130,7 +129,7 @@ public void onError(ServerStatsException exception) { } } ); - } + } /** * Get the player's IP address from the player reference