From eefbe088a82e13d1723452e603e1cc8a7679efb9 Mon Sep 17 00:00:00 2001 From: zavdav <157126752+zavdav@users.noreply.github.com> Date: Mon, 21 Oct 2024 20:46:11 +0200 Subject: [PATCH] Add extended chat/command functionality --- .../beta/fundamentals/Fundamentals.java | 9 ++ .../commands/CommandBroadcast.java | 36 +++++ .../fundamentals/commands/CommandIgnore.java | 58 +++++++ .../fundamentals/commands/CommandList.java | 70 +++++++++ .../fundamentals/commands/CommandMsg.java | 81 ++++++++++ .../fundamentals/commands/CommandMute.java | 77 +++++++++ .../beta/fundamentals/commands/CommandR.java | 79 ++++++++++ .../commands/CommandRealname.java | 54 +++++++ .../fundamentals/commands/CommandSeen.java | 55 +++++++ .../fundamentals/commands/CommandWeather.java | 80 ++++++++++ .../listener/FundamentalsPlayerListener.java | 48 ++++-- .../player/FundamentalsPlayer.java | 47 +++++- .../playerdata/FundamentalsPlayerFile.java | 18 +-- .../settings/FundamentalsConfig.java | 7 + .../settings/FundamentalsLanguage.java | 35 +++++ .../beta/fundamentals/util/Utils.java | 146 ++++++++++++++++++ .../src/main/resources/plugin.yml | 31 ++++ 17 files changed, 906 insertions(+), 25 deletions(-) create mode 100644 FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandBroadcast.java create mode 100644 FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandIgnore.java create mode 100644 FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandList.java create mode 100644 FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandMsg.java create mode 100644 FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandMute.java create mode 100644 FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandR.java create mode 100644 FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandRealname.java create mode 100644 FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandSeen.java create mode 100644 FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandWeather.java diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/Fundamentals.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/Fundamentals.java index 8d92b99..d64f91f 100644 --- a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/Fundamentals.java +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/Fundamentals.java @@ -153,11 +153,20 @@ public void onEnable() { // Bukkit.getPluginCommand("pay").setExecutor(new CommandPay()); // Bukkit.getPluginCommand("god").setExecutor(new CommandGod()); // Bukkit.getPluginCommand("nickname").setExecutor(new CommandNickname()); + Bukkit.getPluginCommand("realname").setExecutor(new CommandRealname(plugin)); + Bukkit.getPluginCommand("seen").setExecutor(new CommandSeen(plugin)); // Bukkit.getPluginCommand("invsee").setExecutor(new CommandInvsee(plugin)); // Bukkit.getPluginCommand("clearinventory").setExecutor(new CommandClearInventory(plugin)); // Bukkit.getPluginCommand("time").setExecutor(new CommandTime(plugin)); // Bukkit.getPluginCommand("ptime").setExecutor(new CommandPTime(plugin)); + Bukkit.getPluginCommand("broadcast").setExecutor(new CommandBroadcast(plugin)); + Bukkit.getPluginCommand("list").setExecutor(new CommandList(plugin)); + Bukkit.getPluginCommand("msg").setExecutor(new CommandMsg(plugin)); + Bukkit.getPluginCommand("r").setExecutor(new CommandR(plugin)); + Bukkit.getPluginCommand("mute").setExecutor(new CommandMute(plugin)); + Bukkit.getPluginCommand("ignore").setExecutor(new CommandIgnore(plugin)); Bukkit.getPluginCommand("vanish").setExecutor(new CommandVanish(plugin)); + Bukkit.getPluginCommand("weather").setExecutor(new CommandWeather()); Bukkit.getPluginCommand("bank").setExecutor(new CommandBank(plugin)); Bukkit.getPluginCommand("balancetop").setExecutor(new CommandBalanceTop(plugin)); Bukkit.getPluginCommand("fakequit").setExecutor(new CommandFakeQuit(plugin)); diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandBroadcast.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandBroadcast.java new file mode 100644 index 0000000..6f9d5bc --- /dev/null +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandBroadcast.java @@ -0,0 +1,36 @@ +package com.johnymuffin.beta.fundamentals.commands; + +import com.johnymuffin.beta.fundamentals.Fundamentals; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; + +import static com.johnymuffin.beta.fundamentals.FundamentalPermission.isPlayerAuthorized; +import static com.johnymuffin.beta.fundamentals.util.Utils.*; + +public class CommandBroadcast implements CommandExecutor { + + private Fundamentals plugin; + + public CommandBroadcast(Fundamentals plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { + if (!isPlayerAuthorized(commandSender, "fundamentals.broadcast")) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("no_permission")); + return true; + } + if (strings.length == 0) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("broadcast_info")); + return true; + } + String message = getFullArg(strings, 0); + String broadcast = formatColor(plugin.getFundamentalConfig().getConfigString("settings.chat.broadcast-format") + .replace("{message}", message)); + Bukkit.broadcastMessage(broadcast); + return true; + } +} diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandIgnore.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandIgnore.java new file mode 100644 index 0000000..2c637d6 --- /dev/null +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandIgnore.java @@ -0,0 +1,58 @@ +package com.johnymuffin.beta.fundamentals.commands; + +import com.johnymuffin.beta.fundamentals.Fundamentals; +import com.johnymuffin.beta.fundamentals.player.FundamentalsPlayer; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.UUID; + +import static com.johnymuffin.beta.fundamentals.FundamentalPermission.isPlayerAuthorized; + +public class CommandIgnore implements CommandExecutor { + + private Fundamentals plugin; + + public CommandIgnore(Fundamentals plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { + if (!isPlayerAuthorized(commandSender,"fundamentals.ignore")) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("no_permission")); + return true; + } + if (!(commandSender instanceof Player)) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("unavailable_to_console")); + return true; + } + if (strings.length == 0) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("ignore_info")); + return true; + } + UUID uuid = plugin.getPlayerCache().getUUIDFromUsername(strings[0]); + if (uuid == null) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("player_not_found_full") + .replace("%username%", strings[0])); + return true; + } + if (uuid.equals(((Player) commandSender).getUniqueId())){ + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("ignore_self")); + return true; + } + FundamentalsPlayer fPlayer = plugin.getPlayerMap().getPlayer((Player) commandSender); + if (fPlayer.getIgnoreList().contains(uuid)) { + fPlayer.removeUserIgnore(uuid); + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("ignore_remove") + .replace("%player%", plugin.getPlayerCache().getUsernameFromUUID(uuid))); + } else { + fPlayer.addUserIgnore(uuid); + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("ignore_add") + .replace("%player%", plugin.getPlayerCache().getUsernameFromUUID(uuid))); + } + return true; + } +} diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandList.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandList.java new file mode 100644 index 0000000..de666cf --- /dev/null +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandList.java @@ -0,0 +1,70 @@ +package com.johnymuffin.beta.fundamentals.commands; + +import com.johnymuffin.beta.fundamentals.Fundamentals; +import com.johnymuffin.beta.fundamentals.player.FundamentalsPlayer; +import com.johnymuffin.beta.fundamentals.util.Utils; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.*; + +import static com.johnymuffin.beta.fundamentals.FundamentalPermission.isPlayerAuthorized; + +public class CommandList implements CommandExecutor { + + private Fundamentals plugin; + + public CommandList(Fundamentals plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { + if (!isPlayerAuthorized(commandSender, "fundamentals.list")) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("no_permission")); + return true; + } + boolean showHidden = isPlayerAuthorized(commandSender, "fundamentals.list.hidden"); + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("list_online") + .replace("%online%", String.valueOf(Bukkit.getOnlinePlayers().length)) + .replace("%maximum%", String.valueOf(Bukkit.getMaxPlayers()))); + + List list = new ArrayList<>(); + List players = new ArrayList<>(); + if (plugin.getFundamentalConfig().getConfigBoolean("settings.list.sort-groups")) { + Map> groups = new TreeMap<>(); + for (Player p : Bukkit.getOnlinePlayers()) { + FundamentalsPlayer fPlayer = plugin.getPlayerMap().getPlayer(p); + String group = plugin.getPermissionsHook().getMainUserGroup(fPlayer.getUuid()); + List groupList = groups.get(group); + if (groupList == null) groupList = new ArrayList<>(); + groupList.add(fPlayer); + groups.put(group, groupList); + } + for (String group : groups.keySet()) { + List groupList = groups.get(group); + groupList.sort(Comparator.comparing(fPlayer -> fPlayer.getBukkitPlayer().getName())); + players.addAll(groupList); + } + } else { + for (Player p : Bukkit.getOnlinePlayers()) { + players.add(plugin.getPlayerMap().getPlayer(p)); + } + players.sort(Comparator.comparing(fPlayer -> fPlayer.getBukkitPlayer().getName())); + } + for (FundamentalsPlayer fPlayer : players) { + boolean isHidden = Utils.isEssentialsHidden(fPlayer.getBukkitPlayer()); + if (isHidden && !showHidden) continue; + StringBuilder sb = new StringBuilder(); + if (fPlayer.isAFK()) sb.append("§7[AFK]§f"); + if (isHidden) sb.append("§7[HIDDEN]§f"); + sb.append(fPlayer.getFullDisplayName()); + list.add(sb.toString()); + } + commandSender.sendMessage("Connected players: " + String.join("§f, ", list)); + return true; + } +} diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandMsg.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandMsg.java new file mode 100644 index 0000000..d168dc3 --- /dev/null +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandMsg.java @@ -0,0 +1,81 @@ +package com.johnymuffin.beta.fundamentals.commands; + +import com.johnymuffin.beta.fundamentals.Fundamentals; +import com.johnymuffin.beta.fundamentals.player.FundamentalsPlayer; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.List; + +import static com.johnymuffin.beta.fundamentals.FundamentalPermission.isPlayerAuthorized; +import static com.johnymuffin.beta.fundamentals.util.Utils.*; + +public class CommandMsg implements CommandExecutor { + + private Fundamentals plugin; + + public CommandMsg(Fundamentals plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { + if (!isPlayerAuthorized(commandSender, "fundamentals.msg")) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("no_permission")); + return true; + } + if (!(commandSender instanceof Player)) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("unavailable_to_console")); + return true; + } + if (strings.length < 2) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("msg_info")); + return true; + } + + List matches = Bukkit.matchPlayer(strings[0].trim()); + FundamentalsPlayer fPlayer = plugin.getPlayerMap().getPlayer((Player) commandSender); + + if (fPlayer.isMuted()) { + String mutedMessage = plugin.getFundamentalsLanguageConfig().getMessage("mute_player_chat") + .replace("%duration%", fPlayer.getMuteStatus() == -1 ? "permanently" : "for" + formatDateDiff(fPlayer.getMuteStatus())); + commandSender.sendMessage(mutedMessage); + return true; + } + if (matches.isEmpty()) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("player_not_found_full") + .replace("%username%", strings[0])); + return true; + } + + Player recipient = matches.get(0); + if (fPlayer.getIgnoreList().contains(recipient.getUniqueId())) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("msg_player_ignored") + .replace("%player%", recipient.getName())); + return true; + } + String message = getFullArg(strings, 1); + if (isPlayerAuthorized(commandSender, "fundamentals.chat.color")) { + message = formatColor(message); + } + + FundamentalsPlayer fRecipient = plugin.getPlayerMap().getPlayer(recipient); + String send = formatColor(plugin.getFundamentalConfig().getConfigString("settings.chat.msg-send-format")) + .replace("{displayname}", fRecipient.getFullDisplayName()) + .replace("{message}", message); + commandSender.sendMessage(send); + fPlayer.setReplyTo(recipient); + + if (!fRecipient.getIgnoreList().contains(fPlayer.getUuid())) { + String receive = formatColor(plugin.getFundamentalConfig().getConfigString("settings.chat.msg-receive-format")) + .replace("{displayname}", fPlayer.getFullDisplayName()) + .replace("{message}", message); + recipient.sendMessage(receive); + fRecipient.setReplyTo((Player) commandSender); + } + return true; + } +} diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandMute.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandMute.java new file mode 100644 index 0000000..b3b1723 --- /dev/null +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandMute.java @@ -0,0 +1,77 @@ +package com.johnymuffin.beta.fundamentals.commands; + +import com.johnymuffin.beta.fundamentals.Fundamentals; +import com.johnymuffin.beta.fundamentals.player.FundamentalsPlayer; +import com.johnymuffin.beta.fundamentals.util.Utils; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.UUID; + +import static com.johnymuffin.beta.fundamentals.FundamentalPermission.isPlayerAuthorized; + +public class CommandMute implements CommandExecutor { + + private Fundamentals plugin; + + public CommandMute(Fundamentals plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { + if (!isPlayerAuthorized(commandSender,"fundamentals.mute")) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("no_permission")); + return true; + } + if (strings.length == 0) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("mute_info")); + return true; + } + UUID uuid = plugin.getPlayerCache().getUUIDFromUsername(strings[0]); + if (uuid == null) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("player_not_found_full") + .replace("%username%", strings[0])); + return true; + } + if (commandSender instanceof Player && uuid.equals(((Player) commandSender).getUniqueId())){ + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("mute_self")); + return true; + } + + FundamentalsPlayer fPlayer = plugin.getPlayerMap().getPlayer(uuid); + Player player = fPlayer.getBukkitPlayer(); + + if (strings.length == 1 && fPlayer.isMuted()){ + fPlayer.setMuteTimer(null); + + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("mute_unmute_successful") + .replace("%player%", plugin.getPlayerCache().getUsernameFromUUID(fPlayer.getUuid()))); + if (player != null) + player.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("mute_player_unmuted")); + + return true; + } + + String time = Utils.getFullArg(strings, 1); + long unixTime = System.currentTimeMillis(); + long duration; + try { + duration = Utils.parseDateDiff(time, true); + } catch (Exception e){ + duration = -1; + } + + fPlayer.setMuteTimer(duration); + String formattedTime = Utils.formatDateDiff(unixTime, duration); + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("mute_successful") + .replace("%player%", plugin.getPlayerCache().getUsernameFromUUID(fPlayer.getUuid())) + .replace("%duration%", duration == -1 ? "permanently" : "for" + formattedTime)); + if (player != null) + player.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("mute_player_muted") + .replace("%duration%", duration == -1 ? "permanently" : "for" + formattedTime)); + return true; + } +} diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandR.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandR.java new file mode 100644 index 0000000..d1c8cc9 --- /dev/null +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandR.java @@ -0,0 +1,79 @@ +package com.johnymuffin.beta.fundamentals.commands; + +import com.johnymuffin.beta.fundamentals.Fundamentals; +import com.johnymuffin.beta.fundamentals.player.FundamentalsPlayer; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static com.johnymuffin.beta.fundamentals.FundamentalPermission.isPlayerAuthorized; +import static com.johnymuffin.beta.fundamentals.util.Utils.*; + +public class CommandR implements CommandExecutor { + + private Fundamentals plugin; + + public CommandR(Fundamentals plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { + if (!isPlayerAuthorized(commandSender,"fundamentals.r")) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("no_permission")); + return true; + } + if (!(commandSender instanceof Player)) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("unavailable_to_console")); + return true; + } + if (strings.length == 0) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("r_info")); + return true; + } + + FundamentalsPlayer fPlayer = plugin.getPlayerMap().getPlayer((Player) commandSender); + if (fPlayer.isMuted()) { + String mutedMessage = plugin.getFundamentalsLanguageConfig().getMessage("mute_player_chat") + .replace("%duration%", fPlayer.getMuteStatus() == -1 ? "permanently" : "for" + formatDateDiff(fPlayer.getMuteStatus())); + commandSender.sendMessage(mutedMessage); + return true; + } + if (fPlayer.getReplyTo() == null) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("r_no_recipient")); + return true; + } + + Player recipient = fPlayer.getReplyTo(); + if (!recipient.isOnline()) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("r_player_offline") + .replace("%player%", recipient.getName())); + return true; + } + if (fPlayer.getIgnoreList().contains(recipient.getUniqueId())) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("msg_player_ignored") + .replace("%player%", recipient.getName())); + return true; + } + String message = getFullArg(strings, 0); + if (isPlayerAuthorized(commandSender, "fundamentals.chat.color")) { + message = formatColor(message); + } + + FundamentalsPlayer fRecipient = plugin.getPlayerMap().getPlayer(recipient); + String send = formatColor(plugin.getFundamentalConfig().getConfigString("settings.chat.msg-send-format")) + .replace("{displayname}", fRecipient.getFullDisplayName()) + .replace("{message}", message); + commandSender.sendMessage(send); + + if (!fRecipient.getIgnoreList().contains(fPlayer.getUuid())) { + String receive = formatColor(plugin.getFundamentalConfig().getConfigString("settings.chat.msg-receive-format")) + .replace("{displayname}", fPlayer.getFullDisplayName()) + .replace("{message}", message); + recipient.sendMessage(receive); + fRecipient.setReplyTo((Player) commandSender); + } + return true; + } +} diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandRealname.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandRealname.java new file mode 100644 index 0000000..c6e3bb8 --- /dev/null +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandRealname.java @@ -0,0 +1,54 @@ +package com.johnymuffin.beta.fundamentals.commands; + +import com.earth2me.essentials.Essentials; +import com.johnymuffin.beta.fundamentals.Fundamentals; +import com.johnymuffin.beta.fundamentals.player.FundamentalsPlayer; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import static com.johnymuffin.beta.fundamentals.FundamentalPermission.isPlayerAuthorized; + +public class CommandRealname implements CommandExecutor { + + private Fundamentals plugin; + + public CommandRealname(Fundamentals plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { + if (!isPlayerAuthorized(commandSender, "fundamentals.realname")) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("no_permission")); + return true; + } + if (strings.length == 0) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("realname_info")); + return true; + } + int found = 0; + String arg = strings[0].toLowerCase(); + Essentials ess = Bukkit.getPluginManager().isPluginEnabled("Essentials") ? + (Essentials) Bukkit.getPluginManager().getPlugin("Essentials") : null; + for (Player p : Bukkit.getOnlinePlayers()) { + FundamentalsPlayer fPlayer = plugin.getPlayerMap().getPlayer(p); + if (ess != null && ess.getUser(p).isHidden()) { + continue; + } + String nickname = fPlayer.getNickname() != null ? + fPlayer.getNickname().replaceAll("&([0-9a-f])", "").toLowerCase() : p.getName(); + if (!arg.equalsIgnoreCase(nickname) && !arg.equalsIgnoreCase(p.getName())) continue; + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("realname_successful") + .replace("%displayname%", fPlayer.getFullDisplayName()) + .replace("%player%", p.getName())); + found++; + } + if (found == 0) + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("realname_player_not_found") + .replace("%nickname%", arg)); + return true; + } +} diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandSeen.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandSeen.java new file mode 100644 index 0000000..69d23ba --- /dev/null +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandSeen.java @@ -0,0 +1,55 @@ +package com.johnymuffin.beta.fundamentals.commands; + +import com.johnymuffin.beta.fundamentals.Fundamentals; +import com.johnymuffin.beta.fundamentals.player.FundamentalsPlayer; +import com.johnymuffin.beta.fundamentals.util.Utils; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.List; +import java.util.UUID; + +import static com.johnymuffin.beta.fundamentals.FundamentalPermission.isPlayerAuthorized; + +public class CommandSeen implements CommandExecutor { + + private Fundamentals plugin; + + public CommandSeen(Fundamentals plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { + if (!isPlayerAuthorized(commandSender, "fundamentals.seen")) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("no_permission")); + return true; + } + if (strings.length == 0) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("seen_info")); + return true; + } + List matches = Bukkit.matchPlayer(strings[0]); + if (matches.isEmpty()) { + UUID uuid = plugin.getPlayerCache().getUUIDFromUsername(strings[0]); + if (uuid == null) { + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("player_not_found_full") + .replace("%username%", strings[0])); + return true; + } + FundamentalsPlayer fPlayer = plugin.getPlayerMap().getPlayer(uuid); + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("seen_offline") + .replace("%player%", plugin.getPlayerCache().getUsernameFromUUID(uuid)) + .replace("%time%", Utils.formatDateDiff(fPlayer.getLastSeen()*1000, System.currentTimeMillis()))); + } else { + FundamentalsPlayer fPlayer = plugin.getPlayerMap().getPlayer(matches.get(0)); + commandSender.sendMessage(plugin.getFundamentalsLanguageConfig().getMessage("seen_online") + .replace("%displayname%", fPlayer.getFullDisplayName()) + .replace("%time%", Utils.formatDateDiff(fPlayer.getLoginTime(), System.currentTimeMillis()))); + } + return true; + } +} diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandWeather.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandWeather.java new file mode 100644 index 0000000..bcaec6d --- /dev/null +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/commands/CommandWeather.java @@ -0,0 +1,80 @@ +package com.johnymuffin.beta.fundamentals.commands; + +import com.johnymuffin.beta.fundamentals.Fundamentals; +import com.johnymuffin.beta.fundamentals.settings.FundamentalsLanguage; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; + +import java.util.ArrayList; +import java.util.List; + +public class CommandWeather implements CommandExecutor { + + @Override + public boolean onCommand(CommandSender commandSender, Command command, String s, String[] strings) { + Player player; + List worlds = new ArrayList<>(); + String worldarg; + + if (!(commandSender.hasPermission("fundamentals.weather") || commandSender.isOp())) { + commandSender.sendMessage(FundamentalsLanguage.getInstance().getMessage("no_permission")); + return true; + } + if (strings.length < 1) { + commandSender.sendMessage(FundamentalsLanguage.getInstance().getMessage("weather_invalid_usage")); + return true; + } + if (strings.length < 2) { + player = (Player) commandSender; + worlds.add(0, player.getWorld()); + } + else { + worldarg = strings[1]; + + if (worldarg.equals("all")) { + worlds = Bukkit.getWorlds(); + } + else { + worlds.add(0, Bukkit.getWorld(worldarg)); + } + } + + String arg = strings[0].toLowerCase(); + + for (World world : worlds) { + switch (arg) { + case "clear": + case "sun": + if (world.hasStorm()) { + world.setThundering(false); + world.setWeatherDuration(5); + } + break; + case "storm": + if (!world.hasStorm()) { + world.setWeatherDuration(5); + } + world.setThundering(true); + break; + case "rain": + if (!world.hasStorm()) { + world.setWeatherDuration(5); + } + world.setThundering(false); + break; + default: + commandSender.sendMessage(FundamentalsLanguage.getInstance().getMessage("weather_invalid_usage")); + return true; + } + commandSender.sendMessage(FundamentalsLanguage.getInstance().getMessage("weather_set_weather") + .replace("%var1%", arg) + .replace("%var2%", world.getName()) + ); + } + return true; + } +} diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/listener/FundamentalsPlayerListener.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/listener/FundamentalsPlayerListener.java index 424d0c2..b02b09a 100644 --- a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/listener/FundamentalsPlayerListener.java +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/listener/FundamentalsPlayerListener.java @@ -5,6 +5,7 @@ import com.johnymuffin.beta.fundamentals.events.FEconomyUpdateEvent; import com.johnymuffin.beta.fundamentals.player.FundamentalsPlayer; import com.johnymuffin.beta.fundamentals.settings.FundamentalsLanguage; +import com.johnymuffin.beta.fundamentals.util.Utils; import com.projectposeidon.api.PoseidonUUID; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -22,10 +23,12 @@ import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.player.*; +import java.util.Iterator; import java.util.UUID; import java.util.logging.Level; import static com.johnymuffin.beta.fundamentals.util.Utils.*; +import static com.johnymuffin.beta.fundamentals.FundamentalPermission.isPlayerAuthorized; public class FundamentalsPlayerListener implements Listener { private Fundamentals plugin; @@ -87,10 +90,18 @@ public void onPlayerJoin(final PlayerJoinEvent event) { if (!event.getPlayer().isOnline()) { return; } + fPlayer.setLoginTime(); fPlayer.updateActivity(); fPlayer.playerJoinUpdate(event.getPlayer().getName()); + //Mute Start + if(!fPlayer.isMuted()){ + fPlayer.setMuteTimer(null); + } + //Mute End + //Nickname Start + fPlayer.updateNickname(); fPlayer.updateDisplayName(); //Nickname End @@ -137,7 +148,7 @@ public void onPlayerQuit(PlayerQuitEvent event) { } @EventHandler(ignoreCancelled = true) - public void onPLayerKick(PlayerKickEvent event) { + public void onPlayerKick(PlayerKickEvent event) { FundamentalsPlayerMap.getInstance().getPlayer(event.getPlayer()).playerQuitUpdate(); //Kick message @@ -151,23 +162,34 @@ public void onPLayerKick(PlayerKickEvent event) { @EventHandler(ignoreCancelled = true, priority = Event.Priority.Low) public void onPlayerChat(final PlayerChatEvent event) { Player player = event.getPlayer(); - FundamentalsPlayer fundamentalsPlayer = plugin.getPlayerMap().getPlayer(player); + FundamentalsPlayer fPlayer = plugin.getPlayerMap().getPlayer(player); - fundamentalsPlayer.updateActivity(); //Update AFK timer - fundamentalsPlayer.updateDisplayName(); //Update Nickname + fPlayer.updateActivity(); //Update AFK timer + fPlayer.updateDisplayName(); //Update Nickname + if (fPlayer.isMuted()) { + event.setCancelled(true); + String mutedMessage = plugin.getFundamentalsLanguageConfig().getMessage("mute_player_chat") + .replace("%duration%", fPlayer.getMuteStatus() == -1 ? "permanently" : "for" + Utils.formatDateDiff(fPlayer.getMuteStatus())); + player.sendMessage(mutedMessage); + return; + } - //Nickname Start -// String displayName = fundamentalsPlayer.getNickname(); -// if (displayName != null) { -// if (player.hasPermission("fundamentals.nickname.color") || player.isOp()) { -// displayName = formatColor(displayName + "&f"); -// } -// player.setDisplayName("~" + displayName); -// } - //Nickname End + String fullDisplayName = fPlayer.getFullDisplayName(); + String message = isPlayerAuthorized(player, "fundamentals.chat.color") ? formatColor(event.getMessage()) : event.getMessage(); + String format = formatColor(plugin.getFundamentalConfig().getConfigString("settings.chat.public-chat-format")) + .replace("{displayname}", fullDisplayName) + .replace("{message}", message); + event.setFormat(format); + Iterator it = event.getRecipients().iterator(); + while (it.hasNext()) { + FundamentalsPlayer recipient = plugin.getPlayerMap().getPlayer(it.next()); + if (recipient.getIgnoreList().contains(fPlayer.getUuid())) { + it.remove(); + } + } } @EventHandler(ignoreCancelled = true) diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/player/FundamentalsPlayer.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/player/FundamentalsPlayer.java index fe1bd9a..e1d0baa 100644 --- a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/player/FundamentalsPlayer.java +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/player/FundamentalsPlayer.java @@ -5,6 +5,7 @@ import com.johnymuffin.beta.fundamentals.playerdata.FundamentalsPlayerFile; import com.johnymuffin.beta.fundamentals.settings.FundamentalsLanguage; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.entity.Player; import java.util.ArrayList; @@ -13,13 +14,16 @@ import java.util.logging.Level; import static com.johnymuffin.beta.fundamentals.util.Utils.getPlayerFromUUID; +import static com.johnymuffin.beta.fundamentals.util.Utils.formatColor; public class FundamentalsPlayer extends FundamentalsPlayerFile { //Fundamentals private Fundamentals plugin; //Player private UUID uuid; + private long loginTime = System.currentTimeMillis(); private long lastActivity = System.currentTimeMillis() / 1000l; + private Player replyTo = null; private boolean isAFK = false; private boolean isFirstJoin = false; private long quitTime = 0L; @@ -112,6 +116,17 @@ public void setBalance(Double amount) { } } + public void updateNickname() { + String displayName = getNickname(); + Player player = getPlayerFromUUID(uuid); + if (displayName != null) { + if (player.hasPermission("fundamentals.nickname.color") || player.isOp()) { + displayName = formatColor(displayName + "&f"); + } + player.setDisplayName("~" + displayName); + } + } + public void updateDisplayName() { Player player = getPlayerFromUUID(uuid); updateDisplayName(player); @@ -130,6 +145,13 @@ public void updateDisplayName(Player player) { } } + public String getFullDisplayName() { + String prefix = plugin.getPermissionsHook().getMainUserPrefix(uuid); + if (prefix == null) { + prefix = ""; + } + return formatColor(prefix) + ChatColor.WHITE + getBukkitPlayer().getDisplayName(); + } public void setBalance(Double amount, String worldName) { if (this.plugin.isWorldManagerMultiWorldEconomy()) { @@ -140,7 +162,6 @@ public void setBalance(Double amount, String worldName) { } } - //AFK Logic public void updateActivity() { //Confirm Player Is Online @@ -170,13 +191,13 @@ public void toggleAFK() { if (isAFK) { isAFK = false; String msg = FundamentalsLanguage.getInstance().getMessage("afk_toggle_off"); - msg = msg.replaceAll("%var1%", getBukkitPlayer().getDisplayName()); + msg = msg.replaceAll("%var1%", getFullDisplayName()); Bukkit.broadcastMessage(msg); } else { isAFK = true; String msg = FundamentalsLanguage.getInstance().getMessage("afk_toggle_on"); - msg = msg.replaceAll("%var1%", getBukkitPlayer().getDisplayName()); + msg = msg.replaceAll("%var1%", getFullDisplayName()); Bukkit.broadcastMessage(msg); } } @@ -231,6 +252,10 @@ public FundamentalsBank[] getAccessibleAccounts() { return (FundamentalsBank[]) accounts.toArray(); } + public boolean isMuted() { + Long muteStatus = getMuteStatus(); + return muteStatus != null && (muteStatus == -1 || System.currentTimeMillis() < muteStatus); + } public long getQuitTime() { return quitTime; @@ -247,6 +272,22 @@ public boolean isFirstJoin() { return isFirstJoin; } + public void setLoginTime() { + this.loginTime = System.currentTimeMillis(); + } + + public long getLoginTime() { + return loginTime; + } + + public Player getReplyTo() { + return replyTo; + } + + public void setReplyTo(Player replyTo) { + this.replyTo = replyTo; + } + public boolean isFakeQuit() { return fakeQuit; } diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/playerdata/FundamentalsPlayerFile.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/playerdata/FundamentalsPlayerFile.java index 8004622..3a08a1f 100644 --- a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/playerdata/FundamentalsPlayerFile.java +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/playerdata/FundamentalsPlayerFile.java @@ -71,7 +71,7 @@ protected void setLastSeen() { public long getLastSeen() { - if(isPlayerOnline()) { + if (isPlayerOnline()) { return System.currentTimeMillis() / 1000L; } return Long.parseLong(String.valueOf(jsonData.get("lastSeen"))); @@ -181,8 +181,8 @@ public void addUserIgnore(UUID uuid) { } else { ignores = new JSONArray(); } - if (!ignores.contains(uuid)) { - ignores.add(uuid); + if (!ignores.contains(uuid.toString())) { + ignores.add(uuid.toString()); jsonData.put("ignore", ignores); } } @@ -193,17 +193,17 @@ public void removeUserIgnore(UUID uuid) { return; } ignores = (JSONArray) jsonData.get("ignore"); - if (ignores.contains(uuid)) { - ignores.remove(uuid); + if (ignores.contains(uuid.toString())) { + ignores.remove(uuid.toString()); } } - public List getIgnoreList() { - List list = new ArrayList(); + public List getIgnoreList() { + List list = new ArrayList(); if (jsonData.containsKey("ignore")) { - JSONArray jsonArray = (JSONArray) jsonData.get("ignores"); + JSONArray jsonArray = (JSONArray) jsonData.get("ignore"); for (int i = 0; i < jsonArray.size(); i++) { - list.add(String.valueOf(jsonArray.get(i))); + list.add(UUID.fromString(String.valueOf(jsonArray.get(i)))); } } return list; diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/settings/FundamentalsConfig.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/settings/FundamentalsConfig.java index 4319812..dfa8eb0 100644 --- a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/settings/FundamentalsConfig.java +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/settings/FundamentalsConfig.java @@ -31,6 +31,7 @@ private void write() { generateConfigOption("settings.vanish-hidden-from-mobs", true); generateConfigOption("settings.preferred-permissions-hook", "JPerms"); // generateConfigOption("settings.import-prefixes-next-start", true); + generateConfigOption("settings.list.sort-groups", true); generateConfigOption("settings.per-world-economy.info", "This setting enables per-world economy. FundamentalsWorldManager must be installed for this feature to function."); @@ -54,6 +55,12 @@ private void write() { generateConfigOption("settings.player.kick-message.info", "This is the server's kick message."); generateConfigOption("settings.player.kick-message.value", "{prefix} &c{name} &bhas been kicked."); + // Chat Format + + generateConfigOption("settings.chat.public-chat-format", "{displayname}&f: {message}"); + generateConfigOption("settings.chat.msg-send-format", "&7[me -> {displayname}&7]&f {message}"); + generateConfigOption("settings.chat.msg-receive-format", "&7[{displayname}&7 -> me]&f {message}"); + generateConfigOption("settings.chat.broadcast-format", "&f[&cBroadcast&f]&a {message}"); //Interest Settings diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/settings/FundamentalsLanguage.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/settings/FundamentalsLanguage.java index 0c57ffc..bf3afdc 100644 --- a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/settings/FundamentalsLanguage.java +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/settings/FundamentalsLanguage.java @@ -78,12 +78,44 @@ private void loadDefaults() { //God Mode map.put("god_enable", "&6Godmode has been enabled"); map.put("god_disable", "&6Godmode has been disabled"); + //Broadcast + map.put("broadcast_info", "&4You haven't provided enough arguments, /broadcast (message)"); + //List + map.put("list_online", "&9There are &c%online% &9out of a maximum &c%maximum% &9players online."); + //Msg + map.put("msg_info", "&4You haven't provided enough arguments, /msg (player) (message)"); + map.put("msg_player_ignored", "&cYou cannot message %player% as you are ignoring them"); + //R + map.put("r_info", "&4You haven't provided enough arguments, /r (message)"); + map.put("r_no_recipient", "&cYou have no one to reply to"); + map.put("r_player_offline", "&cYou cannot reply to %player% as they are offline"); + //Mute + map.put("mute_info", "&4You haven't provided enough arguments, /mute (player) (duration)"); + map.put("mute_successful", "&7Muted %player% %duration%"); + map.put("mute_unmute_successful", "&7Unmuted %player%"); + map.put("mute_player_muted", "&7You have been muted %duration%"); + map.put("mute_player_unmuted", "&7You have been unmuted"); + map.put("mute_player_chat", "&cYou cannot chat as you are muted %duration%"); + map.put("mute_self", "&4You can't mute yourself!"); + //Ignore + map.put("ignore_info", "&4You haven't provided enough arguments, /ignore (player)"); + map.put("ignore_add", "&7You are now ignoring %player%"); + map.put("ignore_remove", "&7You are no longer ignoring %player%"); + map.put("ignore_self", "&4You can't ignore yourself!"); //Nickname map.put("nickname_info", "&4Please use /nick [nickname:off]"); map.put("nickname_remove", "&6Your nickname has been removed"); map.put("nickname_set", "&6Your nickname has been set to &f%var1%"); map.put("nickname_set_others", "&6The nickname for %var1% has been set to &f%var2%"); map.put("nickname_remove_others", "&4You have removed a nickname"); + //Realname + map.put("realname_info", "&4You haven't provided enough arguments, /realname (nickname)"); + map.put("realname_successful", "%displayname%&f is %player%"); + map.put("realname_player_not_found", "&4Can't find a player with the nickname &9%nickname%"); + //Seen + map.put("seen_info", "&4You haven't provided enough arguments, /seen (player)"); + map.put("seen_online", "%displayname%&f has been online for%time%"); + map.put("seen_offline", "%player% was last seen%time% ago"); //InvSee map.put("invsee_deny", "&cSorry, you can't do that while you are in InvSee"); map.put("invsee_info", "&4You haven't provided enough arguments, /invsee (username)"); @@ -96,6 +128,9 @@ private void loadDefaults() { map.put("vanish_successful_other_disabled", "&4Disabled vanish for another player."); map.put("vanish_disable", "&4Vanish Disabled."); map.put("vanish_enable", "&7Vanish Enabled."); + //Weather + map.put("weather_invalid_usage", "&6Invalid usage: &a/weather [worldname|all]"); + map.put("weather_set_weather", "&7Weather has been set to %var1% in %var2%"); //Clear Inventory map.put("clearinventory_notice", "&9Your inventory has been cleared"); map.put("clearinventory_successfully", "&9Inventory cleared successfully"); diff --git a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/util/Utils.java b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/util/Utils.java index 06d2b02..73f9539 100644 --- a/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/util/Utils.java +++ b/FundamentalsCore/src/main/java/com/johnymuffin/beta/fundamentals/util/Utils.java @@ -19,6 +19,7 @@ import java.time.LocalDate; import java.time.format.TextStyle; import java.util.*; +import java.util.regex.Matcher; import java.util.regex.Pattern; public class Utils { @@ -41,6 +42,132 @@ public static String getCurrentMonth() { return month; } + public static String formatDateDiff(long diff) { + Calendar now = new GregorianCalendar(); + Calendar toDate = new GregorianCalendar(); + toDate.setTimeInMillis(diff); + return formatDateDiff(now, toDate); + } + + public static String formatDateDiff(long from, long to){ + Calendar fromDate = new GregorianCalendar(); + Calendar toDate = new GregorianCalendar(); + fromDate.setTimeInMillis(from); + toDate.setTimeInMillis(to); + return formatDateDiff(fromDate, toDate); + } + + public static String formatDateDiff(Calendar fromDate, Calendar toDate) { + boolean future = false; + if (toDate.equals(fromDate)) return "now"; + if (toDate.after(fromDate)) future = true; + + StringBuilder sb = new StringBuilder(); + int[] types = new int[] { + Calendar.YEAR, + Calendar.MONTH, + Calendar.DAY_OF_MONTH, + Calendar.HOUR_OF_DAY, + Calendar.MINUTE, + Calendar.SECOND + }; + String[] names = new String[] { + "year", + "years", + "month", + "months", + "day", + "days", + "hour", + "hours", + "minute", + "minutes", + "second", + "seconds" + }; + for (int i = 0; i < types.length; i++) { + int diff = dateDiff(types[i], fromDate, toDate, future); + if (diff > 0) { + sb.append(" ").append(diff).append(" ").append(names[i * 2 + (diff > 1 ? 1 : 0)]); + } + } + if (sb.length() == 0) return "now"; + return sb.toString(); + } + + public static long parseDateDiff(String time, boolean future) throws Exception { + Calendar c = new GregorianCalendar(); + + Pattern timePattern = Pattern.compile( + "(?:([0-9]+)\\s*y[a-z]*[,\\s]*)?" + + "(?:([0-9]+)\\s*mo[a-z]*[,\\s]*)?" + + "(?:([0-9]+)\\s*w[a-z]*[,\\s]*)?" + + "(?:([0-9]+)\\s*d[a-z]*[,\\s]*)?" + + "(?:([0-9]+)\\s*h[a-z]*[,\\s]*)?" + + "(?:([0-9]+)\\s*m[a-z]*[,\\s]*)?" + + "(?:([0-9]+)\\s*(?:s[a-z]*)?)?", Pattern.CASE_INSENSITIVE); + Matcher m = timePattern.matcher(time); + boolean found = false; + while (m.find()) { + if (m.group() == null || m.group().isEmpty()) continue; + + for (int i = 0; i < m.groupCount(); i++) { + if (m.group(i) != null && !m.group(i).isEmpty()) { + found = true; + break; + } + } + if (found) { + for (int i = 1; i <= 7; i++) { + if (m.group(i) != null && !m.group(i).isEmpty()) { + int group = -1; + switch (i) { + case 1: + group = Calendar.YEAR; + break; + case 2: + group = Calendar.MONTH; + break; + case 3: + group = Calendar.WEEK_OF_YEAR; + break; + case 4: + group = Calendar.DAY_OF_MONTH; + break; + case 5: + group = Calendar.HOUR_OF_DAY; + break; + case 6: + group = Calendar.MINUTE; + break; + case 7: + group = Calendar.SECOND; + break; + } + if (group != -1) c.add(group, Integer.parseInt(m.group(i)) * (future ? 1 : -1)); + } + } + } + } + if (!found) { + throw new Exception("Illegal Date"); + } + return c.getTimeInMillis(); + } + + private static int dateDiff(int type, Calendar fromDate, Calendar toDate, boolean future) { + int diff = 0; + long savedDate = fromDate.getTimeInMillis(); + while ((future && !fromDate.after(toDate)) || (!future && !fromDate.before(toDate))) { + savedDate = fromDate.getTimeInMillis(); + fromDate.add(type, future ? 1 : -1); + diff++; + } + diff--; + fromDate.setTimeInMillis(savedDate); + return diff; + } + public static Player getPlayerFromString(String name) { List players = Bukkit.matchPlayer(name); if (players.size() == 1) { @@ -235,4 +362,23 @@ public static boolean setEssentialsHidden(Player player, boolean visible) { } return false; } + + public static boolean isEssentialsHidden(Player player) { + if (Bukkit.getPluginManager().isPluginEnabled("Essentials")) { + Essentials essentials = (Essentials) Bukkit.getPluginManager().getPlugin("Essentials"); + return essentials.getUser(player).isHidden(); + } + return false; + } + + public static String getFullArg(String[] strings, int start) { + final StringBuilder bldr = new StringBuilder(); + for (int i = start; i < strings.length; i++) { + if (i != start) { + bldr.append(" "); + } + bldr.append(strings[i]); + } + return bldr.toString(); + } } diff --git a/FundamentalsCore/src/main/resources/plugin.yml b/FundamentalsCore/src/main/resources/plugin.yml index 14cbde1..6e427ff 100644 --- a/FundamentalsCore/src/main/resources/plugin.yml +++ b/FundamentalsCore/src/main/resources/plugin.yml @@ -50,6 +50,12 @@ commands: # description: a nickname command # usage: / # aliases: [nick] + realname: + description: Command to get the real name of a nicked user. + usage: / + seen: + description: Command to show when a player was last seen. + usage: / # invsee: # description: a inventory command # usage: / @@ -57,9 +63,34 @@ commands: # description: Clear all items in your inventory. # usage: / # aliases: [ci] + broadcast: + description: Command to broadcast to the whole server. + usage: / + aliases: [bc] + list: + description: Command to list all online players. + usage: / + aliases: [playerlist, who, online] + msg: + description: Command to message players. + usage: / + aliases: [m, t, tell, whisper, w] + r: + description: Command to reply to players. + usage: / + aliases: [reply] + mute: + description: Command to mute players. + usage: / [duration] + ignore: + description: Command to ignore players. + usage: / vanish: description: Command to vanish player. usage: / + weather: + description: Command to change the weather in a world. + usage: / [worldname|all] bank: description: Command to do bank stuff. usage: /