From 309c1ac3f29ab7217bf9cd2f8045711de739cf78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Wed, 25 Oct 2023 15:27:40 +0200 Subject: [PATCH] Added ReportCommand --- .../java/eu/mhsl/craftattack/spawn/Main.java | 3 +- .../spawn/appliances/report/Report.java | 111 ++++++++++++++++++ .../report/command/ReportCommand.java | 80 +++++++++++++ src/main/resources/plugin.yml | 4 + 4 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/report/Report.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/report/command/ReportCommand.java diff --git a/src/main/java/eu/mhsl/craftattack/spawn/Main.java b/src/main/java/eu/mhsl/craftattack/spawn/Main.java index 289b500..ce063e2 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/Main.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/Main.java @@ -5,6 +5,7 @@ import eu.mhsl.craftattack.spawn.appliances.adminMarker.AdminMarker; import eu.mhsl.craftattack.spawn.appliances.chatMessages.ChatMessages; import eu.mhsl.craftattack.spawn.appliances.countdown.Countdown; import eu.mhsl.craftattack.spawn.appliances.debug.Debug; +import eu.mhsl.craftattack.spawn.appliances.report.Report; import eu.mhsl.craftattack.spawn.appliances.tablist.Tablist; import eu.mhsl.craftattack.spawn.appliances.titleClear.TitleClear; import eu.mhsl.craftattack.spawn.config.Configuration; @@ -32,8 +33,8 @@ public final class Main extends JavaPlugin { new TitleClear(), new Countdown(), new Tablist(), - new ChatMessages() new ChatMessages(), + new Report(), new Debug() ); Bukkit.getLogger().info("Loading appliances..."); 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 new file mode 100644 index 0000000..4b724c0 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/report/Report.java @@ -0,0 +1,111 @@ +package eu.mhsl.craftattack.spawn.appliances.report; + +import com.google.gson.Gson; +import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.report.command.ReportCommand; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.List; +import java.util.UUID; + +public class Report extends Appliance { + private record Request(UUID reporter, UUID reported, String reason) {} + private record Response(String url) {} + + public void issueReport(Player issuer, String targetUsername, String reason) { + try { + OfflinePlayer target = Bukkit.getOfflinePlayer(targetUsername); + Request request = new Request(issuer.getUniqueId(), target.getUniqueId(), reason); + + HttpResponse responseString = postRequest(URI.create("https://mhsl.eu/craftattack/report"), new Gson().toJson(request)); + + switch (responseString.statusCode()) { + case 201: + Response response = new Gson().fromJson(responseString.body(), Response.class); + issuer.sendMessage( + Component.text() + .append(Component.text("\\/".repeat(10), NamedTextColor.DARK_GRAY)) + .appendNewline() + .appendNewline() + .append(Component.text("!!! Report hier fertigstellen !!!", NamedTextColor.GOLD)) + .appendNewline() + .appendNewline() + .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)) + ) + .appendNewline() + .appendNewline() + .append( + Component + .text("(" + response.url + ")", NamedTextColor.GRAY) + .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.OPEN_URL, response.url)) + ) + .appendNewline() + .appendNewline() + .append(Component.text("/\\".repeat(10), NamedTextColor.DARK_GRAY)) + ); + break; + + case 400: + issuer.sendMessage( + Component.text() + .append(Component.text("Der Nutzer ", NamedTextColor.RED)) + .append(Component.text(targetUsername, NamedTextColor.DARK_RED)) + .append(Component.text(" ist in unserem System nicht bekannt.", NamedTextColor.RED)) + .appendNewline() + .append(Component.text("Bist du sicher, dass du den Namen richtig geschrieben hast?", NamedTextColor.RED)) + .appendNewline() + .append(Component.text("Du kannst dich alternativ jederzeit bei einem Admin melden.", NamedTextColor.GRAY)) + ); + break; + + case 401: + default: + issuer.sendMessage( + Component.text() + .append(Component.text("Interner Serverfehler beim anlegen des Reports.", NamedTextColor.RED)) + .appendNewline() + .append(Component.text("Bitte melde dich bei einem Admin!", NamedTextColor.RED)) + ); + break; + } + + + + } catch (IOException | InterruptedException e) { + throw new RuntimeException(e); + } + } + + private HttpResponse postRequest(URI uri, String body) throws IOException, InterruptedException { + HttpClient client = HttpClient.newHttpClient(); + HttpRequest httpRequest = HttpRequest.newBuilder() + .uri(uri) + .header("Content-Type", "application/json") + .POST(HttpRequest.BodyPublishers.ofString(body)) + .build(); + + return client.send(httpRequest, HttpResponse.BodyHandlers.ofString()); + } + + @Override + protected @NotNull List> commands() { + return List.of(new ReportCommand()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/report/command/ReportCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/report/command/ReportCommand.java new file mode 100644 index 0000000..eb40dca --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/report/command/ReportCommand.java @@ -0,0 +1,80 @@ +package eu.mhsl.craftattack.spawn.appliances.report.command; + +import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.report.Report; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class ReportCommand extends ApplianceCommand.PlayerChecked { + public ReportCommand() { + super("report"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(args.length == 0) { + sender.sendMessage( + Component + .text("Bitte gib einen Spieler an, den du reporten möchtest!", NamedTextColor.RED) + .appendNewline() + .append(Component.text("/report [grund]", NamedTextColor.RED)) + ); + return; + } + + sender.sendMessage( + Component.newline() + .append(Component.text("Reportanfrage wird erstellt...", NamedTextColor.GREEN)) + .appendNewline() + .append(Component.text("Bitte warte einen Augenblick", NamedTextColor.GRAY)) + .appendNewline() + ); + + Bukkit.getScheduler().runTask(Main.instance(), () -> { + getAppliance().issueReport( + getPlayer(), + args[0], + Arrays.stream(args).skip(1).collect(Collectors.joining(" ")) + ); + }); + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + List response = new ArrayList<>(); + + if(args.length == 1) { + response = Stream.concat( + Bukkit.getOnlinePlayers().stream().map(Player::getName), + Arrays.stream(Bukkit.getOfflinePlayers()).map(OfflinePlayer::getName) + ).toList(); + } + + if(args.length == 2) { + response = List.of( + "Griefing", + "Diebstahl", + "Beleidigung", + "Hacking", + "Andere Regelverstöße", + " " + ); + } + + return super.tabCompleteReducer(response, args); + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index c59630a..dbaee46 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -8,6 +8,10 @@ commands: description: Moves world museum villager to current player location and persists location to config usage: /moveWmVillager permission: admin + report: + description: Reporte einen Spieler + userinfo: + description: Get UUID from any user projectStart: description: Starts project countdown projectStartCancel: