package tc.oc.pgm.match;
import java.util.List;
import javax.inject.Inject;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
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.command.CommandSender;
import tc.oc.commons.bukkit.chat.Audiences;
import tc.oc.commons.bukkit.chat.HeaderComponent;
import tc.oc.commons.core.chat.Audience;
import tc.oc.commons.core.chat.Component;
import tc.oc.commons.core.chat.Components;
import tc.oc.commons.core.formatting.PeriodFormats;
import tc.oc.commons.core.formatting.StringUtils;
import tc.oc.pgm.api.EngagementMatchModule;
import tc.oc.pgm.ffa.FreeForAllMatchModule;
import tc.oc.pgm.goals.Goal;
import tc.oc.pgm.goals.GoalComponent;
import tc.oc.pgm.goals.GoalMatchModule;
import tc.oc.pgm.score.ScoreMatchModule;
import tc.oc.pgm.teams.Team;
import tc.oc.pgm.teams.TeamMatchModule;
public class MatchFormatter {
private final Audiences audiences;
@Inject MatchFormatter(Audiences audiences) {
this.audiences = audiences;
}
public void sendMatchInfo(CommandSender sender, Match match) {
Audience audience = audiences.get(sender);
final Component tip = new Component(ChatColor.WHITE).translate("command.match.matchInfo.title.tip");
audience.sendMessage(new HeaderComponent(new Component(ChatColor.YELLOW)
.translate("command.match.matchInfo.title")
.extra(" #" + match.serialNumber() + " ")
.clickEvent(match.getUrl())
.hoverEvent(tip)));
audience.sendMessage(new Component(
new Component(ChatColor.DARK_PURPLE).extra(new TranslatableComponent("command.match.matchInfo.time")).extra(": "),
new Component(ChatColor.GOLD).extra(PeriodFormats.formatColonsPrecise(match.runningTime()))
));
final MatchPlayer player = match.getPlayer(sender);
final TeamMatchModule tmm = match.getMatchModule(TeamMatchModule.class);
final FreeForAllMatchModule ffamm = match.getMatchModule(FreeForAllMatchModule.class);
final List<BaseComponent> teamCountParts = Lists.newArrayList();
if(tmm != null) {
for(Team team : tmm.getTeams()) {
final Component msg = new Component(ChatColor.GRAY)
.extra(StringUtils.removeEnd(team.getName(), " Team"), team.getColor())
.extra(": ")
.extra(team.getPlayers().size(), ChatColor.WHITE);
if(team.getMaxPlayers() != Integer.MAX_VALUE) {
msg.extra("/" + team.getMaxPlayers());
}
teamCountParts.add(msg);
}
} else if(ffamm != null) {
teamCountParts.add(new Component(ChatColor.GRAY)
.extra(new TranslatableComponent("command.match.matchInfo.players"), ChatColor.YELLOW)
.extra(": ")
.extra(match.getParticipatingPlayers().size(), ChatColor.WHITE)
.extra("/" + ffamm.getMaxPlayers()));
}
teamCountParts.add(new Component(ChatColor.GRAY)
.extra(new TranslatableComponent("command.match.matchInfo.observers"), ChatColor.AQUA)
.extra(": ")
.extra(match.getObservingPlayers().size(), ChatColor.WHITE));
audience.sendMessage(Components.join(new Component(" | ", ChatColor.DARK_GRAY), teamCountParts));
match.module(GoalMatchModule.class).ifPresent(gmm -> {
if(tmm != null && gmm.getGoalsByCompetitor().size() > 0) {
final ListMultimap<Team, BaseComponent> teamGoalTexts = ArrayListMultimap.create();
for(Team team : tmm.getTeams()) {
for(Goal goal : gmm.getGoals(team)) {
if(goal.isVisible()) {
teamGoalTexts.put(team, GoalComponent.forCompetitor(goal, team, true));
}
}
}
if(!teamGoalTexts.isEmpty()) {
audience.sendMessage(new Component(ChatColor.DARK_PURPLE)
.translate("command.match.matchInfo.goals")
.extra(":"));
teamGoalTexts.asMap().forEach((team, goalTexts) -> {
audience.sendMessage(new Component(ChatColor.GRAY)
.extra(" ")
.extra(team.getComponentName())
.extra(": ")
.extra(Components.join(new Component(" "), goalTexts)));
});
}
} else {
// FIXME: better display for FFA
match.module(ScoreMatchModule.class).ifPresent(smm -> {
audience.sendMessage(smm.getStatusMessage());
});
}
});
audience.sendMessage(new Component(ChatColor.DARK_PURPLE)
.translate("misc.link")
.extra(": ")
.link(match.getUrl())
.hoverEvent(tip));
if(player != null) match.module(EngagementMatchModule.class).ifPresent(emm -> {
emm.sendPreMatchFeedback(player);
});
}
}