Skip to content

Commit b288696

Browse files
triagonalmdcfeJRoy
authored
Update to bStats v2 (#4350)
Co-authored-by: MD <1917406+mdcfe@users.noreply.github.com> Co-authored-by: Josh Roy <10731363+JRoy@users.noreply.github.com>
1 parent 19ca518 commit b288696

File tree

4 files changed

+21
-97
lines changed

4 files changed

+21
-97
lines changed

Diff for: Essentials/build.gradle

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ dependencies {
1010

1111
api 'io.papermc:paperlib:1.0.6'
1212

13+
api 'org.bstats:bstats-bukkit:2.2.1'
14+
1315
implementation 'org.spongepowered:configurate-yaml:4.1.2'
1416
implementation 'org.checkerframework:checker-qual:3.14.0'
1517

@@ -28,6 +30,7 @@ shadowJar {
2830
dependencies {
2931
include (dependency('io.papermc:paperlib'))
3032
include (dependency('org.bstats:bstats-bukkit'))
33+
include (dependency('org.bstats:bstats-base'))
3134
include (dependency('org.spongepowered:configurate-yaml'))
3235
include (dependency('org.spongepowered:configurate-core'))
3336
include (dependency('org.yaml:snakeyaml'))
@@ -39,7 +42,7 @@ shadowJar {
3942
include (project(':providers:1_8Provider'))
4043
}
4144
relocate 'io.papermc.lib', 'com.earth2me.essentials.paperlib'
42-
relocate 'org.bstats.bukkit', 'com.earth2me.essentials.metrics'
45+
relocate 'org.bstats', 'com.earth2me.essentials.libs.bstats'
4346
relocate 'org.spongepowered.configurate', 'com.earth2me.essentials.libs.configurate'
4447
relocate 'org.yaml.snakeyaml', 'com.earth2me.essentials.libs.snakeyaml'
4548
relocate 'io.leangen.geantyref', 'com.earth2me.essentials.libs.geantyref'

Diff for: Essentials/src/main/java/com/earth2me/essentials/metrics/MetricsWrapper.java

+14-93
Original file line numberDiff line numberDiff line change
@@ -3,40 +3,32 @@
33
import com.earth2me.essentials.Essentials;
44
import com.earth2me.essentials.economy.EconomyLayer;
55
import com.earth2me.essentials.economy.EconomyLayers;
6-
import com.google.common.collect.ImmutableList;
76
import org.bstats.bukkit.Metrics;
7+
import org.bstats.charts.AdvancedBarChart;
8+
import org.bstats.charts.CustomChart;
9+
import org.bstats.charts.DrilldownPie;
10+
import org.bstats.charts.MultiLineChart;
11+
import org.bstats.charts.SimplePie;
812
import org.bukkit.Bukkit;
9-
import org.bukkit.plugin.Plugin;
1013
import org.bukkit.plugin.java.JavaPlugin;
1114

12-
import java.lang.reflect.Field;
1315
import java.util.HashMap;
14-
import java.util.List;
1516
import java.util.Map;
1617

1718
public class MetricsWrapper {
1819

19-
private static final List<String> KNOWN_FORCED_METRICS = ImmutableList.of(
20-
"ChatControl",
21-
"catserver.server.Metrics");
22-
private static boolean hasWarned = false;
2320
private final Essentials ess;
2421
private final Metrics metrics;
22+
private final JavaPlugin plugin;
2523
private final Map<String, Boolean> commands = new HashMap<>();
26-
private final Plugin plugin;
2724

28-
public MetricsWrapper(final Plugin plugin, final int pluginId, final boolean includeCommands) {
25+
public MetricsWrapper(final JavaPlugin plugin, final int pluginId, final boolean includeCommands) {
2926
this.plugin = plugin;
3027
this.ess = (Essentials) Bukkit.getPluginManager().getPlugin("Essentials");
3128
this.metrics = new Metrics(plugin, pluginId);
3229

33-
if (metrics.isEnabled()) {
34-
plugin.getLogger().info("Starting Metrics. Opt-out using the global bStats config.");
35-
} else {
36-
plugin.getLogger().info("Metrics disabled per bStats config.");
37-
}
30+
plugin.getLogger().info("Starting Metrics. Opt-out using the global bStats config.");
3831

39-
checkForcedMetrics();
4032
addPermsChart();
4133
addEconomyChart();
4234
addReleaseBranchChart();
@@ -51,12 +43,12 @@ public void markCommand(final String command, final boolean state) {
5143
commands.put(command, state);
5244
}
5345

54-
public void addCustomChart(final Metrics.CustomChart chart) {
46+
public void addCustomChart(final CustomChart chart) {
5547
metrics.addCustomChart(chart);
5648
}
5749

5850
private void addPermsChart() {
59-
metrics.addCustomChart(new Metrics.DrilldownPie("permsPlugin", () -> {
51+
metrics.addCustomChart(new DrilldownPie("permsPlugin", () -> {
6052
final Map<String, Map<String, Integer>> result = new HashMap<>();
6153
final String handler = ess.getPermissionsHandler().getName();
6254
final Map<String, Integer> backend = new HashMap<>();
@@ -67,7 +59,7 @@ private void addPermsChart() {
6759
}
6860

6961
private void addEconomyChart() {
70-
metrics.addCustomChart(new Metrics.DrilldownPie("econPlugin", () -> {
62+
metrics.addCustomChart(new DrilldownPie("econPlugin", () -> {
7163
final Map<String, Map<String, Integer>> result = new HashMap<>();
7264
final Map<String, Integer> backend = new HashMap<>();
7365
final EconomyLayer layer = EconomyLayers.getSelectedLayer();
@@ -83,23 +75,23 @@ private void addEconomyChart() {
8375
}
8476

8577
private void addVersionHistoryChart() {
86-
metrics.addCustomChart(new Metrics.MultiLineChart("versionHistory", () -> {
78+
metrics.addCustomChart(new MultiLineChart("versionHistory", () -> {
8779
final HashMap<String, Integer> result = new HashMap<>();
8880
result.put(plugin.getDescription().getVersion(), 1);
8981
return result;
9082
}));
9183
}
9284

9385
private void addReleaseBranchChart() {
94-
metrics.addCustomChart(new Metrics.SimplePie("releaseBranch", ess.getUpdateChecker()::getVersionBranch));
86+
metrics.addCustomChart(new SimplePie("releaseBranch", ess.getUpdateChecker()::getVersionBranch));
9587
}
9688

9789
private void addCommandsChart() {
9890
for (final String command : plugin.getDescription().getCommands().keySet()) {
9991
markCommand(command, false);
10092
}
10193

102-
metrics.addCustomChart(new Metrics.AdvancedBarChart("commands", () -> {
94+
metrics.addCustomChart(new AdvancedBarChart("commands", () -> {
10395
final Map<String, int[]> result = new HashMap<>();
10496
for (final Map.Entry<String, Boolean> entry : commands.entrySet()) {
10597
if (entry.getValue()) {
@@ -112,75 +104,4 @@ private void addCommandsChart() {
112104
}));
113105
}
114106

115-
private boolean isForcedMetricsClass(Class<?> bStatsService) {
116-
for (String identifier : KNOWN_FORCED_METRICS) {
117-
if (bStatsService.getCanonicalName().contains(identifier)) {
118-
return true;
119-
}
120-
}
121-
122-
final JavaPlugin owningPlugin = getProvidingPlugin(bStatsService);
123-
if (owningPlugin != null && KNOWN_FORCED_METRICS.contains(owningPlugin.getName())) {
124-
return true;
125-
}
126-
return false;
127-
}
128-
129-
private void checkForcedMetrics() {
130-
if (hasWarned) return;
131-
hasWarned = true;
132-
133-
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> {
134-
for (final Class<?> service : Bukkit.getServicesManager().getKnownServices()) {
135-
try {
136-
service.getField("B_STATS_VERSION"); // Identifies bStats classes
137-
138-
if (isForcedMetricsClass(service)) {
139-
warnForcedMetrics(service);
140-
} else {
141-
try {
142-
service.getDeclaredField("pluginId"); // Only present in recent bStats classes, which should also have the enabled field unless modified
143-
} catch (final NoSuchFieldException e) {
144-
// Old bStats class found so "enabled" field detection is unreliable.
145-
break;
146-
}
147-
148-
try {
149-
service.getDeclaredField("enabled"); // In some modified forced metrics classes, this will fail
150-
} catch (final NoSuchFieldException e) {
151-
warnForcedMetrics(service);
152-
}
153-
}
154-
} catch (final NoSuchFieldException ignored) {
155-
}
156-
}
157-
});
158-
}
159-
160-
private void warnForcedMetrics(final Class<?> service) {
161-
final Plugin servicePlugin = JavaPlugin.getProvidingPlugin(service);
162-
plugin.getLogger().severe("WARNING: Potential forced metrics collection by plugin '" + servicePlugin.getName() + "' v" + servicePlugin.getDescription().getVersion());
163-
plugin.getLogger().severe("Your server is running a plugin that may not respect bStats' opt-out settings.");
164-
plugin.getLogger().severe("This may cause data to be uploaded to bStats.org for plugins that use bStats, even if you've opted out in the bStats config.");
165-
plugin.getLogger().severe("Please report this to bStats and to the authors of '" + servicePlugin.getName() + "'. (Offending class: " + service.getName() + ")");
166-
}
167-
168-
private JavaPlugin getProvidingPlugin(final Class<?> clazz) {
169-
try {
170-
return JavaPlugin.getProvidingPlugin(clazz);
171-
} catch (final Exception ignored) {
172-
}
173-
174-
final ClassLoader parent = clazz.getClassLoader().getParent();
175-
if (parent.getClass().getName().equals("org.bukkit.plugin.java.PluginClassLoader")) {
176-
try {
177-
final Field pluginField = parent.getClass().getDeclaredField("plugin");
178-
pluginField.setAccessible(true);
179-
return (JavaPlugin) pluginField.get(parent);
180-
} catch (final Exception ignored) {
181-
}
182-
}
183-
184-
return null;
185-
}
186107
}

Diff for: EssentialsXMPP/build.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ shadowJar {
1111
dependencies {
1212
include (dependency('org.igniterealtime.smack:smack'))
1313
}
14-
relocate 'org.bstats.bukkit', 'com.earth2me.essentials.metrics'
14+
relocate 'org.bstats', 'com.earth2me.essentials.libs.bstats'
1515
}

Diff for: EssentialsXMPP/src/main/java/com/earth2me/essentials/xmpp/EssentialsXMPP.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import com.earth2me.essentials.IEssentials;
44
import com.earth2me.essentials.metrics.MetricsWrapper;
55
import net.ess3.api.IUser;
6-
import org.bstats.bukkit.Metrics;
6+
import org.bstats.charts.SimplePie;
77
import org.bukkit.command.Command;
88
import org.bukkit.command.CommandSender;
99
import org.bukkit.entity.Player;
@@ -56,7 +56,7 @@ public void onEnable() {
5656

5757
if (metrics == null) {
5858
metrics = new MetricsWrapper(this, 3818, true);
59-
metrics.addCustomChart(new Metrics.SimplePie("config-valid", () -> xmpp.isConfigValid() ? "yes" : "no"));
59+
metrics.addCustomChart(new SimplePie("config-valid", () -> xmpp.isConfigValid() ? "yes" : "no"));
6060
}
6161
}
6262

0 commit comments

Comments
 (0)