From 881139ae66b87d44987aeede472cfb620eb9001a Mon Sep 17 00:00:00 2001 From: Stephen H Date: Sat, 18 Apr 2020 17:21:05 +1000 Subject: [PATCH] First Commit Committed source code --- .gitignore | 6 + README.md | 12 ++ pom.xml | 26 +++ src/main/java/me/steve8playz/MCeddit.java | 196 ++++++++++++++++++++++ src/main/resources/config.yml | 2 + src/main/resources/plugin.yml | 19 +++ 6 files changed, 261 insertions(+) create mode 100644 pom.xml create mode 100644 src/main/java/me/steve8playz/MCeddit.java create mode 100644 src/main/resources/config.yml create mode 100644 src/main/resources/plugin.yml diff --git a/.gitignore b/.gitignore index a1c2a23..8d70f6f 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,9 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* + +# IntelliJ IDEA Files +.idea/ + +# Compiled Files +target/ \ No newline at end of file diff --git a/README.md b/README.md index 9d7d548..cc23b97 100644 --- a/README.md +++ b/README.md @@ -1 +1,13 @@ # MCeddit +A Simple way to link Minecraft with Reddit +## Commands +- LinkReddit: + - Description: Link your Minecraft account with your Reddit Account + - Usage: /\ \ [player] + - Permission: MCeddit.link + - Default: true +- GetReddit: + - Description: Look at the Reddit API using the plugin + - Usage: /\ \ [player] + - Permission: MCeddit.get + - Default: false \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..b3acf3f --- /dev/null +++ b/pom.xml @@ -0,0 +1,26 @@ + + + 4.0.0 + + me.steve8playz + MCeddit + 1.0-SNAPSHOT + + + + spigotmc-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + + + org.spigotmc + spigot-api + 1.13-R0.1-SNAPSHOT + provided + + + \ No newline at end of file diff --git a/src/main/java/me/steve8playz/MCeddit.java b/src/main/java/me/steve8playz/MCeddit.java new file mode 100644 index 0000000..ad7df58 --- /dev/null +++ b/src/main/java/me/steve8playz/MCeddit.java @@ -0,0 +1,196 @@ +package me.steve8playz; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import org.bukkit.*; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Firework; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.inventory.meta.FireworkMeta; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; + +public class MCeddit extends JavaPlugin implements Listener { + //Final Variables to put in Config file later + private final String messagePrefix = ChatColor.GOLD + "[MCeddit] "; + + @Override + public void onEnable() { + getLogger().info("MCeddit v1.0 has been Enabled"); + getConfig().options().copyDefaults(true); + saveConfig(); + this.getServer().getPluginManager().registerEvents(this, this); + } + + @Override + public void onDisable() { + saveConfig(); + getLogger().info("MCeddit v1.0 has been Disabled"); + } + + + // Keeps track of the cooldowns for multiple players + private HashMap cooldowns = new HashMap(); + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + + + if (player.hasPermission("mceddit.cakeday") && getConfig().contains(player.getUniqueId().toString())) { + long redditCreated = (long) Double.parseDouble(getReddit(getConfig().getString(player.getUniqueId().toString()), "created")); + if (compareUnix(System.currentTimeMillis() / 1000, redditCreated, "MM-dd")) { + + // Cooldown to stop this from executing twice + // TODO: Find a better way of doing this + // TODO: Put cooldownTime into config + int cooldownTime = 86400; + if(cooldowns.containsKey(player.getName())) { + long secondsLeft = ((cooldowns.get(player.getName())/1000)+cooldownTime) - (System.currentTimeMillis()/1000); + if(secondsLeft>0) { + // player.sendMessage("You cant use that commands for another "+ secondsLeft +" seconds!"); + return; + } + } + cooldowns.put(player.getName(), System.currentTimeMillis()); + // END Cooldown Code + + getServer().broadcastMessage(ChatColor.GOLD + "It's " + player.getName() + "'s Reddit Cake Day Today!"); + if (!player.hasPermission("mceddit.cakeday.givecake")) + player.sendMessage(ChatColor.GOLD + "Happy Cake Day " + player.getName() + "!"); + else { + player.sendMessage(ChatColor.GOLD + "Happy Cake Day " + player.getName() + "! Here's a Cake to Celebrate!"); + player.getInventory().addItem(bakeCake(player.getName() + "'s Cake", "A Cake for your Reddit Cake Day")); + } + if (player.hasPermission("mceddit.cakeday.firework")) firework(player); + } + } + } + + public String getReddit(String username, String object) { + try { + String jsonS = ""; + URL url = new URL("https://www.reddit.com/user/" + username + "/about.json"); + URLConnection conn = url.openConnection(); + conn.setRequestProperty("User-Agent", "MCeddit - A Simple Spigot Plugin to link Minecraft with Reddit"); + conn.connect(); + BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); + String inputLine; + + while((inputLine = in.readLine()) != null) { + jsonS+=inputLine; + } + Gson gson = new Gson(); + JsonObject jsonObject = gson.fromJson(jsonS, JsonObject.class); + JsonObject data = jsonObject.get("data").getAsJsonObject(); + String result = data.get(object).getAsString(); + + in.close(); + + return result; + } catch (Exception e) { + if (e.getMessage() == null) { + getLogger().severe("An Unknown Error Occurred while getting to Reddit or Reading the Reddit API, it is possibly because of a bad JSON Object."); + getLogger().warning("If there are any following errors from this plugin that is a result of this."); + } else if (e.getMessage() == "www.reddit.com") { + getLogger().severe("An Error Occurred while getting to Reddit, it is very likely that there is no internet."); + getLogger().warning("If there are any following errors from this plugin that is a result of this."); + } else { + getLogger().severe("An Error Occurred while getting to Reddit: " + e.getMessage()); + getLogger().warning("If there are any following errors from this plugin that is a result of this."); + } + return null; + } + + } + + private boolean compareUnix(long unixSeconds, long compareUnixSeconds, String comparePattern) { + // Convert seconds to milliseconds + Date date = new java.util.Date(unixSeconds * 1000L); + Date dateCompare = new java.util.Date(compareUnixSeconds * 1000L); + // Format the date + SimpleDateFormat dateFormat = new java.text.SimpleDateFormat(comparePattern); + SimpleDateFormat dateFormatCompare = new java.text.SimpleDateFormat(comparePattern); + // Compare + return ((dateFormat.format(date)).equals(dateFormatCompare.format(dateCompare))); + } + + private static ItemStack bakeCake(String itemName, String itemLore) { + ItemStack item = new ItemStack(Material.CAKE, 1); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(itemName); + ArrayList lore = new ArrayList(); + lore.add(itemLore); + meta.setLore(lore); + item.setItemMeta(meta); + return item; + } + + private static void firework(Player player) { + Location loc = player.getLocation(); + Firework fw = loc.getWorld().spawn(loc, Firework.class); + FireworkMeta data = fw.getFireworkMeta(); + Color color1 = Color.RED; + Color color2 = Color.AQUA; + data.addEffects(new FireworkEffect[] { FireworkEffect.builder().withColor(color1, color2).with(FireworkEffect.Type.STAR).build() }); + fw.setFireworkMeta(data); + } + + @Override + public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { + + Player player = (Player) sender; + PlayerInventory inventory = player.getInventory(); + // TODO: Make the linked account only to be changed once without admin permissions + if ((cmd.getName().equalsIgnoreCase("LinkReddit")) && (sender.hasPermission("mceddit.link"))) { + if (args.length == 1) { + if (sender instanceof Player) { + getConfig().set(player.getUniqueId().toString(), args[0].replace("u/", "")); + sender.sendMessage(messagePrefix + ChatColor.GREEN + "User Linked!"); + } else getLogger().warning("You need to be a player to run this command."); + } else if (args.length == 2 && sender.hasPermission("mceddit.link.players")) { + if (Bukkit.getPlayer(args[0]).isOnline()) { + getConfig().set(args[1], Bukkit.getPlayer(args[0]).getUniqueId()); + sender.sendMessage(messagePrefix + ChatColor.GREEN + "User Linked!"); + } else sender.sendMessage(messagePrefix + ChatColor.RED + "Error: Player not Online."); + } else { + sender.sendMessage(messagePrefix + ChatColor.RED + "Usage: /LinkReddit [player]"); + } + } + if ((cmd.getName().equalsIgnoreCase("GetReddit")) && (sender.hasPermission("mceddit.get"))) { + if (args.length == 1) { + if (sender instanceof Player) { + if (getConfig().contains(player.getUniqueId().toString())) { + String message = getReddit(getConfig().getString(player.getUniqueId().toString()), args[0]); + if (message != null) sender.sendMessage(message); + else sender.sendMessage(messagePrefix + ChatColor.DARK_RED + "An Error Occurred. It is likely that you mistyped an Object in the API or there is no internet."); + } else sender.sendMessage(messagePrefix + "Link your Reddit account first"); + } else getLogger().warning("You need to be a player to run this command."); + } else if (args.length == 2 && sender.hasPermission("mceddit.get.players")) { + if (Bukkit.getPlayer(args[1]).isOnline()) { + String message = getReddit(getConfig().getString(Bukkit.getPlayer(args[1]).getUniqueId().toString()), args[0]); + if (message != null) sender.sendMessage(message); + else sender.sendMessage(messagePrefix + ChatColor.DARK_RED + "An Error Occurred. " + ChatColor.RED + "It is likely that you mistyped an Object in the API or there is no internet."); + } else sender.sendMessage(messagePrefix + ChatColor.RED + "Error: Player not Online."); + } else { + sender.sendMessage(messagePrefix + ChatColor.RED + "Usage: /GetReddit [player]"); + } + } + return true; + } +} \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..7f4be2c --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,2 @@ +# The Configuration File for Steve's MCeddit Plugin +# This Plugin will use the config file for player to Reddit username storage so do not touch anything here. \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..52010fa --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,19 @@ +name: MCeddit +main: me.steve8playz.MCeddit +version: 1.0 +description: A Simple way to link Minecraft with Reddit +author: Steve8Playz +api-version: 1.13 +commands: + LinkReddit: + description: Link your Minecraft account with your Reddit Account + usage: / [player] + permission: MCeddit.link + permission-message: You don't have permission to use this command! + default: true + GetReddit: + description: Look at the Reddit API using the plugin + usage: / [player] + permission: MCeddit.get + permission-message: You don't have permission to use this command! + default: false \ No newline at end of file