package tc.oc.bungee.analytics; import javax.inject.Inject; import com.google.common.collect.ImmutableSet; import net.md_5.bungee.api.event.PlayerDisconnectEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.event.EventHandler; import tc.oc.analytics.AnalyticsClient; import tc.oc.analytics.Count; import tc.oc.analytics.DynamicTagger; import tc.oc.analytics.Event; import tc.oc.analytics.MetricFactory; import tc.oc.analytics.Tag; import tc.oc.minecraft.analytics.AnalyticsFacet; public class PlayerTimeoutReporter extends AnalyticsFacet implements Listener { private final Event event = Event.error("player.timeout", "Player timeout"); private final AnalyticsClient client; private final DynamicTagger tagger; private final Count timeouts; @Inject PlayerTimeoutReporter(AnalyticsClient client, MetricFactory metrics, DynamicTagger tagger) { this.client = client; this.timeouts = metrics.count("players.timeouts"); this.tagger = tagger; } @EventHandler public void onDisconnect(PlayerDisconnectEvent event) { final Throwable exception = event.getPlayer().getDisconnectException(); if(exception != null && "ReadTimeoutException".equals(exception.getClass().getSimpleName())) { tagger.withTags( ImmutableSet.of( Tag.of("uuid", event.getPlayer().getUniqueId().toString()), Tag.of("username", event.getPlayer().getName()) ), () -> { client.event(this.event.withBody(event.getPlayer().getName() + " timed out")); timeouts.increment(); } ); } } }