diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties index 0dd2a7d6..a546955f 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties @@ -271,7 +271,8 @@ CHALLENGE_ACCEPT_HOVER = §aAccept challenge #EventCommand EVENT_TIME_FORMAT = HH:mm EVENT_DATE_FORMAT = dd.MM. -EVENT_USAGE = §8/§7event §8[§eTeam§8] - §7To teleport to a fight +EVENT_TEAM_USAGE = §8/§7event team §8[§eTeam§8] - §7To teleport to a fight +EVENT_SHOW_FIGHTS_USAGE = §8/§7event showfights §8[§eEvent§8] - §7To show the fights of that Event EVENT_NO_TEAM = §cThis team does not exist EVENT_NO_FIGHT_TEAM = §cThis team has no current fight EVENT_NO_CURRENT = §cThere is no event taking place currently @@ -282,9 +283,13 @@ EVENT_COMING_SCHEM_DEADLINE = §7 Submission deadline§8: §7{0} EVENT_COMING_TEAMS = §7 With§8: {0} EVENT_COMING_TEAM = §{0}{1} EVENT_CURRENT_EVENT = §e§l{0} -EVENT_CURRENT_FIGHT = §7{0} §{1}{2}§8 vs §{3}{4} +EVENT_CURRENT_FIGHT_1 = §7{0} §{1}{2} +EVENT_CURRENT_FIGHT_VS = §8 vs +EVENT_CURRENT_FIGHT_2 = §{1}{2} EVENT_CURRENT_FIGHT_WIN = §8: §7Victory §{0}{1} EVENT_CURRENT_FIGHT_DRAW = §8: §7Draw +EVENT_TEAM_TABLE = §{0}{1}{2} §8 with §e{3} §7points +EVENT_SHOW_TABLE_USAGE = §8/§7event showtable §8[§eEvent§8] - §7To show the table of that Event #EventRescheduleCommand EVENTRESCHEDULE_USAGE = §8/§7eventreschedule §8[§eTeam1§8] [§eTeam2§8] @@ -751,3 +756,9 @@ DC_SCHEMUPLOAD_IGNORED = Skipping `{0}`, not a schematic file. DC_SCHEMUPLOAD_INVCHAR = `{0}` has invalid characters in its name. DC_SCHEMUPLOAD_SUCCESS = `{0}` was uploaded successfully. DC_SCHEMUPLOAD_ERROR = An error has occured during the upload of `{0}`. For more information ask a Developer. + +UTIL_LIST_BACK_ARROW = §8«« +UTIL_LIST_BACK_ARROW_HOVER = §ePrevious page +UTIL_LIST_PAGE = §e Page §7({0}/{1}) +UTIL_LIST_NEXT = §8 »» +UTIL_LIST_NEXT_HOVER = §eNext page \ No newline at end of file diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties index 47b815ea..c284208b 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties @@ -253,7 +253,8 @@ CHALLENGE_ACCEPT_HOVER = §aHerausforderung annehmen #EventCommand EVENT_TIME_FORMAT = HH:mm EVENT_DATE_FORMAT = dd.MM. -EVENT_USAGE = §8/§7event §8[§eTeam§8] - §7Um dich zum Kampf zu teleportieren +EVENT_TEAM_USAGE=§8/§7event team §8[§eTeam§8] - §7Um dich zum Kampf zu teleportieren +EVENT_SHOW_FIGHTS_USAGE = §8/§7event showfights §8[§eEvent§8] - §7Um die fights des Events zu zeigen EVENT_NO_TEAM = §cDieses Team gibt es nicht EVENT_NO_FIGHT_TEAM = §cDas Team kämpft derzeit nicht EVENT_NO_CURRENT = §cDerzeit findet kein Event statt @@ -264,9 +265,10 @@ EVENT_COMING_SCHEM_DEADLINE = §7 Einsendeschluss§8: §7{0} EVENT_COMING_TEAMS = §7 Mit§8: {0} EVENT_COMING_TEAM = §{0}{1} EVENT_CURRENT_EVENT = §e§l{0} -EVENT_CURRENT_FIGHT = §7{0} §{1}{2}§8 vs §{3}{4} EVENT_CURRENT_FIGHT_WIN = §8: §7Sieg §{0}{1} EVENT_CURRENT_FIGHT_DRAW = §8: §7Unentschieden +EVENT_TEAM_TABLE = §{0}{1}{2} §8 mit §e{3} §7Punkten +EVENT_SHOW_TABLE_USAGE = §8/§7event showtable §8[§eEvent§8] - §7Um die Tabelle des Events zu zeigen. #EventRescheduleCommand EVENTRESCHEDULE_USAGE = §8/§7eventreschedule §8[§eTeam1§8] [§eTeam2§8] diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/EventCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/EventCommand.java index 27fb38bd..a775d71c 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/EventCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/EventCommand.java @@ -19,6 +19,7 @@ package de.steamwar.velocitycore.commands; +import com.google.protobuf.MapEntry; import de.steamwar.command.PreviousArguments; import de.steamwar.command.SWCommand; import de.steamwar.command.TypeMapper; @@ -28,13 +29,18 @@ import de.steamwar.messages.Chatter; import de.steamwar.messages.PlayerChatter; import de.steamwar.persistent.Subserver; import de.steamwar.sql.*; +import de.steamwar.sql.Event; import de.steamwar.velocitycore.EventStarter; import de.steamwar.velocitycore.SubserverSystem; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import java.awt.*; import java.sql.Timestamp; import java.time.Instant; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; @@ -82,35 +88,84 @@ public class EventCommand extends SWCommand { @Register public void eventOverview(@Validator(value = "noEvent", invert = true) Chatter sender) { - sender.system("EVENT_USAGE"); + sender.system("EVENT_TEAM_USAGE"); Event currentEvent = Event.get(); - sender.system("EVENT_CURRENT_EVENT", currentEvent.getEventName()); + eventShowFightsPage(sender, currentEvent, 1); + } - DateTimeFormatter format = DateTimeFormatter.ofPattern(sender.parseToPlain("EVENT_TIME_FORMAT")); - for (EventFight fight : EventFight.getEvent(currentEvent.getEventID())) { - Team blue = Team.byId(fight.getTeamBlue()); - Team red = Team.byId(fight.getTeamRed()); - StringBuilder fline = new StringBuilder(sender.parseToLegacy("EVENT_CURRENT_FIGHT", fight.getStartTime().toLocalDateTime().format(format), blue.getTeamColor(), blue.getTeamKuerzel(), red.getTeamColor(), red.getTeamKuerzel())); + @Register(value = "showtable", description = "EVENT_SHOW_TABLE_USAGE") + public void eventtable(Chatter sender, Event event) { + if (!Instant.now().isBefore(event.getEnd().toInstant())) return; - if (fight.hasFinished()) { - switch (fight.getErgebnis()) { + Map Teampoints = new HashMap<>(); + + EventFight.getEvent(event.getEventID()).forEach(eventFight -> { + if (eventFight.hasFinished() && eventFight.getGroup().isPresent()) { + switch (eventFight.getErgebnis()) { case 1: - fline.append(sender.parseToLegacy("EVENT_CURRENT_FIGHT_WIN", blue.getTeamColor(), blue.getTeamKuerzel())); + //win blue + Teampoints.put(eventFight.getTeamBlue(), Teampoints.getOrDefault(eventFight.getTeamBlue(), 0) + eventFight.getGroup().get().getPointsPerWin()); + Teampoints.put(eventFight.getTeamRed(), Teampoints.getOrDefault(eventFight.getTeamRed(),0) + eventFight.getGroup().get().getPointsPerLoss()); break; case 2: - fline.append(sender.parseToLegacy("EVENT_CURRENT_FIGHT_WIN", red.getTeamColor(), red.getTeamKuerzel())); + //win red + Teampoints.put(eventFight.getTeamBlue(), Teampoints.getOrDefault(eventFight.getTeamBlue(),0) + eventFight.getGroup().get().getPointsPerLoss()); + Teampoints.put(eventFight.getTeamRed(), Teampoints.getOrDefault(eventFight.getTeamRed(),0) + eventFight.getGroup().get().getPointsPerWin()); break; default: - fline.append(sender.parseToLegacy("EVENT_CURRENT_FIGHT_DRAW")); + //draw + Teampoints.put(eventFight.getTeamBlue(), Teampoints.getOrDefault(eventFight.getTeamBlue(),0) + eventFight.getGroup().get().getPointsPerDraw()); + Teampoints.put(eventFight.getTeamRed(), Teampoints.getOrDefault(eventFight.getTeamRed(),0) + eventFight.getGroup().get().getPointsPerDraw()); } } + }); + Map Teampointssortet = Teampoints.entrySet() + .stream() + .sorted(Map.Entry.comparingByValue()) + .collect(Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue, + (a , b) -> a, + LinkedHashMap::new + )); - sender.prefixless("PLAIN_STRING", fline.toString()); + for (Map.Entry entry : Teampointssortet.entrySet()) { + Component finalmessage = sender.parse("EVENT_TEAM_TABLE",Team.byId(entry.getKey()).getTeamColor(), Team.byId(entry.getKey()).getTeamKuerzel(), Team.byId(entry.getKey()).getTeamName(), entry.getValue()); + finalmessage = finalmessage.clickEvent(ClickEvent.runCommand("/team info " + Team.byId(entry.getKey()).getTeamName())); + sender.sendMessage(finalmessage); } } - @Register + @Register(value = "showfights", description = "EVENT_SHOW_FIGHTS_USAGE") + public void eventShowFightsPage(Chatter sender, Event event, @AllowNull @OptionalValue("1") int page) { + if (!Instant.now().isBefore(event.getEnd().toInstant())) return; + int pagecount = sendEventPage(sender, event, page); + + Integer nextpage = page + 1; + Integer prevpage = page - 1; + + Component finalmessage; + + Component pagenumber = sender.parse("UTIL_LIST_PAGE", page, pagecount); + + if (pagecount != 0 && page != 1) { + finalmessage = sender.parse("UTIL_LIST_BACK_ARROW"); + finalmessage = finalmessage.clickEvent(ClickEvent.runCommand("/event showfights " + event.getEventName() + " " + prevpage)); + finalmessage = finalmessage.append(pagenumber); + } else { + finalmessage = pagenumber; + } + + if (pagecount != 0 && pagecount > page) { + Component nextbutton = sender.parse("UTIL_LIST_NEXT"); + nextbutton = nextbutton.clickEvent(ClickEvent.runCommand("/event showfights " + event.getEventName() + " " + nextpage)); + finalmessage = finalmessage.append(nextbutton); + } + sender.sendMessage(finalmessage); + } + + @Register(value = "team", description = "EVENT_TEAM_USAGE") public void eventWithTeam(@Validator(value = "noEvent", invert = true) PlayerChatter sender, @ErrorMessage("EVENT_NO_TEAM") Team team) { Subserver eventArena = EventStarter.getEventServer().get(team.getTeamId()); if (eventArena == null || !Subserver.getServerList().contains(eventArena)) { @@ -122,6 +177,69 @@ public class EventCommand extends SWCommand { } } + private int sendEventPage(Chatter sender, Event event, int page) { + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(sender.parseToPlain("EVENT_DATE_FORMAT")); + Map> dates = EventFight.getEvent(event.getEventID()).stream().collect(Collectors.groupingBy(p -> p.getStartTime().toLocalDateTime().format(dateTimeFormatter))); + if (dates.size() >= page) { + sender.system("EVENT_CURRENT_EVENT", event.getEventName()); + DateTimeFormatter format = DateTimeFormatter.ofPattern(sender.parseToPlain("EVENT_TIME_FORMAT")); + for (EventFight eventFight : dates.get(dates.keySet().toArray()[page - 1])) { + Team blue = Team.byId(eventFight.getTeamBlue()); + Team red = Team.byId(eventFight.getTeamRed()); + Component finalfightline = sender.parse("EVENT_CURRENT_FIGHT_1", eventFight.getStartTime().toLocalDateTime().format(format), blue.getTeamColor(), blue.getTeamKuerzel()); + finalfightline = finalfightline.clickEvent(ClickEvent.runCommand("/team info " + blue.getTeamName())); + Component vs = sender.parse("EVENT_CURRENT_FIGHT_VS"); + finalfightline = finalfightline.append(vs); + Component redteam = sender.parse("EVENT_CURRENT_FIGHT_2", red.getTeamColor(), red.getTeamKuerzel()); + redteam = redteam.clickEvent(ClickEvent.runCommand("/team info " + red.getTeamName())); + finalfightline = finalfightline.append(redteam); + + if (eventFight.hasFinished()) { + Component ergebnis; + switch (eventFight.getErgebnis()) { + case 1: + ergebnis = sender.parse("EVENT_CURRENT_FIGHT_WIN", blue.getTeamColor(), blue.getTeamKuerzel()); + break; + case 2: + ergebnis = sender.parse("EVENT_CURRENT_FIGHT_WIN", red.getTeamColor(), red.getTeamKuerzel()); + break; + default: + ergebnis = sender.parse("EVENT_CURRENT_FIGHT_DRAW"); + } + finalfightline = finalfightline.append(ergebnis); + } + sender.sendMessage(finalfightline); + } + } + return dates.size(); + } + + protected static TypeMapper eventTypeMapper() { + return new TypeMapper<>() { + @Override + public Event map(Chatter sender, PreviousArguments previousArguments, String s) { + return Event.get(s); + } + + @Override + public Collection tabCompletes(Chatter sender, PreviousArguments previousArguments, String s) { + Set events = new HashSet<>(); + List allevents = Event.getAll(); + for (Event event : allevents) { + if (!Instant.now().isAfter(event.getEnd().toInstant())) { + events.add(event.getEventName()); + } + } + return events; + } + }; + } + + @ClassMapper(value = Event.class, local = true) + public TypeMapper eventMapper() { + return eventTypeMapper(); + } + protected static TypeMapper eventTeam(Function> teamMapper) { return new TypeMapper<>() { @Override