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