From 7ddfafd88f91399c68553cc6841c012719df451b Mon Sep 17 00:00:00 2001 From: Artem Date: Sun, 2 Mar 2025 18:03:13 +0300 Subject: [PATCH 1/2] =?UTF-8?q?good=20first=20issue=20=D0=94=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9?= =?UTF-8?q?=20=D0=BF=D0=BB=D0=B0=D0=B3=D0=B8=D0=BD(=D0=B2=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=20=D0=B8=D0=B3=D1=80=D0=BE=D0=BA=D0=B0+=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0=20=D0=BD=D0=B0=20=D0=B4=D0=BB?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20?= =?UTF-8?q?=D0=B8=D0=B3=D1=80=D1=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- .../joutak/joutaktemplate/JouTakTemplate.java | 16 +++- .../commands/PlayerTimeCommand.java | 83 +++++++++++++++++++ .../events/PlayerJoinListener.java | 38 +++++++++ .../joutaktemplate/utils/TimeUtils.java | 12 +++ src/main/resources/plugin.yml | 4 +- 6 files changed, 151 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/joutak/joutaktemplate/commands/PlayerTimeCommand.java create mode 100644 src/main/java/org/joutak/joutaktemplate/events/PlayerJoinListener.java create mode 100644 src/main/java/org/joutak/joutaktemplate/utils/TimeUtils.java diff --git a/pom.xml b/pom.xml index 1354717..39ca6ee 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ JouTakTemplate - 1.8 + 11 UTF-8 diff --git a/src/main/java/org/joutak/joutaktemplate/JouTakTemplate.java b/src/main/java/org/joutak/joutaktemplate/JouTakTemplate.java index ec00d71..da2fa8a 100644 --- a/src/main/java/org/joutak/joutaktemplate/JouTakTemplate.java +++ b/src/main/java/org/joutak/joutaktemplate/JouTakTemplate.java @@ -3,22 +3,34 @@ import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.bukkit.plugin.java.JavaPlugin; +import org.joutak.joutaktemplate.commands.PlayerTimeCommand; +import org.joutak.joutaktemplate.events.PlayerJoinListener; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.UUID; @Slf4j +@Getter public final class JouTakTemplate extends JavaPlugin { @Getter private static JouTakTemplate instance; + // Хранение времени входа игроков + private final HashMap playerJoinTimes = new HashMap<>(); + @Override public void onEnable() { - + instance = this; + getServer().getPluginManager().registerEvents(new PlayerJoinListener(), this); + getCommand("playertime").setExecutor(new PlayerTimeCommand()); + log.info("JouTakTemplate плагин запущен!"); } @Override public void onDisable() { - // Plugin shutdown logic + log.info("JouTakTemplate плагин отключен."); } } diff --git a/src/main/java/org/joutak/joutaktemplate/commands/PlayerTimeCommand.java b/src/main/java/org/joutak/joutaktemplate/commands/PlayerTimeCommand.java new file mode 100644 index 0000000..7b33d51 --- /dev/null +++ b/src/main/java/org/joutak/joutaktemplate/commands/PlayerTimeCommand.java @@ -0,0 +1,83 @@ +package org.joutak.joutaktemplate.commands; + +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.entity.Player; +import org.joutak.joutaktemplate.JouTakTemplate; +import org.joutak.joutaktemplate.utils.TimeUtils; + +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.UUID; + +public class PlayerTimeCommand implements CommandExecutor { + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + + if (sender instanceof Player) { + if (args.length > 0) { + sender.sendMessage("§cОшибка! Команда используется без аргументов"); + sender.sendMessage("§eИспользуйте: /playertime"); + return true; + } + + Player player = (Player) sender; + UUID playerUUID = player.getUniqueId(); + LocalDateTime joinTime = JouTakTemplate.getInstance().getPlayerJoinTimes().get(playerUUID); + + if (joinTime == null) { + player.sendMessage("§cНет данных о вашем входе."); + return true; + } + + LocalDateTime currentTime = LocalDateTime.now(); + Duration duration = Duration.between(joinTime, currentTime); + long minutes = duration.toMinutes(); + long seconds = duration.toSecondsPart(); + + player.sendMessage("§aТекущее серверное время: §e" + TimeUtils.formatTime(currentTime)); + player.sendMessage("§aВаше время входа: §e" + TimeUtils.formatTime(joinTime)); + player.sendMessage("§aВы на сервере уже §e" + minutes + " мин " + seconds + " сек"); + + return true; + } + + if (sender instanceof ConsoleCommandSender) { + if (args.length != 1) { + sender.sendMessage("§cИспользование: /playertime <ник_игрока>"); + return true; + } + + Player target = Bukkit.getPlayerExact(args[0]); + if (target == null) { + sender.sendMessage("§cОшибка! Игрок " + args[0] + " не найден или не в сети."); + return true; + } + + UUID playerUUID = target.getUniqueId(); + LocalDateTime joinTime = JouTakTemplate.getInstance().getPlayerJoinTimes().get(playerUUID); + + if (joinTime == null) { + sender.sendMessage("§cНет данных о входе игрока " + target.getName()); + return true; + } + + LocalDateTime currentTime = LocalDateTime.now(); + Duration duration = Duration.between(joinTime, currentTime); + long minutes = duration.toMinutes(); + long seconds = duration.toSecondsPart(); + + sender.sendMessage("§aТекущее серверное время: §e" + TimeUtils.formatTime(currentTime)); + sender.sendMessage("§aВремя входа игрока " + target.getName() + ": §e" + TimeUtils.formatTime(joinTime)); + sender.sendMessage("§aРазница с текущим временем: §e" + minutes + " мин " + seconds + " сек"); + + return true; + } + + return false; + } +} diff --git a/src/main/java/org/joutak/joutaktemplate/events/PlayerJoinListener.java b/src/main/java/org/joutak/joutaktemplate/events/PlayerJoinListener.java new file mode 100644 index 0000000..41a0a8d --- /dev/null +++ b/src/main/java/org/joutak/joutaktemplate/events/PlayerJoinListener.java @@ -0,0 +1,38 @@ +package org.joutak.joutaktemplate.events; + +import lombok.extern.slf4j.Slf4j; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.Sound; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.ItemStack; +import org.joutak.joutaktemplate.JouTakTemplate; +import org.joutak.joutaktemplate.utils.TimeUtils; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Slf4j +public class PlayerJoinListener implements Listener { + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + UUID playerUUID = event.getPlayer().getUniqueId(); + LocalDateTime joinTime = LocalDateTime.now(); + JouTakTemplate.getInstance().getPlayerJoinTimes().put(playerUUID, joinTime); + + String formattedTime = TimeUtils.formatTime(joinTime); + + log.info("Игрок {} зашел на сервер в {}", event.getPlayer().getName(), formattedTime); + + event.getPlayer().getWorld().spawnParticle(Particle.FIREWORKS_SPARK, event.getPlayer().getLocation(), 30, 0.5, 1, 0.5); + event.getPlayer().playSound(event.getPlayer().getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1f, 1f); + + ItemStack reward = new ItemStack(Material.GOLDEN_APPLE, 1); + event.getPlayer().getInventory().addItem(reward); + event.getPlayer().sendMessage("§6Вы получили бонус за вход: §e1 Золотое яблоко!"); + event.getPlayer().sendMessage("§aВы зашли на сервер в §e" + formattedTime); + } +} diff --git a/src/main/java/org/joutak/joutaktemplate/utils/TimeUtils.java b/src/main/java/org/joutak/joutaktemplate/utils/TimeUtils.java new file mode 100644 index 0000000..4c7dacb --- /dev/null +++ b/src/main/java/org/joutak/joutaktemplate/utils/TimeUtils.java @@ -0,0 +1,12 @@ +package org.joutak.joutaktemplate.utils; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class TimeUtils { + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + public static String formatTime(LocalDateTime time) { + return time.format(FORMATTER); + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index bb6c591..6ecfc40 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,4 +3,6 @@ version: '${project.version}' main: org.joutak.joutaktemplate.JouTakTemplate api-version: '1.20' commands: - joutest: {} + playertime: + description: Показывает время входа и разницу + usage: /playertime \ No newline at end of file From 705c9a1bad3751a13aefd45c422357570cb4bad4 Mon Sep 17 00:00:00 2001 From: Artem Date: Sun, 2 Mar 2025 19:13:08 +0300 Subject: [PATCH 2/2] =?UTF-8?q?good=20first=20issue=20=D0=94=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9?= =?UTF-8?q?=20=D0=BF=D0=BB=D0=B0=D0=B3=D0=B8=D0=BD(=D0=B2=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=20=D0=B8=D0=B3=D1=80=D0=BE=D0=BA=D0=B0+=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0=20=D0=BD=D0=B0=20=D0=B4=D0=BB?= =?UTF-8?q?=D0=B8=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20?= =?UTF-8?q?=D0=B8=D0=B3=D1=80=D1=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commands/PlayerTimeCommand.java | 55 ++++--------------- .../events/PlayerJoinListener.java | 8 ++- .../joutaktemplate/utils/MessageUtils.java | 10 ++++ .../joutaktemplate/utils/TimeUtils.java | 36 ++++++++++++ 4 files changed, 63 insertions(+), 46 deletions(-) create mode 100644 src/main/java/org/joutak/joutaktemplate/utils/MessageUtils.java diff --git a/src/main/java/org/joutak/joutaktemplate/commands/PlayerTimeCommand.java b/src/main/java/org/joutak/joutaktemplate/commands/PlayerTimeCommand.java index 7b33d51..02a929c 100644 --- a/src/main/java/org/joutak/joutaktemplate/commands/PlayerTimeCommand.java +++ b/src/main/java/org/joutak/joutaktemplate/commands/PlayerTimeCommand.java @@ -1,17 +1,15 @@ package org.joutak.joutaktemplate.commands; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; -import org.joutak.joutaktemplate.JouTakTemplate; -import org.joutak.joutaktemplate.utils.TimeUtils; -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.UUID; +import static org.joutak.joutaktemplate.utils.MessageUtils.createTextMessage; +import static org.joutak.joutaktemplate.utils.TimeUtils.getTimeInfo; public class PlayerTimeCommand implements CommandExecutor { @@ -20,64 +18,33 @@ public boolean onCommand(CommandSender sender, Command command, String label, St if (sender instanceof Player) { if (args.length > 0) { - sender.sendMessage("§cОшибка! Команда используется без аргументов"); - sender.sendMessage("§eИспользуйте: /playertime"); + sender.sendMessage(createTextMessage("Ошибка! Команда используется без аргументов", NamedTextColor.RED)); + sender.sendMessage(createTextMessage("Используйте: /playertime", NamedTextColor.YELLOW)); return true; } Player player = (Player) sender; - UUID playerUUID = player.getUniqueId(); - LocalDateTime joinTime = JouTakTemplate.getInstance().getPlayerJoinTimes().get(playerUUID); - - if (joinTime == null) { - player.sendMessage("§cНет данных о вашем входе."); - return true; - } - - LocalDateTime currentTime = LocalDateTime.now(); - Duration duration = Duration.between(joinTime, currentTime); - long minutes = duration.toMinutes(); - long seconds = duration.toSecondsPart(); - - player.sendMessage("§aТекущее серверное время: §e" + TimeUtils.formatTime(currentTime)); - player.sendMessage("§aВаше время входа: §e" + TimeUtils.formatTime(joinTime)); - player.sendMessage("§aВы на сервере уже §e" + minutes + " мин " + seconds + " сек"); - + sender.sendMessage(getTimeInfo(player)); return true; } if (sender instanceof ConsoleCommandSender) { if (args.length != 1) { - sender.sendMessage("§cИспользование: /playertime <ник_игрока>"); + sender.sendMessage(createTextMessage("Использование: /playertime <ник_игрока>", NamedTextColor.RED)); return true; } Player target = Bukkit.getPlayerExact(args[0]); if (target == null) { - sender.sendMessage("§cОшибка! Игрок " + args[0] + " не найден или не в сети."); + sender.sendMessage(createTextMessage("Ошибка! Игрок " + args[0] + " не найден или не в сети.", NamedTextColor.RED)); return true; } - UUID playerUUID = target.getUniqueId(); - LocalDateTime joinTime = JouTakTemplate.getInstance().getPlayerJoinTimes().get(playerUUID); - - if (joinTime == null) { - sender.sendMessage("§cНет данных о входе игрока " + target.getName()); - return true; - } - - LocalDateTime currentTime = LocalDateTime.now(); - Duration duration = Duration.between(joinTime, currentTime); - long minutes = duration.toMinutes(); - long seconds = duration.toSecondsPart(); - - sender.sendMessage("§aТекущее серверное время: §e" + TimeUtils.formatTime(currentTime)); - sender.sendMessage("§aВремя входа игрока " + target.getName() + ": §e" + TimeUtils.formatTime(joinTime)); - sender.sendMessage("§aРазница с текущим временем: §e" + minutes + " мин " + seconds + " сек"); - + sender.sendMessage(getTimeInfo(target)); return true; } return false; } -} + +} \ No newline at end of file diff --git a/src/main/java/org/joutak/joutaktemplate/events/PlayerJoinListener.java b/src/main/java/org/joutak/joutaktemplate/events/PlayerJoinListener.java index 41a0a8d..8200605 100644 --- a/src/main/java/org/joutak/joutaktemplate/events/PlayerJoinListener.java +++ b/src/main/java/org/joutak/joutaktemplate/events/PlayerJoinListener.java @@ -1,6 +1,7 @@ package org.joutak.joutaktemplate.events; import lombok.extern.slf4j.Slf4j; +import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.Sound; @@ -14,6 +15,8 @@ import java.time.LocalDateTime; import java.util.UUID; +import static org.joutak.joutaktemplate.utils.MessageUtils.createTextMessage; + @Slf4j public class PlayerJoinListener implements Listener { @@ -32,7 +35,8 @@ public void onPlayerJoin(PlayerJoinEvent event) { ItemStack reward = new ItemStack(Material.GOLDEN_APPLE, 1); event.getPlayer().getInventory().addItem(reward); - event.getPlayer().sendMessage("§6Вы получили бонус за вход: §e1 Золотое яблоко!"); - event.getPlayer().sendMessage("§aВы зашли на сервер в §e" + formattedTime); + + event.getPlayer().sendMessage(createTextMessage("Вы получили бонус за вход: 1 Золотое яблоко!", NamedTextColor.BLUE)); + event.getPlayer().sendMessage(createTextMessage("Вы зашли на сервер в " + formattedTime, NamedTextColor.GREEN)); } } diff --git a/src/main/java/org/joutak/joutaktemplate/utils/MessageUtils.java b/src/main/java/org/joutak/joutaktemplate/utils/MessageUtils.java new file mode 100644 index 0000000..e25f6ed --- /dev/null +++ b/src/main/java/org/joutak/joutaktemplate/utils/MessageUtils.java @@ -0,0 +1,10 @@ +package org.joutak.joutaktemplate.utils; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; + +public class MessageUtils { + public static Component createTextMessage(String message, NamedTextColor color) { + return Component.text(message, color); + } +} diff --git a/src/main/java/org/joutak/joutaktemplate/utils/TimeUtils.java b/src/main/java/org/joutak/joutaktemplate/utils/TimeUtils.java index 4c7dacb..50a947c 100644 --- a/src/main/java/org/joutak/joutaktemplate/utils/TimeUtils.java +++ b/src/main/java/org/joutak/joutaktemplate/utils/TimeUtils.java @@ -1,7 +1,16 @@ package org.joutak.joutaktemplate.utils; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.entity.Player; +import org.joutak.joutaktemplate.JouTakTemplate; + +import java.time.Duration; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.UUID; + +import static org.joutak.joutaktemplate.utils.MessageUtils.createTextMessage; public class TimeUtils { private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @@ -9,4 +18,31 @@ public class TimeUtils { public static String formatTime(LocalDateTime time) { return time.format(FORMATTER); } + + public static Component getTimeInfo(Player target) { + UUID playerUUID = target.getUniqueId(); + LocalDateTime joinTime = JouTakTemplate.getInstance().getPlayerJoinTimes().get(playerUUID); + + if (joinTime == null) { + return createTextMessage("Нет данных о входе игрока " + target.getName(), NamedTextColor.RED); + } + + LocalDateTime currentTime = LocalDateTime.now(); + Duration duration = Duration.between(joinTime, currentTime); + long minutes = duration.toMinutes(); + long seconds = duration.toSecondsPart(); + + return formatTimeMessage(target.getName(), currentTime, joinTime, minutes, seconds); + } + + private static Component formatTimeMessage(String playerName, LocalDateTime currentTime, LocalDateTime joinTime, long minutes, long seconds) { + return createTextMessage("Текущее серверное время: ", NamedTextColor.GREEN) + .append(createTextMessage(TimeUtils.formatTime(currentTime), NamedTextColor.YELLOW)) + .append(Component.newline()) + .append(createTextMessage("Время входа игрока " + playerName + ": ", NamedTextColor.GREEN)) + .append(createTextMessage(TimeUtils.formatTime(joinTime), NamedTextColor.YELLOW)) + .append(Component.newline()) + .append(createTextMessage("Разница с текущим временем: ", NamedTextColor.GREEN)) + .append(createTextMessage(minutes + " мин " + seconds + " сек", NamedTextColor.YELLOW)); + } }