|
@@ -0,0 +1,355 @@
|
|
|
+package com.gmail.nossr50.metrics;
|
|
|
+
|
|
|
+import java.io.BufferedReader;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.InputStreamReader;
|
|
|
+import java.util.Locale;
|
|
|
+
|
|
|
+import com.gmail.nossr50.mcMMO;
|
|
|
+import com.gmail.nossr50.config.Config;
|
|
|
+import com.gmail.nossr50.config.HiddenConfig;
|
|
|
+import com.gmail.nossr50.config.experience.ExperienceConfig;
|
|
|
+import com.gmail.nossr50.datatypes.experience.FormulaType;
|
|
|
+import com.gmail.nossr50.locale.LocaleLoader;
|
|
|
+
|
|
|
+import com.turt2live.metrics.EMetrics;
|
|
|
+import com.turt2live.metrics.Metrics;
|
|
|
+import com.turt2live.metrics.Metrics.Graph;
|
|
|
+import com.turt2live.metrics.data.DataEvent;
|
|
|
+import com.turt2live.metrics.data.DataTracker;
|
|
|
+import com.turt2live.metrics.tracker.Tracker;
|
|
|
+
|
|
|
+public class MetricsManager {
|
|
|
+ private static boolean setup = false;
|
|
|
+
|
|
|
+ private static Tracker chimeraUseTracker;
|
|
|
+ private static Tracker chimeraServerUseTracker;
|
|
|
+
|
|
|
+ private static boolean customConfig = false;
|
|
|
+
|
|
|
+ private static DataTracker tracker;
|
|
|
+ private static EMetrics emetrics;
|
|
|
+
|
|
|
+ public static void setup() {
|
|
|
+ if (setup) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Config.getInstance().getStatsTrackingEnabled()) {
|
|
|
+ try {
|
|
|
+ emetrics = new EMetrics(mcMMO.p);
|
|
|
+ Metrics metrics = emetrics.getMetrics();
|
|
|
+
|
|
|
+ // Timings Graph
|
|
|
+ Graph timingsGraph = metrics.createGraph("Percentage of servers using timings");
|
|
|
+
|
|
|
+ if (mcMMO.p.getServer().getPluginManager().useTimings()) {
|
|
|
+ timingsGraph.addPlotter(new Metrics.Plotter("Enabled") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ timingsGraph.addPlotter(new Metrics.Plotter("Disabled") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // Donut Version Graph
|
|
|
+ Graph versionDonutGraph = metrics.createGraph("Donut Version");
|
|
|
+
|
|
|
+ boolean haveVersionInformation = false;
|
|
|
+ boolean isOfficialBuild = false;
|
|
|
+ String officialKey = "e14cfacdd442a953343ebd8529138680";
|
|
|
+
|
|
|
+ String version = mcMMO.p.getDescription().getVersion();
|
|
|
+
|
|
|
+ InputStreamReader isr = new InputStreamReader(mcMMO.p.getResource(".jenkins"));
|
|
|
+ BufferedReader br = new BufferedReader(isr);
|
|
|
+ char[] key = new char[32];
|
|
|
+ br.read(key);
|
|
|
+ if (officialKey.equals(String.valueOf(key))) {
|
|
|
+ isOfficialBuild = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (version.contains("-")) {
|
|
|
+ String majorVersion = version.substring(0, version.indexOf("-"));
|
|
|
+ String subVersion = "";
|
|
|
+ if (isOfficialBuild) {
|
|
|
+ int startIndex = version.indexOf("-");
|
|
|
+ if (version.substring(startIndex + 1).contains("-")) {
|
|
|
+ subVersion = version.substring(startIndex, version.indexOf("-", startIndex + 1));
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ subVersion = "-release";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ subVersion = "-custom";
|
|
|
+ }
|
|
|
+
|
|
|
+ version = majorVersion + "~=~" + subVersion;
|
|
|
+ haveVersionInformation = true;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ haveVersionInformation = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (haveVersionInformation) {
|
|
|
+ versionDonutGraph.addPlotter(new Metrics.Plotter(version) {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // Official v Custom build Graph
|
|
|
+ Graph officialGraph = metrics.createGraph("Built by official ci");
|
|
|
+
|
|
|
+ if (isOfficialBuild) {
|
|
|
+ officialGraph.addPlotter(new Metrics.Plotter("Yes") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ officialGraph.addPlotter(new Metrics.Plotter("No") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // Chunkmeta enabled Graph
|
|
|
+ Graph chunkmetaGraph = metrics.createGraph("Uses Chunkmeta");
|
|
|
+
|
|
|
+ if (HiddenConfig.getInstance().getChunkletsEnabled()) {
|
|
|
+ chunkmetaGraph.addPlotter(new Metrics.Plotter("Yes") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ chunkmetaGraph.addPlotter(new Metrics.Plotter("No") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // Storage method Graph
|
|
|
+ Graph storageGraph = metrics.createGraph("Storage method");
|
|
|
+
|
|
|
+ if (Config.getInstance().getUseMySQL()) {
|
|
|
+ storageGraph.addPlotter(new Metrics.Plotter("SQL") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ storageGraph.addPlotter(new Metrics.Plotter("Flatfile") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // Locale Graph
|
|
|
+ Graph localeGraph = metrics.createGraph("Locale");
|
|
|
+
|
|
|
+ localeGraph.addPlotter(new Metrics.Plotter(LocaleLoader.getCurrentLocale().getDisplayLanguage(Locale.US)) {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // ExperienceFormulaShape Graph
|
|
|
+ Graph experienceFormulaShapeGraph = metrics.createGraph("Experience Formula Shape Graph");
|
|
|
+
|
|
|
+ experienceFormulaShapeGraph.addPlotter(new Metrics.Plotter(ExperienceConfig.getInstance().getFormulaType().toString()) {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // GlobalMultiplier Graph
|
|
|
+ Graph globalMultiplierGraph = metrics.createGraph("Global Multiplier Graph");
|
|
|
+
|
|
|
+ globalMultiplierGraph.addPlotter(new Metrics.Plotter(ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier() + "") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // GlobalCurveModifier Graph
|
|
|
+ Graph globalCurveModifierGraph = metrics.createGraph("Global Curve Modifier Graph");
|
|
|
+
|
|
|
+ globalCurveModifierGraph.addPlotter(new Metrics.Plotter(ExperienceConfig.getInstance().getMultiplier(FormulaType.LINEAR) + "") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // GlobalMultiplierGraph Fuzzy Logic Numbers
|
|
|
+ Graph globalMultiplierGraphFuzzy = metrics.createGraph("Global Multiplier Fuzz");
|
|
|
+
|
|
|
+ if (ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier() > 1.0) {
|
|
|
+ globalMultiplierGraphFuzzy.addPlotter(new Metrics.Plotter("Higher") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ else if (ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier() < 1.0) {
|
|
|
+ globalMultiplierGraphFuzzy.addPlotter(new Metrics.Plotter("Lower") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ globalMultiplierGraphFuzzy.addPlotter(new Metrics.Plotter("Default") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // GlobalCurveModifier Fuzzy Logic Numbers
|
|
|
+ Graph globalCurveMultiplierGraphFuzzy = metrics.createGraph("Global Curve Multiplier Fuzz");
|
|
|
+
|
|
|
+ if (ExperienceConfig.getInstance().getMultiplier(FormulaType.LINEAR) > 20.0) {
|
|
|
+ globalCurveMultiplierGraphFuzzy.addPlotter(new Metrics.Plotter("Higher") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ else if (ExperienceConfig.getInstance().getMultiplier(FormulaType.LINEAR) < 20.0) {
|
|
|
+ globalCurveMultiplierGraphFuzzy.addPlotter(new Metrics.Plotter("Lower") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ globalCurveMultiplierGraphFuzzy.addPlotter(new Metrics.Plotter("Default") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // Chimera Wing Usage Trackers
|
|
|
+ final String chimeraGraphName = "Chimera Wing Usage";
|
|
|
+
|
|
|
+ chimeraUseTracker = EMetrics.createBasicTracker(chimeraGraphName, "Player use");
|
|
|
+ chimeraServerUseTracker = EMetrics.createEnabledTracker(chimeraGraphName, "Server use");
|
|
|
+
|
|
|
+ emetrics.addTracker(chimeraUseTracker);
|
|
|
+ emetrics.addTracker(chimeraServerUseTracker);
|
|
|
+
|
|
|
+ // Chimera Wing Enabled Graph
|
|
|
+ Graph chimeraGraph = metrics.createGraph("Chimera Wing");
|
|
|
+
|
|
|
+ if (Config.getInstance().getChimaeraEnabled()) {
|
|
|
+ chimeraGraph.addPlotter(new Metrics.Plotter("Enabled") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ chimeraGraph.addPlotter(new Metrics.Plotter("Disabled") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // Vanilla v Modified config graph
|
|
|
+ Graph customConfigGraph = metrics.createGraph("Modified Configs");
|
|
|
+
|
|
|
+ if (customConfig) {
|
|
|
+ customConfigGraph.addPlotter(new Metrics.Plotter("Edited") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ customConfigGraph.addPlotter(new Metrics.Plotter("Vanilla") {
|
|
|
+ @Override
|
|
|
+ public int getValue() {
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Debug stuff
|
|
|
+ * tracker = emetrics.getDataTracker();
|
|
|
+ * tracker.enable();
|
|
|
+ * tracker.setFilter(new DataEvent.DataType [] { DataEvent.DataType.SEND_DATA });
|
|
|
+ */
|
|
|
+
|
|
|
+ emetrics.startMetrics();
|
|
|
+ }
|
|
|
+ catch (IOException e) {
|
|
|
+ mcMMO.p.getLogger().warning("Failed to submit stats.");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void chimeraWingUsed() {
|
|
|
+ chimeraUseTracker.increment();
|
|
|
+ chimeraServerUseTracker.increment();
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void customConfig() {
|
|
|
+ customConfig = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ @SuppressWarnings("unused")
|
|
|
+ private static void debug() {
|
|
|
+ emetrics.getMetrics().flush();
|
|
|
+
|
|
|
+ for (DataEvent event : tracker.getEvents()) {
|
|
|
+ String graphName = event.getGraphName();
|
|
|
+ String colName = event.getTrackerName();
|
|
|
+ int value = event.getValueSent();
|
|
|
+
|
|
|
+ System.out.println("Graph: " + graphName + ", Column: " + colName + ", Value: " + value);
|
|
|
+ }
|
|
|
+
|
|
|
+ tracker.resetEvents();
|
|
|
+ }
|
|
|
+}
|