From 2be3a136ae244e99630f6be9a01edf1c720f086d Mon Sep 17 00:00:00 2001 From: Sakziea Date: Fri, 24 Jul 2026 11:02:49 +0200 Subject: [PATCH] Add funktion to show next events and formatet the fights in pages --- .../steamwar/messages/BungeeCore.properties | 8 ++ .../messages/BungeeCore_de.properties | 8 ++ .../velocitycore/commands/EventCommand.java | 119 ++++++++++++++++-- 3 files changed, 125 insertions(+), 10 deletions(-) diff --git a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties index 0dd2a7d6..bca27a8e 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore.properties @@ -272,6 +272,8 @@ CHALLENGE_ACCEPT_HOVER = §aAccept challenge 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_USAGE = §8/§7event show §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 @@ -751,3 +753,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..39e579c4 100644 --- a/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties +++ b/VelocityCore/src/de/steamwar/messages/BungeeCore_de.properties @@ -254,6 +254,8 @@ CHALLENGE_ACCEPT_HOVER = §aHerausforderung annehmen 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_USAGE = §8/§7event show §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 @@ -692,3 +694,9 @@ DC_SCHEMUPLOAD_IGNORED = `{0}` wird ignoriert, da die Datei keine Schematic ist. DC_SCHEMUPLOAD_INVCHAR = `{0}` hat unzulässige Buchstaben im Namen. DC_SCHEMUPLOAD_SUCCESS = `{0}` wurde erfolgreich hochgeladen. DC_SCHEMUPLOAD_ERROR = Ein Fehler ist beim Hochladen von `{0}` aufgetreten. Für nähere Informationen wende dich an einen Developer. + +UTIL_LIST_BACK_ARROW = §8«« +UTIL_LIST_BACK_ARROW_HOVER = §eLetste Seite +UTIL_LIST_PAGE = §e Seite §7({0}/{1}) +UTIL_LIST_NEXT = §8 »» +UTIL_LIST_NEXT_HOVER = §eNächste Seite \ No newline at end of file diff --git a/VelocityCore/src/de/steamwar/velocitycore/commands/EventCommand.java b/VelocityCore/src/de/steamwar/velocitycore/commands/EventCommand.java index 27fb38bd..a5aa662d 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/commands/EventCommand.java +++ b/VelocityCore/src/de/steamwar/velocitycore/commands/EventCommand.java @@ -25,16 +25,23 @@ import de.steamwar.command.TypeMapper; import de.steamwar.command.TypeValidator; import de.steamwar.linkage.Linked; import de.steamwar.messages.Chatter; +import de.steamwar.messages.Message; 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 javax.security.auth.callback.CallbackHandler; +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; @@ -86,9 +93,58 @@ public class EventCommand extends SWCommand { Event currentEvent = Event.get(); sender.system("EVENT_CURRENT_EVENT", currentEvent.getEventName()); + sendEvent(sender, currentEvent); + } + + @Register(value = "show", description = "EVENT_SHOW_USAGE") + public void eventShow(Chatter sender, Event event) { + eventShowPage(sender, event, 1); + } + + @Register(value = "show", description = "EVENT_SHOW_USAGE") + public void eventShowPage(Chatter sender, Event event, 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 show " + 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 show " + 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)) { + sender.system("EVENT_NO_FIGHT_TEAM"); + return; + } + if (!PunishmentCommand.isPunishedWithMessage(sender, Punishment.PunishmentType.NoFightServer)) { + SubserverSystem.sendPlayer(eventArena, sender.getPlayer()); + } + } + + private void sendEvent(Chatter sender, Event event) { DateTimeFormatter format = DateTimeFormatter.ofPattern(sender.parseToPlain("EVENT_TIME_FORMAT")); - for (EventFight fight : EventFight.getEvent(currentEvent.getEventID())) { + for (EventFight fight : EventFight.getEvent(event.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())); @@ -110,16 +166,59 @@ public class EventCommand extends SWCommand { } } - @Register - 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)) { - sender.system("EVENT_NO_FIGHT_TEAM"); - return; - } - if (!PunishmentCommand.isPunishedWithMessage(sender, Punishment.PunishmentType.NoFightServer)) { - SubserverSystem.sendPlayer(eventArena, sender.getPlayer()); + 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) { + 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()); + StringBuilder fline = new StringBuilder(sender.parseToLegacy("EVENT_CURRENT_FIGHT", eventFight.getStartTime().toLocalDateTime().format(format), blue.getTeamColor(), blue.getTeamKuerzel(), red.getTeamColor(), red.getTeamKuerzel())); + + if (eventFight.hasFinished()) { + switch (eventFight.getErgebnis()) { + case 1: + fline.append(sender.parseToLegacy("EVENT_CURRENT_FIGHT_WIN", blue.getTeamColor(), blue.getTeamKuerzel())); + break; + case 2: + fline.append(sender.parseToLegacy("EVENT_CURRENT_FIGHT_WIN", red.getTeamColor(), red.getTeamKuerzel())); + break; + default: + fline.append(sender.parseToLegacy("EVENT_CURRENT_FIGHT_DRAW")); + } + } + + sender.prefixless("PLAIN_STRING", fline.toString()); + } } + 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) {