From 1bddee5771e5cb62fa18b21bb26fe1ca02f88236 Mon Sep 17 00:00:00 2001 From: Pepich Date: Tue, 17 Oct 2017 12:56:52 +0200 Subject: [PATCH] Initial commit --- src/com/redstoner/modules/seen/Seen.cmd | 7 + src/com/redstoner/modules/seen/Seen.java | 181 +++++++++++++++++++++++ 2 files changed, 188 insertions(+) create mode 100644 src/com/redstoner/modules/seen/Seen.cmd create mode 100644 src/com/redstoner/modules/seen/Seen.java diff --git a/src/com/redstoner/modules/seen/Seen.cmd b/src/com/redstoner/modules/seen/Seen.cmd new file mode 100644 index 0000000..c4fd2c2 --- /dev/null +++ b/src/com/redstoner/modules/seen/Seen.cmd @@ -0,0 +1,7 @@ +command seen { + [string:player] { + help Displays information about a player.; + perm utils.seen; + run seen player; + } +} \ No newline at end of file diff --git a/src/com/redstoner/modules/seen/Seen.java b/src/com/redstoner/modules/seen/Seen.java new file mode 100644 index 0000000..78721e1 --- /dev/null +++ b/src/com/redstoner/modules/seen/Seen.java @@ -0,0 +1,181 @@ +package com.redstoner.modules.seen; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import com.earth2me.essentials.utils.DateUtil; +import com.nemez.cmdmgr.Command; +import com.nemez.cmdmgr.Command.AsyncType; +import com.redstoner.annotations.AutoRegisterListener; +import com.redstoner.annotations.Commands; +import com.redstoner.annotations.Version; +import com.redstoner.misc.CommandHolderType; +import com.redstoner.misc.JsonManager; +import com.redstoner.misc.Main; +import com.redstoner.misc.Utils; +import com.redstoner.modules.Module; +import com.redstoner.modules.datamanager.DataManager; + +@AutoRegisterListener +@Commands(CommandHolderType.File) +@Version(major = 4, minor = 0, revision = 0, compatible = 4) +public class Seen implements Module, Listener +{ + HashMap names = new HashMap<>(); + HashMap ips = new HashMap<>(); + + @Override + public void postEnable() + { + Module.super.postEnable(); + + } + + @SuppressWarnings("deprecation") + @Command(hook = "seen", async = AsyncType.ALWAYS) + public boolean seen(CommandSender sender, String player) + { + ArrayList message = new ArrayList<>(); + OfflinePlayer p = Bukkit.getPlayer(player); + if (p == null) + { + p = Bukkit.getOfflinePlayer(player); + if (p != null) + p = Bukkit.getOfflinePlayer(p.getUniqueId()); + } + if (p == null || !p.hasPlayedBefore()) + { + getLogger().message(sender, true, "That player has never joined the server!"); + return true; + } + boolean cansee = (sender instanceof Player ? p instanceof Player && ((Player) sender).canSee((Player) p) + : true); + boolean online = cansee ? p instanceof Player : false; + String state; + long timestamp; + if (online) + { + state = "&aonline"; + timestamp = (long) DataManager.getData(p.getUniqueId().toString(), "lastjoined"); + } + else + { + state = "&coffline"; + timestamp = (long) DataManager.getOrDefault(p.getUniqueId().toString(), "lastquit", p.getLastPlayed()); + } + String time = DateUtil.formatDateDiff(timestamp); + message.add("The player &e" + p.getName() + " &7has been " + state + " &7since " + time + "&7."); + JSONArray _names; + if (online) + { + if (DataManager.getState((Player) p, "afk")) + message.add("This player is currently &eAFK"); + String reason = (String) DataManager.getOrDefault(p.getUniqueId().toString(), "AFK", "afk_reason", ""); + if (reason.length() >= 1) + message.add(" &5- " + reason); + if (DataManager.getState((Player) p, "vanished")) + message.add("This player is currently &evanished&7!"); + _names = names.get(p.getUniqueId()); + } + else + { + _names = loadNames(p.getUniqueId()); + } + if (_names != null && _names.size() > 1) + message.add("This player has also been known as: &e" + + _names.toJSONString().replaceAll("[\"\\[\\]]", "").replace(",", "&7, &e")); + if (sender.hasPermission("utils.seen.ip")) + { + JSONArray _ips; + if (online) + _ips = ips.get(p.getUniqueId()); + else + _ips = loadIPs(p.getUniqueId()); + if (_names != null && _names.size() > 0) + message.add("This player has joined with the following IPs: &e" + + _ips.toJSONString().replaceAll("[\"\\[\\]]", "").replace(",", "&7, &e")); + } + getLogger().message(sender, message.toArray(new String[] {})); + return true; + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + DataManager.setData(event.getPlayer(), "lastjoined", System.currentTimeMillis()); + DataManager.setData(event.getPlayer(), "ip", event.getPlayer().getAddress().getHostName()); + loadData(event.getPlayer()); + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) + { + DataManager.setData(event.getPlayer(), "lastquit", System.currentTimeMillis()); + unloadData(event.getPlayer()); + } + + @SuppressWarnings("unchecked") + public void loadData(Player player) + { + File jsonfile = new File(Main.plugin.getDataFolder(), "/seen/" + Utils.getID(player)); + JSONObject json = JsonManager.getObject(jsonfile); + if (json == null) + { + json = new JSONObject(); + json.put("names", new JSONArray()); + json.put("ips", new JSONArray()); + } + JSONArray names = (JSONArray) json.get("names"); + if (!names.contains(player.getName())) + names.add(player.getName()); + json.put("names", names); + + JSONArray ips = (JSONArray) json.get("ips"); + String ip = player.getAddress().getHostName(); + if (!ips.contains(ip)) + ips.add(ip); + json.put("ips", ips); + + this.names.put(player.getUniqueId(), names); + this.ips.put(player.getUniqueId(), ips); + JsonManager.save(json, jsonfile); + } + + public JSONArray loadNames(UUID uuid) + { + File jsonfile = new File(Main.plugin.getDataFolder(), "/seen/" + uuid); + JSONObject json = JsonManager.getObject(jsonfile); + if (json == null) + return null; + else + return (JSONArray) json.get("names"); + } + + public JSONArray loadIPs(UUID uuid) + { + File jsonfile = new File(Main.plugin.getDataFolder(), "/seen/" + uuid); + JSONObject json = JsonManager.getObject(jsonfile); + if (json == null) + return null; + else + return (JSONArray) json.get("ips"); + } + + public void unloadData(Player player) + { + this.names.remove(player.getUniqueId()); + } +}