diff --git a/src/main/java/org/itakinn/tknlogs/ChatListener.java b/src/main/java/org/itakinn/tknlogs/ChatListener.java new file mode 100644 index 0000000..c36892b --- /dev/null +++ b/src/main/java/org/itakinn/tknlogs/ChatListener.java @@ -0,0 +1,13 @@ +package org.itakinn.tknlogs; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +public class ChatListener implements Listener { + @EventHandler + public void onPlayerChat(AsyncPlayerChatEvent e) { + String message = "[CHAT] " + e.getPlayer().getName() + ": " + e.getMessage(); + TKNLogs.getDiscord().sendMessage(message); + } +} \ No newline at end of file diff --git a/src/main/java/org/itakinn/tknlogs/CommandListener.java b/src/main/java/org/itakinn/tknlogs/CommandListener.java new file mode 100644 index 0000000..3f8db1d --- /dev/null +++ b/src/main/java/org/itakinn/tknlogs/CommandListener.java @@ -0,0 +1,24 @@ +package org.itakinn.tknlogs; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.server.ServerCommandEvent; + +public class CommandListener implements Listener { + @EventHandler + public void onPlayerCommand(PlayerCommandPreprocessEvent e) { + String message = "[COMMAND] " + e.getPlayer().getName() + ": " + e.getMessage()+ + " X: "+e.getPlayer().getLocation().getBlockX()+ + " Y: "+e.getPlayer().getLocation().getBlockY()+ + " Z: "+e.getPlayer().getLocation().getBlockZ()+ + " World: "+e.getPlayer().getLocation().getWorld().getName(); + TKNLogs.getDiscord().sendMessage(message); + } + @EventHandler + public void onConsoleCommand(ServerCommandEvent e) { + String message = "[CONSOLE] Command: " + e.getCommand(); + TKNLogs.getDiscord().sendMessage(message); + } +} diff --git a/src/main/java/org/itakinn/tknlogs/DiscordNotifier.java b/src/main/java/org/itakinn/tknlogs/DiscordNotifier.java index bfe95ed..a021e45 100644 --- a/src/main/java/org/itakinn/tknlogs/DiscordNotifier.java +++ b/src/main/java/org/itakinn/tknlogs/DiscordNotifier.java @@ -4,6 +4,8 @@ package org.itakinn.tknlogs; import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; import net.dv8tion.jda.api.entities.channel.concrete.TextChannel; +import net.dv8tion.jda.api.requests.GatewayIntent; + import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.plugin.java.JavaPlugin; import java.util.Objects; @@ -17,27 +19,28 @@ public class DiscordNotifier { private static final String token = config.getString("discord.token"); public DiscordNotifier(){ if(token == null){ - plugin.getLogger().warning("Token não encontrado"); + plugin.getLogger().warning("Invalid Token"); return; } - api = JDABuilder.createDefault(token).build(); - - /* .addEventListeners(new SlashListener()).build(); - api.upsertCommand("genimg", "gera uma img") - .addOption(OptionType.STRING, "resolução", "resolução da imagem", true, true) - .addOption(OptionType.STRING, "prompt", "prompt pra gerar a imagem", true) - .queue();*/ - - channel = api.getTextChannelById(Objects.requireNonNull(config.getString("discord.channel-id"))); + try { + api = JDABuilder.createDefault(token) + .enableIntents(GatewayIntent.GUILD_MESSAGES, GatewayIntent.MESSAGE_CONTENT) + .build().awaitReady(); + channel = api.getTextChannelById(Objects.requireNonNull(config.getString("discord.channel"))); + if(channel!=null){ + channel.sendMessage("Bot Started").queue(); + }else{ + plugin.getLogger().warning("Channel Not Found"+channel.toString()); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } } public void sendMessage(String message){ channel.sendMessage(message).queue(); - - } public void sendShutdown(){ api.shutdown(); } - public static JDA getJDA() {return api;} } \ No newline at end of file diff --git a/src/main/java/org/itakinn/tknlogs/ErrorCatcher.java b/src/main/java/org/itakinn/tknlogs/ErrorCatcher.java index 40721d6..b79c9e7 100644 --- a/src/main/java/org/itakinn/tknlogs/ErrorCatcher.java +++ b/src/main/java/org/itakinn/tknlogs/ErrorCatcher.java @@ -8,20 +8,18 @@ import java.util.logging.LogRecord; public class ErrorCatcher extends Handler { @Override public void publish(LogRecord record) { - if (record.getLevel() == Level.ALL) { - String mensagem = record.getMessage(); - Throwable excecao = record.getThrown(); - TKNLogs.getDiscord().sendMessage(mensagem); - - //Bukkit.getConsoleSender().sendMessage("§c[ERROR] " + mensagem); - - if (excecao != null) { - TKNLogs.getDiscord().sendMessage(excecao.toString()); - excecao.printStackTrace(); - } + String msg = record.getMessage(); + Throwable exce = record.getThrown(); + TKNLogs.getDiscord().sendMessage(msg); + if (exce != null) { + TKNLogs.getDiscord().sendMessage(exce.toString()); + exce.printStackTrace(); } } - + public static void register() { + java.util.logging.Logger rootLogger = java.util.logging.Logger.getLogger(""); + rootLogger.addHandler(new ErrorCatcher()); + } @Override public void flush() { } diff --git a/src/main/java/org/itakinn/tknlogs/JoinQuitListener.java b/src/main/java/org/itakinn/tknlogs/JoinQuitListener.java new file mode 100644 index 0000000..ec58091 --- /dev/null +++ b/src/main/java/org/itakinn/tknlogs/JoinQuitListener.java @@ -0,0 +1,37 @@ +package org.itakinn.tknlogs; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class JoinQuitListener implements Listener { + @EventHandler + public void onPlayerJoin(PlayerJoinEvent e) { + String message = "[JOIN] " + e.getPlayer().getName()+ + " X: "+e.getPlayer().getLocation().getBlockX()+ + " Y: "+e.getPlayer().getLocation().getBlockY()+ + " Z: "+e.getPlayer().getLocation().getBlockZ()+ + " World: "+e.getPlayer().getLocation().getWorld().getName(); + TKNLogs.getDiscord().sendMessage(message); + } + @EventHandler + public void onPlayerDeath(PlayerDeathEvent e){ + String message = "[DEATH] " + e.getEntity().getName()+ + " X: "+e.getEntity().getLocation().getBlockX()+ + " Y: "+e.getEntity().getLocation().getBlockY()+ + " Z: "+e.getEntity().getLocation().getBlockZ()+ + " World: "+e.getEntity().getLocation().getWorld().getName(); + TKNLogs.getDiscord().sendMessage(message); + } + @EventHandler + public void onPlayerQuit(PlayerQuitEvent e) { + String message = "[QUIT] " + e.getPlayer().getName()+ + " X: "+e.getPlayer().getLocation().getBlockX()+ + " Y: "+e.getPlayer().getLocation().getBlockY()+ + " Z: "+e.getPlayer().getLocation().getBlockZ()+ + " World: "+e.getPlayer().getLocation().getWorld().getName(); + TKNLogs.getDiscord().sendMessage(message); + } +} \ No newline at end of file diff --git a/src/main/java/org/itakinn/tknlogs/LoggerReader.java b/src/main/java/org/itakinn/tknlogs/LoggerReader.java new file mode 100644 index 0000000..4183d10 --- /dev/null +++ b/src/main/java/org/itakinn/tknlogs/LoggerReader.java @@ -0,0 +1,81 @@ +package org.itakinn.tknlogs; + +import org.bukkit.Bukkit; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import static java.nio.file.StandardWatchEventKinds.*; + + +public class LoggerReader { + private final JavaPlugin plugin; + private Path logDir; + private WatchService watchService; + private long lastReadPosition; + + public LoggerReader() { + this.plugin = TKNLogs.getPlugin(); + this.logDir = Paths.get(plugin.getDataFolder().getParentFile().getParent(), "logs"); + this.lastReadPosition = 0; + } + + public void start() { + try { + // Configura o WatchService para monitorar modificações no diretório + watchService = FileSystems.getDefault().newWatchService(); + logDir.register(watchService, ENTRY_MODIFY); + + // Inicia a thread de monitoramento assíncrona + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { + while (!Thread.currentThread().isInterrupted()) { + WatchKey key; + try { + key = watchService.take(); // Aguarda eventos + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + return; + } + + for (WatchEvent event : key.pollEvents()) { + if (event.kind() == ENTRY_MODIFY) { + Path changedFile = logDir.resolve((Path) event.context()); + if (changedFile.endsWith("latest.log")) { + processLogChanges(changedFile.toFile()); + } + } + } + key.reset(); + } + }); + + } catch (IOException e) { + plugin.getLogger().severe("Erro ao iniciar monitor de logs: " + e.getMessage()); + } + } + + private void processLogChanges(File logFile) { + try (RandomAccessFile raf = new RandomAccessFile(logFile, "r")) { + // Pula para a última posição lida + if (raf.length() < lastReadPosition) { + lastReadPosition = 0; // Log foi reiniciado (ex: servidor reiniciou) + } + raf.seek(lastReadPosition); + + String line; + while ((line = raf.readLine()) != null) { + line = new String(line.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + TKNLogs.getDiscord().sendMessage(line); + } + + lastReadPosition = raf.getFilePointer(); + + } catch (IOException e) { + plugin.getLogger().severe("Erro ao ler latest.log: " + e.getMessage()); + } + } +} diff --git a/src/main/java/org/itakinn/tknlogs/TKNLogs.java b/src/main/java/org/itakinn/tknlogs/TKNLogs.java index 0dc1f2c..c463b29 100644 --- a/src/main/java/org/itakinn/tknlogs/TKNLogs.java +++ b/src/main/java/org/itakinn/tknlogs/TKNLogs.java @@ -7,16 +7,22 @@ import org.bukkit.plugin.java.JavaPlugin; public final class TKNLogs extends JavaPlugin { private static DiscordNotifier discord; private static JavaPlugin plugin; + private LoggerReader logMonitor; @Override public void onEnable() { + Bukkit.getPluginManager().registerEvents(new ChatListener(), this); + Bukkit.getPluginManager().registerEvents(new CommandListener(), this); + Bukkit.getPluginManager().registerEvents(new JoinQuitListener(), this); + logMonitor = new LoggerReader(); + logMonitor.start(); plugin = this; saveDefaultConfig(); reloadConfig(); - discord = new DiscordNotifier(); Logger logger = Bukkit.getLogger(); logger.addHandler(new ErrorCatcher()); - + ErrorCatcher.register(); + getLogger().info("PLUGIN STARTED"); } public static JavaPlugin getPlugin(){ return plugin; @@ -26,7 +32,7 @@ public final class TKNLogs extends JavaPlugin { } @Override public void onDisable() { - discord.sendMessage("Desligando o plugin"); + discord.sendMessage("TURNING OFF PLUGIN"); discord.sendShutdown(); } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 362384b..01d8530 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,3 +1,3 @@ discord: token: "" - channel-id: "" \ No newline at end of file + channel: "" \ No newline at end of file