From 417fa1e92f95579d6540f96437dddd7c3a9cd137 Mon Sep 17 00:00:00 2001 From: acrighthere Date: Sun, 8 Jun 2025 15:37:39 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=83=20/givepass=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B4=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=BF=D1=80=D0=BE=D1=85=D0=BE=D0=B4=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 3 +- .../joutak/joutaktemplate/JouTakTemplate.java | 9 ++- .../commands/GivePassCommand.java | 80 +++++++++++++++++++ .../data/PlayerJoinListener.java | 60 ++++++++++++++ .../joutaktemplate/data/PlayerPass.java | 11 +++ src/main/resources/plugin.yml | 8 +- 6 files changed, 166 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/joutak/joutaktemplate/commands/GivePassCommand.java create mode 100644 src/main/java/org/joutak/joutaktemplate/data/PlayerJoinListener.java create mode 100644 src/main/java/org/joutak/joutaktemplate/data/PlayerPass.java diff --git a/.idea/misc.xml b/.idea/misc.xml index 0be571f..9fd924f 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,3 +1,4 @@ + @@ -12,7 +13,7 @@ - + \ No newline at end of file diff --git a/src/main/java/org/joutak/joutaktemplate/JouTakTemplate.java b/src/main/java/org/joutak/joutaktemplate/JouTakTemplate.java index ec00d71..48889bd 100644 --- a/src/main/java/org/joutak/joutaktemplate/JouTakTemplate.java +++ b/src/main/java/org/joutak/joutaktemplate/JouTakTemplate.java @@ -3,6 +3,8 @@ import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.bukkit.plugin.java.JavaPlugin; +import org.joutak.joutaktemplate.commands.GivePassCommand; +import org.joutak.joutaktemplate.data.PlayerJoinListener; @Slf4j @@ -13,12 +15,17 @@ public final class JouTakTemplate extends JavaPlugin { @Override public void onEnable() { - + instance = this; + if (!getDataFolder().exists()) getDataFolder().mkdirs(); + getCommand("givepass").setExecutor(new GivePassCommand(this)); + getServer().getPluginManager().registerEvents(new PlayerJoinListener(this), this); + log.info("Плагин JouTakTemplate успешно включен."); } @Override public void onDisable() { // Plugin shutdown logic + log.info("Плагин JouTekTemplate отключён"); } } diff --git a/src/main/java/org/joutak/joutaktemplate/commands/GivePassCommand.java b/src/main/java/org/joutak/joutaktemplate/commands/GivePassCommand.java new file mode 100644 index 0000000..0cb3e1a --- /dev/null +++ b/src/main/java/org/joutak/joutaktemplate/commands/GivePassCommand.java @@ -0,0 +1,80 @@ +package org.joutak.joutaktemplate.commands; + +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; +import org.joutak.joutaktemplate.data.PlayerPass; + +import java.io.*; +import java.lang.reflect.Type; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.List; + +public class GivePassCommand implements CommandExecutor { + private final JavaPlugin javaPlugin; + private final File jsonFile; + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + public GivePassCommand(JavaPlugin javaPlugin){ + this.javaPlugin = javaPlugin; + this.jsonFile = new File(javaPlugin.getDataFolder(), "passes.json"); + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args){ + if (args.length != 1){ + sender.sendMessage(ChatColor.RED + "Использование команды /givepass <количество дней>"); + return false; + } + + int days; + try + { + days = Integer.parseInt(args[0]); + } catch (NumberFormatException e){ + sender.sendMessage(ChatColor.RED + "Введите целое число "); + return false; + } + + if(!jsonFile.exists()){ + sender.sendMessage(ChatColor.RED+"Файл passes.json не найден"); + return false; + } + + try(Reader reader = new FileReader(jsonFile)) { + Type listType = new TypeToken>() { + }.getType(); + List passes = gson.fromJson(reader, listType); + + LocalDate now = LocalDate.now(); + + for (PlayerPass pass : passes) { + LocalDate passUntil = LocalDate.parse(pass.getPassValidUntil(), formatter); + LocalDate newValidUntil = passUntil.isAfter(now) ? passUntil.plusDays(days) : now.plusDays(days); + + pass.setPassValidUntil(newValidUntil.format(formatter)); + pass.setLastPaymentDate(now.format(formatter)); + } + + try (Writer writer = new FileWriter(jsonFile)) { + gson.toJson(passes, writer); + } + + sender.sendMessage(ChatColor.GREEN + "Проходки продлены на " + days + " дня(ей)"); + return true; + } + catch (IOException | DateTimeParseException e){ + e.printStackTrace(); + sender.sendMessage(ChatColor.RED + "Ошибка при обработке файла."); + return false; + } + } +} diff --git a/src/main/java/org/joutak/joutaktemplate/data/PlayerJoinListener.java b/src/main/java/org/joutak/joutaktemplate/data/PlayerJoinListener.java new file mode 100644 index 0000000..dc735c4 --- /dev/null +++ b/src/main/java/org/joutak/joutaktemplate/data/PlayerJoinListener.java @@ -0,0 +1,60 @@ +package org.joutak.joutaktemplate.data; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +import java.io.*; +import java.lang.reflect.Type; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import org.bukkit.plugin.java.JavaPlugin; + +public class PlayerJoinListener implements Listener { + + private final File jsonFile; + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + public PlayerJoinListener(JavaPlugin plugin) { + this.jsonFile = new File(plugin.getDataFolder(), "passes.json"); + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + String nickname = event.getPlayer().getName(); + + List passes = new ArrayList<>(); + + if (jsonFile.exists()) { + try (Reader reader = new FileReader(jsonFile)) { + Type listType = new TypeToken>() {}.getType(); + passes = gson.fromJson(reader, listType); + } catch (IOException e) { + e.printStackTrace(); + } + } + + boolean exists = passes.stream().anyMatch(p -> p.getNickname().equalsIgnoreCase(nickname)); + if (!exists) { + LocalDate now = LocalDate.now(); + PlayerPass newPass = new PlayerPass(); + newPass.setNickname(nickname); + newPass.setLastPaymentDate(now.format(formatter)); + newPass.setPassValidUntil(now.format(formatter)); + passes.add(newPass); + + // Сохранить обратно + try (Writer writer = new FileWriter(jsonFile)) { + gson.toJson(passes, writer); + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/main/java/org/joutak/joutaktemplate/data/PlayerPass.java b/src/main/java/org/joutak/joutaktemplate/data/PlayerPass.java new file mode 100644 index 0000000..484a7d9 --- /dev/null +++ b/src/main/java/org/joutak/joutaktemplate/data/PlayerPass.java @@ -0,0 +1,11 @@ +package org.joutak.joutaktemplate.data; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class PlayerPass { + private String nickname; + private String lastPaymentDate; + private String passValidUntil; +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index bb6c591..5a7c332 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,8 @@ name: JouTakTemplate -version: '${project.version}' +version: 1.0-SNAPSHOT main: org.joutak.joutaktemplate.JouTakTemplate -api-version: '1.20' +api-version: 1.20 commands: - joutest: {} + givepass: + description: Раздаёт проходки игрокам на N дней + usage: /givepass