diff options
author | Minenash <minenash@protonmail.com> | 2018-12-31 16:52:32 -0500 |
---|---|---|
committer | Minenash <minenash@protonmail.com> | 2018-12-31 16:52:32 -0500 |
commit | 1180d8236261122f9b955b6fc4b874d4f903950d (patch) | |
tree | b51494e1417dd4a77355794bd8669a97da8710ef | |
parent | 767572a0826916adcd6bd7dc38c0e5c2e124c597 (diff) |
Added Mail Module
-rw-r--r-- | src/main/java/com/redstoner/modules/mail/Mail.cmd | 81 | ||||
-rw-r--r-- | src/main/java/com/redstoner/modules/mail/Mail.java | 622 | ||||
-rw-r--r-- | src/main/java/com/redstoner/modules/mail/Msg.java | 206 | ||||
-rw-r--r-- | src/main/java/com/redstoner/modules/mail/Theme.java | 53 | ||||
-rw-r--r-- | src/main/java/com/redstoner/modules/mail/module.info | 3 |
5 files changed, 965 insertions, 0 deletions
diff --git a/src/main/java/com/redstoner/modules/mail/Mail.cmd b/src/main/java/com/redstoner/modules/mail/Mail.cmd new file mode 100644 index 0000000..705dafe --- /dev/null +++ b/src/main/java/com/redstoner/modules/mail/Mail.cmd @@ -0,0 +1,81 @@ +command mail { + perm utils.mail; + type player; + + [empty] { + run read; + help Shows your inbox of mails.; + } + read [empty] { + run read; + help Shows your inbox of messages.; + } + delete [int:id] { + run delete id; + help Deletes the given message.; + } + clear [empty] { + run clear; + help Clears your inbox.; + } + send [string:player] [string:message...] { + run send player message; + help Send a message to the given player.; + } + reply [int:id] [string:message...] { + run reply id message; + help Reply to a players message.; + } + retract [int:id] { + run retract_id id; + help Retract the given message, if the player has not read it yet.; + } + retract [empty] { + run retract; + help Retract the last message you sent, if the player has not read it yet.; + } + archive [empty] { + run archive_read; + help Shoes are archived messages.; + } + archive read [empty]{ + run archive_read; + help Shoes are archived messages.; + } + archive [int:id] { + run archive id; + help Archives a message.; + } + unarchive [int:id] { + run unarchive id; + help Unarchives a message.; + } + settings theme { + [string:s_theme] { + run settings_theme_set s_theme; + help Sets the theme for your inbox. Available themes are: Light, Dark, and Gold.; + } + run settings_theme; + help Shows your current theme setting.; + } + settings actions { + [string:s_actions] { + run settings_actions_set s_actions; + help Sets the action set for your inbox. Available options are: \nMinimal: No click actions,\nSimple: Delete, and \nStandard: Delete, and Reply. \nAll actions are still available as commands.; + } + run settings_actions; + help Shows your current action set setting.; + } + settings names { + [string:s_names] { + run settings_names_set s_names; + help Sets if you want to see player's username or display name. Available options are: username or displayname; + } + run settings_names; + help Shows your current names setting.; + } + [string:player] [string:message...] { + run send player message; + help Send a message to the given player.; + } +}
\ No newline at end of file diff --git a/src/main/java/com/redstoner/modules/mail/Mail.java b/src/main/java/com/redstoner/modules/mail/Mail.java new file mode 100644 index 0000000..b2cbefe --- /dev/null +++ b/src/main/java/com/redstoner/modules/mail/Mail.java @@ -0,0 +1,622 @@ +package com.redstoner.modules.mail; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TimeZone; +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.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import com.nemez.cmdmgr.Command; +import com.redstoner.annotations.AutoRegisterListener; +import com.redstoner.annotations.Commands; +import com.redstoner.annotations.Version; +import com.redstoner.coremods.moduleLoader.ModuleLoader; +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; +import com.redstoner.modules.ignore.Ignore; + +import net.nemez.chatapi.ChatAPI; + +@AutoRegisterListener +@Commands(CommandHolderType.File) +@Version(major = 5, minor = 0, revision = 0, compatible = 4) +public class Mail implements Module, Listener +{ + + private Map<String, List<Msg>> playerToMsg = new HashMap<>(); + private Map<Integer, Msg> idToMsg = new HashMap<>(); + private Map<String, Integer> lastSent = new HashMap<>(); + private Map<String, Map<Integer, Msg>> archives = new HashMap<>(); + private int lastID = 1; + + @Command(hook = "read") + public void read(CommandSender sender) { + + String uuid = ((Player)sender).getUniqueId().toString(); + + List<Msg> list = playerToMsg.get(uuid); + if (list == null) { + getLogger().message(sender, true, "You have no new messages."); + return; + } + + boolean shownTut = (boolean) DataManager.getOrDefault(sender, "showntut", false); + + if (!shownTut) { + ChatAPI.createMessage(sender) + .appendText(getLogger().getHeader() + "\n&7Looks like you've never read your" + + " messages before, here is a quick overview of it.\n\n&9There are 3 themes: ") + .appendSendChatHover("&eLight", "/mail settings theme light", + "&7[&cX&7][&9I&7][&8Reply&7] &afriend22&7: &fTest message!") + .appendText("&7, ") + .appendSendChatHover("&eDark", "/mail settings theme dark", + "&8[&cX&8][&9I&8][&7Reply&8] &afriend22&7: &fTest message!") + .appendText("&7, and ") + .appendSendChatHover("&eGold", "/mail settings theme gold", + "&6[&fX&6][&fI&6][&fReply&6] &afriend22&6: &fTest message!") + .appendText("\n&7&o Hover to preview, click to select. Default is Dark.") + + .appendText("\n&9There are also 4 action sets: ") + .appendSendChatHover("&eMinimal", "/mail settings actions minimal", + "&8[&9I&8] &afriend22&7: &fTest message!") + .appendText("&7, ") + .appendSendChatHover("&eSimple", "/mail settings actions simple", + "&8[&cX&8][&9I&8] &afriend22&7: &fTest message!") + .appendText("&7, ") + .appendSendChatHover("&eNormal", "/mail settings actions normal", + "&8[&cX&8][&9I&8][&7Reply&8] &afriend22&7: &fTest message!") + .appendText("&7, and ") + .appendSendChatHover("&eFull", "/mail settings actions full", + "&8[&cX&8][&9I&8][&7Reply&8][&6Archive&8] &afriend22&7: &fTest message!") + .appendText("\n&7&o Hover to preview, click to select. Default is Normal") + + .appendText("\n&9You can see names in 2 ways: ") + .appendSendChatHover("&eUsernames", "/mail settings names username", + "&8[&cX&8][&9I&8][&7Reply&8] &afriend22&7: &fTest message!") + .appendText("&7 or ") + .appendSendChatHover("&eDisplayName", "/mail settings names displayname", + "&8[&cX&8][&9I&8][&7Reply&8] &a&ofriendinator&r&7: &fTest message!") + .appendText("\n&7&o Hover to preview, click to select. Default is Username") + + .appendText("\n\n&9What the things on the left mean:\n" + + " &8[&cX&8]&7 - Deletes the message\n" + + " &8[&9I&8]&7 - Shows some basic info when hovered over.\n" + + " &8[&7Reply&8]&7 - Replys to the message; forms a message chain.\n" + + " &8[&6Archive&8]&7 - Archives the message.\n\n" + + "For command help run ") + .appendSendChatHover("&e/mail help", "/mail help", "Click to run") + .appendText("&7 to get a list of commands.\n&2Now do ") + .appendSendChatHover("&e/mail read","/mail","Click to run") + .appendText("&2 again to start reading.") + .send(); + DataManager.setData(sender, "showntut", true); + DataManager.setData(sender, "theme", "DARK"); + DataManager.setData(sender, "actions", "NORMAL"); + DataManager.setData(sender, "names", "username"); + return; + } + + System.out.println(playerToMsg); + System.out.println(idToMsg); + System.out.println(archives); + + String themeStr = (String) DataManager.getData(sender, "theme"); + String actions = (String) DataManager.getData(sender, "actions"); + String names = (String) DataManager.getData(sender, "names"); + Theme theme; + + if (!isValidTheme(themeStr)) { + theme = Theme.DARK; + DataManager.setData(sender, "theme", theme); + getLogger().message(sender, true, "Something went wrong with your theme setting. The setting has been reset."); + } + else + theme = Theme.valueOf(themeStr); + if (!isValidActions(actions)) { + actions = "NORMAL"; + DataManager.setData(sender, "actions", actions); + getLogger().message(sender, true, "Something went wrong with your action set setting. The setting has been reset."); + } + if (!isValidNames(names)) { + names = "username"; + DataManager.setData(sender, "names", names); + getLogger().message(sender, true, "Something went wrong with your names setting. The setting has been reset."); + } + + boolean useDisplayName = names.equals("displayname"); + + ChatAPI.send(sender, "\n" + getLogger().getHeader()); + ChatAPI.send(sender, ""); + switch (actions) { + case "MINIMAL": + for (Msg m : list) { + m.showMinimal(sender, theme, useDisplayName); + m.read(); + } + break; + case "SIMPLE": + for (Msg m : list) { + m.showSimple(sender, theme, useDisplayName); + m.read(); + } + break; + case "NORMAL": + for (Msg m : list) { + m.showNormal(sender, theme, useDisplayName); + m.read(); + } + break; + case "FULL": + for (Msg m : list) { + m.showFull(sender, theme, useDisplayName); + m.read(); + } + break; + } + + ChatAPI.createMessage(sender).appendText("\n" + theme.getClearColor() + "Do ") + .appendSendChatHover(theme.getClearAccentColor() + "/mail clear","/mail clear","&cClick to Clear") + .appendText(theme.getClearColor() + " to clear all of your messages.") + .send(); + + savePlayerMsgs(uuid); + + } + + @Command(hook = "delete") + public void delete(CommandSender sender, int id) { + Msg msg = idToMsg.get(id); + String uuid = ((Player)sender).getUniqueId().toString(); + + if (msg == null || !msg.getReciever().equals(uuid)) { + getLogger().message(sender, true, "You have no messages with that ID[" + id + "]."); + return; + } + + idToMsg.remove(id); + + List<Msg> list = playerToMsg.get(uuid); + list.remove(msg); + if (list.isEmpty()) + playerToMsg.remove(uuid); + else + playerToMsg.put(uuid, list); + + getLogger().message(sender, "Message Deleted. [ID=" + id + "]"); + savePlayerMsgs(uuid); + } + + @Command(hook = "clear") + public void clear(CommandSender sender) { + String uuid = ((Player)sender).getUniqueId().toString(); + + List<Msg> list = playerToMsg.get(uuid); + + if (list == null) { + getLogger().message(sender, "Messages Cleared."); + return; + } + + playerToMsg.remove(uuid); + for (Msg m : list) + idToMsg.remove(m.getID()); + + getLogger().message(sender, "Messages Cleared."); + savePlayerMsgs(uuid); + } + + @Command(hook = "send") + @SuppressWarnings("deprecation") + public void send(CommandSender sender, String player, String message) { + OfflinePlayer op = Bukkit.getOfflinePlayer(player); + if (!op.hasPlayedBefore()) + getLogger().message(sender, true, "&e" + player + "&7 has never joined the server."); + else + sendMessage(sender, op.getPlayer().getUniqueId().toString(), message, null); + } + + @Command(hook = "reply") + public void reply(CommandSender sender, int id, String message) { + String uuid = ((Player)sender).getUniqueId().toString(); + + Msg msg = idToMsg.get(id); + + if (msg == null || !msg.getReciever().equals(uuid)) { + getLogger().message(sender, true, "You have no messages with that ID[" + id + "]."); + return; + } + + sendMessage(sender, msg.getSender(), message, msg.getChain()); + + } + + + public void sendMessage(CommandSender sender, String r_uuid, String message, String chain) { + + Player r = Bukkit.getOfflinePlayer(UUID.fromString(r_uuid)).getPlayer(); + + if (ModuleLoader.exists("Ignore") ? !Ignore.getIgnoredBy(sender).sendTo(r) : false) + { + getLogger().message(sender, true, Utils.getName(r) + " has ignored you. Your message was not sent."); + return; + } + + String s_uuid = ((Player)sender).getUniqueId().toString(); + + Date date = new Date(); + SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); + dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); + + int id = getNextID(); + + Msg msg = new Msg(id, s_uuid, r_uuid, dateFormat.format(date), message, chain, false); + + idToMsg.put(id, msg); + List<Msg> list = playerToMsg.getOrDefault(r_uuid, new ArrayList<>()); + list.add(msg); + playerToMsg.put(r_uuid, list); + lastSent.put(s_uuid, id); + + getLogger().message(sender, "Message Sent! [ID=" + id + "]"); + ChatAPI.createMessage(sender) + .appendText(getLogger().getPrefix() + "Click ") + .appendSendChatHover("&ehere", "/mail retract " + id, "&cClick to Retract") + .appendText("&7 or do ") + .appendSuggestHover("&e/mail retract [id]", "/mail retract", "Click to Copy") + .appendText("&7 to retract it.") + .send(); + + + if (r.isOnline()) { + int num = playerToMsg.get(r_uuid).size(); + ChatAPI.createMessage(r) + .appendText(getLogger().getPrefix() + "&7You got &e" + num + "&7 message" + (num == 1? "" : "s") + "! Do ") + .appendSendChatHover("&e/mail", "/mail", "Click to read your messages") + .appendText("&7 to read them.") + .send(); + } + + savePlayerMsgs(r_uuid); + } + + @Command(hook = "retract") + public void retract(CommandSender sender) { + String uuid = ((Player)sender).getUniqueId().toString(); + int id = lastSent.get(uuid); + if (id == 0) + getLogger().message(sender, true, "You haven't sent a message this session."); + else + retract_id(sender, id); + } + + @Command(hook = "retract_id") + public void retract_id(CommandSender sender, int id) { + String uuid = ((Player)sender).getUniqueId().toString(); + Msg msg = idToMsg.get(id); + + if (msg == null || !msg.getSender().equals(uuid)) + getLogger().message(sender, true, "Unable to retract, that message doesn't exist. You either put in the wrong id, or it was deleted by the reciever."); + else if (msg.isRead()) + getLogger().message(sender, true, "Unable to retract, message has already been read."); + else { + idToMsg.remove(id); + + String r_uuid = msg.getReciever(); + List<Msg> list = playerToMsg.get(r_uuid); + list.remove(msg); + if (list.isEmpty()) + playerToMsg.remove(r_uuid); + else + playerToMsg.put(r_uuid, list); + getLogger().message(sender, "Message Retracted."); + savePlayerMsgs(r_uuid); + } + } + + @Command(hook = "archive_read") + public void archive_read(CommandSender sender) { + String uuid = ((Player)sender).getUniqueId().toString(); + Map<Integer, Msg> list = archives.get(uuid); + + if (list == null) { + getLogger().message(sender, true, "You have no archived messages."); + return; + } + + ChatAPI.send(sender, "&2--=[ Archived ]=--"); + ChatAPI.send(sender, ""); + + String themeStr = (String) DataManager.getData(sender, "theme"); + String names = (String) DataManager.getData(sender, "names"); + Theme theme; + + if (!isValidTheme(themeStr)) { + theme = Theme.DARK; + DataManager.setData(sender, "theme", theme); + getLogger().message(sender, true, "Something went wrong with your theme setting. The setting has been reset."); + } + else + theme = Theme.valueOf(themeStr); + if (!isValidNames(names)) { + names = "username"; + DataManager.setData(sender, "names", names); + getLogger().message(sender, true, "Something went wrong with your names setting. The setting has been reset."); + } + + for (Msg m : list.values()) { + m.showArchived(sender, theme, names.equals("displayname")); + } + + ChatAPI.send(sender, "\n&2These messages don't count towards your mail count."); + } + + @Command(hook = "archive") + public void archive(CommandSender sender, int id) { + String uuid = ((Player)sender).getUniqueId().toString(); + Msg msg = idToMsg.get(id); + + if (msg == null || !msg.getReciever().equals(uuid)) { + getLogger().message(sender, true, "You have no messages with that ID[" + id + "]."); + return; + } + + msg.read(); + + List<Msg> list = playerToMsg.get(uuid); + list.remove(msg); + if (list.isEmpty()) + playerToMsg.remove(uuid); + else + playerToMsg.put(uuid, list); + idToMsg.remove(id); + + Map<Integer,Msg> list2 = archives.getOrDefault(uuid, new HashMap<>()); + int lastAID = list2.size(); + list2.put(lastAID, msg); + archives.put(uuid, list2); + + msg.setID(list2.size() -1); + getLogger().message(sender, "Message Archived. [ID=" + id + "] [ArchiveID=" + lastAID + "]"); + savePlayerMsgs(uuid); + savePlayerArchive(uuid); + } + + @Command(hook = "unarchive") + public void unarchive(CommandSender sender, int id) { + String uuid = ((Player)sender).getUniqueId().toString(); + Map<Integer,Msg> list = archives.get(uuid); + + if (id < 0 || id >= list.size()) { + getLogger().message(sender, true, "You have no archived messages with that ID."); + return; + } + + Msg msg = list.get(id); + msg.setID(getNextID()); + + list.remove(id); + if (list.isEmpty()) + archives.remove(uuid); + else + archives.put(uuid, list); + List<Msg> list2 = playerToMsg.getOrDefault(uuid, new ArrayList<>()); + list2.add(msg); + playerToMsg.put(uuid, list2); + idToMsg.put(msg.getID(), msg); + + getLogger().message(sender, "Message Unarchived. [ArchiveID=" + id + "] [ID=" + msg.getID() + "]"); + savePlayerMsgs(uuid); + savePlayerArchive(uuid); + } + + @Command(hook = "settings_theme") + public void settings_theme(CommandSender sender) { + String theme = (String) DataManager.getData(sender, "theme"); + if (!isValidTheme(theme)) { + theme = Theme.DARK.toString(); + DataManager.setData(sender, "theme", theme); + } + getLogger().message(sender, "Your current theme is &e" + theme + "&7."); + + } + @Command(hook = "settings_theme_set") + public void settings_theme_set(CommandSender sender, String theme) { + if (!isValidTheme(theme)) { + ChatAPI.createMessage(sender) + .appendText(getLogger().getPrefix(true) + "Invalid theme. Available themes are: ") + .appendSendChatHover("&eLight", "/mail settings theme light", "Click to switch to &eLight") + .appendText("&7, ") + .appendSendChatHover("&eDark", "/mail settings theme dark", "Click to switch to &eDark") + .appendText("&7, ") + .appendSendChatHover("&eGold", "/mail settings theme gold", "Click to switch to &eGold") + .send(); + + return; + } + DataManager.setData(sender, "theme", theme.toUpperCase()); + getLogger().message(sender, "Theme set to &e" + theme + "&7."); + } + @Command(hook = "settings_actions") + public void settings_actions(CommandSender sender) { + String actions = (String) DataManager.getData(sender, "actions"); + if (!isValidActions(actions)) { + actions = "NORMAL"; + DataManager.setData(sender, "actions", actions); + } + getLogger().message(sender, "Your current action set is &e" + actions.toLowerCase() + "."); + } + @Command(hook = "settings_actions_set") + public void settings_actions_set(CommandSender sender, String actions) { + if (!isValidActions(actions)) { + + ChatAPI.createMessage(sender) + .appendText(getLogger().getPrefix(true) + "Invalid action set. Available options are:") + .appendSendChatHover("\n &eMinimal", "/mail settings actions minimal", "Click to switch to &eMinimal") + .appendText("&7: No click actions, ") + .appendSendChatHover("\n &eSimple", "/mail settings actions simple", "Click to switch to &eSimple") + .appendText("&7: Delete, ") + .appendSendChatHover("\n &eNormal", "/mail settings actions normal", "Click to switch to &eNormal") + .appendText("&7: : Delete and Reply.") + .appendSendChatHover("\n &eFull", "/mail settings actions full", "Click to switch to &eFull") + .appendText("&7: : Delete, Reply, and Archive.\nAll actions are still available with commands.") + .send(); + + return; + } + DataManager.setData(sender, "actions", actions.toUpperCase()); + getLogger().message(sender, "Action Set set to &e" + actions.toLowerCase() + "&7."); + } + @Command(hook = "settings_names") + public void settings_names(CommandSender sender) { + String names = (String) DataManager.getData(sender, "names"); + if (!isValidNames(names)) { + names = "username"; + DataManager.setData(sender, "names", names); + } + getLogger().message(sender, "Your current names setting is &e" + names.toLowerCase() + "."); + } + @Command(hook = "settings_names_set") + public void settings_names_set(CommandSender sender, String names) { + if (!isValidNames(names)) { + ChatAPI.createMessage(sender) + .appendText(getLogger().getPrefix(true) + "Invalid name setting. Available options are: ") + .appendSendChatHover("&eusername", "/mail settings names username", "Click to switch to &eusernames") + .appendText(" &7or ") + .appendSendChatHover("&edisplaynames", "/mail settings names displaynames", "Click to switch to &edisplaynames") + .send(); + + return; + } + DataManager.setData(sender, "names", names.toLowerCase()); + getLogger().message(sender, "Names setting set to &e" + names.toLowerCase() + "&7."); + } + + private boolean isValidTheme(String theme) { + return theme != null && (theme.equalsIgnoreCase("light") + || theme.equalsIgnoreCase("dark") + || theme.equalsIgnoreCase("gold")); + } + + private boolean isValidActions(String actions) { + return actions != null && (actions.equalsIgnoreCase("minimal") + || actions.equalsIgnoreCase("simple") + || actions.equalsIgnoreCase("normal") + || actions.equalsIgnoreCase("full")); + } + private boolean isValidNames(String names) { + return names != null && (names.equalsIgnoreCase("username") + || names.equalsIgnoreCase("displayname")); + } + + private int getNextID() { + return lastID++; + } + + public void postEnable() { + File dir = new File(Main.plugin.getDataFolder(), "/mail"); + File[] filesInDir = dir.listFiles(); + if (filesInDir == null) + return; + for (File file : filesInDir) { + if (file.isFile()) { + JSONArray msgs = JsonManager.getArray(file); + String uuid = file.getName().substring(0, file.getName().indexOf(".json")); + + List<Msg> list = new ArrayList<>(); + for (Object o : msgs) { + Msg m = Msg.fromJSONObject((JSONObject)o, getNextID()); + list.add(m); + idToMsg.put(m.getID(), m); + } + playerToMsg.put(uuid, list); + } + } + + Bukkit.getOnlinePlayers().forEach((Player p) -> loadPlayer(p)); + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + loadPlayer(event.getPlayer()); + + } + + public void loadPlayer(Player p) { + String uuid = p.getUniqueId().toString(); + + File jsonfile = new File(Main.plugin.getDataFolder(), "/mail/archive/" + uuid + ".json"); + JSONArray fromArchive = JsonManager.getArray(jsonfile); + Map<Integer,Msg> archives = new HashMap<>(); + + if (fromArchive != null) { + int i = 0; + for (Object o : fromArchive) { + Msg m = Msg.fromJSONObject(((JSONObject)o), i); + archives.put(i, m); + i++; + } + if (!archives.isEmpty()) + this.archives.put(uuid, archives); + } + + + List<Msg> list = playerToMsg.get(uuid); + if (list != null && !list.isEmpty()) + ChatAPI.createMessage(p) + .appendText(getLogger().getPrefix() + "&7You got &e" + list.size() + + "&7 message" + (list.size() == 1? "" : "s") + "! Do ") + .appendSendChatHover("&e/mail", "/mail", "Click to read your messages") + .appendText("&7 to read them.") + .send(); + System.out.println("Loaded " + p.getName()); + } + + @SuppressWarnings("unchecked") + public void savePlayerMsgs(String uuid) { + + File jsonfile = new File(Main.plugin.getDataFolder(), "/mail/" + uuid + ".json"); + + List<Msg> messages = playerToMsg.getOrDefault(uuid, new ArrayList<>()); + + JSONArray m_array = new JSONArray(); + + for (Msg m : messages) + m_array.add(m.toJSONObject()); + + JsonManager.save(m_array, jsonfile); + } + + @SuppressWarnings("unchecked") + public void savePlayerArchive(String uuid) { + + File jsonfile = new File(Main.plugin.getDataFolder(), "/mail/archive/" + uuid + ".json"); + + Map<Integer,Msg> arch = archives.getOrDefault(uuid, new HashMap<>()); + + JSONArray a_array = new JSONArray(); + + for (Msg m : arch.values()) + a_array.add(m.toJSONObject()); + + JsonManager.save(a_array, jsonfile); + } +} diff --git a/src/main/java/com/redstoner/modules/mail/Msg.java b/src/main/java/com/redstoner/modules/mail/Msg.java new file mode 100644 index 0000000..8bb666f --- /dev/null +++ b/src/main/java/com/redstoner/modules/mail/Msg.java @@ -0,0 +1,206 @@ +package com.redstoner.modules.mail; + +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.json.simple.JSONObject; + +import net.nemez.chatapi.ChatAPI; +import net.nemez.chatapi.click.Message; + +public class Msg { + + private int id; + private String sender; + private String reciever; + private String timeSent; + private String message; + private String chain; + private boolean read; + + public Msg(int id, String sender, String reciever, String timeSent, String message, String chain, boolean read) { + this.id = id; + this.sender = sender; + this.reciever = reciever; + this.timeSent = timeSent; + this.message = message; + this.chain = chain; + this.read = read; + } + + public String getSender() { + return sender; + } + + public String getReciever() { + return reciever; + } + + + public void read() { + read = true; + } + + public boolean isRead() { + return read; + } + + public void setID(int id) { + this.id = id; + } + + public int getID() { + return id; + } + + public String getChain() { + Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); + + String line = getPrefix(p) + p.getName() + "&7:&f " + message; + + if (chain == null) + return line; + else + return chain + "\n" + line; + } + + public void showMinimal(CommandSender viewer, Theme theme, boolean showDisplayName) { + Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); + String name = getPrefix(p) + p.getName(); + + Message msg = ChatAPI.createMessage(viewer) + .appendText(theme.getBracketColor() + "[") + .appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id) + .appendText(theme.getBracketColor() + "] "); + if (showDisplayName) + msg.appendTextHover(p.getDisplayName(), name); + else + msg.appendText(name); + msg.appendText(theme.getColonColor() + ": "); + if (chain == null) + msg.appendText(message).send(); + else + msg.appendTextHover(message, chain).send(); + } + + public void showSimple(CommandSender viewer, Theme theme, boolean showDisplayName) { + Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); + String name = getPrefix(p) + p.getName(); + + Message msg = ChatAPI.createMessage(viewer) + .appendText(theme.getBracketColor() + "[") + .appendSendChatHover(theme.getDeleteColor() + "X", "/mail delete " + id, "&cDelete") + .appendText(theme.getBracketColor() + "][") + .appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id) + .appendText(theme.getBracketColor() + "] "); + if (showDisplayName) + msg.appendTextHover(p.getDisplayName(), name); + else + msg.appendText(name); + msg.appendText(theme.getColonColor() + ": "); + if (chain == null) + msg.appendText(message).send(); + else + msg.appendTextHover(message, chain).send(); + } + + public void showNormal(CommandSender viewer, Theme theme, boolean showDisplayName) { + Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); + String name = getPrefix(p) + p.getName(); + + Message msg = ChatAPI.createMessage(viewer) + .appendText(theme.getBracketColor() + "[") + .appendSendChatHover(theme.getDeleteColor() + "X", "/mail delete " + id, "&cDelete") + .appendText(theme.getBracketColor() + "][") + .appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id) + .appendText(theme.getBracketColor() + "][") + .appendSuggestHover(theme.getReplyColor() + "Reply", "/mail reply " + id + " ", "&7Reply") + .appendText(theme.getBracketColor() + "] "); + if (showDisplayName) + msg.appendTextHover(p.getDisplayName(), name); + else + msg.appendText(name); + msg.appendText(theme.getColonColor() + ": "); + if (chain == null) + msg.appendText(message).send(); + else + msg.appendTextHover(message, chain).send(); + } + + public void showFull(CommandSender viewer, Theme theme, boolean showDisplayName) { + Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); + String name = getPrefix(p) + p.getName(); + + Message msg = ChatAPI.createMessage(viewer) + .appendText(theme.getBracketColor() + "[") + .appendSendChatHover(theme.getDeleteColor() + "X", "/mail delete " + id, "&cDelete") + .appendText(theme.getBracketColor() + "][") + .appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id) + .appendText(theme.getBracketColor() + "][") + .appendSuggestHover(theme.getReplyColor() + "Reply", "/mail reply " + id + " ", "&7Reply") + .appendText(theme.getBracketColor() + "][") + .appendSendChatHover(theme.getArchiveColor() + "Archive", "/mail archive " + id + " ", "&6Archive") + .appendText(theme.getBracketColor() + "] "); + if (showDisplayName) + msg.appendTextHover(p.getDisplayName(), name); + else + msg.appendText(name); + msg.appendText(theme.getColonColor() + ": "); + if (chain == null) + msg.appendText(message).send(); + else + msg.appendTextHover(message, chain).send(); + } + + public void showArchived(CommandSender viewer, Theme theme, boolean showDisplayName) { + Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer(); + String name = getPrefix(p) + p.getName(); + + Message msg = ChatAPI.createMessage(viewer) + .appendText(theme.getBracketColor() + "[") + .appendSendChatHover(theme.getArchiveColor() + "Unarchive", "/mail unarchive " + id, "&6Unarchive") + .appendText(theme.getBracketColor() + "][") + .appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id) + .appendText(theme.getBracketColor() + "] "); + if (showDisplayName) + msg.appendTextHover(p.getDisplayName(), name); + else + msg.appendText(name); + msg.appendText(theme.getColonColor() + ": "); + if (chain == null) + msg.appendText(message).send(); + else + msg.appendTextHover(message, chain).send(); + } + + private String getPrefix(Player player) + { + String[] teams = new String[] {"admin", "mod", "trainingmod", "helper", "trusted", "builder", "member", "visitor"}; + String[] prefixes = new String[] {"&4", "&c", "&c", "&9", "&3", "&a", "&f", "&7"}; + + for (int i = 0; i < teams.length; i++) + if (player.hasPermission("group." + teams[i])) + return prefixes[i]; + return "&7"; + + } + + @SuppressWarnings("unchecked") + public JSONObject toJSONObject() { + JSONObject j = new JSONObject(); + j.put("sender", sender); + j.put("reciever", reciever); + j.put("timeSent", timeSent); + j.put("message", message); + j.put("chain", chain); + j.put("read", read); + return j; + } + + public static Msg fromJSONObject(JSONObject j, int id) { + return new Msg(id, (String) j.get("sender"), (String) j.get("reciever"), (String) j.get("timeSent"), + (String) j.get("message"), (String) j.get("chain"), (boolean)j.get("read")); + } +} diff --git a/src/main/java/com/redstoner/modules/mail/Theme.java b/src/main/java/com/redstoner/modules/mail/Theme.java new file mode 100644 index 0000000..575e0a5 --- /dev/null +++ b/src/main/java/com/redstoner/modules/mail/Theme.java @@ -0,0 +1,53 @@ +package com.redstoner.modules.mail; + +public enum Theme { + LIGHT("&7","&c","&9","&8","&e","&7","&2", "&e"), + DARK("&8","&c","&9","&7","&6","&7","&2", "&e"), + GOLD("&6","&f","&f","&f","&f","&6","&6", "&6"); + + private String bracketColor; + private String deleteColor; + private String infoColor; + private String replyColor; + private String archiveColor; + private String colonColor; + private String clearColor; + private String clearAccentColor; + + private Theme(String bracketColor, String deleteColor, String infoColor, String replyColor, + String archiveColor, String colonColor, String clearColor, String clearAccentColor) { + this.bracketColor = bracketColor; + this.deleteColor = deleteColor; + this.infoColor = infoColor; + this.replyColor = replyColor; + this.archiveColor = archiveColor; + this.colonColor = colonColor; + this.clearColor = clearColor; + this.clearAccentColor = clearAccentColor; + } + + public String getBracketColor() { + return bracketColor; + } + public String getDeleteColor() { + return deleteColor; + } + public String getInfoColor() { + return infoColor; + } + public String getReplyColor() { + return replyColor; + } + public String getArchiveColor() { + return archiveColor; + } + public String getColonColor() { + return colonColor; + } + public String getClearColor() { + return clearColor; + } + public String getClearAccentColor() { + return clearAccentColor; + } +} diff --git a/src/main/java/com/redstoner/modules/mail/module.info b/src/main/java/com/redstoner/modules/mail/module.info new file mode 100644 index 0000000..2740d76 --- /dev/null +++ b/src/main/java/com/redstoner/modules/mail/module.info @@ -0,0 +1,3 @@ +displayName: Mail +category: Chat +description: A better version of essentials's mail feature.
\ No newline at end of file |