Added /seen command

This commit is contained in:
Teriuihi 2022-09-30 00:01:10 +02:00
parent 2d652bc780
commit 425eaf2b94
4 changed files with 44 additions and 31 deletions

View File

@ -6,7 +6,10 @@ import com.alttd.config.MessagesConfig;
import com.alttd.database.queries.QueriesUserUUID; import com.alttd.database.queries.QueriesUserUUID;
import com.alttd.database.queries.queriesSeen.PlaytimeSeen; import com.alttd.database.queries.queriesSeen.PlaytimeSeen;
import com.alttd.database.queries.queriesSeen.SeenQueries; import com.alttd.database.queries.queriesSeen.SeenQueries;
import com.alttd.templates.Parser;
import com.alttd.templates.Template;
import com.alttd.util.Util; import com.alttd.util.Util;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.CommandAutoCompleteInteractionEvent;
import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent; import net.dv8tion.jda.api.events.interaction.command.SlashCommandInteractionEvent;
@ -17,17 +20,21 @@ import net.dv8tion.jda.api.interactions.commands.build.CommandData;
import net.dv8tion.jda.api.interactions.commands.build.Commands; import net.dv8tion.jda.api.interactions.commands.build.Commands;
import net.dv8tion.jda.api.requests.RestAction; import net.dv8tion.jda.api.requests.RestAction;
import java.awt.*;
import java.util.Collections; import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit;
public class CommandSeen extends DiscordCommand { public class CommandSeen extends DiscordCommand {
private final CommandData commandData; private final CommandData commandData;
private static final List<String> validServers = List.of("lobby", "creative", "fjord", "grotto");
public CommandSeen(JDA jda, CommandManager commandManager) { public CommandSeen(JDA jda, CommandManager commandManager) {
commandData = Commands.slash(getName(), "Check when a player was last online.") 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) .addOption(OptionType.STRING, "playername", "The playername or uuid you want to check.", true, false)
.setGuildOnly(true) .setGuildOnly(true)
.setDefaultPermissions(DefaultMemberPermissions.ENABLED); .setDefaultPermissions(DefaultMemberPermissions.ENABLED);
@ -41,39 +48,36 @@ public class CommandSeen extends DiscordCommand {
@Override @Override
public void execute(SlashCommandInteractionEvent event) { public void execute(SlashCommandInteractionEvent event) {
OptionMapping option = event.getOption("playername"); String playerName = event.getOption("playername", OptionMapping::getAsString);
if (option == null) { if (playerName == null || playerName.length() < 3 || playerName.length() > 16) {
error(event);
return; return;
} }
String playerName = option.getAsString();
UUID uuid;
try{
uuid = UUID.fromString(playerName);
playerName = QueriesUserUUID.getUsernameByUUID(uuid);
} catch (IllegalArgumentException exception){
uuid = QueriesUserUUID.getUUIDByUsername(playerName);
}
UUID uuid = QueriesUserUUID.getUUIDByUsername(playerName);
if (uuid == null) { if (uuid == null) {
error(event); error(event);
return; return;
} }
// TODO Determine if a player is online or not? currently not possible? List<PlaytimeSeen> lastSeen = SeenQueries.getLastSeen(uuid);
PlaytimeSeen lastSeen = SeenQueries.getLastSeen(uuid); if (lastSeen == null || lastSeen.isEmpty()) {
if (lastSeen == null || lastSeen.getLastSeen() == 0) {
error(event); error(event);
return; return;
} }
String SEEN_FORMAT = "Player <gold>%player%</gold> has been %online/offline% for %time% on %server%.</white>"; EmbedBuilder embedBuilder = new EmbedBuilder();
event.replyEmbeds(Util.genericSuccessEmbed("Success", embedBuilder
SEEN_FORMAT .setTitle("Seen")
.replaceAll("%player%", playerName) .setColor(Color.GREEN)
// .replaceAll("%online/offline%", Config.Messages.SEEN_OFFLINE_FORMAT.getMessage()) .appendDescription("`" + Util.capitalize(playerName) + "`'s seen information per server:\n\n");
.replaceAll("%time%", getPassedTime(lastSeen.getLastSeen())) for (PlaytimeSeen playtimeSeen : lastSeen) {
.replaceAll("%server%", lastSeen.getServer()) if (playtimeSeen == null || playtimeSeen.getLastSeen() == 0 || !validServers.contains(playtimeSeen.getServer().toLowerCase()))
)) continue;
embedBuilder.appendDescription(Util.capitalize(playtimeSeen.getServer()) + ": " + "<t:" + TimeUnit.MILLISECONDS.toSeconds(playtimeSeen.getLastSeen()) +":R>\n");
}
event.replyEmbeds(embedBuilder.build())
.setEphemeral(true).queue(RestAction.getDefaultSuccess(), Util::handleFailure); .setEphemeral(true).queue(RestAction.getDefaultSuccess(), Util::handleFailure);
} }

View File

@ -1,7 +1,5 @@
package com.alttd.config; package com.alttd.config;
import net.dv8tion.jda.api.entities.Activity;
public class SettingsConfig extends AbstractConfig { public class SettingsConfig extends AbstractConfig {
static SettingsConfig settingsConfig; static SettingsConfig settingsConfig;

View File

@ -5,22 +5,27 @@ import com.alttd.database.Database;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID; import java.util.UUID;
public class SeenQueries { public class SeenQueries {
public static PlaytimeSeen getLastSeen(UUID uuid) { public static List<PlaytimeSeen> getLastSeen(UUID uuid) {
String sql = "SELECT server_name, last_seen " +
"FROM playtime_view " +
"WHERE uuid = ? AND last_seen IS NOT NULL " +
"ORDER BY last_seen ASC";
try { 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"); PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql);
statement.setString(1, uuid.toString()); statement.setString(1, uuid.toString());
ResultSet resultSet = statement.executeQuery(); ResultSet resultSet = statement.executeQuery();
ArrayList<PlaytimeSeen> playtimeSeenList = new ArrayList<>();
if (resultSet.next()) { while (resultSet.next()) {
PlaytimeSeen playtimeSeen = new PlaytimeSeen(uuid, resultSet.getString("server_name"), resultSet.getLong("last_seen")); playtimeSeenList.add(new PlaytimeSeen(uuid, resultSet.getString("server_name"), resultSet.getLong("last_seen")));
return playtimeSeen;
} }
return playtimeSeenList;
} catch (SQLException exception) { } catch (SQLException exception) {
exception.printStackTrace(); exception.printStackTrace();
} }

View File

@ -210,4 +210,10 @@ public class Util {
return stringBuilder.substring(0, stringBuilder.length() - 2); return stringBuilder.substring(0, stringBuilder.length() - 2);
} }
public static String capitalize(String str) {
if (str.length() <= 1)
return str.toUpperCase();
return str.toUpperCase().charAt(0) + str.toLowerCase().substring(1);
}
} }