From 4391f17a15967d011d2a97036002d642e92e8689 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 5 Mar 2018 18:10:39 +0800 Subject: [PATCH 1/5] Implement matchstats command --- .../i18n/templates/pgm/PGMMessages.properties | 5 ++ .../oc/pgm/playerstats/MatchStatsCommand.java | 84 +++++++++++++++++++ .../tc/oc/pgm/playerstats/StatsManifest.java | 5 +- 3 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 PGM/src/main/java/tc/oc/pgm/playerstats/MatchStatsCommand.java diff --git a/Commons/core/src/main/i18n/templates/pgm/PGMMessages.properties b/Commons/core/src/main/i18n/templates/pgm/PGMMessages.properties index c8d2578e5..82fc73a52 100644 --- a/Commons/core/src/main/i18n/templates/pgm/PGMMessages.properties +++ b/Commons/core/src/main/i18n/templates/pgm/PGMMessages.properties @@ -122,6 +122,11 @@ command.mutation.error.illegal = You are not able to use that mutation command.mutation.list.current = Current Mutations command.mutation.list.queued = Queued Mutations +command.matchstats.header = {0}'s match statistics: +command.matchstats.kills = Kills : {0} +command.matchstats.deaths = Deaths : {0} +command.matchstats.kdr = K/D : {0} + # {0} = team name ffa.join = You joined the match team.join = You joined {0} diff --git a/PGM/src/main/java/tc/oc/pgm/playerstats/MatchStatsCommand.java b/PGM/src/main/java/tc/oc/pgm/playerstats/MatchStatsCommand.java new file mode 100644 index 000000000..a353b4f61 --- /dev/null +++ b/PGM/src/main/java/tc/oc/pgm/playerstats/MatchStatsCommand.java @@ -0,0 +1,84 @@ +package tc.oc.pgm.playerstats; + +import com.google.common.collect.Lists; +import com.sk89q.minecraft.util.commands.Command; +import com.sk89q.minecraft.util.commands.CommandContext; +import com.sk89q.minecraft.util.commands.CommandException; +import com.sk89q.minecraft.util.commands.CommandPermissions; +import java.text.DecimalFormat; +import java.util.List; +import java.util.stream.Collectors; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.TranslatableComponent; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import tc.oc.commons.bukkit.chat.HeaderComponent; +import tc.oc.commons.bukkit.chat.NameStyle; +import tc.oc.commons.bukkit.commands.UserFinder; +import tc.oc.commons.core.chat.Component; +import tc.oc.commons.core.chat.Components; +import tc.oc.commons.core.commands.CommandFutureCallback; +import tc.oc.commons.core.concurrent.Flexecutor; +import tc.oc.commons.core.formatting.StringUtils; +import tc.oc.minecraft.scheduler.Sync; +import tc.oc.pgm.commands.CommandUtils; +import tc.oc.pgm.match.MatchPlayer; +import tc.oc.pgm.match.inject.MatchScoped; + +import static tc.oc.pgm.commands.CommandUtils.senderToMatchPlayer; + +import javax.inject.Inject; + +@MatchScoped +public class MatchStatsCommand { + private final UserFinder userFinder; + private final Flexecutor flexecutor; + + private static final DecimalFormat FORMAT = new DecimalFormat("0.00"); + + @Inject MatchStatsCommand(UserFinder userFinder, @Sync Flexecutor flexecutor) { + this.userFinder = userFinder; + this.flexecutor = flexecutor; + } + + @Command(aliases = {"matchstats", "mstats"}, + desc = "Displays your current stats for the match", + usage = "[target]", + max = 1 + ) + @CommandPermissions("pgm.playerstats.matchstats") + public List matchStats(CommandContext args, CommandSender sender) throws CommandException { + MatchPlayer player = senderToMatchPlayer(sender); + if(args.getSuggestionContext() != null) { + if(args.getSuggestionContext().getIndex() == 0) { + return StringUtils.complete(args.getString(0), + Bukkit.getOnlinePlayers().stream().map(Player::getDisplayName).collect(Collectors.toSet())); + } + } + + if(args.argsLength() == 0) { + displayStats(player); + } else { + flexecutor.callback( + userFinder.findLocalPlayerOrSender(sender, args, 0), + CommandFutureCallback.onSuccess(sender, user -> displayStats(senderToMatchPlayer(user.player()))) + ); + } + return null; + } + + private BaseComponent parseStats(MatchPlayer player) { + StatsUserFacet facet = player.getUserContext().facet(StatsUserFacet.class); + BaseComponent matchKills = new Component(ChatColor.GREEN).translate("command.matchstats.kills", facet.matchKills()); + BaseComponent matchDeaths = new Component(ChatColor.RED).translate("command.matchstats.deaths", facet.deaths()); + BaseComponent matchRatio = new Component(ChatColor.AQUA).translate("command.matchstats.kdr", FORMAT.format((double) facet.matchKills() / Math.max(facet.deaths(), 1))); + return Components.join(Components.newline(), Lists.newArrayList(matchKills, matchDeaths, matchRatio)); + } + + private void displayStats(MatchPlayer player) { + player.sendMessage(new HeaderComponent(new TranslatableComponent("command.matchstats.header", player.getStyledName(NameStyle.VERBOSE)))); + player.sendMessage(parseStats(player)); + } +} diff --git a/PGM/src/main/java/tc/oc/pgm/playerstats/StatsManifest.java b/PGM/src/main/java/tc/oc/pgm/playerstats/StatsManifest.java index aba60b33a..a91cb9d7f 100644 --- a/PGM/src/main/java/tc/oc/pgm/playerstats/StatsManifest.java +++ b/PGM/src/main/java/tc/oc/pgm/playerstats/StatsManifest.java @@ -1,6 +1,7 @@ package tc.oc.pgm.playerstats; import tc.oc.commons.bukkit.settings.SettingBinder; +import tc.oc.commons.core.commands.CommandBinder; import tc.oc.commons.core.inject.HybridManifest; import tc.oc.pgm.match.MatchPlayerFacetBinder; import tc.oc.pgm.match.MatchUserFacetBinder; @@ -10,9 +11,11 @@ public class StatsManifest extends HybridManifest implements MatchBinders { @Override protected void configure() { + new CommandBinder(binder()) + .register(MatchStatsCommand.class); + new SettingBinder(publicBinder()).addBinding().toInstance(StatSettings.STATS); installPlayerModule(binder -> new MatchPlayerFacetBinder(binder).register(StatsPlayerFacet.class)); installUserModule(binder -> new MatchUserFacetBinder(binder).register(StatsUserFacet.class)); } - } From eeb39e5f0fd54401a45cbd668be8cde2df5b9a34 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 10 Mar 2018 13:56:47 +0800 Subject: [PATCH 2/5] Make reports display no longer show reports with offline reportees by default --- .../bukkit/report/ReportAnnouncer.java | 2 +- .../commons/bukkit/report/ReportCommands.java | 9 +- .../bukkit/report/ReportFormatter.java | 12 ++- .../oc/pgm/playerstats/MatchStatsCommand.java | 84 ------------------- .../tc/oc/pgm/playerstats/StatsManifest.java | 21 ----- 5 files changed, 18 insertions(+), 110 deletions(-) delete mode 100644 PGM/src/main/java/tc/oc/pgm/playerstats/MatchStatsCommand.java delete mode 100644 PGM/src/main/java/tc/oc/pgm/playerstats/StatsManifest.java diff --git a/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportAnnouncer.java b/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportAnnouncer.java index 5cdefba66..37a943e2c 100644 --- a/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportAnnouncer.java +++ b/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportAnnouncer.java @@ -75,7 +75,7 @@ public void broadcast(ModelUpdate message) { if(localServer._id().equals(message.document().server_id()) || (config.crossServer() && config.families().contains(message.document().family()))) { - final List formatted = reportFormatter.format(message.document(), true, false); + final List formatted = reportFormatter.format(message.document(), true, false, false); adminChannel.viewers() .filter(viewer -> viewer.hasPermission(ReportPermissions.RECEIVE)) .forEach(viewer -> { diff --git a/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportCommands.java b/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportCommands.java index 520ee3bb1..dbbfcf99b 100644 --- a/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportCommands.java +++ b/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportCommands.java @@ -91,6 +91,10 @@ private void assertEnabled() throws CommandException { } } + private void displayReports(Audience audience, Report report, boolean showServer, boolean showTime, boolean displayOffline) { + audience.sendMessages(reportFormatter.format(report, showServer, showTime, displayOffline)); + } + @Command( aliases = { "report" }, usage = " ", @@ -145,7 +149,7 @@ public void report(final CommandContext args, final CommandSender sender) throws @Command( aliases = { "reports", "reps" }, usage = "[-a] [-p page] [player]", - flags = "ap:", + flags = "aop:", desc = "List recent reports on this server, or all servers, optionally filtering by player.", min = 0, max = 1 @@ -159,6 +163,7 @@ public void reports(final CommandContext args, final CommandSender sender) throw CommandFutureCallback.onSuccess(sender, args, userResult -> { final int page = args.getFlagInteger('p', 1); final boolean crossServer = args.hasFlag('a'); + final boolean showOffline = args.hasFlag('o'); ReportSearchRequest request = ReportSearchRequest.create(page, PER_PAGE); request = crossServer ? request.forFamilies(reportConfiguration.families()) @@ -184,7 +189,7 @@ public void reports(final CommandContext args, final CommandSender sender) throw audience.sendMessage(new HeaderComponent(title)); for(Report report : reportResult.documents()) { if(report.reported() != null) { - audience.sendMessages(reportFormatter.format(report, crossServer, true)); + displayReports(audience, report, crossServer, true, showOffline); } } }) diff --git a/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportFormatter.java b/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportFormatter.java index eef3993f6..62976a908 100644 --- a/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportFormatter.java +++ b/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportFormatter.java @@ -1,12 +1,14 @@ package tc.oc.commons.bukkit.report; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import javax.inject.Inject; import com.google.common.collect.ImmutableList; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; +import tc.oc.api.bukkit.users.OnlinePlayers; import tc.oc.api.docs.Report; import tc.oc.api.servers.ServerStore; import tc.oc.commons.bukkit.chat.NameStyle; @@ -22,15 +24,21 @@ public class ReportFormatter { private final IdentityProvider identityProvider; private final ServerStore servers; + private final OnlinePlayers onlinePlayers; - @Inject ReportFormatter(IdentityProvider identityProvider, ServerStore servers) { + @Inject ReportFormatter(IdentityProvider identityProvider, ServerStore servers, OnlinePlayers onlinePlayers) { this.identityProvider = identityProvider; this.servers = servers; + this.onlinePlayers = onlinePlayers; } - public List format(Report report, boolean showServer, boolean showTime) { + public List format(Report report, boolean showServer, boolean showTime, boolean displayOffline) { final List parts = new ArrayList<>(); + if(!displayOffline && onlinePlayers.find(report.reported()).onlinePlayer() == null) { + return Collections.emptyList(); + } + parts.add(new Component( new Component("["), new Component("Rep", ChatColor.GOLD), diff --git a/PGM/src/main/java/tc/oc/pgm/playerstats/MatchStatsCommand.java b/PGM/src/main/java/tc/oc/pgm/playerstats/MatchStatsCommand.java deleted file mode 100644 index a353b4f61..000000000 --- a/PGM/src/main/java/tc/oc/pgm/playerstats/MatchStatsCommand.java +++ /dev/null @@ -1,84 +0,0 @@ -package tc.oc.pgm.playerstats; - -import com.google.common.collect.Lists; -import com.sk89q.minecraft.util.commands.Command; -import com.sk89q.minecraft.util.commands.CommandContext; -import com.sk89q.minecraft.util.commands.CommandException; -import com.sk89q.minecraft.util.commands.CommandPermissions; -import java.text.DecimalFormat; -import java.util.List; -import java.util.stream.Collectors; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TranslatableComponent; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import tc.oc.commons.bukkit.chat.HeaderComponent; -import tc.oc.commons.bukkit.chat.NameStyle; -import tc.oc.commons.bukkit.commands.UserFinder; -import tc.oc.commons.core.chat.Component; -import tc.oc.commons.core.chat.Components; -import tc.oc.commons.core.commands.CommandFutureCallback; -import tc.oc.commons.core.concurrent.Flexecutor; -import tc.oc.commons.core.formatting.StringUtils; -import tc.oc.minecraft.scheduler.Sync; -import tc.oc.pgm.commands.CommandUtils; -import tc.oc.pgm.match.MatchPlayer; -import tc.oc.pgm.match.inject.MatchScoped; - -import static tc.oc.pgm.commands.CommandUtils.senderToMatchPlayer; - -import javax.inject.Inject; - -@MatchScoped -public class MatchStatsCommand { - private final UserFinder userFinder; - private final Flexecutor flexecutor; - - private static final DecimalFormat FORMAT = new DecimalFormat("0.00"); - - @Inject MatchStatsCommand(UserFinder userFinder, @Sync Flexecutor flexecutor) { - this.userFinder = userFinder; - this.flexecutor = flexecutor; - } - - @Command(aliases = {"matchstats", "mstats"}, - desc = "Displays your current stats for the match", - usage = "[target]", - max = 1 - ) - @CommandPermissions("pgm.playerstats.matchstats") - public List matchStats(CommandContext args, CommandSender sender) throws CommandException { - MatchPlayer player = senderToMatchPlayer(sender); - if(args.getSuggestionContext() != null) { - if(args.getSuggestionContext().getIndex() == 0) { - return StringUtils.complete(args.getString(0), - Bukkit.getOnlinePlayers().stream().map(Player::getDisplayName).collect(Collectors.toSet())); - } - } - - if(args.argsLength() == 0) { - displayStats(player); - } else { - flexecutor.callback( - userFinder.findLocalPlayerOrSender(sender, args, 0), - CommandFutureCallback.onSuccess(sender, user -> displayStats(senderToMatchPlayer(user.player()))) - ); - } - return null; - } - - private BaseComponent parseStats(MatchPlayer player) { - StatsUserFacet facet = player.getUserContext().facet(StatsUserFacet.class); - BaseComponent matchKills = new Component(ChatColor.GREEN).translate("command.matchstats.kills", facet.matchKills()); - BaseComponent matchDeaths = new Component(ChatColor.RED).translate("command.matchstats.deaths", facet.deaths()); - BaseComponent matchRatio = new Component(ChatColor.AQUA).translate("command.matchstats.kdr", FORMAT.format((double) facet.matchKills() / Math.max(facet.deaths(), 1))); - return Components.join(Components.newline(), Lists.newArrayList(matchKills, matchDeaths, matchRatio)); - } - - private void displayStats(MatchPlayer player) { - player.sendMessage(new HeaderComponent(new TranslatableComponent("command.matchstats.header", player.getStyledName(NameStyle.VERBOSE)))); - player.sendMessage(parseStats(player)); - } -} diff --git a/PGM/src/main/java/tc/oc/pgm/playerstats/StatsManifest.java b/PGM/src/main/java/tc/oc/pgm/playerstats/StatsManifest.java deleted file mode 100644 index a91cb9d7f..000000000 --- a/PGM/src/main/java/tc/oc/pgm/playerstats/StatsManifest.java +++ /dev/null @@ -1,21 +0,0 @@ -package tc.oc.pgm.playerstats; - -import tc.oc.commons.bukkit.settings.SettingBinder; -import tc.oc.commons.core.commands.CommandBinder; -import tc.oc.commons.core.inject.HybridManifest; -import tc.oc.pgm.match.MatchPlayerFacetBinder; -import tc.oc.pgm.match.MatchUserFacetBinder; -import tc.oc.pgm.match.inject.MatchBinders; - -public class StatsManifest extends HybridManifest implements MatchBinders { - - @Override - protected void configure() { - new CommandBinder(binder()) - .register(MatchStatsCommand.class); - - new SettingBinder(publicBinder()).addBinding().toInstance(StatSettings.STATS); - installPlayerModule(binder -> new MatchPlayerFacetBinder(binder).register(StatsPlayerFacet.class)); - installUserModule(binder -> new MatchUserFacetBinder(binder).register(StatsUserFacet.class)); - } -} From d886c0b7ee924014fb20bf3291af5de6fdd17e0b Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 10 Mar 2018 14:00:07 +0800 Subject: [PATCH 3/5] fix rebase mistake --- .../tc/oc/pgm/playerstats/StatsManifest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 PGM/src/main/java/tc/oc/pgm/playerstats/StatsManifest.java diff --git a/PGM/src/main/java/tc/oc/pgm/playerstats/StatsManifest.java b/PGM/src/main/java/tc/oc/pgm/playerstats/StatsManifest.java new file mode 100644 index 000000000..aba60b33a --- /dev/null +++ b/PGM/src/main/java/tc/oc/pgm/playerstats/StatsManifest.java @@ -0,0 +1,18 @@ +package tc.oc.pgm.playerstats; + +import tc.oc.commons.bukkit.settings.SettingBinder; +import tc.oc.commons.core.inject.HybridManifest; +import tc.oc.pgm.match.MatchPlayerFacetBinder; +import tc.oc.pgm.match.MatchUserFacetBinder; +import tc.oc.pgm.match.inject.MatchBinders; + +public class StatsManifest extends HybridManifest implements MatchBinders { + + @Override + protected void configure() { + new SettingBinder(publicBinder()).addBinding().toInstance(StatSettings.STATS); + installPlayerModule(binder -> new MatchPlayerFacetBinder(binder).register(StatsPlayerFacet.class)); + installUserModule(binder -> new MatchUserFacetBinder(binder).register(StatsUserFacet.class)); + } + +} From 7ca7b90bfb5312b0aac3448b958e6f0185851747 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Sat, 10 Mar 2018 14:03:34 +0800 Subject: [PATCH 4/5] Fix another rebase mistake --- .../core/src/main/i18n/templates/pgm/PGMMessages.properties | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Commons/core/src/main/i18n/templates/pgm/PGMMessages.properties b/Commons/core/src/main/i18n/templates/pgm/PGMMessages.properties index 82fc73a52..c8d2578e5 100644 --- a/Commons/core/src/main/i18n/templates/pgm/PGMMessages.properties +++ b/Commons/core/src/main/i18n/templates/pgm/PGMMessages.properties @@ -122,11 +122,6 @@ command.mutation.error.illegal = You are not able to use that mutation command.mutation.list.current = Current Mutations command.mutation.list.queued = Queued Mutations -command.matchstats.header = {0}'s match statistics: -command.matchstats.kills = Kills : {0} -command.matchstats.deaths = Deaths : {0} -command.matchstats.kdr = K/D : {0} - # {0} = team name ffa.join = You joined the match team.join = You joined {0} From cd522538a454b0ae4237fcc3e7e9f90246424923 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Wed, 4 Apr 2018 21:59:45 +0800 Subject: [PATCH 5/5] Assert if reported is actually online --- .../java/tc/oc/commons/bukkit/report/ReportCommands.java | 8 ++++++-- .../java/tc/oc/commons/bukkit/report/ReportFormatter.java | 4 ---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportCommands.java b/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportCommands.java index dbbfcf99b..58004201d 100644 --- a/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportCommands.java +++ b/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportCommands.java @@ -20,6 +20,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerQuitEvent; import tc.oc.api.bukkit.users.BukkitUserStore; +import tc.oc.api.bukkit.users.OnlinePlayers; import tc.oc.api.docs.Report; import tc.oc.api.docs.Server; import tc.oc.minecraft.scheduler.SyncExecutor; @@ -55,6 +56,7 @@ public class ReportCommands implements Commands, Listener { private final BukkitUserStore userStore; private final Audiences audiences; private final IdentityProvider identities; + private final OnlinePlayers onlinePlayers; private final Map senderLastReport = new WeakHashMap<>(); @@ -67,7 +69,8 @@ public class ReportCommands implements Commands, Listener { Server localServer, BukkitUserStore userStore, Audiences audiences, - IdentityProvider identities) { + IdentityProvider identities, + OnlinePlayers onlinePlayers) { this.reportFormatter = reportFormatter; this.reportService = reportService; this.reportCreator = reportCreator; @@ -78,6 +81,7 @@ public class ReportCommands implements Commands, Listener { this.userStore = userStore; this.audiences = audiences; this.identities = identities; + this.onlinePlayers = onlinePlayers; } @EventHandler @@ -188,7 +192,7 @@ public void reports(final CommandContext args, final CommandSender sender) throw final Audience audience = audiences.get(sender); audience.sendMessage(new HeaderComponent(title)); for(Report report : reportResult.documents()) { - if(report.reported() != null) { + if(report.reported() != null && onlinePlayers.find(report.reported()).isOnline()) { displayReports(audience, report, crossServer, true, showOffline); } } diff --git a/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportFormatter.java b/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportFormatter.java index 62976a908..ca3b7cf65 100644 --- a/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportFormatter.java +++ b/Commons/bukkit/src/main/java/tc/oc/commons/bukkit/report/ReportFormatter.java @@ -35,10 +35,6 @@ public class ReportFormatter { public List format(Report report, boolean showServer, boolean showTime, boolean displayOffline) { final List parts = new ArrayList<>(); - if(!displayOffline && onlinePlayers.find(report.reported()).onlinePlayer() == null) { - return Collections.emptyList(); - } - parts.add(new Component( new Component("["), new Component("Rep", ChatColor.GOLD),