From d900233bf4efca8deee77d4609311795137b1024 Mon Sep 17 00:00:00 2001
From: psrcek
Date: Thu, 2 Feb 2017 22:05:52 +0100
Subject: [PATCH] Created mentio
---
src/com/redstoner/modules/mentio/Mentio.java | 306 +++++++++++++++++++
1 file changed, 306 insertions(+)
create mode 100644 src/com/redstoner/modules/mentio/Mentio.java
diff --git a/src/com/redstoner/modules/mentio/Mentio.java b/src/com/redstoner/modules/mentio/Mentio.java
new file mode 100644
index 0000000..5019422
--- /dev/null
+++ b/src/com/redstoner/modules/mentio/Mentio.java
@@ -0,0 +1,306 @@
+package com.redstoner.modules.mentio;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.bukkit.ChatColor;
+import org.bukkit.Sound;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.AsyncPlayerChatEvent;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+
+import com.nemez.cmdmgr.Command;
+import com.redstoner.annotations.AutoRegisterListener;
+import com.redstoner.annotations.Version;
+import com.redstoner.misc.Main;
+import com.redstoner.misc.Utils;
+import com.redstoner.modules.Module;
+
+@Version(major = 1, minor = 0, revision = 0)
+@AutoRegisterListener
+public class Mentio implements Module, Listener {
+ private boolean enabled = false;
+ private File configFile;
+ private Map> mentions;
+
+ @Override
+ public void onEnable() {
+ enabled = enableModule();
+ }
+
+ @Override
+ public void onDisable() {
+ enabled = false;
+ }
+
+ @Override
+ public boolean enabled() {
+ return enabled;
+ }
+
+ private boolean enableModule() {
+ configFile = new File(Main.plugin.getDataFolder(), "mentio.json");
+
+ if (!configFile.exists()) {
+ try {
+ FileWriter writer = new FileWriter(configFile);
+
+ writer.write("{}");
+ writer.flush();
+ writer.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+
+ Utils.error("Could not create blank mentions file! Disabling.");
+
+ return false;
+ }
+
+ }
+
+ mentions = new HashMap<>();
+
+ try {
+ FileReader reader = new FileReader(configFile);
+ JSONObject json = (JSONObject) new JSONParser().parse(reader);
+
+ for (Object key : json.keySet()) {
+ JSONArray mentionsJSONArray = (JSONArray) json.get(key);
+ List mentionsArray = new ArrayList();
+
+ for (Object obj : mentionsJSONArray.toArray()) {
+ mentionsArray.add(obj.toString());
+ }
+
+ mentions.put((String) key, mentionsArray);
+ }
+ } catch (IOException | ParseException e) {
+ e.printStackTrace();
+
+ Utils.error("Could not get mentions from file! Disabling.");
+
+ return false;
+ }
+
+ return true;
+ }
+
+ @SuppressWarnings("unchecked")
+ private boolean saveMentions() {
+ JSONObject data = new JSONObject();
+
+ for (String key : mentions.keySet()) {
+ JSONArray array = new JSONArray();
+
+ for (String mention : mentions.get(key)) {
+ array.add(mention);
+ }
+
+ data.put(key, array);
+ }
+
+ try {
+ PrintWriter writer = new PrintWriter(configFile);
+
+ writer.write(data.toJSONString());
+ writer.close();
+
+ return true;
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ private String findAllColors(String s) {
+ String colors = "";
+
+ for (int i = s.indexOf("§"); i >= 0; i = s.indexOf("§", i + 1)) {
+ colors += "§" + s.charAt(i + 1);
+ }
+
+ return colors;
+ }
+
+ private String getDisplayNameWithoutSuffix(Player player) {
+ return ChatColor.stripColor(player.getDisplayName().toLowerCase()).replaceAll("\\$", "").replaceAll("•", "").trim();
+ }
+
+ @Command(hook = "addWord")
+ public void addWord(CommandSender sender, String word) {
+ Player player = (Player) sender;
+ String uuid = player.getUniqueId().toString();
+ List playerMentions = mentions.get(uuid);
+
+ List oldMentions = new ArrayList();
+ List newMentions = new ArrayList();
+
+ if (playerMentions == null) {
+ newMentions.add(player.getName().toLowerCase());
+ newMentions.add(getDisplayNameWithoutSuffix(player));
+ } else {
+ oldMentions.addAll(playerMentions);
+ newMentions.addAll(playerMentions);
+ }
+
+ newMentions.add(word.toLowerCase());
+ mentions.put(uuid, newMentions);
+
+ if (!saveMentions()) {
+ Utils.sendErrorMessage(player, null, "&cCould not save mentions! Please contact an admin!", '&');
+
+ if (playerMentions == null) {
+ mentions.remove(uuid);
+ } else {
+ mentions.put(uuid, oldMentions);
+ }
+
+ return;
+ }
+
+ Utils.sendMessage(player, null, "&aSuccessfully added mention: &e" + word, '&');
+ }
+
+ @Command(hook = "delWord")
+ public void delWord(CommandSender sender, String word) {
+ Player player = (Player) sender;
+ String uuid = player.getUniqueId().toString();
+ List playerMentions = mentions.get(uuid);
+
+ List oldMentions = new ArrayList();
+ List newMentions = new ArrayList();
+
+ if (playerMentions == null) {
+ newMentions.add(player.getName().toLowerCase());
+ newMentions.add(getDisplayNameWithoutSuffix(player));
+ } else {
+ oldMentions.addAll(playerMentions);
+ newMentions.addAll(playerMentions);
+ }
+
+ if (!oldMentions.contains(word.toLowerCase())) {
+ Utils.sendMessage(player, null, "&cYou do not have \"" + word + "\" added as a mention!", '&');
+ return;
+ }
+
+ newMentions.remove(word.toLowerCase());
+ mentions.put(uuid, newMentions);
+
+ if (!saveMentions()) {
+ Utils.sendErrorMessage(player, null, "&cCould not save mentions! Please contact an admin!", '&');
+
+ if (playerMentions == null) {
+ mentions.remove(uuid);
+ } else {
+ mentions.put(uuid, oldMentions);
+ }
+
+ return;
+ }
+
+ Utils.sendMessage(player, null, "&aSuccessfully removed mention: &e" + word, '&');
+ }
+
+ @Command(hook = "listWords")
+ public void listWords(CommandSender sender) {
+ Player player = (Player) sender;
+ String uuid = player.getUniqueId().toString();
+ List playerMentions = mentions.get(uuid);
+
+ Utils.sendMessage(player, null, "&aWords you are currently listening for (case ignored):");
+
+ if (playerMentions == null) {
+ Utils.sendMessage(player, null, "&c - &3" + player.getName().toLowerCase(), '&');
+ Utils.sendMessage(player, null, "&c - &3" + getDisplayNameWithoutSuffix(player), '&');
+ return;
+ }
+
+ if (playerMentions.size() == 0) {
+ Utils.sendMessage(player, null, "&cYou are currently not litstening for any words!", '&');
+ return;
+ }
+
+ for (String word : playerMentions) {
+ Utils.sendMessage(player, null, "&c - &3" + word, '&');
+ }
+ }
+
+ @EventHandler(priority = EventPriority.MONITOR)
+ public void onChat(AsyncPlayerChatEvent e) {
+ List words = new ArrayList(Arrays.asList(e.getMessage().split(" ")));
+
+ for (Player recipient : e.getRecipients()) {
+ String uuid = recipient.getUniqueId().toString();
+ List playerMentions = mentions.get(uuid);
+
+ if (playerMentions == null) {
+ playerMentions = new ArrayList();
+ playerMentions.add(recipient.getName());
+ playerMentions.add(getDisplayNameWithoutSuffix(recipient));
+ }
+
+ List mentioColoredWords = new ArrayList(words);
+ boolean isMentioned = false;
+
+ for (String listenWord : playerMentions) {
+ for (int i = 0; i < mentioColoredWords.size(); i++) {
+ String word = mentioColoredWords.get(i);
+
+ if (word.toLowerCase().contains(listenWord.toLowerCase())) {
+ isMentioned = true;
+ String formatting = "";
+
+ for (int j = 0; j <= words.indexOf(word); j++) {
+ formatting += words.get(j);
+ }
+
+ formatting = findAllColors(formatting);
+
+ mentioColoredWords.set(i, "&a&o" + ChatColor.stripColor(word) + formatting);
+ }
+ }
+ }
+
+ if (isMentioned) {
+ try {
+ e.getRecipients().remove(recipient);
+ } catch (UnsupportedOperationException ex) {
+ ex.printStackTrace();
+ continue;
+ }
+
+ String message = String.join(" ", mentioColoredWords.toArray(new String[0]));
+
+ // this is purposely not Utils.sendMessage, prefixes are not wanted!
+ recipient.sendMessage(e.getFormat().replace("%1$s", e.getPlayer().getDisplayName()).replace("%2$s", message));
+ recipient.playSound(recipient.getLocation(), Sound.ENTITY_CHICKEN_EGG, 1, 2);
+ }
+ }
+ }
+
+ @Override
+ public String getCommandString() {
+ StringBuilder sb = new StringBuilder();
+
+ sb.append("");
+
+ return sb.toString();
+ }
+
+}