From 5c06f4b809a7734e55e885eddaee4e20825fcdda Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 20 Jul 2015 19:52:56 +0200 Subject: [PATCH] Added a /tellraw message for new players to write their name on Reddit if they want it displayed. --- .metadata/.mylyn/.tasks.xml.zip | Bin 250 -> 250 bytes .metadata/.mylyn/tasks.xml.zip | Bin 250 -> 250 bytes .../0/6088cf20022f001511a3ba75618c68e5 | 68 +++ .../10/704e9345022f001511a3ba75618c68e5 | 73 ++++ .../11/6040761c022f001511a3ba75618c68e5 | 67 +++ .../14/70fadb62ff2e001511a3ba75618c68e5 | 49 +++ .../19/0072a52f022f001511a3ba75618c68e5 | 69 +++ .../2/3097a03f012f001511a3ba75618c68e5 | 0 .../27/603d2e77012f001511a3ba75618c68e5 | 67 +++ .../27/6094151b012f001511a3ba75618c68e5 | 50 +++ .../27/70ba5e30032f001511a3ba75618c68e5 | 78 ++++ .../2a/10f997ed052f001511a3ba75618c68e5 | 397 +++++++++++++++++ .../30/60904025fd2e001511a3ba75618c68e5 | 44 ++ .../39/e0e3f38efd2e001511a3ba75618c68e5 | 47 ++ .../43/e0daac42032f001511a3ba75618c68e5 | 72 ++++ .../47/705caa25022f001511a3ba75618c68e5 | 68 +++ .../5a/f0233823022f001511a3ba75618c68e5 | 68 +++ .../5d/f02ee61e022f001511a3ba75618c68e5 | 68 +++ .../6/e0073580012f001511a3ba75618c68e5 | 67 +++ .../60/60a8e9e7052f001511a3ba75618c68e5 | 397 +++++++++++++++++ .../62/60642c63ff2e001511a3ba75618c68e5 | 49 +++ .../64/705f43f0042f001511a3ba75618c68e5 | 74 ++++ .../67/602639aefe2e001511a3ba75618c68e5 | 47 ++ .../67/70de873d032f001511a3ba75618c68e5 | 78 ++++ .../6e/70483370012f001511a3ba75618c68e5 | 65 +++ .../6e/e0ff0a20022f001511a3ba75618c68e5 | 68 +++ .../6f/e053c88a032f001511a3ba75618c68e5 | 73 ++++ .../73/e0bd2a55032f001511a3ba75618c68e5 | 78 ++++ .../80/e08df834032f001511a3ba75618c68e5 | 78 ++++ .../83/60141ae3042f001511a3ba75618c68e5 | 400 ++++++++++++++++++ .../83/705f6955012f001511a3ba75618c68e5 | 63 +++ .../8b/6006432e032f001511a3ba75618c68e5 | 73 ++++ .../8d/60933f62ff2e001511a3ba75618c68e5 | 49 +++ .../9/70788731022f001511a3ba75618c68e5 | 72 ++++ .../92/e057acf2fe2e001511a3ba75618c68e5 | 47 ++ .../95/f0eeaa17fd2e001511a3ba75618c68e5 | 44 ++ .../97/00499c49012f001511a3ba75618c68e5 | 79 ++++ .../97/6096c38cfd2e001511a3ba75618c68e5 | 47 ++ .../9b/f056a849012f001511a3ba75618c68e5 | 79 ++++ .../9f/e052f695fd2e001511a3ba75618c68e5 | 47 ++ .../a/e03728d7042f001511a3ba75618c68e5 | 399 +++++++++++++++++ .../a0/602b122cfd2e001511a3ba75618c68e5 | 397 +++++++++++++++++ .../a0/e0ec5f84012f001511a3ba75618c68e5 | 67 +++ .../a9/6080831f022f001511a3ba75618c68e5 | 68 +++ .../ad/e0eec742012f001511a3ba75618c68e5 | 4 + .../af/708b111d012f001511a3ba75618c68e5 | 65 +++ .../b3/e0282178012f001511a3ba75618c68e5 | 67 +++ .../b4/709af161ff2e001511a3ba75618c68e5 | 47 ++ .../b5/703791ec052f001511a3ba75618c68e5 | 398 +++++++++++++++++ .../c7/6023b583002f001511a3ba75618c68e5 | 51 +++ .../c9/70756544052f001511a3ba75618c68e5 | 397 +++++++++++++++++ .../cb/f0ea1f21052f001511a3ba75618c68e5 | 74 ++++ .../d/f0722227012f001511a3ba75618c68e5 | 63 +++ .../d6/e08d6864ff2e001511a3ba75618c68e5 | 49 +++ .../d8/f05418d3042f001511a3ba75618c68e5 | 397 +++++++++++++++++ .../db/e0afd61c022f001511a3ba75618c68e5 | 68 +++ .../ea/d0facaee052f001511a3ba75618c68e5 | 398 +++++++++++++++++ .../f1/e0e3f27f032f001511a3ba75618c68e5 | 78 ++++ .../f3/102d06a3fe2e001511a3ba75618c68e5 | 47 ++ .../f7/60d64f66fd2e001511a3ba75618c68e5 | 44 ++ .../f9/60a3e283fd2e001511a3ba75618c68e5 | 45 ++ .../ff/60ae02e4fe2e001511a3ba75618c68e5 | 47 ++ .../ff/e0d13c89032f001511a3ba75618c68e5 | 73 ++++ .../RemoteSystemsTempFiles/.markers.snap | Bin 560 -> 720 bytes .../RemoteSystemsTempFiles/.syncinfo.snap | Bin 560 -> 720 bytes .../.indexes/e4/77/69/e/history.index | Bin 7535 -> 13391 bytes .../.indexes/e4/81/43/bf/history.index | Bin 0 -> 162 bytes .../.indexes/e4/history.index | Bin 0 -> 101 bytes .../TheButtonAutoFlair/.markers.snap | Bin 28724 -> 34515 bytes .../TheButtonAutoFlair/.syncinfo.snap | Bin 560 -> 720 bytes .../.root/.markers.snap | Bin 560 -> 720 bytes .../.safetable/org.eclipse.core.resources | Bin 28747 -> 36407 bytes .../.plugins/org.eclipse.core.resources/.snap | Bin 23598 -> 29107 bytes .../org.eclipse.jdt.core/1508644233.index | Bin 15141 -> 16240 bytes .../org.eclipse.jdt.core/savedIndexNames.txt | 1 - .../org.eclipse.jdt.ui/jdt-images/8.png | Bin 0 -> 159 bytes .../org.eclipse.jdt.ui/jdt-images/9.png | Bin 0 -> 292 bytes TheButtonAutoFlair.jar | Bin 57843 -> 60744 bytes .../TellRawAutoMessage/Reflection.class | Bin 0 -> 3761 bytes .../thebuttonautoflair/PlayerListener.class | Bin 2396 -> 4343 bytes .../TellRawAutoMessage/Reflection.java | 79 ++++ .../thebuttonautoflair/PlayerListener.java | 36 +- 82 files changed, 6814 insertions(+), 4 deletions(-) create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/0/6088cf20022f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/10/704e9345022f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/11/6040761c022f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/14/70fadb62ff2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/19/0072a52f022f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2/3097a03f012f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/27/603d2e77012f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/27/6094151b012f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/27/70ba5e30032f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/2a/10f997ed052f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/30/60904025fd2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/39/e0e3f38efd2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/43/e0daac42032f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/47/705caa25022f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5a/f0233823022f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/5d/f02ee61e022f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6/e0073580012f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/60/60a8e9e7052f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/62/60642c63ff2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/64/705f43f0042f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/67/602639aefe2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/67/70de873d032f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6e/70483370012f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6e/e0ff0a20022f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/6f/e053c88a032f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/73/e0bd2a55032f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/80/e08df834032f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/83/60141ae3042f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/83/705f6955012f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8b/6006432e032f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/8d/60933f62ff2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9/70788731022f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/92/e057acf2fe2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/95/f0eeaa17fd2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/97/00499c49012f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/97/6096c38cfd2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9b/f056a849012f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/9f/e052f695fd2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a/e03728d7042f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a0/602b122cfd2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a0/e0ec5f84012f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/a9/6080831f022f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ad/e0eec742012f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/af/708b111d012f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b3/e0282178012f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b4/709af161ff2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/b5/703791ec052f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c7/6023b583002f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/c9/70756544052f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/cb/f0ea1f21052f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d/f0722227012f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d6/e08d6864ff2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/d8/f05418d3042f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/db/e0afd61c022f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ea/d0facaee052f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f1/e0e3f27f032f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f3/102d06a3fe2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f7/60d64f66fd2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/f9/60a3e283fd2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ff/60ae02e4fe2e001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.history/ff/e0d13c89032f001511a3ba75618c68e5 create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/TheButtonAutoFlair/.indexes/e4/81/43/bf/history.index create mode 100644 .metadata/.plugins/org.eclipse.core.resources/.projects/TheButtonAutoFlair/.indexes/e4/history.index create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/8.png create mode 100644 .metadata/.plugins/org.eclipse.jdt.ui/jdt-images/9.png create mode 100644 TheButtonAutoFlair/bin/de/inventivegames/TellRawAutoMessage/Reflection.class create mode 100644 TheButtonAutoFlair/src/de/inventivegames/TellRawAutoMessage/Reflection.java diff --git a/.metadata/.mylyn/.tasks.xml.zip b/.metadata/.mylyn/.tasks.xml.zip index 34d8b0ee719c72160fbcc105666285300c2ffb14..93e1057579de7bb1cfe13000a22e0fe3a708612c 100644 GIT binary patch delta 26 gcmeyx_=}Mzz?+#xgn@&DgW>h8i9D;AfaDG*0A^zduK)l5 delta 26 gcmeyx_=}Mzz?+#xgn@&DgTc0UBF`!&Ai2W{09wrlIRF3v diff --git a/.metadata/.mylyn/tasks.xml.zip b/.metadata/.mylyn/tasks.xml.zip index dd13ec7ab981f7a0c7d83b662c76090373d72e94..755dd380edf0de0e3e1fecd7ffb1a52f6c8c84aa 100644 GIT binary patch delta 26 gcmeyx_=}Mzz?+#xgn@&DgP~#WM4nYlKyrr@0AJk)-v9sr delta 26 gcmeyx_=}Mzz?+#xgn@&DgTZ#fM4nYlKyrr@09yA4KL7v# diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/0/6088cf20022f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/0/6088cf20022f001511a3ba75618c68e5 new file mode 100644 index 0000000..ee7bab6 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/0/6088cf20022f001511a3ba75618c68e5 @@ -0,0 +1,68 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import de.inventivegames.TellRawAutoMessage.Reflection; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { //2015.07.20. + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + sendRawMessage(p, json); + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + try { + System.out.prinom + Object handle = Reflection.getHandle(player); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/10/704e9345022f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/10/704e9345022f001511a3ba75618c68e5 new file mode 100644 index 0000000..15a6d77 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/10/704e9345022f001511a3ba75618c68e5 @@ -0,0 +1,73 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import de.inventivegames.TellRawAutoMessage.Reflection; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { //2015.07.20. + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + sendRawMessage(p, json); + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + try { + System.out.println("1"); + Object handle = Reflection.getHandle(player); + System.out.println("2"); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + System.out.prinln("3"); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + System.out.prinln("4"); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + System.out.prinln("5"); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + System.out.prinln("6"); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/11/6040761c022f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/11/6040761c022f001511a3ba75618c68e5 new file mode 100644 index 0000000..bfe0c85 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/11/6040761c022f001511a3ba75618c68e5 @@ -0,0 +1,67 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import de.inventivegames.TellRawAutoMessage.Reflection; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { //2015.07.20. + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + sendRawMessage(p, json); + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + try { + Object handle = Reflection.getHandle(player); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/14/70fadb62ff2e001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/14/70fadb62ff2e001511a3ba75618c68e5 new file mode 100644 index 0000000..17fc5c8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/14/70fadb62ff2e001511a3ba75618c68e5 @@ -0,0 +1,49 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + try { + System.out.prinln("1"); + Object handle = Reflection.getHandle(player); + System.out.prinln("2"); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2/3097a03f012f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/2/3097a03f012f001511a3ba75618c68e5 new file mode 100644 index 0000000..e69de29 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/27/603d2e77012f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/27/603d2e77012f001511a3ba75618c68e5 new file mode 100644 index 0000000..3b279ea --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/27/603d2e77012f001511a3ba75618c68e5 @@ -0,0 +1,67 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import de.inventivegames.TellRawAutoMessage.Reflection; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + p.sendTitle(json, ""; + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + try { + Object handle = Reflection.getHandle(player); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/27/6094151b012f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/27/6094151b012f001511a3ba75618c68e5 new file mode 100644 index 0000000..050f11a --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/27/6094151b012f001511a3ba75618c68e5 @@ -0,0 +1,50 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + p.sendTitle(json, ""; + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + if (majorVersion < 1.8 || (majorVersion == 1.8 && lesserVersion == 1)) { + chatSerializerClazz = Reflection.getNMSClass("ChatSerializer"); + } else { + chatSerializerClazz = Reflection.getNMSClass("IChatBaseComponent$ChatSerializer"); + } + try { + System.out.println("1"); + Object handle = Reflection.getHandle(player); + System.out.println("2"); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + System.out.println("3"); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + System.out.println("4"); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + System.out.println("5"); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + System.out.println("6"); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/2a/10f997ed052f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/2a/10f997ed052f001511a3ba75618c68e5 new file mode 100644 index 0000000..c5f649b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/2a/10f997ed052f001511a3ba75618c68e5 @@ -0,0 +1,397 @@ +package tk.sznp.thebuttonautoflair; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.io.IOUtils; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.palmergames.bukkit.towny.object.Town; +import com.palmergames.bukkit.towny.object.WorldCoord; + +public class PluginMain extends JavaPlugin +{ //Translated to Java: 2015.07.15. + //A user, which flair isn't obtainable: + //https://www.reddit.com/r/thebutton/comments/31c32v/i_pressed_the_button_without_really_thinking/ + // Fired when plugin is first enabled + @Override + public void onEnable() + { + System.out.println("The Button Auto-flair Plugin by NorbiPeti (:P)"); + //System.out.println("Original C# version: http://pastebin.com/tX8xCPbp"); + //System.out.println("The Java version is... Also made by the same person."); + //System.out.println("With the help of StackOverflow and similar."); + /*catch(MalformedURLException e) + { + } + catch(IOException e) + { + }*/ + getServer().getPluginManager().registerEvents(new PlayerListener(), this); + //System.out.println("Registering commands..."); + this.getCommand("u").setExecutor(new Commands()); + this.getCommand("u").setUsage(this.getCommand("u").getUsage().replace('&', '§')); + try { + File file=new File("flairsaccepted.txt"); + if(file.exists()) + { + BufferedReader br=new BufferedReader(new FileReader("flairsaccepted.txt")); + String line; + while ((line = br.readLine()) != null) + { + AcceptedPlayers.add(line.replace("\n", "")); + } + br.close(); + } + file=new File("flairsignored.txt"); + if(file.exists()) + { + BufferedReader br=new BufferedReader(new FileReader("flairsignored.txt")); + String line; + while ((line = br.readLine()) != null) + { + IgnoredPlayers.add(line.replace("\n", "")); + } + br.close(); + } + file=new File("autoflairconfig.txt"); + if(file.exists()) + { + BufferedReader br=new BufferedReader(new FileReader(file)); + String line; + while((line=br.readLine())!=null) + { + String[] s=line.split(" "); + TownColors.put(s[0], s[1]); + } + br.close(); + } + } catch (IOException e) { + System.out.println("Error!\n"+e); + } + //System.out.println("Registering done."); + Runnable r=new Runnable(){public void run(){ThreadMethod();}}; + Thread t=new Thread(r); + t.start(); + } + Boolean stop=false; + // Fired when plugin is disabled + @Override + public void onDisable() + { + try + { + FileWriter fw; + fw = new FileWriter("flairsaccepted.txt"); + fw.close(); + fw = new FileWriter("flairsignored.txt"); + fw.close(); + } + catch(Exception e) + { + System.out.println("Error!\n"+e); + } + for(String player : AcceptedPlayers) + { + File file=new File("flairsaccepted.txt"); + try { + BufferedWriter bw=new BufferedWriter(new FileWriter(file, true)); + bw.write(player+"\n"); + bw.close(); + } catch (IOException e) { + System.out.println("Error!\n"+e); + } + } + for(String player : IgnoredPlayers) + { + File file=new File("flairsignored.txt"); + try { + BufferedWriter bw = new BufferedWriter(new FileWriter(file, true)); + bw.write(player+"\n"); + bw.close(); + } catch (IOException e) { + System.out.println("Error!\n"+e); + } + } + stop=true; + } + + public void ThreadMethod() //<-- 2015.07.16. + { + /*System.out.println("Sleeping for 5 seconds..."); //2015.07.20. + try { + Thread.sleep(5000); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } //2015.07.20.*/ + while(!stop) + { + try + { + String body=DownloadString("https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/autoflair_system_comment_your_minecraft_name_and/.json?limit=1000"); + JSONArray json=new JSONArray(body).getJSONObject(1).getJSONObject("data").getJSONArray("children"); + for(Object obj : json) + { + JSONObject item = (JSONObject)obj; + String author=item.getJSONObject("data").getString("author"); + String ign=item.getJSONObject("data").getString("body"); + int start = ign.indexOf("IGN:") + "IGN:".length(); + int end = ign.indexOf(' ', start); + if (end == -1 || end == start) + end=ign.indexOf('\n', start); //2015.07.15. + if (end == -1 || end == start) + ign = ign.substring(start); + else + ign = ign.substring(start, end); + ign = ign.trim(); + if(HasIGFlair(ign)) + continue; + //System.out.println("Author: "+author); + try { + Thread.sleep(10); + } catch(InterruptedException ex) { + Thread.currentThread().interrupt(); + } + String[] flairdata = DownloadString("http://karmadecay.com/thebutton-data.php?users=" + author).replace("\"", "").split(":"); + String flair; + if(flairdata.length > 1) //2015.07.15. + flair = flairdata[1]; + else + flair=""; + if (flair != "-1") + flair = flair + "s"; + else + flair = "non-presser"; + String flairclass; + //System.out.println("flairdata.length:"+flairdata.length); + if(flairdata.length>2) + flairclass = flairdata[2]; + else + flairclass="unknown"; + SetFlair(ign, flair, flairclass, author); + } + Thread.sleep(10000); + } + catch(Exception e) + { + System.out.println("Error!\n"+e); + } + } + } + + public String DownloadString(String urlstr) throws MalformedURLException, IOException + { + URL url = new URL(urlstr); + URLConnection con = url.openConnection(); + con.setRequestProperty("User-Agent", "TheButtonAutoFlair"); + InputStream in = con.getInputStream(); + String encoding = con.getContentEncoding(); + encoding = encoding == null ? "UTF-8" : encoding; + String body = IOUtils.toString(in, encoding); + in.close(); + return body; + } + + //It has to store offline player flairs too, therefore it can't use Player object + public static Map PlayerFlairs=new HashMap(); + public static Map PlayerUserNames=new HashMap(); + //public Map PlayerFlairs=new HashMap(); + public static ArrayList Players=new ArrayList(); + public static ArrayList AcceptedPlayers=new ArrayList(); //2015.07.16. + public static ArrayList IgnoredPlayers=new ArrayList(); //2015.07.16. + //public static Map PlayerTowns=new HashMap(); //2015.07.20. + public static Map TownColors=new HashMap(); //2015.07.20. + public Boolean HasIGFlair(String playername) + { + /*Player player=null; + for(Player p : Players) + { + if(p.getName()==playername) + { + player=p; + break; + } + } + if(player==null) + return false;*/ + return PlayerFlairs.containsKey(playername); + } + + public void SetFlair(String playername, String text, String flairclass, String username) + { + String finalflair; + switch(flairclass) + { + case "press-1": + finalflair="§c("+text+")§r"; + break; + case "press-2": + finalflair="§6("+text+")§r"; + break; + case "press-3": + finalflair="§e("+text+")§r"; + break; + case "press-4": + finalflair="§a("+text+")§r"; + break; + case "press-5": + finalflair="§9("+text+")§r"; + break; + case "press-6": + finalflair="§5("+text+")§r"; + break; + case "no-press": + finalflair="§7(non-pr.)§r"; + break; + case "cheater": + finalflair="§5("+text+")§r"; + break; + default: + finalflair=""; + break; + } + if(finalflair.length()==0) //<-- 2015.07.20. + return; + PlayerFlairs.put(playername, finalflair); + PlayerUserNames.put(playername, username); + /*for(Player player : Players) + { + if(player.getName()==playername) + { + PlayerFlairs.put(player, finalflair); + break; + } + }*/ + //System.out.println("SetFlair - playername: "+playername+" text: "+text+" flairclass: "+flairclass); + System.out.println("Added new flair to "+playername+": "+finalflair); + for(Player player : Players) + { + //System.out.println("Online player: "+player.getName()); + //System.out.println("player.getName ("+player.getName()+") == playername ("+playername+"): "+(player.getName()==playername)); + if(player.getName().equals(playername)) + { + //System.out.println("DisplayName: "+player.getDisplayName()); + //player.setDisplayName(player.getDisplayName()+finalflair); + AppendPlayerDisplayFlair(player, username, finalflair); + //System.out.println("DisplayName: "+player.getDisplayName()); + break; + } + } + } + + public static String GetFlair(Player player) + { //2015.07.16. + String flair=PlayerFlairs.get(player.getName()); + return flair==null ? "" : flair; + } + + public static void AppendPlayerDisplayFlair(Player player, String username, String flair) + { + if(IgnoredPlayers.contains(player.getName())) + return; + if(AcceptedPlayers.contains(player.getName())) + //player.setDisplayName(player.getDisplayName()+flair); + AppendPlayerDisplayFlairFinal(player, flair); //2015.07.20. + else + player.sendMessage("§9Are you Reddit user "+username+"?§r §6Type /u accept or /u ignore§r"); + } + + public static void AppendPlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + //System.out.println("A"); + String color = GetColorForTown(GetPlayerTown(player)); //TO!DO: Multiple colors put on first capital letters + String[] colors = color.substring(1).split("§"); + String displayname=player.getDisplayName(); + ArrayList Positions=new ArrayList<>(); + //System.out.println("B"); + for(int i=0; i=colors.length) + { + //System.out.println("D"); + int x=0; + for(int i=0; i towns = TownyUniverse.getDataSource().getTowns(); + try { + Town town = WorldCoord.parseWorldCoord(player).getTownBlock().getTown(); + return town.getName(); + } catch (Exception e) { + return ""; + } + } + + public static void RemovePlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + String color = GetColorForTown(GetPlayerTown(player)); + String dname=player.getDisplayName(); + player.setDisplayName(dname.substring(dname.indexOf(color)+3, dname.indexOf(flair))); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/30/60904025fd2e001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/30/60904025fd2e001511a3ba75618c68e5 new file mode 100644 index 0000000..ccbc91e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/30/60904025fd2e001511a3ba75618c68e5 @@ -0,0 +1,44 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + try { + System.out.prinln("1"); + Object handle = Reflection.getHandle(player); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5a/f0233823022f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/5a/f0233823022f001511a3ba75618c68e5 new file mode 100644 index 0000000..acbe1ae --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5a/f0233823022f001511a3ba75618c68e5 @@ -0,0 +1,68 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import de.inventivegames.TellRawAutoMessage.Reflection; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { //2015.07.20. + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + sendRawMessage(p, json); + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + try { + System.out.prinln + Object handle = Reflection.getHandle(player); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/5d/f02ee61e022f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/f02ee61e022f001511a3ba75618c68e5 new file mode 100644 index 0000000..75d84da --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/5d/f02ee61e022f001511a3ba75618c68e5 @@ -0,0 +1,68 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import de.inventivegames.TellRawAutoMessage.Reflection; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { //2015.07.20. + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + sendRawMessage(p, json); + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + try { + System.out.println() + Object handle = Reflection.getHandle(player); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6/e0073580012f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/6/e0073580012f001511a3ba75618c68e5 new file mode 100644 index 0000000..3b1ae41 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6/e0073580012f001511a3ba75618c68e5 @@ -0,0 +1,67 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import de.inventivegames.TellRawAutoMessage.Reflection; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + try { + Object handle = Reflection.getHandle(player); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/60/60a8e9e7052f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/60/60a8e9e7052f001511a3ba75618c68e5 new file mode 100644 index 0000000..c5f649b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/60/60a8e9e7052f001511a3ba75618c68e5 @@ -0,0 +1,397 @@ +package tk.sznp.thebuttonautoflair; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.io.IOUtils; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.palmergames.bukkit.towny.object.Town; +import com.palmergames.bukkit.towny.object.WorldCoord; + +public class PluginMain extends JavaPlugin +{ //Translated to Java: 2015.07.15. + //A user, which flair isn't obtainable: + //https://www.reddit.com/r/thebutton/comments/31c32v/i_pressed_the_button_without_really_thinking/ + // Fired when plugin is first enabled + @Override + public void onEnable() + { + System.out.println("The Button Auto-flair Plugin by NorbiPeti (:P)"); + //System.out.println("Original C# version: http://pastebin.com/tX8xCPbp"); + //System.out.println("The Java version is... Also made by the same person."); + //System.out.println("With the help of StackOverflow and similar."); + /*catch(MalformedURLException e) + { + } + catch(IOException e) + { + }*/ + getServer().getPluginManager().registerEvents(new PlayerListener(), this); + //System.out.println("Registering commands..."); + this.getCommand("u").setExecutor(new Commands()); + this.getCommand("u").setUsage(this.getCommand("u").getUsage().replace('&', '§')); + try { + File file=new File("flairsaccepted.txt"); + if(file.exists()) + { + BufferedReader br=new BufferedReader(new FileReader("flairsaccepted.txt")); + String line; + while ((line = br.readLine()) != null) + { + AcceptedPlayers.add(line.replace("\n", "")); + } + br.close(); + } + file=new File("flairsignored.txt"); + if(file.exists()) + { + BufferedReader br=new BufferedReader(new FileReader("flairsignored.txt")); + String line; + while ((line = br.readLine()) != null) + { + IgnoredPlayers.add(line.replace("\n", "")); + } + br.close(); + } + file=new File("autoflairconfig.txt"); + if(file.exists()) + { + BufferedReader br=new BufferedReader(new FileReader(file)); + String line; + while((line=br.readLine())!=null) + { + String[] s=line.split(" "); + TownColors.put(s[0], s[1]); + } + br.close(); + } + } catch (IOException e) { + System.out.println("Error!\n"+e); + } + //System.out.println("Registering done."); + Runnable r=new Runnable(){public void run(){ThreadMethod();}}; + Thread t=new Thread(r); + t.start(); + } + Boolean stop=false; + // Fired when plugin is disabled + @Override + public void onDisable() + { + try + { + FileWriter fw; + fw = new FileWriter("flairsaccepted.txt"); + fw.close(); + fw = new FileWriter("flairsignored.txt"); + fw.close(); + } + catch(Exception e) + { + System.out.println("Error!\n"+e); + } + for(String player : AcceptedPlayers) + { + File file=new File("flairsaccepted.txt"); + try { + BufferedWriter bw=new BufferedWriter(new FileWriter(file, true)); + bw.write(player+"\n"); + bw.close(); + } catch (IOException e) { + System.out.println("Error!\n"+e); + } + } + for(String player : IgnoredPlayers) + { + File file=new File("flairsignored.txt"); + try { + BufferedWriter bw = new BufferedWriter(new FileWriter(file, true)); + bw.write(player+"\n"); + bw.close(); + } catch (IOException e) { + System.out.println("Error!\n"+e); + } + } + stop=true; + } + + public void ThreadMethod() //<-- 2015.07.16. + { + /*System.out.println("Sleeping for 5 seconds..."); //2015.07.20. + try { + Thread.sleep(5000); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } //2015.07.20.*/ + while(!stop) + { + try + { + String body=DownloadString("https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/autoflair_system_comment_your_minecraft_name_and/.json?limit=1000"); + JSONArray json=new JSONArray(body).getJSONObject(1).getJSONObject("data").getJSONArray("children"); + for(Object obj : json) + { + JSONObject item = (JSONObject)obj; + String author=item.getJSONObject("data").getString("author"); + String ign=item.getJSONObject("data").getString("body"); + int start = ign.indexOf("IGN:") + "IGN:".length(); + int end = ign.indexOf(' ', start); + if (end == -1 || end == start) + end=ign.indexOf('\n', start); //2015.07.15. + if (end == -1 || end == start) + ign = ign.substring(start); + else + ign = ign.substring(start, end); + ign = ign.trim(); + if(HasIGFlair(ign)) + continue; + //System.out.println("Author: "+author); + try { + Thread.sleep(10); + } catch(InterruptedException ex) { + Thread.currentThread().interrupt(); + } + String[] flairdata = DownloadString("http://karmadecay.com/thebutton-data.php?users=" + author).replace("\"", "").split(":"); + String flair; + if(flairdata.length > 1) //2015.07.15. + flair = flairdata[1]; + else + flair=""; + if (flair != "-1") + flair = flair + "s"; + else + flair = "non-presser"; + String flairclass; + //System.out.println("flairdata.length:"+flairdata.length); + if(flairdata.length>2) + flairclass = flairdata[2]; + else + flairclass="unknown"; + SetFlair(ign, flair, flairclass, author); + } + Thread.sleep(10000); + } + catch(Exception e) + { + System.out.println("Error!\n"+e); + } + } + } + + public String DownloadString(String urlstr) throws MalformedURLException, IOException + { + URL url = new URL(urlstr); + URLConnection con = url.openConnection(); + con.setRequestProperty("User-Agent", "TheButtonAutoFlair"); + InputStream in = con.getInputStream(); + String encoding = con.getContentEncoding(); + encoding = encoding == null ? "UTF-8" : encoding; + String body = IOUtils.toString(in, encoding); + in.close(); + return body; + } + + //It has to store offline player flairs too, therefore it can't use Player object + public static Map PlayerFlairs=new HashMap(); + public static Map PlayerUserNames=new HashMap(); + //public Map PlayerFlairs=new HashMap(); + public static ArrayList Players=new ArrayList(); + public static ArrayList AcceptedPlayers=new ArrayList(); //2015.07.16. + public static ArrayList IgnoredPlayers=new ArrayList(); //2015.07.16. + //public static Map PlayerTowns=new HashMap(); //2015.07.20. + public static Map TownColors=new HashMap(); //2015.07.20. + public Boolean HasIGFlair(String playername) + { + /*Player player=null; + for(Player p : Players) + { + if(p.getName()==playername) + { + player=p; + break; + } + } + if(player==null) + return false;*/ + return PlayerFlairs.containsKey(playername); + } + + public void SetFlair(String playername, String text, String flairclass, String username) + { + String finalflair; + switch(flairclass) + { + case "press-1": + finalflair="§c("+text+")§r"; + break; + case "press-2": + finalflair="§6("+text+")§r"; + break; + case "press-3": + finalflair="§e("+text+")§r"; + break; + case "press-4": + finalflair="§a("+text+")§r"; + break; + case "press-5": + finalflair="§9("+text+")§r"; + break; + case "press-6": + finalflair="§5("+text+")§r"; + break; + case "no-press": + finalflair="§7(non-pr.)§r"; + break; + case "cheater": + finalflair="§5("+text+")§r"; + break; + default: + finalflair=""; + break; + } + if(finalflair.length()==0) //<-- 2015.07.20. + return; + PlayerFlairs.put(playername, finalflair); + PlayerUserNames.put(playername, username); + /*for(Player player : Players) + { + if(player.getName()==playername) + { + PlayerFlairs.put(player, finalflair); + break; + } + }*/ + //System.out.println("SetFlair - playername: "+playername+" text: "+text+" flairclass: "+flairclass); + System.out.println("Added new flair to "+playername+": "+finalflair); + for(Player player : Players) + { + //System.out.println("Online player: "+player.getName()); + //System.out.println("player.getName ("+player.getName()+") == playername ("+playername+"): "+(player.getName()==playername)); + if(player.getName().equals(playername)) + { + //System.out.println("DisplayName: "+player.getDisplayName()); + //player.setDisplayName(player.getDisplayName()+finalflair); + AppendPlayerDisplayFlair(player, username, finalflair); + //System.out.println("DisplayName: "+player.getDisplayName()); + break; + } + } + } + + public static String GetFlair(Player player) + { //2015.07.16. + String flair=PlayerFlairs.get(player.getName()); + return flair==null ? "" : flair; + } + + public static void AppendPlayerDisplayFlair(Player player, String username, String flair) + { + if(IgnoredPlayers.contains(player.getName())) + return; + if(AcceptedPlayers.contains(player.getName())) + //player.setDisplayName(player.getDisplayName()+flair); + AppendPlayerDisplayFlairFinal(player, flair); //2015.07.20. + else + player.sendMessage("§9Are you Reddit user "+username+"?§r §6Type /u accept or /u ignore§r"); + } + + public static void AppendPlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + //System.out.println("A"); + String color = GetColorForTown(GetPlayerTown(player)); //TO!DO: Multiple colors put on first capital letters + String[] colors = color.substring(1).split("§"); + String displayname=player.getDisplayName(); + ArrayList Positions=new ArrayList<>(); + //System.out.println("B"); + for(int i=0; i=colors.length) + { + //System.out.println("D"); + int x=0; + for(int i=0; i towns = TownyUniverse.getDataSource().getTowns(); + try { + Town town = WorldCoord.parseWorldCoord(player).getTownBlock().getTown(); + return town.getName(); + } catch (Exception e) { + return ""; + } + } + + public static void RemovePlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + String color = GetColorForTown(GetPlayerTown(player)); + String dname=player.getDisplayName(); + player.setDisplayName(dname.substring(dname.indexOf(color)+3, dname.indexOf(flair))); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/62/60642c63ff2e001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/62/60642c63ff2e001511a3ba75618c68e5 new file mode 100644 index 0000000..17fc5c8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/62/60642c63ff2e001511a3ba75618c68e5 @@ -0,0 +1,49 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("IChatBaseComponent$ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) + { + try { + System.out.println("1"); + Object handle = Reflection.getHandle(player); + System.out.println("2"); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + System.out.println("3"); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + System.out.println("4"); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + System.out.println("5"); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + System.out.println("6"); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/67/602639aefe2e001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/67/602639aefe2e001511a3ba75618c68e5 new file mode 100644 index 0000000..e6f7c88 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/67/602639aefe2e001511a3ba75618c68e5 @@ -0,0 +1,47 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + p.sendRawMessage("["",{"text":"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to "},{"text":"[this thread.]","clickEvent":{"action":"open_url","value":"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/"},"hoverEvent":{"action":"show_text","value":{"text":"","extra":[{"text":"Click here to go to the Reddit thread§r"}]}}}]"); + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + if (majorVersion < 1.8 || (majorVersion == 1.8 && lesserVersion == 1)) { + chatSerializerClazz = Reflection.getNMSClass("ChatSerializer"); + } else { + chatSerializerClazz = Reflection.getNMSClass("IChatBaseComponent$ChatSerializer"); + } + try { + System.out.println("1"); + Object handle = Reflection.getHandle(player); + System.out.println("2"); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + System.out.println("3"); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + System.out.println("4"); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + System.out.println("5"); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + System.out.println("6"); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6e/70483370012f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/70483370012f001511a3ba75618c68e5 new file mode 100644 index 0000000..61f45e9 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6e/70483370012f001511a3ba75618c68e5 @@ -0,0 +1,65 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import de.inventivegames.TellRawAutoMessage.Reflection; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + p.sendTitle(json, ""; + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + try { + System.out.prin + Object handle = Reflection.getHandle(player); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/6f/e053c88a032f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/6f/e053c88a032f001511a3ba75618c68e5 new file mode 100644 index 0000000..0cb17d7 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/6f/e053c88a032f001511a3ba75618c68e5 @@ -0,0 +1,73 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import de.inventivegames.TellRawAutoMessage.Reflection; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { //2015.07.20. + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + sendRawMessage(p, json); + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("IChatBaseComponent$ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) + try { + System.out.println("1"); + Object handle = Reflection.getHandle(player); + System.out.println("2"); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + System.out.println("3"); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + System.out.println("4"); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + System.out.println("5"); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + System.out.println("6"); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/73/e0bd2a55032f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/73/e0bd2a55032f001511a3ba75618c68e5 new file mode 100644 index 0000000..826a700 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/73/e0bd2a55032f001511a3ba75618c68e5 @@ -0,0 +1,78 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import de.inventivegames.TellRawAutoMessage.Reflection; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { //2015.07.20. + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + sendRawMessage(p, json); + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + if (majorVersion < 1.8 || (majorVersion == 1.8 && lesserVersion == 1)) { + chatSerializerClazz = Reflection.getNMSClass("ChatSerializer"); + } else { + chatSerializerClazz = Reflection.getNMSClass("IChatBaseComponent$ChatSerializer"); + } + try { + System.out.println("1"); + Object handle = Reflection.getHandle(player); + System.out.println("2"); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + System.out.println("3"); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + System.out.println("4"); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + System.out.println("5"); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + System.out.println("6"); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/80/e08df834032f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/80/e08df834032f001511a3ba75618c68e5 new file mode 100644 index 0000000..e1f6a66 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/80/e08df834032f001511a3ba75618c68e5 @@ -0,0 +1,78 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import de.inventivegames.TellRawAutoMessage.Reflection; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { //2015.07.20. + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + sendRawMessage(p, json); + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + if (majorVersion < 1.8 || (majorVersion == 1.8 && lesserVersion == 1)) { + chatSerializerClazz = Reflection.getNMSClass("ChatSerializer"); + } else { + chatSerializerClazz = Reflection.getNMSClass("IChatBaseComponent$ChatSerializer"); + } + try { + System.out.println("1"); + Object handle = Reflection.getHandle(player); + System.out.println("2"); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + System.out.println("3"); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + System.out.println("4"); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + System.out.println("5"); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + System.out.println("6"); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/83/60141ae3042f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/83/60141ae3042f001511a3ba75618c68e5 new file mode 100644 index 0000000..7e04469 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/83/60141ae3042f001511a3ba75618c68e5 @@ -0,0 +1,400 @@ +package tk.sznp.thebuttonautoflair; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.io.IOUtils; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.palmergames.bukkit.towny.object.Town; +import com.palmergames.bukkit.towny.object.WorldCoord; + +public class PluginMain extends JavaPlugin +{ //Translated to Java: 2015.07.15. + //A user, which flair isn't obtainable: + //https://www.reddit.com/r/thebutton/comments/31c32v/i_pressed_the_button_without_really_thinking/ + // Fired when plugin is first enabled + @Override + public void onEnable() + { + System.out.println("The Button Auto-flair Plugin by NorbiPeti (:P)"); + //System.out.println("Original C# version: http://pastebin.com/tX8xCPbp"); + //System.out.println("The Java version is... Also made by the same person."); + //System.out.println("With the help of StackOverflow and similar."); + /*catch(MalformedURLException e) + { + } + catch(IOException e) + { + }*/ + getServer().getPluginManager().registerEvents(new PlayerListener(), this); + //System.out.println("Registering commands..."); + this.getCommand("u").setExecutor(new Commands()); + this.getCommand("u").setUsage(this.getCommand("u").getUsage().replace('&', '§')); + try { + File file=new File("flairsaccepted.txt"); + if(file.exists()) + { + BufferedReader br=new BufferedReader(new FileReader("flairsaccepted.txt")); + String line; + while ((line = br.readLine()) != null) + { + AcceptedPlayers.add(line.replace("\n", "")); + } + br.close(); + } + file=new File("flairsignored.txt"); + if(file.exists()) + { + BufferedReader br=new BufferedReader(new FileReader("flairsignored.txt")); + String line; + while ((line = br.readLine()) != null) + { + IgnoredPlayers.add(line.replace("\n", "")); + } + br.close(); + } + file=new File("autoflairconfig.txt"); + if(file.exists()) + { + BufferedReader br=new BufferedReader(new FileReader(file)); + String line; + while((line=br.readLine())!=null) + { + String[] s=line.split(" "); + TownColors.put(s[0], s[1]); + } + br.close(); + } + } catch (IOException e) { + System.out.println("Error!\n"+e); + } + //System.out.println("Registering done."); + Runnable r=new Runnable(){public void run(){ThreadMethod();}}; + Thread t=new Thread(r); + t.start(); + } + Boolean stop=false; + // Fired when plugin is disabled + @Override + public void onDisable() + { + try + { + FileWriter fw; + fw = new FileWriter("flairsaccepted.txt"); + fw.close(); + fw = new FileWriter("flairsignored.txt"); + fw.close(); + } + catch(Exception e) + { + System.out.println("Error!\n"+e); + } + for(String player : AcceptedPlayers) + { + File file=new File("flairsaccepted.txt"); + try { + BufferedWriter bw=new BufferedWriter(new FileWriter(file, true)); + bw.write(player+"\n"); + bw.close(); + } catch (IOException e) { + System.out.println("Error!\n"+e); + } + } + for(String player : IgnoredPlayers) + { + File file=new File("flairsignored.txt"); + try { + BufferedWriter bw = new BufferedWriter(new FileWriter(file, true)); + bw.write(player+"\n"); + bw.close(); + } catch (IOException e) { + System.out.println("Error!\n"+e); + } + } + stop=true; + } + + public void ThreadMethod() //<-- 2015.07.16. + { + /*System.out.println("Sleeping for 5 seconds..."); //2015.07.20. + try { + Thread.sleep(5000); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } //2015.07.20.*/ + while(!stop) + { + try + { + String body=DownloadString("https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/autoflair_system_comment_your_minecraft_name_and/.json?limit=1000"); + JSONArray json=new JSONArray(body).getJSONObject(1).getJSONObject("data").getJSONArray("children"); + for(Object obj : json) + { + JSONObject item = (JSONObject)obj; + String author=item.getJSONObject("data").getString("author"); + String ign=item.getJSONObject("data").getString("body"); + int start = ign.indexOf("IGN:") + "IGN:".length(); + int end = ign.indexOf(' ', start); + if (end == -1 || end == start) + end=ign.indexOf('\n', start); //2015.07.15. + if (end == -1 || end == start) + ign = ign.substring(start); + else + ign = ign.substring(start, end); + ign = ign.trim(); + if(HasIGFlair(ign)) + continue; + //System.out.println("Author: "+author); + try { + Thread.sleep(10); + } catch(InterruptedException ex) { + Thread.currentThread().interrupt(); + } + String[] flairdata = DownloadString("http://karmadecay.com/thebutton-data.php?users=" + author).replace("\"", "").split(":"); + String flair; + if(flairdata.length > 1) //2015.07.15. + flair = flairdata[1]; + else + flair=""; + if (flair != "-1") + flair = flair + "s"; + else + flair = "non-presser"; + String flairclass; + //System.out.println("flairdata.length:"+flairdata.length); + if(flairdata.length>2) + flairclass = flairdata[2]; + else + flairclass="unknown"; + SetFlair(ign, flair, flairclass, author); + } + Thread.sleep(10000); + } + catch(Exception e) + { + System.out.println("Error!\n"+e); + } + } + } + + public String DownloadString(String urlstr) throws MalformedURLException, IOException + { + URL url = new URL(urlstr); + URLConnection con = url.openConnection(); + con.setRequestProperty("User-Agent", "TheButtonAutoFlair"); + InputStream in = con.getInputStream(); + String encoding = con.getContentEncoding(); + encoding = encoding == null ? "UTF-8" : encoding; + String body = IOUtils.toString(in, encoding); + in.close(); + return body; + } + + //It has to store offline player flairs too, therefore it can't use Player object + public static Map PlayerFlairs=new HashMap(); + public static Map PlayerUserNames=new HashMap(); + //public Map PlayerFlairs=new HashMap(); + public static ArrayList Players=new ArrayList(); + public static ArrayList AcceptedPlayers=new ArrayList(); //2015.07.16. + public static ArrayList IgnoredPlayers=new ArrayList(); //2015.07.16. + //public static Map PlayerTowns=new HashMap(); //2015.07.20. + public static Map TownColors=new HashMap(); //2015.07.20. + public Boolean HasIGFlair(String playername) + { + /*Player player=null; + for(Player p : Players) + { + if(p.getName()==playername) + { + player=p; + break; + } + } + if(player==null) + return false;*/ + return PlayerFlairs.containsKey(playername); + } + + public void SetFlair(String playername, String text, String flairclass, String username) + { + String finalflair; + switch(flairclass) + { + case "press-1": + finalflair="§c("+text+")§r"; + break; + case "press-2": + finalflair="§6("+text+")§r"; + break; + case "press-3": + finalflair="§e("+text+")§r"; + break; + case "press-4": + finalflair="§a("+text+")§r"; + break; + case "press-5": + finalflair="§9("+text+")§r"; + break; + case "press-6": + finalflair="§5("+text+")§r"; + break; + case "no-press": + finalflair="§7(non-pr.)§r"; + break; + case "cheater": + finalflair="§5("+text+")§r"; + break; + default: + finalflair=""; + break; + } + if(finalflair.length()==0) //<-- 2015.07.20. + return; + PlayerFlairs.put(playername, finalflair); + PlayerUserNames.put(playername, username); + /*for(Player player : Players) + { + if(player.getName()==playername) + { + PlayerFlairs.put(player, finalflair); + break; + } + }*/ + //System.out.println("SetFlair - playername: "+playername+" text: "+text+" flairclass: "+flairclass); + System.out.println("Added new flair to "+playername+": "+finalflair); + for(Player player : Players) + { + //System.out.println("Online player: "+player.getName()); + //System.out.println("player.getName ("+player.getName()+") == playername ("+playername+"): "+(player.getName()==playername)); + if(player.getName().equals(playername)) + { + //System.out.println("DisplayName: "+player.getDisplayName()); + //player.setDisplayName(player.getDisplayName()+finalflair); + AppendPlayerDisplayFlair(player, username, finalflair); + //System.out.println("DisplayName: "+player.getDisplayName()); + break; + } + } + } + + public static String GetFlair(Player player) + { //2015.07.16. + String flair=PlayerFlairs.get(player.getName()); + return flair==null ? "" : flair; + } + + public static void AppendPlayerDisplayFlair(Player player, String username, String flair) + { + if(IgnoredPlayers.contains(player.getName())) + return; + if(AcceptedPlayers.contains(player.getName())) + //player.setDisplayName(player.getDisplayName()+flair); + AppendPlayerDisplayFlairFinal(player, flair); //2015.07.20. + else + player.sendMessage("§9Are you Reddit user "+username+"?§r §6Type /u accept or /u ignore§r"); + } + + public static void AppendPlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + //System.out.println("A"); + String color = GetColorForTown(GetPlayerTown(player)); //TO!DO: Multiple colors put on first capital letters + if(color!="") + { + String[] colors = color.substring(1).split("§"); + String displayname=player.getDisplayName(); + ArrayList Positions=new ArrayList<>(); + //System.out.println("B"); + for(int i=0; i=colors.length) + { + //System.out.println("D"); + int x=0; + for(int i=0; i towns = TownyUniverse.getDataSource().getTowns(); + try { + Town town = WorldCoord.parseWorldCoord(player).getTownBlock().getTown(); + return town.getName(); + } catch (Exception e) { + return ""; + } + } + + public static void RemovePlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + String color = GetColorForTown(GetPlayerTown(player)); + String dname=player.getDisplayName(); + player.setDisplayName(dname.substring(dname.indexOf(color)+3, dname.indexOf(flair))); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/83/705f6955012f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/83/705f6955012f001511a3ba75618c68e5 new file mode 100644 index 0000000..a8af32e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/83/705f6955012f001511a3ba75618c68e5 @@ -0,0 +1,63 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + p.sendTitle(json, ""; + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + try { + System.out.println("1"); + Object handle = Reflection.getHandle(player); + System.out.println("2"); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + System.out.println("3"); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + System.out.println("4"); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + System.out.println("5"); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + System.out.println("6"); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/8d/60933f62ff2e001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/8d/60933f62ff2e001511a3ba75618c68e5 new file mode 100644 index 0000000..17fc5c8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/8d/60933f62ff2e001511a3ba75618c68e5 @@ -0,0 +1,49 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + try { + System.out.println("1"); + Object handle = Reflection.getHandle(player); + System.out.println("2"); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + System.out.prinln("3"); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + System.out.prinln("4"); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + System.out.prinln("5"); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/92/e057acf2fe2e001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/92/e057acf2fe2e001511a3ba75618c68e5 new file mode 100644 index 0000000..4a2d255 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/92/e057acf2fe2e001511a3ba75618c68e5 @@ -0,0 +1,47 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + p.sendRawMessage("[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"); + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i getNMSClass(String className) { + String fullName = "net.minecraft.server." + getVersion() + className; + Class clazz = null; + try { + clazz = Class.forName(fullName); + } catch (Exception e) { + e.printStackTrace(); + } + return clazz; + } + + public static Class getOBCClass(String className) { + String fullName = "org.bukkit.craftbukkit." + getVersion() + className; + Class clazz = null; + try { + clazz = Class.forName(fullName); + } catch (Exception e) { + e.printStackTrace(); + } + return clazz; + } + + public static Object getHandle(Object obj) { + try { + return getMethod(obj.getClass(), "getHandle").invoke(obj); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static Field getField(Class clazz, String name) { + try { + Field field = clazz.getDeclaredField(name); + field.setAccessible(true); + return field; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static Method getMethod(Class clazz, String name, Class... args) { + for (Method m : clazz.getMethods()) + if (m.getName().equals(name) && (args.length == 0 || ClassListEqual(args, m.getParameterTypes()))) { + m.setAccessible(true); + return m; + } + return null; + } + + public static boolean ClassListEqual(Class[] l1, Class[] l2) { + boolean equal = true; + if (l1.length != l2.length) + return false; + for (int i = 0; i < l1.length; i++) + if (l1[i] != l2[i]) { + equal = false; + break; + } + return equal; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/97/6096c38cfd2e001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/97/6096c38cfd2e001511a3ba75618c68e5 new file mode 100644 index 0000000..e0f927c --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/97/6096c38cfd2e001511a3ba75618c68e5 @@ -0,0 +1,47 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + p.sendMessage("§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to this thread."); + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i getNMSClass(String className) { + String fullName = "net.minecraft.server." + getVersion() + className; + Class clazz = null; + try { + clazz = Class.forName(fullName); + } catch (Exception e) { + e.printStackTrace(); + } + return clazz; + } + + public static Class getOBCClass(String className) { + String fullName = "org.bukkit.craftbukkit." + getVersion() + className; + Class clazz = null; + try { + clazz = Class.forName(fullName); + } catch (Exception e) { + e.printStackTrace(); + } + return clazz; + } + + public static Object getHandle(Object obj) { + try { + return getMethod(obj.getClass(), "getHandle").invoke(obj); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static Field getField(Class clazz, String name) { + try { + Field field = clazz.getDeclaredField(name); + field.setAccessible(true); + return field; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static Method getMethod(Class clazz, String name, Class... args) { + for (Method m : clazz.getMethods()) + if (m.getName().equals(name) && (args.length == 0 || ClassListEqual(args, m.getParameterTypes()))) { + m.setAccessible(true); + return m; + } + return null; + } + + public static boolean ClassListEqual(Class[] l1, Class[] l2) { + boolean equal = true; + if (l1.length != l2.length) + return false; + for (int i = 0; i < l1.length; i++) + if (l1[i] != l2[i]) { + equal = false; + break; + } + return equal; + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/9f/e052f695fd2e001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/9f/e052f695fd2e001511a3ba75618c68e5 new file mode 100644 index 0000000..9d447d8 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/9f/e052f695fd2e001511a3ba75618c68e5 @@ -0,0 +1,47 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + p.sendRawMessage("§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to this thread.§r"); + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i 1) //2015.07.15. + flair = flairdata[1]; + else + flair=""; + if (flair != "-1") + flair = flair + "s"; + else + flair = "non-presser"; + String flairclass; + //System.out.println("flairdata.length:"+flairdata.length); + if(flairdata.length>2) + flairclass = flairdata[2]; + else + flairclass="unknown"; + SetFlair(ign, flair, flairclass, author); + } + Thread.sleep(10000); + } + catch(Exception e) + { + System.out.println("Error!\n"+e); + } + } + } + + public String DownloadString(String urlstr) throws MalformedURLException, IOException + { + URL url = new URL(urlstr); + URLConnection con = url.openConnection(); + con.setRequestProperty("User-Agent", "TheButtonAutoFlair"); + InputStream in = con.getInputStream(); + String encoding = con.getContentEncoding(); + encoding = encoding == null ? "UTF-8" : encoding; + String body = IOUtils.toString(in, encoding); + in.close(); + return body; + } + + //It has to store offline player flairs too, therefore it can't use Player object + public static Map PlayerFlairs=new HashMap(); + public static Map PlayerUserNames=new HashMap(); + //public Map PlayerFlairs=new HashMap(); + public static ArrayList Players=new ArrayList(); + public static ArrayList AcceptedPlayers=new ArrayList(); //2015.07.16. + public static ArrayList IgnoredPlayers=new ArrayList(); //2015.07.16. + //public static Map PlayerTowns=new HashMap(); //2015.07.20. + public static Map TownColors=new HashMap(); //2015.07.20. + public Boolean HasIGFlair(String playername) + { + /*Player player=null; + for(Player p : Players) + { + if(p.getName()==playername) + { + player=p; + break; + } + } + if(player==null) + return false;*/ + return PlayerFlairs.containsKey(playername); + } + + public void SetFlair(String playername, String text, String flairclass, String username) + { + String finalflair; + switch(flairclass) + { + case "press-1": + finalflair="§c("+text+")§r"; + break; + case "press-2": + finalflair="§6("+text+")§r"; + break; + case "press-3": + finalflair="§e("+text+")§r"; + break; + case "press-4": + finalflair="§a("+text+")§r"; + break; + case "press-5": + finalflair="§9("+text+")§r"; + break; + case "press-6": + finalflair="§5("+text+")§r"; + break; + case "no-press": + finalflair="§7(non-pr.)§r"; + break; + case "cheater": + finalflair="§5("+text+")§r"; + break; + default: + finalflair=""; + break; + } + if(finalflair.length()==0) //<-- 2015.07.20. + return; + PlayerFlairs.put(playername, finalflair); + PlayerUserNames.put(playername, username); + /*for(Player player : Players) + { + if(player.getName()==playername) + { + PlayerFlairs.put(player, finalflair); + break; + } + }*/ + //System.out.println("SetFlair - playername: "+playername+" text: "+text+" flairclass: "+flairclass); + System.out.println("Added new flair to "+playername+": "+finalflair); + for(Player player : Players) + { + //System.out.println("Online player: "+player.getName()); + //System.out.println("player.getName ("+player.getName()+") == playername ("+playername+"): "+(player.getName()==playername)); + if(player.getName().equals(playername)) + { + //System.out.println("DisplayName: "+player.getDisplayName()); + //player.setDisplayName(player.getDisplayName()+finalflair); + AppendPlayerDisplayFlair(player, username, finalflair); + //System.out.println("DisplayName: "+player.getDisplayName()); + break; + } + } + } + + public static String GetFlair(Player player) + { //2015.07.16. + String flair=PlayerFlairs.get(player.getName()); + return flair==null ? "" : flair; + } + + public static void AppendPlayerDisplayFlair(Player player, String username, String flair) + { + if(IgnoredPlayers.contains(player.getName())) + return; + if(AcceptedPlayers.contains(player.getName())) + //player.setDisplayName(player.getDisplayName()+flair); + AppendPlayerDisplayFlairFinal(player, flair); //2015.07.20. + else + player.sendMessage("§9Are you Reddit user "+username+"?§r §6Type /u accept or /u ignore§r"); + } + + public static void AppendPlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + //System.out.println("A"); + String color = GetColorForTown(GetPlayerTown(player)); //TO!DO: Multiple colors put on first capital letters + if(color!="") + { + String[] colors = color.substring(1).split("§"); + String displayname=player.getDisplayName(); + ArrayList Positions=new ArrayList<>(); + //System.out.println("B"); + for(int i=0; i=colors.length) + { + //System.out.println("D"); + int x=0; + for(int i=0; i towns = TownyUniverse.getDataSource().getTowns(); + try { + Town town = WorldCoord.parseWorldCoord(player).getTownBlock().getTown(); + return town.getName(); + } catch (Exception e) { + return ""; + } + } + + public static void RemovePlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + String color = GetColorForTown(GetPlayerTown(player)); + String dname=player.getDisplayName(); + player.setDisplayName(dname.substring(dname.indexOf(color)+3, dname.indexOf(flair))); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a0/602b122cfd2e001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/602b122cfd2e001511a3ba75618c68e5 new file mode 100644 index 0000000..c5f649b --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/602b122cfd2e001511a3ba75618c68e5 @@ -0,0 +1,397 @@ +package tk.sznp.thebuttonautoflair; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.io.IOUtils; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.palmergames.bukkit.towny.object.Town; +import com.palmergames.bukkit.towny.object.WorldCoord; + +public class PluginMain extends JavaPlugin +{ //Translated to Java: 2015.07.15. + //A user, which flair isn't obtainable: + //https://www.reddit.com/r/thebutton/comments/31c32v/i_pressed_the_button_without_really_thinking/ + // Fired when plugin is first enabled + @Override + public void onEnable() + { + System.out.println("The Button Auto-flair Plugin by NorbiPeti (:P)"); + //System.out.println("Original C# version: http://pastebin.com/tX8xCPbp"); + //System.out.println("The Java version is... Also made by the same person."); + //System.out.println("With the help of StackOverflow and similar."); + /*catch(MalformedURLException e) + { + } + catch(IOException e) + { + }*/ + getServer().getPluginManager().registerEvents(new PlayerListener(), this); + //System.out.println("Registering commands..."); + this.getCommand("u").setExecutor(new Commands()); + this.getCommand("u").setUsage(this.getCommand("u").getUsage().replace('&', '§')); + try { + File file=new File("flairsaccepted.txt"); + if(file.exists()) + { + BufferedReader br=new BufferedReader(new FileReader("flairsaccepted.txt")); + String line; + while ((line = br.readLine()) != null) + { + AcceptedPlayers.add(line.replace("\n", "")); + } + br.close(); + } + file=new File("flairsignored.txt"); + if(file.exists()) + { + BufferedReader br=new BufferedReader(new FileReader("flairsignored.txt")); + String line; + while ((line = br.readLine()) != null) + { + IgnoredPlayers.add(line.replace("\n", "")); + } + br.close(); + } + file=new File("autoflairconfig.txt"); + if(file.exists()) + { + BufferedReader br=new BufferedReader(new FileReader(file)); + String line; + while((line=br.readLine())!=null) + { + String[] s=line.split(" "); + TownColors.put(s[0], s[1]); + } + br.close(); + } + } catch (IOException e) { + System.out.println("Error!\n"+e); + } + //System.out.println("Registering done."); + Runnable r=new Runnable(){public void run(){ThreadMethod();}}; + Thread t=new Thread(r); + t.start(); + } + Boolean stop=false; + // Fired when plugin is disabled + @Override + public void onDisable() + { + try + { + FileWriter fw; + fw = new FileWriter("flairsaccepted.txt"); + fw.close(); + fw = new FileWriter("flairsignored.txt"); + fw.close(); + } + catch(Exception e) + { + System.out.println("Error!\n"+e); + } + for(String player : AcceptedPlayers) + { + File file=new File("flairsaccepted.txt"); + try { + BufferedWriter bw=new BufferedWriter(new FileWriter(file, true)); + bw.write(player+"\n"); + bw.close(); + } catch (IOException e) { + System.out.println("Error!\n"+e); + } + } + for(String player : IgnoredPlayers) + { + File file=new File("flairsignored.txt"); + try { + BufferedWriter bw = new BufferedWriter(new FileWriter(file, true)); + bw.write(player+"\n"); + bw.close(); + } catch (IOException e) { + System.out.println("Error!\n"+e); + } + } + stop=true; + } + + public void ThreadMethod() //<-- 2015.07.16. + { + /*System.out.println("Sleeping for 5 seconds..."); //2015.07.20. + try { + Thread.sleep(5000); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } //2015.07.20.*/ + while(!stop) + { + try + { + String body=DownloadString("https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/autoflair_system_comment_your_minecraft_name_and/.json?limit=1000"); + JSONArray json=new JSONArray(body).getJSONObject(1).getJSONObject("data").getJSONArray("children"); + for(Object obj : json) + { + JSONObject item = (JSONObject)obj; + String author=item.getJSONObject("data").getString("author"); + String ign=item.getJSONObject("data").getString("body"); + int start = ign.indexOf("IGN:") + "IGN:".length(); + int end = ign.indexOf(' ', start); + if (end == -1 || end == start) + end=ign.indexOf('\n', start); //2015.07.15. + if (end == -1 || end == start) + ign = ign.substring(start); + else + ign = ign.substring(start, end); + ign = ign.trim(); + if(HasIGFlair(ign)) + continue; + //System.out.println("Author: "+author); + try { + Thread.sleep(10); + } catch(InterruptedException ex) { + Thread.currentThread().interrupt(); + } + String[] flairdata = DownloadString("http://karmadecay.com/thebutton-data.php?users=" + author).replace("\"", "").split(":"); + String flair; + if(flairdata.length > 1) //2015.07.15. + flair = flairdata[1]; + else + flair=""; + if (flair != "-1") + flair = flair + "s"; + else + flair = "non-presser"; + String flairclass; + //System.out.println("flairdata.length:"+flairdata.length); + if(flairdata.length>2) + flairclass = flairdata[2]; + else + flairclass="unknown"; + SetFlair(ign, flair, flairclass, author); + } + Thread.sleep(10000); + } + catch(Exception e) + { + System.out.println("Error!\n"+e); + } + } + } + + public String DownloadString(String urlstr) throws MalformedURLException, IOException + { + URL url = new URL(urlstr); + URLConnection con = url.openConnection(); + con.setRequestProperty("User-Agent", "TheButtonAutoFlair"); + InputStream in = con.getInputStream(); + String encoding = con.getContentEncoding(); + encoding = encoding == null ? "UTF-8" : encoding; + String body = IOUtils.toString(in, encoding); + in.close(); + return body; + } + + //It has to store offline player flairs too, therefore it can't use Player object + public static Map PlayerFlairs=new HashMap(); + public static Map PlayerUserNames=new HashMap(); + //public Map PlayerFlairs=new HashMap(); + public static ArrayList Players=new ArrayList(); + public static ArrayList AcceptedPlayers=new ArrayList(); //2015.07.16. + public static ArrayList IgnoredPlayers=new ArrayList(); //2015.07.16. + //public static Map PlayerTowns=new HashMap(); //2015.07.20. + public static Map TownColors=new HashMap(); //2015.07.20. + public Boolean HasIGFlair(String playername) + { + /*Player player=null; + for(Player p : Players) + { + if(p.getName()==playername) + { + player=p; + break; + } + } + if(player==null) + return false;*/ + return PlayerFlairs.containsKey(playername); + } + + public void SetFlair(String playername, String text, String flairclass, String username) + { + String finalflair; + switch(flairclass) + { + case "press-1": + finalflair="§c("+text+")§r"; + break; + case "press-2": + finalflair="§6("+text+")§r"; + break; + case "press-3": + finalflair="§e("+text+")§r"; + break; + case "press-4": + finalflair="§a("+text+")§r"; + break; + case "press-5": + finalflair="§9("+text+")§r"; + break; + case "press-6": + finalflair="§5("+text+")§r"; + break; + case "no-press": + finalflair="§7(non-pr.)§r"; + break; + case "cheater": + finalflair="§5("+text+")§r"; + break; + default: + finalflair=""; + break; + } + if(finalflair.length()==0) //<-- 2015.07.20. + return; + PlayerFlairs.put(playername, finalflair); + PlayerUserNames.put(playername, username); + /*for(Player player : Players) + { + if(player.getName()==playername) + { + PlayerFlairs.put(player, finalflair); + break; + } + }*/ + //System.out.println("SetFlair - playername: "+playername+" text: "+text+" flairclass: "+flairclass); + System.out.println("Added new flair to "+playername+": "+finalflair); + for(Player player : Players) + { + //System.out.println("Online player: "+player.getName()); + //System.out.println("player.getName ("+player.getName()+") == playername ("+playername+"): "+(player.getName()==playername)); + if(player.getName().equals(playername)) + { + //System.out.println("DisplayName: "+player.getDisplayName()); + //player.setDisplayName(player.getDisplayName()+finalflair); + AppendPlayerDisplayFlair(player, username, finalflair); + //System.out.println("DisplayName: "+player.getDisplayName()); + break; + } + } + } + + public static String GetFlair(Player player) + { //2015.07.16. + String flair=PlayerFlairs.get(player.getName()); + return flair==null ? "" : flair; + } + + public static void AppendPlayerDisplayFlair(Player player, String username, String flair) + { + if(IgnoredPlayers.contains(player.getName())) + return; + if(AcceptedPlayers.contains(player.getName())) + //player.setDisplayName(player.getDisplayName()+flair); + AppendPlayerDisplayFlairFinal(player, flair); //2015.07.20. + else + player.sendMessage("§9Are you Reddit user "+username+"?§r §6Type /u accept or /u ignore§r"); + } + + public static void AppendPlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + //System.out.println("A"); + String color = GetColorForTown(GetPlayerTown(player)); //TO!DO: Multiple colors put on first capital letters + String[] colors = color.substring(1).split("§"); + String displayname=player.getDisplayName(); + ArrayList Positions=new ArrayList<>(); + //System.out.println("B"); + for(int i=0; i=colors.length) + { + //System.out.println("D"); + int x=0; + for(int i=0; i towns = TownyUniverse.getDataSource().getTowns(); + try { + Town town = WorldCoord.parseWorldCoord(player).getTownBlock().getTown(); + return town.getName(); + } catch (Exception e) { + return ""; + } + } + + public static void RemovePlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + String color = GetColorForTown(GetPlayerTown(player)); + String dname=player.getDisplayName(); + player.setDisplayName(dname.substring(dname.indexOf(color)+3, dname.indexOf(flair))); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a0/e0ec5f84012f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/e0ec5f84012f001511a3ba75618c68e5 new file mode 100644 index 0000000..978ff27 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a0/e0ec5f84012f001511a3ba75618c68e5 @@ -0,0 +1,67 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import de.inventivegames.TellRawAutoMessage.Reflection; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + sendRawMessage(p, json); + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + try { + Object handle = Reflection.getHandle(player); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/a9/6080831f022f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/a9/6080831f022f001511a3ba75618c68e5 new file mode 100644 index 0000000..09aad10 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/a9/6080831f022f001511a3ba75618c68e5 @@ -0,0 +1,68 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import de.inventivegames.TellRawAutoMessage.Reflection; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { //2015.07.20. + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + sendRawMessage(p, json); + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + try { + System.out.prinln() + Object handle = Reflection.getHandle(player); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ad/e0eec742012f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/e0eec742012f001511a3ba75618c68e5 new file mode 100644 index 0000000..99186fb --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ad/e0eec742012f001511a3ba75618c68e5 @@ -0,0 +1,4 @@ + +public class Reflection { + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/af/708b111d012f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/af/708b111d012f001511a3ba75618c68e5 new file mode 100644 index 0000000..cdae381 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/af/708b111d012f001511a3ba75618c68e5 @@ -0,0 +1,65 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + p.sendTitle(json, ""; + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + try { + Object handle = Reflection.getHandle(player); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/b4/709af161ff2e001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/b4/709af161ff2e001511a3ba75618c68e5 new file mode 100644 index 0000000..be69dbf --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/b4/709af161ff2e001511a3ba75618c68e5 @@ -0,0 +1,47 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + p.sendRawMessage("[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"); + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i 1) //2015.07.15. + flair = flairdata[1]; + else + flair=""; + if (flair != "-1") + flair = flair + "s"; + else + flair = "non-presser"; + String flairclass; + //System.out.println("flairdata.length:"+flairdata.length); + if(flairdata.length>2) + flairclass = flairdata[2]; + else + flairclass="unknown"; + SetFlair(ign, flair, flairclass, author); + } + Thread.sleep(10000); + } + catch(Exception e) + { + System.out.println("Error!\n"+e); + } + } + } + + public String DownloadString(String urlstr) throws MalformedURLException, IOException + { + URL url = new URL(urlstr); + URLConnection con = url.openConnection(); + con.setRequestProperty("User-Agent", "TheButtonAutoFlair"); + InputStream in = con.getInputStream(); + String encoding = con.getContentEncoding(); + encoding = encoding == null ? "UTF-8" : encoding; + String body = IOUtils.toString(in, encoding); + in.close(); + return body; + } + + //It has to store offline player flairs too, therefore it can't use Player object + public static Map PlayerFlairs=new HashMap(); + public static Map PlayerUserNames=new HashMap(); + //public Map PlayerFlairs=new HashMap(); + public static ArrayList Players=new ArrayList(); + public static ArrayList AcceptedPlayers=new ArrayList(); //2015.07.16. + public static ArrayList IgnoredPlayers=new ArrayList(); //2015.07.16. + //public static Map PlayerTowns=new HashMap(); //2015.07.20. + public static Map TownColors=new HashMap(); //2015.07.20. + public Boolean HasIGFlair(String playername) + { + /*Player player=null; + for(Player p : Players) + { + if(p.getName()==playername) + { + player=p; + break; + } + } + if(player==null) + return false;*/ + return PlayerFlairs.containsKey(playername); + } + + public void SetFlair(String playername, String text, String flairclass, String username) + { + String finalflair; + switch(flairclass) + { + case "press-1": + finalflair="§c("+text+")§r"; + break; + case "press-2": + finalflair="§6("+text+")§r"; + break; + case "press-3": + finalflair="§e("+text+")§r"; + break; + case "press-4": + finalflair="§a("+text+")§r"; + break; + case "press-5": + finalflair="§9("+text+")§r"; + break; + case "press-6": + finalflair="§5("+text+")§r"; + break; + case "no-press": + finalflair="§7(non-pr.)§r"; + break; + case "cheater": + finalflair="§5("+text+")§r"; + break; + default: + finalflair=""; + break; + } + if(finalflair.length()==0) //<-- 2015.07.20. + return; + PlayerFlairs.put(playername, finalflair); + PlayerUserNames.put(playername, username); + /*for(Player player : Players) + { + if(player.getName()==playername) + { + PlayerFlairs.put(player, finalflair); + break; + } + }*/ + //System.out.println("SetFlair - playername: "+playername+" text: "+text+" flairclass: "+flairclass); + System.out.println("Added new flair to "+playername+": "+finalflair); + for(Player player : Players) + { + //System.out.println("Online player: "+player.getName()); + //System.out.println("player.getName ("+player.getName()+") == playername ("+playername+"): "+(player.getName()==playername)); + if(player.getName().equals(playername)) + { + //System.out.println("DisplayName: "+player.getDisplayName()); + //player.setDisplayName(player.getDisplayName()+finalflair); + AppendPlayerDisplayFlair(player, username, finalflair); + //System.out.println("DisplayName: "+player.getDisplayName()); + break; + } + } + } + + public static String GetFlair(Player player) + { //2015.07.16. + String flair=PlayerFlairs.get(player.getName()); + return flair==null ? "" : flair; + } + + public static void AppendPlayerDisplayFlair(Player player, String username, String flair) + { + if(IgnoredPlayers.contains(player.getName())) + return; + if(AcceptedPlayers.contains(player.getName())) + //player.setDisplayName(player.getDisplayName()+flair); + AppendPlayerDisplayFlairFinal(player, flair); //2015.07.20. + else + player.sendMessage("§9Are you Reddit user "+username+"?§r §6Type /u accept or /u ignore§r"); + } + + public static void AppendPlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + //System.out.println("A"); + String color = GetColorForTown(GetPlayerTown(player)); //TO!DO: Multiple colors put on first capital letters + String[] colors = color.substring(1).split("§"); + String displayname=player.getDisplayName(); + ArrayList Positions=new ArrayList<>(); + //System.out.println("B"); + for(int i=0; i=colors.length) + { + //System.out.println("D"); + int x=0; + for(int i=0; i towns = TownyUniverse.getDataSource().getTowns(); + try { + Town town = WorldCoord.parseWorldCoord(player).getTownBlock().getTown(); + return town.getName(); + } catch (Exception e) { + return ""; + } + } + + public static void RemovePlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + String color = GetColorForTown(GetPlayerTown(player)); + String dname=player.getDisplayName(); + player.setDisplayName(dname.substring(dname.indexOf(color)+3, dname.indexOf(flair))); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/c7/6023b583002f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/c7/6023b583002f001511a3ba75618c68e5 new file mode 100644 index 0000000..0b43c2e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/c7/6023b583002f001511a3ba75618c68e5 @@ -0,0 +1,51 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + Packet packet = new PacketPlayOutChat(ChatSerializer.a(json), true); + ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet); + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i 1) //2015.07.15. + flair = flairdata[1]; + else + flair=""; + if (flair != "-1") + flair = flair + "s"; + else + flair = "non-presser"; + String flairclass; + //System.out.println("flairdata.length:"+flairdata.length); + if(flairdata.length>2) + flairclass = flairdata[2]; + else + flairclass="unknown"; + SetFlair(ign, flair, flairclass, author); + } + Thread.sleep(10000); + } + catch(Exception e) + { + System.out.println("Error!\n"+e); + } + } + } + + public String DownloadString(String urlstr) throws MalformedURLException, IOException + { + URL url = new URL(urlstr); + URLConnection con = url.openConnection(); + con.setRequestProperty("User-Agent", "TheButtonAutoFlair"); + InputStream in = con.getInputStream(); + String encoding = con.getContentEncoding(); + encoding = encoding == null ? "UTF-8" : encoding; + String body = IOUtils.toString(in, encoding); + in.close(); + return body; + } + + //It has to store offline player flairs too, therefore it can't use Player object + public static Map PlayerFlairs=new HashMap(); + public static Map PlayerUserNames=new HashMap(); + //public Map PlayerFlairs=new HashMap(); + public static ArrayList Players=new ArrayList(); + public static ArrayList AcceptedPlayers=new ArrayList(); //2015.07.16. + public static ArrayList IgnoredPlayers=new ArrayList(); //2015.07.16. + //public static Map PlayerTowns=new HashMap(); //2015.07.20. + public static Map TownColors=new HashMap(); //2015.07.20. + public Boolean HasIGFlair(String playername) + { + /*Player player=null; + for(Player p : Players) + { + if(p.getName()==playername) + { + player=p; + break; + } + } + if(player==null) + return false;*/ + return PlayerFlairs.containsKey(playername); + } + + public void SetFlair(String playername, String text, String flairclass, String username) + { + String finalflair; + switch(flairclass) + { + case "press-1": + finalflair="§c("+text+")§r"; + break; + case "press-2": + finalflair="§6("+text+")§r"; + break; + case "press-3": + finalflair="§e("+text+")§r"; + break; + case "press-4": + finalflair="§a("+text+")§r"; + break; + case "press-5": + finalflair="§9("+text+")§r"; + break; + case "press-6": + finalflair="§5("+text+")§r"; + break; + case "no-press": + finalflair="§7(non-pr.)§r"; + break; + case "cheater": + finalflair="§5("+text+")§r"; + break; + default: + finalflair=""; + break; + } + if(finalflair.length()==0) //<-- 2015.07.20. + return; + PlayerFlairs.put(playername, finalflair); + PlayerUserNames.put(playername, username); + /*for(Player player : Players) + { + if(player.getName()==playername) + { + PlayerFlairs.put(player, finalflair); + break; + } + }*/ + //System.out.println("SetFlair - playername: "+playername+" text: "+text+" flairclass: "+flairclass); + System.out.println("Added new flair to "+playername+": "+finalflair); + for(Player player : Players) + { + //System.out.println("Online player: "+player.getName()); + //System.out.println("player.getName ("+player.getName()+") == playername ("+playername+"): "+(player.getName()==playername)); + if(player.getName().equals(playername)) + { + //System.out.println("DisplayName: "+player.getDisplayName()); + //player.setDisplayName(player.getDisplayName()+finalflair); + AppendPlayerDisplayFlair(player, username, finalflair); + //System.out.println("DisplayName: "+player.getDisplayName()); + break; + } + } + } + + public static String GetFlair(Player player) + { //2015.07.16. + String flair=PlayerFlairs.get(player.getName()); + return flair==null ? "" : flair; + } + + public static void AppendPlayerDisplayFlair(Player player, String username, String flair) + { + if(IgnoredPlayers.contains(player.getName())) + return; + if(AcceptedPlayers.contains(player.getName())) + //player.setDisplayName(player.getDisplayName()+flair); + AppendPlayerDisplayFlairFinal(player, flair); //2015.07.20. + else + player.sendMessage("§9Are you Reddit user "+username+"?§r §6Type /u accept or /u ignore§r"); + } + + public static void AppendPlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + //System.out.println("A"); + String color = GetColorForTown(GetPlayerTown(player)); //TO!DO: Multiple colors put on first capital letters + String[] colors = color.substring(1).split("§"); + String displayname=player.getDisplayName(); + ArrayList Positions=new ArrayList<>(); + //System.out.println("B"); + for(int i=0; i=colors.length) + { + //System.out.println("D"); + int x=0; + for(int i=0; i towns = TownyUniverse.getDataSource().getTowns(); + try { + Town town = WorldCoord.parseWorldCoord(player).getTownBlock().getTown(); + return town.getName(); + } catch (Exception e) { + return ""; + } + } + + public static void RemovePlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + String color = GetColorForTown(GetPlayerTown(player)); + String dname=player.getDisplayName(); + player.setDisplayName(dname.substring(dname.indexOf(color)+3, dname.indexOf(flair))); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/cb/f0ea1f21052f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/cb/f0ea1f21052f001511a3ba75618c68e5 new file mode 100644 index 0000000..93cc476 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/cb/f0ea1f21052f001511a3ba75618c68e5 @@ -0,0 +1,74 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import de.inventivegames.TellRawAutoMessage.Reflection; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { //2015.07.20. + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + sendRawMessage(p, json); + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("IChatBaseComponent$ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) + { + try { + System.out.println("1"); + Object handle = Reflection.getHandle(player); + System.out.println("2"); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + System.out.println("3"); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + System.out.println("4"); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + System.out.println("5"); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + System.out.println("6"); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/d/f0722227012f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/d/f0722227012f001511a3ba75618c68e5 new file mode 100644 index 0000000..a8af32e --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/d/f0722227012f001511a3ba75618c68e5 @@ -0,0 +1,63 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + p.sendTitle(json, ""; + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i 1) //2015.07.15. + flair = flairdata[1]; + else + flair=""; + if (flair != "-1") + flair = flair + "s"; + else + flair = "non-presser"; + String flairclass; + //System.out.println("flairdata.length:"+flairdata.length); + if(flairdata.length>2) + flairclass = flairdata[2]; + else + flairclass="unknown"; + SetFlair(ign, flair, flairclass, author); + } + Thread.sleep(10000); + } + catch(Exception e) + { + System.out.println("Error!\n"+e); + } + } + } + + public String DownloadString(String urlstr) throws MalformedURLException, IOException + { + URL url = new URL(urlstr); + URLConnection con = url.openConnection(); + con.setRequestProperty("User-Agent", "TheButtonAutoFlair"); + InputStream in = con.getInputStream(); + String encoding = con.getContentEncoding(); + encoding = encoding == null ? "UTF-8" : encoding; + String body = IOUtils.toString(in, encoding); + in.close(); + return body; + } + + //It has to store offline player flairs too, therefore it can't use Player object + public static Map PlayerFlairs=new HashMap(); + public static Map PlayerUserNames=new HashMap(); + //public Map PlayerFlairs=new HashMap(); + public static ArrayList Players=new ArrayList(); + public static ArrayList AcceptedPlayers=new ArrayList(); //2015.07.16. + public static ArrayList IgnoredPlayers=new ArrayList(); //2015.07.16. + //public static Map PlayerTowns=new HashMap(); //2015.07.20. + public static Map TownColors=new HashMap(); //2015.07.20. + public Boolean HasIGFlair(String playername) + { + /*Player player=null; + for(Player p : Players) + { + if(p.getName()==playername) + { + player=p; + break; + } + } + if(player==null) + return false;*/ + return PlayerFlairs.containsKey(playername); + } + + public void SetFlair(String playername, String text, String flairclass, String username) + { + String finalflair; + switch(flairclass) + { + case "press-1": + finalflair="§c("+text+")§r"; + break; + case "press-2": + finalflair="§6("+text+")§r"; + break; + case "press-3": + finalflair="§e("+text+")§r"; + break; + case "press-4": + finalflair="§a("+text+")§r"; + break; + case "press-5": + finalflair="§9("+text+")§r"; + break; + case "press-6": + finalflair="§5("+text+")§r"; + break; + case "no-press": + finalflair="§7(non-pr.)§r"; + break; + case "cheater": + finalflair="§5("+text+")§r"; + break; + default: + finalflair=""; + break; + } + if(finalflair.length()==0) //<-- 2015.07.20. + return; + PlayerFlairs.put(playername, finalflair); + PlayerUserNames.put(playername, username); + /*for(Player player : Players) + { + if(player.getName()==playername) + { + PlayerFlairs.put(player, finalflair); + break; + } + }*/ + //System.out.println("SetFlair - playername: "+playername+" text: "+text+" flairclass: "+flairclass); + System.out.println("Added new flair to "+playername+": "+finalflair); + for(Player player : Players) + { + //System.out.println("Online player: "+player.getName()); + //System.out.println("player.getName ("+player.getName()+") == playername ("+playername+"): "+(player.getName()==playername)); + if(player.getName().equals(playername)) + { + //System.out.println("DisplayName: "+player.getDisplayName()); + //player.setDisplayName(player.getDisplayName()+finalflair); + AppendPlayerDisplayFlair(player, username, finalflair); + //System.out.println("DisplayName: "+player.getDisplayName()); + break; + } + } + } + + public static String GetFlair(Player player) + { //2015.07.16. + String flair=PlayerFlairs.get(player.getName()); + return flair==null ? "" : flair; + } + + public static void AppendPlayerDisplayFlair(Player player, String username, String flair) + { + if(IgnoredPlayers.contains(player.getName())) + return; + if(AcceptedPlayers.contains(player.getName())) + //player.setDisplayName(player.getDisplayName()+flair); + AppendPlayerDisplayFlairFinal(player, flair); //2015.07.20. + else + player.sendMessage("§9Are you Reddit user "+username+"?§r §6Type /u accept or /u ignore§r"); + } + + public static void AppendPlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + //System.out.println("A"); + String color = GetColorForTown(GetPlayerTown(player)); //TO!DO: Multiple colors put on first capital letters + String[] colors = color.substring(1).split("§"); + String displayname=player.getDisplayName(); + ArrayList Positions=new ArrayList<>(); + //System.out.println("B"); + for(int i=0; i=colors.length) + { + //System.out.println("D"); + int x=0; + for(int i=0; i towns = TownyUniverse.getDataSource().getTowns(); + try { + Town town = WorldCoord.parseWorldCoord(player).getTownBlock().getTown(); + return town.getName(); + } catch (Exception e) { + return ""; + } + } + + public static void RemovePlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + String color = GetColorForTown(GetPlayerTown(player)); + String dname=player.getDisplayName(); + player.setDisplayName(dname.substring(dname.indexOf(color)+3, dname.indexOf(flair))); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/db/e0afd61c022f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/db/e0afd61c022f001511a3ba75618c68e5 new file mode 100644 index 0000000..57d6080 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/db/e0afd61c022f001511a3ba75618c68e5 @@ -0,0 +1,68 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import de.inventivegames.TellRawAutoMessage.Reflection; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { //2015.07.20. + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + sendRawMessage(p, json); + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + try { + System.out.println + Object handle = Reflection.getHandle(player); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/ea/d0facaee052f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/ea/d0facaee052f001511a3ba75618c68e5 new file mode 100644 index 0000000..009fd12 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/ea/d0facaee052f001511a3ba75618c68e5 @@ -0,0 +1,398 @@ +package tk.sznp.thebuttonautoflair; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.apache.commons.io.IOUtils; +import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; +import org.json.JSONArray; +import org.json.JSONObject; + +import com.palmergames.bukkit.towny.object.Town; +import com.palmergames.bukkit.towny.object.WorldCoord; + +public class PluginMain extends JavaPlugin +{ //Translated to Java: 2015.07.15. + //A user, which flair isn't obtainable: + //https://www.reddit.com/r/thebutton/comments/31c32v/i_pressed_the_button_without_really_thinking/ + // Fired when plugin is first enabled + @Override + public void onEnable() + { + System.out.println("The Button Auto-flair Plugin by NorbiPeti (:P)"); + //System.out.println("Original C# version: http://pastebin.com/tX8xCPbp"); + //System.out.println("The Java version is... Also made by the same person."); + //System.out.println("With the help of StackOverflow and similar."); + /*catch(MalformedURLException e) + { + } + catch(IOException e) + { + }*/ + getServer().getPluginManager().registerEvents(new PlayerListener(), this); + + //System.out.println("Registering commands..."); + this.getCommand("u").setExecutor(new Commands()); + this.getCommand("u").setUsage(this.getCommand("u").getUsage().replace('&', '§')); + try { + File file=new File("flairsaccepted.txt"); + if(file.exists()) + { + BufferedReader br=new BufferedReader(new FileReader("flairsaccepted.txt")); + String line; + while ((line = br.readLine()) != null) + { + AcceptedPlayers.add(line.replace("\n", "")); + } + br.close(); + } + file=new File("flairsignored.txt"); + if(file.exists()) + { + BufferedReader br=new BufferedReader(new FileReader("flairsignored.txt")); + String line; + while ((line = br.readLine()) != null) + { + IgnoredPlayers.add(line.replace("\n", "")); + } + br.close(); + } + file=new File("autoflairconfig.txt"); + if(file.exists()) + { + BufferedReader br=new BufferedReader(new FileReader(file)); + String line; + while((line=br.readLine())!=null) + { + String[] s=line.split(" "); + TownColors.put(s[0], s[1]); + } + br.close(); + } + } catch (IOException e) { + System.out.println("Error!\n"+e); + } + //System.out.println("Registering done."); + Runnable r=new Runnable(){public void run(){ThreadMethod();}}; + Thread t=new Thread(r); + t.start(); + } + Boolean stop=false; + // Fired when plugin is disabled + @Override + public void onDisable() + { + try + { + FileWriter fw; + fw = new FileWriter("flairsaccepted.txt"); + fw.close(); + fw = new FileWriter("flairsignored.txt"); + fw.close(); + } + catch(Exception e) + { + System.out.println("Error!\n"+e); + } + for(String player : AcceptedPlayers) + { + File file=new File("flairsaccepted.txt"); + try { + BufferedWriter bw=new BufferedWriter(new FileWriter(file, true)); + bw.write(player+"\n"); + bw.close(); + } catch (IOException e) { + System.out.println("Error!\n"+e); + } + } + for(String player : IgnoredPlayers) + { + File file=new File("flairsignored.txt"); + try { + BufferedWriter bw = new BufferedWriter(new FileWriter(file, true)); + bw.write(player+"\n"); + bw.close(); + } catch (IOException e) { + System.out.println("Error!\n"+e); + } + } + stop=true; + } + + public void ThreadMethod() //<-- 2015.07.16. + { + /*System.out.println("Sleeping for 5 seconds..."); //2015.07.20. + try { + Thread.sleep(5000); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } //2015.07.20.*/ + while(!stop) + { + try + { + String body=DownloadString("https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/autoflair_system_comment_your_minecraft_name_and/.json?limit=1000"); + JSONArray json=new JSONArray(body).getJSONObject(1).getJSONObject("data").getJSONArray("children"); + for(Object obj : json) + { + JSONObject item = (JSONObject)obj; + String author=item.getJSONObject("data").getString("author"); + String ign=item.getJSONObject("data").getString("body"); + int start = ign.indexOf("IGN:") + "IGN:".length(); + int end = ign.indexOf(' ', start); + if (end == -1 || end == start) + end=ign.indexOf('\n', start); //2015.07.15. + if (end == -1 || end == start) + ign = ign.substring(start); + else + ign = ign.substring(start, end); + ign = ign.trim(); + if(HasIGFlair(ign)) + continue; + //System.out.println("Author: "+author); + try { + Thread.sleep(10); + } catch(InterruptedException ex) { + Thread.currentThread().interrupt(); + } + String[] flairdata = DownloadString("http://karmadecay.com/thebutton-data.php?users=" + author).replace("\"", "").split(":"); + String flair; + if(flairdata.length > 1) //2015.07.15. + flair = flairdata[1]; + else + flair=""; + if (flair != "-1") + flair = flair + "s"; + else + flair = "non-presser"; + String flairclass; + //System.out.println("flairdata.length:"+flairdata.length); + if(flairdata.length>2) + flairclass = flairdata[2]; + else + flairclass="unknown"; + SetFlair(ign, flair, flairclass, author); + } + Thread.sleep(10000); + } + catch(Exception e) + { + System.out.println("Error!\n"+e); + } + } + } + + public String DownloadString(String urlstr) throws MalformedURLException, IOException + { + URL url = new URL(urlstr); + URLConnection con = url.openConnection(); + con.setRequestProperty("User-Agent", "TheButtonAutoFlair"); + InputStream in = con.getInputStream(); + String encoding = con.getContentEncoding(); + encoding = encoding == null ? "UTF-8" : encoding; + String body = IOUtils.toString(in, encoding); + in.close(); + return body; + } + + //It has to store offline player flairs too, therefore it can't use Player object + public static Map PlayerFlairs=new HashMap(); + public static Map PlayerUserNames=new HashMap(); + //public Map PlayerFlairs=new HashMap(); + public static ArrayList Players=new ArrayList(); + public static ArrayList AcceptedPlayers=new ArrayList(); //2015.07.16. + public static ArrayList IgnoredPlayers=new ArrayList(); //2015.07.16. + //public static Map PlayerTowns=new HashMap(); //2015.07.20. + public static Map TownColors=new HashMap(); //2015.07.20. + public Boolean HasIGFlair(String playername) + { + /*Player player=null; + for(Player p : Players) + { + if(p.getName()==playername) + { + player=p; + break; + } + } + if(player==null) + return false;*/ + return PlayerFlairs.containsKey(playername); + } + + public void SetFlair(String playername, String text, String flairclass, String username) + { + String finalflair; + switch(flairclass) + { + case "press-1": + finalflair="§c("+text+")§r"; + break; + case "press-2": + finalflair="§6("+text+")§r"; + break; + case "press-3": + finalflair="§e("+text+")§r"; + break; + case "press-4": + finalflair="§a("+text+")§r"; + break; + case "press-5": + finalflair="§9("+text+")§r"; + break; + case "press-6": + finalflair="§5("+text+")§r"; + break; + case "no-press": + finalflair="§7(non-pr.)§r"; + break; + case "cheater": + finalflair="§5("+text+")§r"; + break; + default: + finalflair=""; + break; + } + if(finalflair.length()==0) //<-- 2015.07.20. + return; + PlayerFlairs.put(playername, finalflair); + PlayerUserNames.put(playername, username); + /*for(Player player : Players) + { + if(player.getName()==playername) + { + PlayerFlairs.put(player, finalflair); + break; + } + }*/ + //System.out.println("SetFlair - playername: "+playername+" text: "+text+" flairclass: "+flairclass); + System.out.println("Added new flair to "+playername+": "+finalflair); + for(Player player : Players) + { + //System.out.println("Online player: "+player.getName()); + //System.out.println("player.getName ("+player.getName()+") == playername ("+playername+"): "+(player.getName()==playername)); + if(player.getName().equals(playername)) + { + //System.out.println("DisplayName: "+player.getDisplayName()); + //player.setDisplayName(player.getDisplayName()+finalflair); + AppendPlayerDisplayFlair(player, username, finalflair); + //System.out.println("DisplayName: "+player.getDisplayName()); + break; + } + } + } + + public static String GetFlair(Player player) + { //2015.07.16. + String flair=PlayerFlairs.get(player.getName()); + return flair==null ? "" : flair; + } + + public static void AppendPlayerDisplayFlair(Player player, String username, String flair) + { + if(IgnoredPlayers.contains(player.getName())) + return; + if(AcceptedPlayers.contains(player.getName())) + //player.setDisplayName(player.getDisplayName()+flair); + AppendPlayerDisplayFlairFinal(player, flair); //2015.07.20. + else + player.sendMessage("§9Are you Reddit user "+username+"?§r §6Type /u accept or /u ignore§r"); + } + + public static void AppendPlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + //System.out.println("A"); + String color = GetColorForTown(GetPlayerTown(player)); //TO!DO: Multiple colors put on first capital letters + String[] colors = color.substring(1).split("§"); + String displayname=player.getDisplayName(); + ArrayList Positions=new ArrayList<>(); + //System.out.println("B"); + for(int i=0; i=colors.length) + { + //System.out.println("D"); + int x=0; + for(int i=0; i towns = TownyUniverse.getDataSource().getTowns(); + try { + Town town = WorldCoord.parseWorldCoord(player).getTownBlock().getTown(); + return town.getName(); + } catch (Exception e) { + return ""; + } + } + + public static void RemovePlayerDisplayFlairFinal(Player player, String flair) + { //2015.07.20. + String color = GetColorForTown(GetPlayerTown(player)); + String dname=player.getDisplayName(); + player.setDisplayName(dname.substring(dname.indexOf(color)+3, dname.indexOf(flair))); + } +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f1/e0e3f27f032f001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/f1/e0e3f27f032f001511a3ba75618c68e5 new file mode 100644 index 0000000..edf98d5 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f1/e0e3f27f032f001511a3ba75618c68e5 @@ -0,0 +1,78 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import de.inventivegames.TellRawAutoMessage.Reflection; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(!PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { //2015.07.20. + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + sendRawMessage(p, json); + } + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("IChatBaseComponent$ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) { + if (majorVersion < 1.8 || (majorVersion == 1.8 && lesserVersion == 1)) { + chatSerializerClazz = Reflection.getNMSClass("ChatSerializer"); + } else { + chatSerializerClazz = Reflection.getNMSClass("IChatBaseComponent$ChatSerializer"); + } + try { + System.out.println("1"); + Object handle = Reflection.getHandle(player); + System.out.println("2"); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + System.out.println("3"); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + System.out.println("4"); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + System.out.println("5"); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + System.out.println("6"); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.history/f3/102d06a3fe2e001511a3ba75618c68e5 b/.metadata/.plugins/org.eclipse.core.resources/.history/f3/102d06a3fe2e001511a3ba75618c68e5 new file mode 100644 index 0000000..48efb04 --- /dev/null +++ b/.metadata/.plugins/org.eclipse.core.resources/.history/f3/102d06a3fe2e001511a3ba75618c68e5 @@ -0,0 +1,47 @@ +package tk.sznp.thebuttonautoflair; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerListener implements Listener +{ //2015.07.16. + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) + { + Player p=event.getPlayer(); + PluginMain.Players.add(p); + //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); + if(PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + p.sendRawMessage("§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to [this thread].§r"); + //System.out.println("Added player "+p.getName()); + } + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) + { + //for(Player player : PluginMain.Players) + for(int i=0; i nmsChatSerializer = Reflection.getNMSClass("IChatBaseComponent$ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) {} + try { + System.out.println("1"); + Object handle = Reflection.getHandle(player); + System.out.println("2"); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + System.out.println("3"); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + System.out.println("4"); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + System.out.println("5"); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + System.out.println("6"); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/RemoteSystemsTempFiles/.markers.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/RemoteSystemsTempFiles/.markers.snap index 08e6b1835531613769e8ad5ec29258df5381c8b8..00c7e0d4fb965939bd21e10b45f41956d891c13b 100644 GIT binary patch delta 10 RcmdnMa)EV&0nx`Abb0TTcV#{z5s diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/RemoteSystemsTempFiles/.syncinfo.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/RemoteSystemsTempFiles/.syncinfo.snap index 08e6b1835531613769e8ad5ec29258df5381c8b8..00c7e0d4fb965939bd21e10b45f41956d891c13b 100644 GIT binary patch delta 10 RcmdnMa)EV&0nx`Abb0TTcV#{z5s diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/TheButtonAutoFlair/.indexes/e4/77/69/e/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/TheButtonAutoFlair/.indexes/e4/77/69/e/history.index index c83598913ba658a72d99c552861b0dfce44397cd..7cac1ac6156659e8bc9aec19068bfc489d8d7a50 100644 GIT binary patch literal 13391 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 Qu)K}?EA*z3fAH)6AB>?_Qvd(} delta 29 lcmX?~@!o1f6f>jIW^2|5ER5!xWdtHwnHW}XE?2q14*;J~3C#ci diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/TheButtonAutoFlair/.indexes/e4/81/43/bf/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/TheButtonAutoFlair/.indexes/e4/81/43/bf/history.index new file mode 100644 index 0000000000000000000000000000000000000000..8a5584d7255bb8fc8eca90ed8be1cfc09ef77716 GIT binary patch literal 162 zcmZQ#U|?Wmu+%RuO4d(F)z8c;OU*0EEK5yK%uOxU4@u3*2}&$?EG^0RO)V}?Oi$Gh zN=?g2O)kmI&(q6FEK6iy`4G0klTn{RRB-XG(!`#Orx&+mukm998tXX+tN4R=$DNSX Tt1W=2H<-S_9$9?he26#z>SH=6 literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/TheButtonAutoFlair/.indexes/e4/history.index b/.metadata/.plugins/org.eclipse.core.resources/.projects/TheButtonAutoFlair/.indexes/e4/history.index new file mode 100644 index 0000000000000000000000000000000000000000..24c595ff109e882e9b6c371b33118b777be7704f GIT binary patch literal 101 zcmZQ#U|?Wm5YaC#O4bibP0LA5F3HT#)5}UMOJrbX@SNkxsLvoOxOi7-Vo%1?i(9hS d_%SjtJa~8930Yii0Yuzj`T~1o@rCmt;s8w=A}Rm? literal 0 HcmV?d00001 diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/TheButtonAutoFlair/.markers.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/TheButtonAutoFlair/.markers.snap index d68c7ea7eef78e36d82ed1a38b41ebb55844f91b..9a22a58170b0db56bdf1af5bc7d61d65da75b9d6 100644 GIT binary patch delta 2191 zcmcJR%}*0S7{+I}3*90bP>S&b9axEwV4;OttsWo-h(h=f5-uui+o4^%AIcZrfB3c9YE}oj3dZ=AGw#x=%hc zA8xYi11Yk8>^|GnLxxUmGH=P3V1T(rhU8v$Ao#dFHpx_8BF(O6q`%M0jF9)PV4Ijl z`nY6Zq$1sSSf!%fk)KiX$7g+aDgU&_)J2? zGf0<2Sz1OqV5Jz_0YCt_6=WD<9JxTdvjj#(Rn;(zAgCillQSp=8e~aD6KN%abSeV& zf`+JwQC!orBnfvkKAg`a^Gu+Ap4-TXun?hvdNIUuMt+OjG6cv9s6o1xA@q(o|#NBf!t~nHWe|SoaCK0Z*J)y8< z?#yfMtgOXkdbiiU&5M@k9QV{A`r0A7#}YL=JDJAj*;dl`74&UY)loR}jLAxWXBA_5 zwmfjnG^WD8vSae^9GH#%@OiW-qbQa%wUQ~@ip&3C$P+|_v|C9qzJ+kz>XzbZwqtk> z)Dq)lDMp%N4CJ^6b_9BS_7NTJ4{Lhd7fC0R686!tm2lQq7z@EbYHU`*G7`+u_sOCf z_sw8kQsX_a^p|`SIRN6e85*5UAgJUJPG~W>{jx6W6@_OvT+}rMVp?h%5f-$eWWX3o z>Bt=PY5{Q8j2)l?z)aBok8SloL#LTu9>5!jtO^ZgBJ^+@Rr;_i5bhR+m#Cs)P*0Gd zgDp%ic^PUQ>+XP9gHcUM$p|A@tSOtBVk{M?T1u#{Y`enkI1=}|<4FFqIfIrftmZ5g zF+SNl;{IAojN=xDH6z(=4F0qogCD6SMyM2H*}|CPryUp(2L=r`RWY1@Re8@-`_0%q zA1JG$!PduuGTp0|ZjQg>(A{w8w&r!q(y~%!9i`G`g?~>k7UbiLGvkXUENmKlw7McZ d2QB+MZ-2W>UK}DqUy=+ioU8oBQ2k?K?GF^!epmni delta 9 QcmccI%e3VI;|7xg02giqOaK4? diff --git a/.metadata/.plugins/org.eclipse.core.resources/.projects/TheButtonAutoFlair/.syncinfo.snap b/.metadata/.plugins/org.eclipse.core.resources/.projects/TheButtonAutoFlair/.syncinfo.snap index 08e6b1835531613769e8ad5ec29258df5381c8b8..00c7e0d4fb965939bd21e10b45f41956d891c13b 100644 GIT binary patch delta 10 RcmdnMa)EV&0nx`Abb0TTcV#{z5s diff --git a/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap b/.metadata/.plugins/org.eclipse.core.resources/.root/.markers.snap index 08e6b1835531613769e8ad5ec29258df5381c8b8..00c7e0d4fb965939bd21e10b45f41956d891c13b 100644 GIT binary patch delta 10 RcmdnMa)EV&0nx`Abb0TTcV#{z5s diff --git a/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources index 1956ab270663b39c21f258361080d640f71e4828..495d4f16019c8820882e8c5f284a6176261fb223 100644 GIT binary patch delta 134 zcmX^8fN}dArVZW&ll`;wSd9#=Ow2cLQ2oxtZee9?VP#?lhJ*3G1ddnqw}CIi{aOgtC*fQTGu|t~VR)Ywz#{LtjVzgQM+hEBMUN z4?#;=+E7;cNr~*Xd*wbQ(BM&nieCv>I^~c|Dap*22%$|nH6IelfWFp)&NgYET1-a! zw<3(Ox{rdko#l03n6Un#R5MqUbF`^bw&N+VuBePhGi(#+>^6S1oH)8L z))w*#N9Um)(tA6c3enc{3bymk9Eh0Wh}#09i!=&|0@UGj5S^Pd0-^;G3);}0L;2$v z!6j>W!unxQBGMIwP(seYuiy1`FU0BSzwI=ckQb#SuUTpLD(;}C+i!7uWtGFK;`JSa%{0m~ zQQs%p)5aMFGgDe-=Xg_IHK zw>?S2|K*Jcd83r%3jMOnptlvj3|*_AVK2R_ubHUFdAq5`&3AbYIc%aYfi_4w7yry*v0PZnE$ Stsi(n3X0FIM+X*qU;hPP`a4|! delta 9 Qcmdn|m~q_>#tnKg02k{7IRF3v diff --git a/.metadata/.plugins/org.eclipse.jdt.core/1508644233.index b/.metadata/.plugins/org.eclipse.jdt.core/1508644233.index index fd8221b53b2f4a647b642c0b2e505e1286a9cfd0..f7782c801a78cde965948aacac7c998bacd8d0c9 100644 GIT binary patch literal 16240 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 R>C2z*$Xsr^!Tjof{sz}RWA6X} literal 15141 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 g?Y;jdJ3?fk^FKhzN4JuXzx;PVmQOh{+ z_!HX(B>~!Hxmw+*{9EJh&cU{D407xS`z-j;pzy9zQuK^6$0L*~Hmmk6n z!sZ1Kjn@DW$e*^8d>5bxV(In?|B(&Asu`aF@vBNO0u?7H+}8U)YN z{fzkk9XlKUckF2V-wDJZw*B;k{~$Sn27rL`oSgq&vs3?1-`nxOX=^>04H6?tGYsT! q?E25z==oo7YQldInIn literal 0 HcmV?d00001 diff --git a/TheButtonAutoFlair.jar b/TheButtonAutoFlair.jar index dd5b9623325b9b312a0b9762d5c640e933df040c..1a559fa31467d95463e0010a33ddc4ad4c097b6b 100644 GIT binary patch delta 4443 zcmb7IS5OlSvyDL@gx;h@P>Mh(p*JCjbm?7bf*1r0y%z~ZLq{P(_Zwk1O3vvU?Q{PAaj_&|Kd*b(Z_ zdw?CesB;-zbV8Q6kmPem$n!6{Y%`9cemLFI*K7u7TRF(?(XIFtw!4n{MPo${2ub!! zAT_4Hl3s@+!}MTqo|pgnyHiWHkzM9vQdJ({)$awAXFVC*biYjP?Y$Sc;dIrXyW%r& zxA_@nmZckh4dCle?aHp3 z(E*33*f5tjC5Jncwb%m-z1?OK|JFCJ*@pzZJbOek0(*#c^jXqK?yt$(H~sT%?-i!q zF45{S5BIHjbhceZY<8Zz6?Wjl~Qu9!vvLin@geBsvM?}b=jvDP!5Vq(V4wH<|gpQudQr@uk8R2CWz6dC)zm? z`&$=yN<_4CHs zQs`;Gjy-_<+|RHIUbOzF`$uS#3fub=vBJ>}6*NU~zFL7d=SeT(I=U4s$B_qhg`GkqIE)bgDXG#bYONyvge2RRj9 z{&wpY@51b0+*bWy7@S(=#|lmUT3K!gwwWTA|Bqzu54FXvjJxt5!a=gh6JP)2ObD`K zMaMlFXVuBWKS(A13{|~QOtx?802+Ir=tr=4KQJHj2}t?M5K@RDuO_{HpK`|cnGu5z z+W9Hd4wTeTK#pk-v>_RCL$c2YYa|ADFaTEyj)wVhufyzQB+{aV)zgw~Gg=Qr{3Q2i z#t(|_`O|+UAj+Q`J4fvOD4#VG|56{2ShuJ6l(}!V<+Ko~R7nx@LoYCar4C+GEBc;) z=~~IbE5YVpFWAYJ_#rP!UY`{y$L1hi8%bx9rC#= z_EObjSiv>+S9zPqg4cf>XYe-IFO;EY`cB?Sd|}4j<6P`R6@}y{pA=fq-u}~Ze1E&! zzl`{MbH9C*`f!JEuyb|o+DgaBBNXn^KR;_-eX73vXGB>V6QMT3P=W);S zKKX-xoc#e9QtOa|q!oJn%g6wLI-2^w2eAscn}tcLxsS4-@MoN3zUqIk^j;B3#-OD| z_W<-w;TrkkpxqOy>x?5|hpP-}({)5)>Qu*+jHHBoLMFkgwMfKu<~|Fqz0Wy8J1b>c zY4_AUNT0U!@XYb)f`*J|NTRem;p2#Zn*ULj?A68IK49?##%u;=Zx>%~cVhN|32DS) zpIK>4)uS}M(YrhR-u*=$L3(qHsUD`LLJv`RR#{@UJ%Y%{v#maCVpL&Qarl&&v_7A{ zyZglYAr=lRvWtA{|FIq|dkZo%n8EVG@+cyckiFJ=6TC+@8jlE2*A$rdIlHHC97?*{RX-0ops_Uo{-dU?8I zEJiP7hlx!96B{P=bP8k#)cXf1Ex4FktUJZ0`l5MX?X$DxpT$i zmAK}-(`ceWXi(ugx8?pqICG#=0o|2C4zTxkjb!%D;y&&{BnLBHNgFnroCTd?&dhl~ ztRC%CA~ktiRMDZ&QAsBwaWf^)8O+lV3)tI*>X0QN>7Nk;R6;q0hamQ;$^z}KYO~DQ z$q4gQ{W~D6aFy#xKc8cCf0po&I6(pBR}qjM*!oN>mTl$%`yG=u@I-aMI{?*3xZb_=XsByyA^uE}lYr z3sdv65qtK5$U@sM^ct;)$V$Hc(^U5FlrG5dp79*`O*pgme`K!o z%}_tZ8FwPALai1sN@e}-Y!KH9f;BiLB7)pprq?zI-zc&WB&7R|NELuwRg^0>Z*%N; zbqaQ{t}KYcLNoCpw5YdZygUY$=6-QlM55{SZA304cm)2)oI`~nkUCZIbL0BYf+X)^ zHcsO9i)5Z}x^28I?21gg)gx;=6EoNkG@HN>vgu7_gbQUc+8WE>Rf});5^lw53pIZF zC}z5d$7JI5_cO_i%a?nabZ&zy(6p~ozfd}8`|z^lvlBVK)v;;9#b=5w+h z)_tQt=y*uLzXMswEY24BOG^EtelG?D*RT4T)NtV=Dm#j$XdjG=b3 z@~79Pmv0#D_&BMR`wbo@wc!>Vg!lN%Mrj#j(z* zc!rT}uwrTYHzYRl^nCBql2>ipQM_~=9T7zsDqFi_i`x3s)T>4tgMM3(^>MwzcTd*G z#htZAD0+~}l&HkWxX<*%UGv(e{xhZTf>%B*jT5 znOXE8ibHnJ_wp*qoj$P3mS{U7OZ{BykN1FDfq)1WJXVnJe6)?hkaR1u`kUt-uO4P z8}{f(!c+hWz5DuwBX2D!dF|V|0atii$tNTQ);gyz_|n5~9fH>>BX5=wyPqRSn9JXz zVSv)Sd-_0Ccw>Zmx@dZQGTix~1h(WT9z;ogVfkW{I7wuwAGGPWBzzd}=FHSMq%=bf z%XEx)xBTjqWx+*@Uw-?5uCtohIV>tR4}GAR=oq@y532P|63RhXDC`c)d79;uFgAbM z4kGAImw$Te3tCo5@FLgq*;dAxd(fw)dO972d_5ZX_~?GtVf<)x$;|2OMd;^~Zbqh9 z3AGqYf=yPJX^*Dk$yAAah=Sl__y7y)&P5*@HnApT9nx-K{P>P9n)&D9-kiq|-Ll*A zVo^uX5Q-cMY1+{z3PvIep?md851;&!A4v&@>vCz)I?&MTDbiUKg*ap#g(-5~h=g-$Q#f{tr#U1rkK zG8=l;E@c($sGgM}3urfLBQ|#Fv*`(~vf!UfWy8O6Bae@zQyl~VoYB?88&DL${OtP9 z_W5i7_CY9-;z48BoUMTH~C~> zR`6Ot$1IHC3LLmofpK2Z0FG5->Q+>h&EEq6?q1JeF5d2LFk^KUH9d7hoohfQ!2kRz zcC&~Y|I!8k!2TuTFM892$*&Q|JY9uelfbB~abl`g+5fVM8Crz^iwFPqxG;ovI^q9b zn4eA5uoo=5{*4s?z={I^LjPwWYWRPLK$yu+GK~8g6ga$r$y$>F_HSaQ)|hBG033jH MasVK6>z}#*09r>=od5s; delta 1522 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 diff --git a/TheButtonAutoFlair/src/de/inventivegames/TellRawAutoMessage/Reflection.java b/TheButtonAutoFlair/src/de/inventivegames/TellRawAutoMessage/Reflection.java new file mode 100644 index 0000000..196f023 --- /dev/null +++ b/TheButtonAutoFlair/src/de/inventivegames/TellRawAutoMessage/Reflection.java @@ -0,0 +1,79 @@ +package de.inventivegames.TellRawAutoMessage; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; + +import org.bukkit.Bukkit; + +public class Reflection { + + public static String getVersion() { + String name = Bukkit.getServer().getClass().getPackage().getName(); + String version = name.substring(name.lastIndexOf('.') + 1) + "."; + return version; + } + + public static Class getNMSClass(String className) { + String fullName = "net.minecraft.server." + getVersion() + className; + Class clazz = null; + try { + clazz = Class.forName(fullName); + } catch (Exception e) { + e.printStackTrace(); + } + return clazz; + } + + public static Class getOBCClass(String className) { + String fullName = "org.bukkit.craftbukkit." + getVersion() + className; + Class clazz = null; + try { + clazz = Class.forName(fullName); + } catch (Exception e) { + e.printStackTrace(); + } + return clazz; + } + + public static Object getHandle(Object obj) { + try { + return getMethod(obj.getClass(), "getHandle").invoke(obj); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static Field getField(Class clazz, String name) { + try { + Field field = clazz.getDeclaredField(name); + field.setAccessible(true); + return field; + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static Method getMethod(Class clazz, String name, Class... args) { + for (Method m : clazz.getMethods()) + if (m.getName().equals(name) && (args.length == 0 || ClassListEqual(args, m.getParameterTypes()))) { + m.setAccessible(true); + return m; + } + return null; + } + + public static boolean ClassListEqual(Class[] l1, Class[] l2) { + boolean equal = true; + if (l1.length != l2.length) + return false; + for (int i = 0; i < l1.length; i++) + if (l1[i] != l2[i]) { + equal = false; + break; + } + return equal; + } + +} diff --git a/TheButtonAutoFlair/src/tk/sznp/thebuttonautoflair/PlayerListener.java b/TheButtonAutoFlair/src/tk/sznp/thebuttonautoflair/PlayerListener.java index ccbc91e..93cc476 100644 --- a/TheButtonAutoFlair/src/tk/sznp/thebuttonautoflair/PlayerListener.java +++ b/TheButtonAutoFlair/src/tk/sznp/thebuttonautoflair/PlayerListener.java @@ -7,6 +7,8 @@ import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; +import de.inventivegames.TellRawAutoMessage.Reflection; + public class PlayerListener implements Listener { //2015.07.16. @EventHandler @@ -15,8 +17,14 @@ public class PlayerListener implements Listener Player p=event.getPlayer(); PluginMain.Players.add(p); //event.getPlayer().setDisplayName(p.getDisplayName()+PluginMain.GetFlair(p)); - PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); - System.out.println("Added player "+p.getName()); + if(PluginMain.PlayerUserNames.containsKey(p.getName())) //<-- 2015.07.20. + PluginMain.AppendPlayerDisplayFlair(p, PluginMain.PlayerUserNames.get(p.getName()), PluginMain.GetFlair(p)); + else + { //2015.07.20. + String json="[\"\",{\"text\":\"§6Hi! If you'd like your flair displayed ingame, write your Minecraft name to \"},{\"text\":\"[this thread.]\",\"clickEvent\":{\"action\":\"open_url\",\"value\":\"https://www.reddit.com/r/TheButtonMinecraft/comments/3d25do/\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"Click here to go to the Reddit thread§r\"}]}}}]"; + sendRawMessage(p, json); + } + //System.out.println("Added player "+p.getName()); } @EventHandler @@ -29,7 +37,7 @@ public class PlayerListener implements Listener if(player.getName().equals(event.getPlayer().getName())) { PluginMain.Players.remove(player); - System.out.println("Removed player "+event.getPlayer().getName()); + //System.out.println("Removed player "+event.getPlayer().getName()); } else i++; //If the player is removed, the next item will be on the same index @@ -41,4 +49,26 @@ public class PlayerListener implements Listener { } + + private static Class nmsChatSerializer = Reflection.getNMSClass("IChatBaseComponent$ChatSerializer"); + private static Class nmsPacketPlayOutChat = Reflection.getNMSClass("PacketPlayOutChat"); + public static void sendRawMessage(Player player, String message) + { + try { + System.out.println("1"); + Object handle = Reflection.getHandle(player); + System.out.println("2"); + Object connection = Reflection.getField(handle.getClass(), "playerConnection").get(handle); + System.out.println("3"); + Object serialized = Reflection.getMethod(nmsChatSerializer, "a", String.class).invoke(null, message); + System.out.println("4"); + Object packet = nmsPacketPlayOutChat.getConstructor(Reflection.getNMSClass("IChatBaseComponent")).newInstance(serialized); + System.out.println("5"); + Reflection.getMethod(connection.getClass(), "sendPacket").invoke(connection, packet); + System.out.println("6"); + } catch (Exception e) { + e.printStackTrace(); + } + } + }