From 5519ea0ad4e42fc77025721b53d30baf146ec833 Mon Sep 17 00:00:00 2001
From: Len <40720638+destro174@users.noreply.github.com>
Date: Thu, 29 Sep 2022 13:01:14 +0200
Subject: [PATCH] Start working on CommandSeen.java
---
.../alttd/commandManager/CommandManager.java | 4 +-
.../commandManager/commands/CommandSeen.java | 134 ++++++++++++++++++
.../java/com/alttd/config/MessagesConfig.java | 2 +
.../database/queries/QueriesUserUUID.java | 2 +-
.../queries/queriesSeen/PlaytimeSeen.java | 33 +++++
.../queries/queriesSeen/SeenQueries.java | 29 ++++
src/main/java/com/alttd/util/Util.java | 24 ++++
7 files changed, 226 insertions(+), 2 deletions(-)
create mode 100644 src/main/java/com/alttd/commandManager/commands/CommandSeen.java
create mode 100644 src/main/java/com/alttd/database/queries/queriesSeen/PlaytimeSeen.java
create mode 100644 src/main/java/com/alttd/database/queries/queriesSeen/SeenQueries.java
diff --git a/src/main/java/com/alttd/commandManager/CommandManager.java b/src/main/java/com/alttd/commandManager/CommandManager.java
index b685d21..56aa794 100644
--- a/src/main/java/com/alttd/commandManager/CommandManager.java
+++ b/src/main/java/com/alttd/commandManager/CommandManager.java
@@ -42,7 +42,9 @@ public class CommandManager extends ListenerAdapter {
new CommandUpdateCommands(jda, this),
new CommandEvidence(jda, modalManager, this),
new CommandFlag(jda, this),
- new CommandHistory(jda, this));
+ new CommandHistory(jda, this),
+ new CommandSeen(jda, this)
+ );
}
@Override
diff --git a/src/main/java/com/alttd/commandManager/commands/CommandSeen.java b/src/main/java/com/alttd/commandManager/commands/CommandSeen.java
new file mode 100644
index 0000000..d2bfdd0
--- /dev/null
+++ b/src/main/java/com/alttd/commandManager/commands/CommandSeen.java
@@ -0,0 +1,134 @@
+package com.alttd.commandManager.commands;
+
+import com.alttd.commandManager.CommandManager;
+import com.alttd.commandManager.DiscordCommand;
+import com.alttd.config.MessagesConfig;
+import com.alttd.database.queries.QueriesUserUUID;
+import com.alttd.database.queries.queriesSeen.PlaytimeSeen;
+import com.alttd.database.queries.queriesSeen.SeenQueries;
+import com.alttd.util.Util;
+import net.dv8tion.jda.api.JDA;
+import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent;
+import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
+import net.dv8tion.jda.api.interactions.commands.DefaultMemberPermissions;
+import net.dv8tion.jda.api.interactions.commands.OptionMapping;
+import net.dv8tion.jda.api.interactions.commands.OptionType;
+import net.dv8tion.jda.api.interactions.commands.build.CommandData;
+import net.dv8tion.jda.api.interactions.commands.build.Commands;
+import net.dv8tion.jda.api.requests.RestAction;
+
+import java.util.Collections;
+import java.util.Date;
+import java.util.UUID;
+
+public class CommandSeen extends DiscordCommand {
+
+ private final CommandData commandData;
+
+ public CommandSeen(JDA jda, CommandManager commandManager) {
+ commandData = Commands.slash(getName(), "Check when a player was last online.")
+ .addOption(OptionType.STRING, "playername", "The playername or uuid you want to check.", true, true)
+ .setGuildOnly(true)
+ .setDefaultPermissions(DefaultMemberPermissions.ENABLED);
+
+ Util.registerCommand(commandManager, jda, commandData, getName());
+ }
+
+ @Override
+ public String getName() {
+ return "seen";
+ }
+
+ @Override
+ public void execute(SlashCommandInteractionEvent event) {
+ OptionMapping option = event.getOption("playername");
+ if (option == null) {
+ return;
+ }
+ String playerName = option.getAsString();
+ UUID uuid;
+ try{
+ uuid = UUID.fromString(playerName);
+ playerName = QueriesUserUUID.getUsernameByUUID(uuid);
+ } catch (IllegalArgumentException exception){
+ uuid = QueriesUserUUID.getUUIDByUsername(playerName);
+ }
+
+ if (uuid == null) {
+ error(event);
+ return;
+ }
+
+ // TODO Determine if a player is online or not? currently not possible?
+ PlaytimeSeen lastSeen = SeenQueries.getLastSeen(uuid);
+ if (lastSeen == null || lastSeen.getLastSeen() == 0) {
+ error(event);
+ return;
+ }
+
+ String SEEN_FORMAT = "Player %player% has been %online/offline% for %time% on %server%.";
+ event.replyEmbeds(Util.genericSuccessEmbed("Success",
+ SEEN_FORMAT
+ .replaceAll("%player%", playerName)
+// .replaceAll("%online/offline%", Config.Messages.SEEN_OFFLINE_FORMAT.getMessage())
+ .replaceAll("%time%", getPassedTime(lastSeen.getLastSeen()))
+ .replaceAll("%server%", lastSeen.getServer())
+ ))
+ .setEphemeral(true).queue(RestAction.getDefaultSuccess(), Util::handleFailure);
+ }
+
+ @Override
+ public void suggest(CommandAutoCompleteInteractionEvent event) {
+ event.replyChoices(Collections.emptyList())
+ .queue(RestAction.getDefaultSuccess(), Util::handleFailure);
+ }
+
+ @Override
+ public String getHelpMessage() {
+ return MessagesConfig.HELP_SEEN;
+ }
+
+ @Override
+ public CommandData getCommandData() {
+ return commandData;
+ }
+
+ private static String getPassedTime(Long time) {
+ return Util.convertTime(new Date().getTime() - time);
+ }
+
+ private void error(SlashCommandInteractionEvent event) {
+ event.replyEmbeds(Util.genericErrorEmbed("Error", "No recorded time."))
+ .setEphemeral(true).queue(RestAction.getDefaultSuccess(), Util::handleFailure);
+ }
+
+// private static Component getOnlineSeen(String playerName, Player player) {
+// UUID uuid = player.getUniqueId();
+// PlaytimePlayer playtimePlayer = Queries.getPlaytimePlayer(uuid);
+//
+// if (playtimePlayer == null) return MiniMessage.get().parse(Config.Messages.PLAYER_NOT_FOUND.getMessage().replaceAll("%player%", playerName));
+//
+// return getOnlineSeen(playtimePlayer, player);
+// }
+// private static Component getOfflineSeen(String playerName) {
+// UUID uuid = Utilities.getPlayerUUID(playerName);
+//
+// if (uuid == null) return MiniMessage.get().parse(Config.Messages.PLAYER_NOT_FOUND.getMessage().replaceAll("%player%", playerName));
+//
+// return getOfflineSeen(uuid);
+// }
+//
+// private static Component getOfflineSeen(UUID uuid) {
+// if (uuid == null) return Component.empty();
+//
+// PlaytimeSeen lastSeen = Queries.getLastSeen(uuid);
+//
+// if (lastSeen == null || lastSeen.getLastSeen() == 0) return MiniMessage.get().parse(Config.Messages.SEEN_TIME_NULL.getMessage());
+//
+// return MiniMessage.get().parse(Config.Messages.SEEN_FORMAT.getMessage()
+// .replaceAll("%player%", Utilities.getPlayerName(uuid))
+// .replaceAll("%online/offline%", Config.Messages.SEEN_OFFLINE_FORMAT.getMessage())
+// .replaceAll("%time%", getPassedTime(lastSeen.getLastSeen()))
+// .replaceAll("%server%", lastSeen.getServer()));
+// }
+}
diff --git a/src/main/java/com/alttd/config/MessagesConfig.java b/src/main/java/com/alttd/config/MessagesConfig.java
index 4706cac..d2714fc 100644
--- a/src/main/java/com/alttd/config/MessagesConfig.java
+++ b/src/main/java/com/alttd/config/MessagesConfig.java
@@ -17,10 +17,12 @@ public class MessagesConfig extends AbstractConfig {
public static String HELP_HELP = "`/help`: Shows help menu";
public static String HELP_SUGGESTION = "`/suggestion`: Opens suggestion form";
public static String HELP_MESSAGE_TEMPLATE = "";
+ public static String HELP_SEEN = "";
private static void loadHelp() {
HELP_HELP = messagesConfig.getString("help.help", HELP_HELP);
HELP_SUGGESTION = messagesConfig.getString("help.suggestion", HELP_SUGGESTION);
HELP_MESSAGE_TEMPLATE = messagesConfig.getString("help.message-template", HELP_MESSAGE_TEMPLATE);
+ HELP_SEEN = messagesConfig.getString("help.seen", HELP_SEEN);
}
private static void loadPollHelp() {
diff --git a/src/main/java/com/alttd/database/queries/QueriesUserUUID.java b/src/main/java/com/alttd/database/queries/QueriesUserUUID.java
index c1199fe..0c8e99f 100644
--- a/src/main/java/com/alttd/database/queries/QueriesUserUUID.java
+++ b/src/main/java/com/alttd/database/queries/QueriesUserUUID.java
@@ -38,6 +38,6 @@ public class QueriesUserUUID {
} catch (SQLException exception) {
exception.printStackTrace();
}
- return null;
+ return "user not found";
}
}
diff --git a/src/main/java/com/alttd/database/queries/queriesSeen/PlaytimeSeen.java b/src/main/java/com/alttd/database/queries/queriesSeen/PlaytimeSeen.java
new file mode 100644
index 0000000..fc45828
--- /dev/null
+++ b/src/main/java/com/alttd/database/queries/queriesSeen/PlaytimeSeen.java
@@ -0,0 +1,33 @@
+package com.alttd.database.queries.queriesSeen;
+
+import java.util.UUID;
+
+public class PlaytimeSeen {
+ private final UUID uuid;
+ private String server;
+ private Long lastSeen;
+
+ public PlaytimeSeen(UUID uuid, String server, Long lastSeen) {
+ this.uuid = uuid;
+ this.server = server;
+ this.lastSeen = lastSeen;
+ }
+
+ public UUID getUuid() {
+ return uuid;
+ }
+
+ public String getServer() {
+ return server;
+ }
+
+ public Long getLastSeen() {
+ return lastSeen;
+ }
+
+ public void setLastSeen(String server, long lastSeen) {
+ this.server = server;
+ this.lastSeen = lastSeen;
+ }
+
+}
diff --git a/src/main/java/com/alttd/database/queries/queriesSeen/SeenQueries.java b/src/main/java/com/alttd/database/queries/queriesSeen/SeenQueries.java
new file mode 100644
index 0000000..66abeda
--- /dev/null
+++ b/src/main/java/com/alttd/database/queries/queriesSeen/SeenQueries.java
@@ -0,0 +1,29 @@
+package com.alttd.database.queries.queriesSeen;
+
+import com.alttd.database.Database;
+
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.UUID;
+
+public class SeenQueries {
+
+ public static PlaytimeSeen getLastSeen(UUID uuid) {
+
+ try {
+ PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement("SELECT server_name, last_seen FROM playtime WHERE uuid = ? AND last_seen IS NOT NULL ORDER BY last_seen DESC LIMIT 1");
+ statement.setString(1, uuid.toString());
+
+ ResultSet resultSet = statement.executeQuery();
+
+ if (resultSet.next()) {
+ PlaytimeSeen playtimeSeen = new PlaytimeSeen(uuid, resultSet.getString("server_name"), resultSet.getLong("last_seen"));
+ return playtimeSeen;
+ }
+ } catch (SQLException exception) {
+ exception.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/alttd/util/Util.java b/src/main/java/com/alttd/util/Util.java
index 686bb67..bff6ff1 100644
--- a/src/main/java/com/alttd/util/Util.java
+++ b/src/main/java/com/alttd/util/Util.java
@@ -22,6 +22,7 @@ import java.awt.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
public class Util {
@@ -186,4 +187,27 @@ public class Util {
}
return l;
}
+
+ public static String convertTime(long timeInMillis){
+ return convertTime((int) TimeUnit.MILLISECONDS.toMinutes(timeInMillis));
+ }
+
+ private static String convertTime(int timeInMinutes) {
+ int days = (int) TimeUnit.MINUTES.toDays(timeInMinutes);
+ int hours = (int) (TimeUnit.MINUTES.toHours(timeInMinutes) - TimeUnit.DAYS.toHours(days));
+ int minutes = (int) (TimeUnit.MINUTES.toMinutes(timeInMinutes) - TimeUnit.HOURS.toMinutes(hours)
+ - TimeUnit.DAYS.toMinutes(days));
+
+ StringBuilder stringBuilder = new StringBuilder();
+
+ if (days != 0) {
+ stringBuilder.append(days).append(days == 1 ? " day, " : " days, ");
+ }
+ if (hours != 0) {
+ stringBuilder.append(hours).append(hours == 1 ? " hour, " : " hours, ");
+ }
+ stringBuilder.append(minutes).append(minutes == 1 ? " minute, " : " minutes, ");
+
+ return stringBuilder.substring(0, stringBuilder.length() - 2);
+ }
}