diff --git a/src/main/java/dansplugins/activitytracker/ActivityTracker.java b/src/main/java/dansplugins/activitytracker/ActivityTracker.java index d2ca6b1..ae8b0d1 100644 --- a/src/main/java/dansplugins/activitytracker/ActivityTracker.java +++ b/src/main/java/dansplugins/activitytracker/ActivityTracker.java @@ -21,6 +21,7 @@ import dansplugins.activitytracker.commands.DefaultCommand; import dansplugins.activitytracker.commands.HelpCommand; import dansplugins.activitytracker.commands.InfoCommand; +import dansplugins.activitytracker.commands.ListCommand; import dansplugins.activitytracker.commands.StatsCommand; import dansplugins.activitytracker.commands.TopCommand; import dansplugins.activitytracker.eventhandlers.JoinHandler; @@ -154,6 +155,7 @@ private void initializeCommandService() { new ConfigCommand(configService), new HelpCommand(), new InfoCommand(persistentData), + new ListCommand(persistentData), new StatsCommand(persistentData), new TopCommand(activityRecordService) )); diff --git a/src/main/java/dansplugins/activitytracker/commands/HelpCommand.java b/src/main/java/dansplugins/activitytracker/commands/HelpCommand.java index 1e71c38..bbf30cf 100644 --- a/src/main/java/dansplugins/activitytracker/commands/HelpCommand.java +++ b/src/main/java/dansplugins/activitytracker/commands/HelpCommand.java @@ -22,6 +22,7 @@ public boolean execute(CommandSender sender) { sender.sendMessage(ChatColor.AQUA + "/at help - View a list of helpful commands."); sender.sendMessage(ChatColor.AQUA + "/at info - View your activity record."); sender.sendMessage(ChatColor.AQUA + "/at info (playerName) - View a player's activity record."); + sender.sendMessage(ChatColor.AQUA + "/at list - View the 10 most recent sessions (admin only)."); sender.sendMessage(ChatColor.AQUA + "/at top - View a list of the most active players on the server."); sender.sendMessage(ChatColor.AQUA + "/at stats - View activity stats for the server."); sender.sendMessage(ChatColor.AQUA + "/at config - Show or set config options."); diff --git a/src/main/java/dansplugins/activitytracker/commands/ListCommand.java b/src/main/java/dansplugins/activitytracker/commands/ListCommand.java new file mode 100644 index 0000000..6de428c --- /dev/null +++ b/src/main/java/dansplugins/activitytracker/commands/ListCommand.java @@ -0,0 +1,87 @@ +package dansplugins.activitytracker.commands; + +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import dansplugins.activitytracker.data.PersistentData; +import dansplugins.activitytracker.objects.ActivityRecord; +import dansplugins.activitytracker.objects.Session; +import preponderous.ponder.minecraft.bukkit.abs.AbstractPluginCommand; +import preponderous.ponder.minecraft.bukkit.tools.UUIDChecker; + +/** + * @author Daniel McCoy Stephenson + */ +public class ListCommand extends AbstractPluginCommand { + private final PersistentData persistentData; + + public ListCommand(PersistentData persistentData) { + super(new ArrayList<>(Arrays.asList("list")), new ArrayList<>(Arrays.asList("at.admin"))); + this.persistentData = persistentData; + } + + @Override + public boolean execute(CommandSender sender) { + // Get all sessions from all activity records + List allSessions = new ArrayList<>(); + for (ActivityRecord record : persistentData.getActivityRecords()) { + if (record != null && record.getSessions() != null) { + allSessions.addAll(record.getSessions()); + } + } + + // Sort sessions by login date in descending order (most recent first) + List sortedSessions = allSessions.stream() + .filter(session -> session != null && session.getLoginDate() != null) + .sorted(Comparator.comparing(Session::getLoginDate).reversed()) + .limit(10) + .collect(Collectors.toList()); + + if (sortedSessions.isEmpty()) { + sender.sendMessage(ChatColor.RED + "No sessions found."); + return true; + } + + sender.sendMessage(ChatColor.AQUA + " === 10 Most Recent Sessions ==="); + + UUIDChecker uuidChecker = new UUIDChecker(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + int count = 1; + for (Session session : sortedSessions) { + String playerName = uuidChecker.findPlayerNameBasedOnUUID(session.getPlayerUUID()); + if (playerName == null) { + playerName = "Unknown Player"; + } + + String loginTime = session.getLoginDate().format(formatter); + String status = session.isActive() ? ChatColor.GREEN + "Active" : ChatColor.RED + "Ended"; + + String sessionInfo; + if (session.isActive()) { + sessionInfo = String.format("%d. %s - Login: %s (%s%s)", + count, playerName, loginTime, status, ChatColor.AQUA); + } else { + sessionInfo = String.format("%d. %s - Login: %s (%s%s - Duration: %.1f min)", + count, playerName, loginTime, status, ChatColor.AQUA, session.getMinutesSpent()); + } + + sender.sendMessage(ChatColor.AQUA + sessionInfo); + count++; + } + + return true; + } + + @Override + public boolean execute(CommandSender sender, String[] args) { + return execute(sender); + } +} \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index e930dde..bc68215 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -17,4 +17,6 @@ permissions: at.stats: default: true at.config: + default: op + at.admin: default: op \ No newline at end of file