From 09e0db05d908b9ff25eb9ff9b21aeb704922292d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Elias=20M=C3=BCller?= <elias@elias-mueller.com>
Date: Wed, 25 Oct 2023 14:50:59 +0200
Subject: [PATCH] Added UserInfoCommand

---
 .../java/eu/mhsl/craftattack/spawn/Main.java  |  3 +
 .../spawn/appliances/debug/Debug.java         | 14 ++++
 .../debug/command/UserInfoCommand.java        | 82 +++++++++++++++++++
 3 files changed, 99 insertions(+)
 create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/Debug.java
 create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/command/UserInfoCommand.java

diff --git a/src/main/java/eu/mhsl/craftattack/spawn/Main.java b/src/main/java/eu/mhsl/craftattack/spawn/Main.java
index 808cf0f..289b500 100644
--- a/src/main/java/eu/mhsl/craftattack/spawn/Main.java
+++ b/src/main/java/eu/mhsl/craftattack/spawn/Main.java
@@ -4,6 +4,7 @@ import eu.mhsl.craftattack.spawn.appliance.Appliance;
 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.tablist.Tablist;
 import eu.mhsl.craftattack.spawn.appliances.titleClear.TitleClear;
 import eu.mhsl.craftattack.spawn.config.Configuration;
@@ -32,6 +33,8 @@ public final class Main extends JavaPlugin {
                 new Countdown(),
                 new Tablist(),
                 new ChatMessages()
+                new ChatMessages(),
+                new Debug()
         );
         Bukkit.getLogger().info("Loading appliances...");
         appliances.forEach(appliance -> {
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/Debug.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/Debug.java
new file mode 100644
index 0000000..4b1e94e
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/Debug.java
@@ -0,0 +1,14 @@
+package eu.mhsl.craftattack.spawn.appliances.debug;
+
+import eu.mhsl.craftattack.spawn.appliance.Appliance;
+import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
+import eu.mhsl.craftattack.spawn.appliances.debug.command.UserInfoCommand;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+public class Debug extends Appliance {
+    @Override
+    protected @NotNull List<ApplianceCommand<?>> commands() {
+        return List.of(new UserInfoCommand());
+    }
+}
diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/command/UserInfoCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/command/UserInfoCommand.java
new file mode 100644
index 0000000..51f958b
--- /dev/null
+++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/command/UserInfoCommand.java
@@ -0,0 +1,82 @@
+package eu.mhsl.craftattack.spawn.appliances.debug.command;
+
+import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand;
+import eu.mhsl.craftattack.spawn.appliances.debug.Debug;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.event.ClickEvent;
+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.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Stream;
+
+public class UserInfoCommand extends ApplianceCommand<Debug> {
+    public UserInfoCommand() {
+        super("userInfo");
+    }
+
+    @Override
+    protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
+        if(args.length != 1) {
+                sender.sendMessage(Component.text("Bitte gib einen Nutzernamen an.", NamedTextColor.RED));
+                return;
+        }
+
+        OfflinePlayer player = Bukkit.getOfflinePlayer(args[0]);
+
+        sender.sendMessage(
+                Component.text()
+                        .appendNewline()
+                        .append(Component.text("Informationen zu: ", NamedTextColor.GOLD))
+                        .append(
+                                Component
+                                        .text(Objects.requireNonNull(player.getName()), NamedTextColor.YELLOW)
+                                        .clickEvent(ClickEvent.copyToClipboard(Objects.requireNonNull(player.getName())))
+                        )
+                        .appendNewline()
+                        .append(
+                                Component
+                                        .text("UUID: " + player.getUniqueId(), NamedTextColor.GRAY)
+                                        .clickEvent(ClickEvent.copyToClipboard(player.getUniqueId().toString()))
+                        )
+                        .appendNewline()
+                        .append(
+                                Component
+                                        .text("Erster Besuch: " + formatUnixTimestamp(player.getFirstPlayed()), NamedTextColor.GRAY)
+                                        .clickEvent(ClickEvent.copyToClipboard(String.valueOf(player.getFirstPlayed())))
+                        )
+                        .appendNewline()
+                        .append(
+                                Component
+                                        .text("Letzter Besuch: " + formatUnixTimestamp(player.getLastSeen()), NamedTextColor.GRAY)
+                                        .clickEvent(ClickEvent.copyToClipboard(String.valueOf(player.getLastSeen())))
+                        )
+                        .appendNewline()
+        );
+    }
+
+    @Override
+    public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
+        if(args.length < 2) {
+            return Stream.concat(
+                    Bukkit.getOnlinePlayers().stream().map(Player::getName),
+                    Arrays.stream(Bukkit.getOfflinePlayers()).map(OfflinePlayer::getName)
+            ).toList();
+        }
+
+        return new ArrayList<>();
+    }
+
+    private String formatUnixTimestamp(long timestamp) {
+        DateFormat format = new SimpleDateFormat("E dd.MM.yyyy H:m:s");
+        return format.format(new Date(timestamp));
+    }
+}