diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/afkTag/AfkTag.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/afkTag/AfkTag.java index 538efcd..e9b9668 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/afkTag/AfkTag.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/afkTag/AfkTag.java @@ -13,13 +13,12 @@ import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.List; -import java.util.WeakHashMap; +import java.util.*; public class AfkTag extends Appliance implements DisplayName.DisplayNamed { - private final WeakHashMap afkTimings = new WeakHashMap<>(); + private final HashMap afkTimings = new HashMap<>(); private static final int updateIntervalSeconds = 30; - private static final int afkWhenMillis = 5 * 60 * 1000; + private static final int afkWhenMillis = 3 * 60 * 1000; @Override public void onEnable() { @@ -33,21 +32,22 @@ public class AfkTag extends Appliance implements DisplayName.DisplayNamed { public void resetTiming(Player player) { boolean wasAfk = isAfk(player); - this.afkTimings.put(player, System.currentTimeMillis()); + this.afkTimings.put(player.getUniqueId(), System.currentTimeMillis()); if (wasAfk) this.updateAfkPrefix(player); } private void checkAfkPlayers() { - this.afkTimings.keySet().forEach((player) -> { - if(!isAfk(player)) return; - this.updateAfkPrefix(player); - }); + this.afkTimings.keySet().stream() + .map(Bukkit::getPlayer) + .filter(Objects::nonNull) + .filter(this::isAfk) + .forEach(this::updateAfkPrefix); } private boolean isAfk(Player player) { if(player.isSleeping()) return false; - long lastTimeActive = this.afkTimings.getOrDefault(player, 0L); + long lastTimeActive = this.afkTimings.getOrDefault(player.getUniqueId(), 0L); long timeSinceLastActive = System.currentTimeMillis() - lastTimeActive; return timeSinceLastActive >= afkWhenMillis; } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/report/Report.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/report/Report.java index 10b9bf3..300858a 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/report/Report.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/report/Report.java @@ -5,9 +5,12 @@ import eu.mhsl.craftattack.spawn.Main; import eu.mhsl.craftattack.spawn.appliance.Appliance; import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentBuilder; +import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.format.NamedTextColor; +import org.apache.http.client.utils.URIBuilder; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; @@ -16,6 +19,7 @@ import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.net.URI; +import java.net.URISyntaxException; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; @@ -45,7 +49,16 @@ public class Report extends Appliance { private record Request(@NotNull UUID reporter, @Nullable UUID reported, String reason) { } - private record Response(@NotNull String url) { + private record ReportResponse(@NotNull String url) { + } + + private record ReportsResponse(List from_self, Object to_self) { + } + + private record ReportInfo(Reporter reported, @NotNull String subject, boolean draft, @NotNull String status, @NotNull String url) { + } + + private record Reporter(@NotNull String username, @NotNull String uuid) { } public void reportToUnknown(@NotNull Player issuer) { @@ -66,6 +79,27 @@ public class Report extends Appliance { this.issueReport(issuer, request); } + public void requestReports(Player issuer) { + URIBuilder uriBuilder = new URIBuilder(this.apiEndpoint); + uriBuilder.addParameter("uuid", issuer.getUniqueId().toString()); + + try(HttpClient client = HttpClient.newHttpClient()) { + HttpRequest httpRequest = HttpRequest.newBuilder() + .uri(uriBuilder.build()) + .header("Content-Type", "application/json") + .GET() + .build(); + + HttpResponse httpResponse = client.send(httpRequest, HttpResponse.BodyHandlers.ofString()); + this.printReports(issuer, httpResponse); + } catch (IOException | InterruptedException | URISyntaxException e) { + issuer.sendMessage( + Component.text("Internal server description: " + e.getMessage()).color(NamedTextColor.RED) + ); + throw new RuntimeException(e); + } + } + private void issueReport(Player issuer, Request reportRequest) { try(HttpClient client = HttpClient.newHttpClient()) { HttpRequest httpRequest = HttpRequest.newBuilder() @@ -84,10 +118,57 @@ public class Report extends Appliance { } } + private void printReports(Player issuer, HttpResponse httpResponse) { + if(httpResponse.statusCode() != 200) { + Main.logger().warning("Failed to request Reports: " + httpResponse.statusCode()); + issuer.sendMessage( + Component.text() + .append(Component.text("Interner Serverfehler beim abfragen der Reports.", NamedTextColor.RED)) + .appendNewline() + .append(Component.text("Bitte melde dich bei einem Admin!", NamedTextColor.RED)) + ); + return; + } + + List reports = new Gson().fromJson(httpResponse.body(), ReportsResponse.class).from_self; + reports.removeIf(reportInfo -> reportInfo.draft); + if(reports.isEmpty()) { + issuer.sendMessage( + Component.text() + .append(Component.text("Du hast noch niemanden reportet.", NamedTextColor.RED)) + .appendNewline() + .append(Component.text("Um jemanden zu melden, nutze /report", NamedTextColor.GRAY)) + ); + return; + } + + ComponentBuilder component = Component.text(); + + component.append( + Component.newline() + .append(Component.text("Von dir erstellte Reports: ", NamedTextColor.GOLD)) + .appendNewline() + ); + + reports.forEach(reportInfo -> { + component.append( + Component.text() + .append(Component.text(" - ", NamedTextColor.WHITE)) + .append(Component.text(reportInfo.reported.username, NamedTextColor.WHITE)) + .append(Component.text(String.format(": %s", reportInfo.subject), NamedTextColor.GRAY)) + .clickEvent(ClickEvent.openUrl(reportInfo.url)) + .hoverEvent(HoverEvent.showText(Component.text("Klicke, um den Report einzusehen.", NamedTextColor.GOLD))) + ); + component.appendNewline(); + }); + + issuer.sendMessage(component.build()); + } + private void printResultMessage(Player issuer, HttpResponse httpResponse) { switch(httpResponse.statusCode()) { case 201: - Response response = new Gson().fromJson(httpResponse.body(), Response.class); + ReportResponse createdReport = new Gson().fromJson(httpResponse.body(), ReportResponse.class); issuer.sendMessage( Component.text() .append(Component.text("\\/".repeat(20), NamedTextColor.DARK_GRAY)) @@ -99,15 +180,15 @@ public class Report extends Appliance { .append( Component .text(" > Hier klicken < ", NamedTextColor.GREEN) - .hoverEvent(HoverEvent.showText(Component.text(response.url).color(NamedTextColor.GREEN))) - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, response.url)) + .hoverEvent(HoverEvent.showText(Component.text(createdReport.url).color(NamedTextColor.GREEN))) + .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, createdReport.url)) ) .appendNewline() .appendNewline() .append( Component - .text(response.url, NamedTextColor.GRAY) - .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, response.url)) + .text(createdReport.url, NamedTextColor.GRAY) + .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, createdReport.url)) ) .appendNewline() .appendNewline() @@ -142,6 +223,9 @@ public class Report extends Appliance { @Override @NotNull protected List> commands() { - return List.of(new ReportCommand()); + return List.of( + new ReportCommand(), + new ReportsCommand() + ); } } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/report/ReportsCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/report/ReportsCommand.java new file mode 100644 index 0000000..6000b83 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/report/ReportsCommand.java @@ -0,0 +1,19 @@ +package eu.mhsl.craftattack.spawn.appliances.report; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.util.text.ComponentUtil; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class ReportsCommand extends ApplianceCommand.PlayerChecked { + public ReportsCommand() { + super("reports"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + sender.sendMessage(ComponentUtil.pleaseWait()); + getAppliance().requestReports(getPlayer()); + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index f0033ee..c837b8c 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -10,6 +10,8 @@ commands: permission: admin report: description: Reporte einen Spieler + reports: + description: Von dir erstellte Reports userinfo: description: Get UUID from any user projectStart: