Merge pull request #35 from RedstonerServer/gradle
Updated to 1.13 and a whole lot more
This commit is contained in:
12
.gitignore
vendored
Normal file
12
.gitignore
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
/.gradle/
|
||||||
|
/build/
|
||||||
|
/bin/
|
||||||
|
|
||||||
|
/.settings/
|
||||||
|
/.idea/
|
||||||
|
|
||||||
|
.classpath
|
||||||
|
.project
|
||||||
|
|
||||||
|
/.idea/
|
||||||
|
/.vscode/
|
||||||
27
build.gradle
Normal file
27
build.gradle
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
apply plugin: "java"
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
jcenter()
|
||||||
|
maven { url "https://jitpack.io" }
|
||||||
|
|
||||||
|
maven { url "https://hub.spigotmc.org/nexus/content/repositories/snapshots/" }
|
||||||
|
maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation "com.github.RedstonerServer:ModuleLoader:gradle-SNAPSHOT"
|
||||||
|
implementation "com.github.RedstonerServer:CommandManager:master-SNAPSHOT"
|
||||||
|
implementation "com.github.RedstonerServer:ChatAPI:master-SNAPSHOT"
|
||||||
|
implementation "com.github.RedstonerServer:ChestAPI:master-SNAPSHOT"
|
||||||
|
|
||||||
|
compileOnly 'org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT'
|
||||||
|
}
|
||||||
|
|
||||||
|
sourceSets {
|
||||||
|
main {
|
||||||
|
resources {
|
||||||
|
srcDir 'src/main/java'
|
||||||
|
include '**/*.cmd'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,225 +0,0 @@
|
|||||||
package com.redstoner.modules.afk;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.Event;
|
|
||||||
import org.bukkit.event.EventException;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.EventPriority;
|
|
||||||
import org.bukkit.event.HandlerList;
|
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
|
||||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
|
||||||
import org.bukkit.event.player.PlayerEvent;
|
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
|
||||||
import org.bukkit.event.player.PlayerMoveEvent;
|
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
|
||||||
import org.bukkit.plugin.EventExecutor;
|
|
||||||
|
|
||||||
import com.nemez.cmdmgr.Command;
|
|
||||||
import com.redstoner.annotations.AutoRegisterListener;
|
|
||||||
import com.redstoner.annotations.Commands;
|
|
||||||
import com.redstoner.annotations.Version;
|
|
||||||
import com.redstoner.misc.BroadcastFilter;
|
|
||||||
import com.redstoner.misc.CommandHolderType;
|
|
||||||
import com.redstoner.misc.Main;
|
|
||||||
import com.redstoner.misc.Utils;
|
|
||||||
import com.redstoner.modules.Module;
|
|
||||||
import com.redstoner.modules.datamanager.DataManager;
|
|
||||||
|
|
||||||
@Commands(CommandHolderType.File)
|
|
||||||
@AutoRegisterListener
|
|
||||||
@Version(major = 4, minor = 0, revision = 5, compatible = 5)
|
|
||||||
public class AFK implements Module, Listener
|
|
||||||
{
|
|
||||||
private CustomListener listener;
|
|
||||||
boolean move = true, look = false;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void firstLoad()
|
|
||||||
{
|
|
||||||
Module.super.firstLoad();
|
|
||||||
DataManager.setConfig("indicator", "&7[AFK]");
|
|
||||||
String[] choices = new String[] {"listen", "ignore"};
|
|
||||||
DataManager.setConfig("move", "listen", choices);
|
|
||||||
DataManager.setConfig("look", "ignore", choices);
|
|
||||||
DataManager.setConfig("chat", "listen", choices);
|
|
||||||
DataManager.setConfig("interact", "listen", choices);
|
|
||||||
DataManager.setConfig("command", "ignore", choices);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void migrate(Version old)
|
|
||||||
{
|
|
||||||
Module.super.migrate(old);
|
|
||||||
if ((old.major() == 4) && (old.minor() == 0) && (old.revision() == 3))
|
|
||||||
{
|
|
||||||
String[] choices = new String[] {"listen", "ignore"};
|
|
||||||
DataManager.setConfig("look", "ignore", choices);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void postEnable()
|
|
||||||
{
|
|
||||||
Module.super.postEnable();
|
|
||||||
listener = new CustomListener();
|
|
||||||
update_afk_listeners(Bukkit.getConsoleSender());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDisable()
|
|
||||||
{
|
|
||||||
Module.super.onDisable();
|
|
||||||
HandlerList.unregisterAll(listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Command(hook = "afk")
|
|
||||||
public boolean afk(CommandSender sender)
|
|
||||||
{
|
|
||||||
return afk(sender, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Command(hook = "afk2")
|
|
||||||
public boolean afk(CommandSender sender, String reason)
|
|
||||||
{
|
|
||||||
return afk(sender, reason, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean afk(CommandSender sender, String reason, boolean silent)
|
|
||||||
{
|
|
||||||
if (isafk(sender))
|
|
||||||
{
|
|
||||||
unafk(sender);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DataManager.setData(sender, "afk_reason", reason);
|
|
||||||
DataManager.setState(sender, "afk", true);
|
|
||||||
if (!silent)
|
|
||||||
Utils.broadcast("§7 * ", Utils.getName(sender) + "§7 is now AFK", null);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void unafk(CommandSender sender)
|
|
||||||
{
|
|
||||||
DataManager.setState(sender, "afk", false);
|
|
||||||
Utils.broadcast("§7 * ", Utils.getName(sender) + "§7 is no longer AFK", null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isafk(CommandSender sender)
|
|
||||||
{
|
|
||||||
return DataManager.getState(sender, "afk");
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isVanished(Player player)
|
|
||||||
{
|
|
||||||
return DataManager.getState(player, "vanished");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Command(hook = "update_afk_listeners")
|
|
||||||
public boolean update_afk_listeners(CommandSender sender)
|
|
||||||
{
|
|
||||||
Utils.broadcast(null, "Updating afk listeners...", new BroadcastFilter()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public boolean sendTo(CommandSender recipient)
|
|
||||||
{
|
|
||||||
return recipient.hasPermission("utils.afk.admin");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
move = DataManager.getConfigOrDefault("move", "listen").equals("listen");
|
|
||||||
look = DataManager.getConfigOrDefault("look", "ignore").equals("listen");
|
|
||||||
if (move || look)
|
|
||||||
Bukkit.getPluginManager().registerEvent(PlayerMoveEvent.class, listener, EventPriority.MONITOR, listener,
|
|
||||||
Main.plugin);
|
|
||||||
else
|
|
||||||
PlayerMoveEvent.getHandlerList().unregister(listener);
|
|
||||||
if (DataManager.getConfigOrDefault("chat", "listen").equals("listen"))
|
|
||||||
Bukkit.getPluginManager().registerEvent(PlayerInteractEvent.class, listener, EventPriority.MONITOR,
|
|
||||||
listener, Main.plugin);
|
|
||||||
else
|
|
||||||
PlayerInteractEvent.getHandlerList().unregister(listener);
|
|
||||||
if (DataManager.getConfigOrDefault("interact", "listen").equals("listen"))
|
|
||||||
Bukkit.getPluginManager().registerEvent(AsyncPlayerChatEvent.class, listener, EventPriority.MONITOR,
|
|
||||||
listener, Main.plugin);
|
|
||||||
else
|
|
||||||
AsyncPlayerChatEvent.getHandlerList().unregister(listener);
|
|
||||||
if (DataManager.getConfigOrDefault("command", "ignore").equals("listen"))
|
|
||||||
Bukkit.getPluginManager().registerEvent(PlayerCommandPreprocessEvent.class, listener, EventPriority.MONITOR,
|
|
||||||
listener, Main.plugin);
|
|
||||||
else
|
|
||||||
PlayerCommandPreprocessEvent.getHandlerList().unregister(listener);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onLeave(PlayerQuitEvent event)
|
|
||||||
{
|
|
||||||
DataManager.setState(event.getPlayer(), "afk", false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class CustomListener implements Listener, EventExecutor
|
|
||||||
{
|
|
||||||
private boolean move = true, look = false;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void execute(Listener listener, Event event) throws EventException
|
|
||||||
{
|
|
||||||
if (event instanceof PlayerEvent)
|
|
||||||
{
|
|
||||||
if (event instanceof PlayerMoveEvent)
|
|
||||||
{
|
|
||||||
PlayerMoveEvent pevent = (PlayerMoveEvent) event;
|
|
||||||
double distance = pevent.getFrom().distance(pevent.getTo());
|
|
||||||
boolean moved = distance > 0;
|
|
||||||
boolean looked = (pevent.getFrom().getPitch() != pevent.getTo().getPitch())
|
|
||||||
|| (pevent.getFrom().getYaw() != pevent.getTo().getYaw());
|
|
||||||
if ((move && moved) || (look && looked))
|
|
||||||
{
|
|
||||||
Player player = pevent.getPlayer();
|
|
||||||
if (isafk(player))
|
|
||||||
if (!isVanished(player))
|
|
||||||
unafk(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PlayerEvent pevent = (PlayerEvent) event;
|
|
||||||
Player player = pevent.getPlayer();
|
|
||||||
if (isafk(player))
|
|
||||||
if (!isVanished(player))
|
|
||||||
unafk(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void unafk(CommandSender sender)
|
|
||||||
{
|
|
||||||
DataManager.setState(sender, "afk", false);
|
|
||||||
Utils.broadcast("§7 * ", Utils.getName(sender) + "§7 is no longer AFK", null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isafk(CommandSender sender)
|
|
||||||
{
|
|
||||||
return DataManager.getState(sender, "afk");
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isVanished(Player player)
|
|
||||||
{
|
|
||||||
return DataManager.getState(player, "vanished");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void listenMove(boolean move)
|
|
||||||
{
|
|
||||||
this.move = move;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void listenLook(boolean look)
|
|
||||||
{
|
|
||||||
this.look = look;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,206 +0,0 @@
|
|||||||
package com.redstoner.modules.blockplacemods;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
|
|
||||||
import com.nemez.cmdmgr.Command;
|
|
||||||
import com.redstoner.annotations.AutoRegisterListener;
|
|
||||||
import com.redstoner.annotations.Commands;
|
|
||||||
import com.redstoner.annotations.Version;
|
|
||||||
import com.redstoner.misc.CommandHolderType;
|
|
||||||
import com.redstoner.misc.Main;
|
|
||||||
import com.redstoner.modules.Module;
|
|
||||||
import com.redstoner.modules.blockplacemods.mods.Mod;
|
|
||||||
import com.redstoner.modules.blockplacemods.mods.ModAbstract;
|
|
||||||
import com.redstoner.modules.blockplacemods.mods.ModToggledAbstract;
|
|
||||||
import com.redstoner.utils.CommandException;
|
|
||||||
import com.redstoner.utils.CommandMap;
|
|
||||||
|
|
||||||
@Commands(CommandHolderType.None)
|
|
||||||
@AutoRegisterListener
|
|
||||||
@Version(major = 4, minor = 1, revision = 1, compatible = 4)
|
|
||||||
public final class BlockPlaceMods implements Module, Listener
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public boolean onEnable()
|
|
||||||
{
|
|
||||||
ModAbstract.registerAll(getLogger());
|
|
||||||
for (Mod mod : new ArrayList<>(ModAbstract.getMods().values()))
|
|
||||||
{
|
|
||||||
mod.registerListeners();
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Map<String, org.bukkit.command.Command> commandMap = CommandMap.getCommandMap();
|
|
||||||
org.bukkit.command.Command command = new BlockPlaceModsCommand();
|
|
||||||
for (String alias : getCommandAliases())
|
|
||||||
{
|
|
||||||
commandMap.put(alias, command);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (ReflectiveOperationException ex)
|
|
||||||
{
|
|
||||||
ex.printStackTrace();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void postEnable()
|
|
||||||
{
|
|
||||||
setPrefix("BPM");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDisable()
|
|
||||||
{
|
|
||||||
for (Mod mod : ModAbstract.getMods().values())
|
|
||||||
{
|
|
||||||
mod.unregisterListeners();
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Map<String, org.bukkit.command.Command> commandMap = CommandMap.getCommandMap();
|
|
||||||
for (String alias : getCommandAliases())
|
|
||||||
{
|
|
||||||
org.bukkit.command.Command command = commandMap.get(alias);
|
|
||||||
if (command != null && command.getClass() == BlockPlaceModsCommand.class)
|
|
||||||
{
|
|
||||||
commandMap.remove(alias);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ignored)
|
|
||||||
{}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String[] getCommandAliases()
|
|
||||||
{
|
|
||||||
String pluginName = Main.plugin.getName().toLowerCase();
|
|
||||||
// @noformat
|
|
||||||
return new String[]{"mod", pluginName + ":mod",
|
|
||||||
"set", pluginName + ":set",
|
|
||||||
"toggle", pluginName + ":toggle"
|
|
||||||
};
|
|
||||||
// @format
|
|
||||||
}
|
|
||||||
|
|
||||||
@Command(hook = "mod_empty")
|
|
||||||
public void onModEmptyCommand(CommandSender sender)
|
|
||||||
{
|
|
||||||
onModCommand(sender, "");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Command(hook = "mod")
|
|
||||||
public void onModCommand(CommandSender sender, String input)
|
|
||||||
{
|
|
||||||
String[] args = new ArrayList<>(Arrays.asList(input.split(" "))).stream()
|
|
||||||
.filter(x -> x != null && !x.trim().isEmpty()).toArray(String[]::new);
|
|
||||||
String prefix = "";
|
|
||||||
String message;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (args.length > 0)
|
|
||||||
{
|
|
||||||
Mod target = ModAbstract.getMod(args[0].toLowerCase());
|
|
||||||
if (target != null)
|
|
||||||
{
|
|
||||||
prefix += "&7[&2" + capitalize(target.getName()) + "&7]:&a ";
|
|
||||||
if (!(sender instanceof Player))
|
|
||||||
{
|
|
||||||
message = "&cYou must be a player to use any block place mod";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
message = target.runCommand((Player) sender, Arrays.copyOfRange(args, 1, args.length));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (args[0].equalsIgnoreCase("help"))
|
|
||||||
{
|
|
||||||
message = commandHelp(sender, args);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
message = "&cThat argument could not be recognized";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
message = commandHelp(sender, args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (CommandException ex)
|
|
||||||
{
|
|
||||||
message = " &c" + ex.getMessage();
|
|
||||||
}
|
|
||||||
catch (Throwable t)
|
|
||||||
{
|
|
||||||
message = " &cAn unexpected error occurred while executing this command.";
|
|
||||||
t.printStackTrace();
|
|
||||||
}
|
|
||||||
getLogger().message(sender, prefix + message);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String commandHelp(CommandSender sender, String[] args)
|
|
||||||
{
|
|
||||||
StringBuilder result = new StringBuilder("§7BlockPlaceMods adds some redstone-centric utilities");
|
|
||||||
result.append("\n").append(ChatColor.GRAY.toString()).append("Available mods:");
|
|
||||||
List<Mod> mods = new ArrayList<>(new HashSet<>(ModAbstract.getMods().values()));
|
|
||||||
mods.sort(Comparator.<Mod> comparingInt(m -> ModToggledAbstract.class.isInstance(m) ? 1 : -1)
|
|
||||||
.thenComparing(Mod::getName));
|
|
||||||
for (Mod mod : mods)
|
|
||||||
{
|
|
||||||
result.append("\n").append(ChatColor.AQUA.toString()).append("/mod ").append(ChatColor.ITALIC.toString())
|
|
||||||
.append(mod.getName());
|
|
||||||
for (String alias : mod.getAliases())
|
|
||||||
{
|
|
||||||
result.append('|').append(alias);
|
|
||||||
}
|
|
||||||
result.append(ChatColor.GRAY.toString()).append(" - ").append(mod.getDescription());
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String capitalize(String modName)
|
|
||||||
{
|
|
||||||
if (modName.isEmpty())
|
|
||||||
{
|
|
||||||
return modName;
|
|
||||||
}
|
|
||||||
char first = modName.charAt(0);
|
|
||||||
if (first != (first = Character.toUpperCase(first)))
|
|
||||||
{
|
|
||||||
char[] result = modName.toCharArray();
|
|
||||||
result[0] = first;
|
|
||||||
return String.valueOf(result);
|
|
||||||
}
|
|
||||||
return modName;
|
|
||||||
}
|
|
||||||
|
|
||||||
private class BlockPlaceModsCommand extends org.bukkit.command.Command
|
|
||||||
{
|
|
||||||
public BlockPlaceModsCommand()
|
|
||||||
{
|
|
||||||
super("mod");
|
|
||||||
String[] aliases = getCommandAliases();
|
|
||||||
setAliases(Arrays.asList(Arrays.copyOfRange(aliases, 1, aliases.length)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean execute(CommandSender sender, String label, String[] args)
|
|
||||||
{
|
|
||||||
onModCommand(sender, String.join(" ", args));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
package com.redstoner.modules.blockplacemods.mods;
|
|
||||||
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
import com.redstoner.utils.CommandException;
|
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public interface Mod
|
|
||||||
{
|
|
||||||
String getName();
|
|
||||||
|
|
||||||
String getDescription();
|
|
||||||
|
|
||||||
Set<String> getAliases();
|
|
||||||
|
|
||||||
Object getDefault();
|
|
||||||
|
|
||||||
String runCommand(Player sender, String[] args) throws CommandException;
|
|
||||||
|
|
||||||
void registerListeners();
|
|
||||||
|
|
||||||
void unregisterListeners();
|
|
||||||
}
|
|
||||||
@@ -1,94 +0,0 @@
|
|||||||
package com.redstoner.modules.blockplacemods.mods;
|
|
||||||
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.HandlerList;
|
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.bukkit.event.inventory.InventoryType;
|
|
||||||
|
|
||||||
import com.redstoner.misc.Main;
|
|
||||||
import com.redstoner.modules.ModuleLogger;
|
|
||||||
import com.redstoner.modules.datamanager.DataManager;
|
|
||||||
|
|
||||||
public abstract class ModAbstract implements Mod, Listener
|
|
||||||
{
|
|
||||||
private static final Map<String, Mod> mods = new HashMap<>();
|
|
||||||
private final String name;
|
|
||||||
private final Set<String> aliases;
|
|
||||||
private static ModuleLogger logger;
|
|
||||||
|
|
||||||
public static Map<String, Mod> getMods()
|
|
||||||
{
|
|
||||||
return Collections.unmodifiableMap(mods);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Mod getMod(String name)
|
|
||||||
{
|
|
||||||
return mods.get(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void registerMod(Mod mod)
|
|
||||||
{
|
|
||||||
mods.put(mod.getName(), mod);
|
|
||||||
for (String alias : mod.getAliases())
|
|
||||||
{
|
|
||||||
mods.putIfAbsent(alias, mod);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void registerAll(final ModuleLogger logger)
|
|
||||||
{
|
|
||||||
ModAbstract.logger = logger;
|
|
||||||
registerMod(new ModToggledCauldron());
|
|
||||||
registerMod(new ModToggledPiston());
|
|
||||||
registerMod(new ModToggledObserver());
|
|
||||||
registerMod(new ModToggledStep());
|
|
||||||
registerMod(new ModToggledTorch());
|
|
||||||
registerMod(new ModInventory("dropper", InventoryType.DROPPER));
|
|
||||||
registerMod(new ModInventory("furnace", InventoryType.FURNACE));
|
|
||||||
registerMod(new ModInventory("hopper", InventoryType.HOPPER));
|
|
||||||
}
|
|
||||||
|
|
||||||
public ModAbstract(String name)
|
|
||||||
{
|
|
||||||
this.name = Objects.requireNonNull(name);
|
|
||||||
this.aliases = new HashSet<>(2);
|
|
||||||
logger.info("Loaded mod " + name);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getName()
|
|
||||||
{
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Set<String> getAliases()
|
|
||||||
{
|
|
||||||
return aliases;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void registerListeners()
|
|
||||||
{
|
|
||||||
Bukkit.getPluginManager().registerEvents(this, Main.plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void unregisterListeners()
|
|
||||||
{
|
|
||||||
HandlerList.unregisterAll(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void reset(Player player)
|
|
||||||
{
|
|
||||||
DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,195 +0,0 @@
|
|||||||
package com.redstoner.modules.blockplacemods.mods;
|
|
||||||
|
|
||||||
import com.redstoner.modules.datamanager.DataManager;
|
|
||||||
import com.redstoner.utils.CommandException;
|
|
||||||
import com.redstoner.utils.ItemProperties;
|
|
||||||
import org.bukkit.GameMode;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.block.BlockState;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.EventPriority;
|
|
||||||
import org.bukkit.event.block.BlockPlaceEvent;
|
|
||||||
import org.bukkit.event.inventory.InventoryType;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
|
||||||
import org.bukkit.inventory.InventoryHolder;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.json.simple.JSONArray;
|
|
||||||
import org.json.simple.JSONObject;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
public class ModInventory extends ModAbstract
|
|
||||||
{
|
|
||||||
protected InventoryType inventoryType;
|
|
||||||
|
|
||||||
public ModInventory(String name, InventoryType inventoryType)
|
|
||||||
{
|
|
||||||
super(name);
|
|
||||||
this.inventoryType = inventoryType;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int highestUsedIndex(ItemStack[] items)
|
|
||||||
{
|
|
||||||
for (int i = items.length - 1; i >= 0; i--)
|
|
||||||
{
|
|
||||||
if (items[i] != null)
|
|
||||||
{
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDescription()
|
|
||||||
{
|
|
||||||
return "Controls " + inventoryType.name().toLowerCase() + " placement content";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String runCommand(Player sender, String[] args) throws CommandException
|
|
||||||
{
|
|
||||||
if (args.length > 0)
|
|
||||||
{
|
|
||||||
if (args[0].equalsIgnoreCase("clear"))
|
|
||||||
{
|
|
||||||
reset(sender);
|
|
||||||
return "Reset data successfully";
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
int slot = Integer.parseInt(args[0]);
|
|
||||||
if (slot >= inventoryType.getDefaultSize())
|
|
||||||
{
|
|
||||||
throw new CommandException(
|
|
||||||
"Slot number " + slot + " is too high for " + inventoryType.toString().toLowerCase() + "s");
|
|
||||||
}
|
|
||||||
if (slot < 0)
|
|
||||||
{
|
|
||||||
throw new CommandException("Slot number " + slot + " is negative");
|
|
||||||
}
|
|
||||||
// Set the stored item to the item in the sender's hand
|
|
||||||
ItemStack item = sender.getInventory().getItemInMainHand();
|
|
||||||
if (item == null || item.getType() == Material.AIR || item.getAmount() == 0)
|
|
||||||
{
|
|
||||||
// Remove the item.
|
|
||||||
// Set item to null to ensure correct itemName below.
|
|
||||||
item = null;
|
|
||||||
if (present(sender))
|
|
||||||
{
|
|
||||||
set(sender, slot, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
set(sender, slot, item);// don't need to clone because the reference isn't kept
|
|
||||||
}
|
|
||||||
String itemName = item == null ? "nothing"
|
|
||||||
: item.getAmount() + " " + item.getType().toString().toLowerCase().replace("_", "");
|
|
||||||
return "Set the item in slot " + slot + " to " + itemName;
|
|
||||||
}
|
|
||||||
catch (NumberFormatException ex)
|
|
||||||
{
|
|
||||||
if (!args[0].equalsIgnoreCase("help"))
|
|
||||||
{
|
|
||||||
throw new CommandException("Expected a number indicating the slot that you want to set");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
StringBuilder message = new StringBuilder();
|
|
||||||
message.append(" &a### &3Container Mod&a Help ###\n");
|
|
||||||
message.append("&7").append(getDescription()).append('\n');
|
|
||||||
message.append("&6/mod ").append(getName().toLowerCase())
|
|
||||||
.append("&o <slot> &bsets the item in slot to your hand\n");
|
|
||||||
message.append("&6/mod ").append(getName().toLowerCase()).append("&o clear &bclears the data\n");
|
|
||||||
message.append("&6/mod ").append(getName().toLowerCase()).append("&o help &bshows this help page\n");
|
|
||||||
return message.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
|
||||||
public void onBlockPlace(BlockPlaceEvent event)
|
|
||||||
{
|
|
||||||
if (present(event.getPlayer()) && event.getPlayer().getGameMode() == GameMode.CREATIVE)
|
|
||||||
{
|
|
||||||
BlockState state = event.getBlock().getState();
|
|
||||||
if (state instanceof InventoryHolder)
|
|
||||||
{
|
|
||||||
Inventory inv = ((InventoryHolder) state).getInventory();
|
|
||||||
if (inv.getType() == inventoryType)
|
|
||||||
{
|
|
||||||
ItemStack[] data = get(event.getPlayer());
|
|
||||||
inv.setContents(data);
|
|
||||||
state.update();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected ItemStack[] get(Player player)
|
|
||||||
{
|
|
||||||
Object obj = DataManager.getData(player.getUniqueId().toString(), "BlockPlaceMods", getName());
|
|
||||||
if (obj == null)
|
|
||||||
return getDefault();
|
|
||||||
JSONArray array = (JSONArray) obj;
|
|
||||||
ItemStack[] items = new ItemStack[Math.min(inventoryType.getDefaultSize(), array.size())];
|
|
||||||
for (int i = 0, n = items.length; i < n; i++)
|
|
||||||
{
|
|
||||||
Object obj2 = array.get(i);
|
|
||||||
if (obj2 instanceof JSONObject)
|
|
||||||
{ // if null, items[i] remains null
|
|
||||||
items[i] = new ItemProperties().loadFrom((JSONObject) obj2).toItemStack();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return items;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void set(Player player, int index, ItemStack item)
|
|
||||||
{
|
|
||||||
ItemStack[] data = get(player);
|
|
||||||
if (item == null)
|
|
||||||
{
|
|
||||||
if (index < data.length)
|
|
||||||
{
|
|
||||||
data[index] = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (index >= data.length)
|
|
||||||
{
|
|
||||||
data = Arrays.copyOf(data, index + 1);
|
|
||||||
}
|
|
||||||
data[index] = item;
|
|
||||||
}
|
|
||||||
set(player, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
protected void set(Player player, ItemStack[] data)
|
|
||||||
{
|
|
||||||
if (highestUsedIndex(data) == -1)
|
|
||||||
reset(player);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
JSONArray array = new JSONArray();
|
|
||||||
for (int i = 0, n = highestUsedIndex(data); i < n; i++)
|
|
||||||
{
|
|
||||||
ItemStack item = data[i];
|
|
||||||
array.add(item == null ? null : new ItemProperties(item).toJSONObject());
|
|
||||||
}
|
|
||||||
DataManager.setData(player.getUniqueId().toString(), "BlockPlaceMods", getName(), array);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean present(Player player)
|
|
||||||
{
|
|
||||||
return get(player) != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ItemStack[] getDefault()
|
|
||||||
{
|
|
||||||
return new ItemStack[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
package com.redstoner.modules.blockplacemods.mods;
|
|
||||||
|
|
||||||
import com.redstoner.modules.datamanager.DataManager;
|
|
||||||
import com.redstoner.utils.CommandException;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
public abstract class ModToggledAbstract extends ModAbstract
|
|
||||||
{
|
|
||||||
protected boolean enabledByDefault;
|
|
||||||
|
|
||||||
public ModToggledAbstract(String name, boolean enabledByDefault) {
|
|
||||||
super(name);
|
|
||||||
this.enabledByDefault = enabledByDefault;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Boolean getDefault() {
|
|
||||||
return enabledByDefault;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean hasEnabled(Player player)
|
|
||||||
{
|
|
||||||
return (boolean) DataManager.getOrDefault(player.getUniqueId().toString(), "BlockPlaceMods", getName(),
|
|
||||||
enabledByDefault);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean setEnabled(Player sender, boolean enabled)
|
|
||||||
{
|
|
||||||
if (enabled == hasEnabled(sender))
|
|
||||||
return false;
|
|
||||||
if (enabled == enabledByDefault)
|
|
||||||
reset(sender);
|
|
||||||
else
|
|
||||||
DataManager.setData(sender.getUniqueId().toString(), "BlockPlaceMods", getName(), enabled);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String runCommand(Player sender, String[] args) throws CommandException
|
|
||||||
{
|
|
||||||
if (args.length == 0 || args[0].equalsIgnoreCase("toggle"))
|
|
||||||
{
|
|
||||||
boolean enabled = hasEnabled(sender);
|
|
||||||
setEnabled(sender, !enabled);
|
|
||||||
return !enabled ? "Enabled" : "Disabled";
|
|
||||||
}
|
|
||||||
if (args[0].equalsIgnoreCase("help"))
|
|
||||||
{
|
|
||||||
StringBuilder message = new StringBuilder();
|
|
||||||
message.append(" &a### &3Toggled Mod&a Help ###");
|
|
||||||
message.append("\n&7").append(getDescription());
|
|
||||||
message.append("\n&6/mod ").append(getName()).append("&o (toggle) &btoggles state");
|
|
||||||
message.append("\n&6/mod ").append(getName()).append("&o on/off &bsets state");
|
|
||||||
message.append("\n&6/mod ").append(getName()).append("&o help &bshows this help page");
|
|
||||||
return message.toString();
|
|
||||||
}
|
|
||||||
final boolean enable;
|
|
||||||
switch (args[0].toLowerCase())
|
|
||||||
{
|
|
||||||
case "on":
|
|
||||||
case "enable":
|
|
||||||
case "true":
|
|
||||||
enable = true;
|
|
||||||
break;
|
|
||||||
case "off":
|
|
||||||
case "disable":
|
|
||||||
case "false":
|
|
||||||
enable = false;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new CommandException("Input '" + args[0] + "' was not understood. "
|
|
||||||
+ "Use one of: \non, enable, true, off, disable, false.");
|
|
||||||
}
|
|
||||||
if (!setEnabled(sender, enable))
|
|
||||||
{
|
|
||||||
throw new CommandException("Was already " + (enable ? "enabled" : "disabled"));
|
|
||||||
}
|
|
||||||
return enable ? "Enabled" : "Disabled";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
package com.redstoner.modules.blockplacemods.mods;
|
|
||||||
|
|
||||||
import org.bukkit.GameMode;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.block.Block;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.EventPriority;
|
|
||||||
import org.bukkit.event.block.Action;
|
|
||||||
import org.bukkit.event.block.BlockPlaceEvent;
|
|
||||||
import org.bukkit.event.player.PlayerInteractEvent;
|
|
||||||
|
|
||||||
public class ModToggledCauldron extends ModToggledAbstract
|
|
||||||
{
|
|
||||||
public ModToggledCauldron()
|
|
||||||
{
|
|
||||||
super("cauldron", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDescription()
|
|
||||||
{
|
|
||||||
return "If active, placed cauldrons are filled, and they cycle on shiftless right click with redstone or fist";
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
@EventHandler
|
|
||||||
public void onPlayerInteract(PlayerInteractEvent event)
|
|
||||||
{
|
|
||||||
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && !event.getPlayer().isSneaking()
|
|
||||||
&& event.getClickedBlock().getType() == Material.CAULDRON && hasEnabled(event.getPlayer())
|
|
||||||
&& (event.getPlayer().getGameMode() == GameMode.CREATIVE)
|
|
||||||
&& (event.getPlayer().getInventory().getItemInMainHand().getType() == Material.AIR))
|
|
||||||
{
|
|
||||||
Block block = event.getClickedBlock();
|
|
||||||
block.setData((byte) ((block.getData() - 1) & 0x3));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
|
||||||
public void onBlockPlace(BlockPlaceEvent event)
|
|
||||||
{
|
|
||||||
if (event.getBlock().getType() == Material.CAULDRON && !event.getPlayer().isSneaking()
|
|
||||||
&& hasEnabled(event.getPlayer()) && (event.getPlayer().getGameMode() == GameMode.CREATIVE))
|
|
||||||
{
|
|
||||||
event.getBlock().setData((byte) 3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
package com.redstoner.modules.blockplacemods.mods;
|
|
||||||
|
|
||||||
import org.bukkit.GameMode;
|
|
||||||
import org.bukkit.block.Block;
|
|
||||||
import org.bukkit.block.BlockFace;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.EventPriority;
|
|
||||||
import org.bukkit.event.block.BlockPlaceEvent;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A mod that makes placement of directional blocks act the way placement of logs does normally.
|
|
||||||
* Quartz pillar placement works like this too.
|
|
||||||
*
|
|
||||||
* Placed blocks face the block you clicked to place them.
|
|
||||||
*/
|
|
||||||
public abstract class ModToggledLogPlaceAbstract extends ModToggledAbstract {
|
|
||||||
|
|
||||||
protected ModToggledLogPlaceAbstract(String name, boolean enabledByDefault) {
|
|
||||||
super(name, enabledByDefault);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
|
||||||
public void onBlockPlace(BlockPlaceEvent event)
|
|
||||||
{
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
Block block;
|
|
||||||
if (hasEnabled(player) && !player.isSneaking() && player.getGameMode() == GameMode.CREATIVE
|
|
||||||
&& isApplicableToPlacedBlock(block = event.getBlock()))
|
|
||||||
{
|
|
||||||
block.setData((byte) getBlockDataForFacing(block.getFace(event.getBlockAgainst())));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract int getBlockDataForFacing(BlockFace direction);
|
|
||||||
|
|
||||||
protected abstract boolean isApplicableToPlacedBlock(Block block);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
package com.redstoner.modules.blockplacemods.mods;
|
|
||||||
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.block.Block;
|
|
||||||
import org.bukkit.block.BlockFace;
|
|
||||||
|
|
||||||
public class ModToggledObserver extends ModToggledLogPlaceAbstract {
|
|
||||||
|
|
||||||
protected ModToggledObserver() {
|
|
||||||
super("observer", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDescription() {
|
|
||||||
return "If active, observers face the block you place them against";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean isApplicableToPlacedBlock(Block block) {
|
|
||||||
return block.getType() == Material.OBSERVER;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getBlockDataForFacing(BlockFace direction) {
|
|
||||||
switch (direction) {
|
|
||||||
case UP:
|
|
||||||
return 0;
|
|
||||||
default:
|
|
||||||
case DOWN:
|
|
||||||
return 1;
|
|
||||||
case SOUTH:
|
|
||||||
return 2;
|
|
||||||
case NORTH:
|
|
||||||
return 3;
|
|
||||||
case EAST:
|
|
||||||
return 4;
|
|
||||||
case WEST:
|
|
||||||
return 5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
package com.redstoner.modules.blockplacemods.mods;
|
|
||||||
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.block.Block;
|
|
||||||
import org.bukkit.block.BlockFace;
|
|
||||||
|
|
||||||
public class ModToggledPiston extends ModToggledLogPlaceAbstract
|
|
||||||
{
|
|
||||||
public ModToggledPiston()
|
|
||||||
{
|
|
||||||
super("piston", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDescription()
|
|
||||||
{
|
|
||||||
return "If active, pistons face the block you place them against";
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean isApplicableToPlacedBlock(Block block) {
|
|
||||||
Material type = block.getType();
|
|
||||||
return type == Material.PISTON_BASE || type == Material.PISTON_STICKY_BASE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getBlockDataForFacing(BlockFace direction) {
|
|
||||||
switch (direction)
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
case DOWN:
|
|
||||||
return 0;
|
|
||||||
case UP:
|
|
||||||
return 1;
|
|
||||||
case NORTH:
|
|
||||||
return 2;
|
|
||||||
case SOUTH:
|
|
||||||
return 3;
|
|
||||||
case WEST:
|
|
||||||
return 4;
|
|
||||||
case EAST:
|
|
||||||
return 5;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
package com.redstoner.modules.blockplacemods.mods;
|
|
||||||
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.EventPriority;
|
|
||||||
import org.bukkit.event.block.BlockPlaceEvent;
|
|
||||||
|
|
||||||
public class ModToggledStep extends ModToggledAbstract
|
|
||||||
{
|
|
||||||
public ModToggledStep()
|
|
||||||
{
|
|
||||||
super("step", true);
|
|
||||||
getAliases().add("slab");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDescription()
|
|
||||||
{
|
|
||||||
return "If active, placed steps will always turn upside-down";
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
|
||||||
public void onBlockPlace(BlockPlaceEvent event)
|
|
||||||
{
|
|
||||||
if (isStep(event.getBlock().getType()) && !event.getPlayer().isSneaking() && hasEnabled(event.getPlayer()))
|
|
||||||
{
|
|
||||||
byte data = event.getBlock().getData();
|
|
||||||
if (data != (data |= 0x8))
|
|
||||||
{
|
|
||||||
event.getBlock().setData(data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isStep(Material block)
|
|
||||||
{
|
|
||||||
return block == Material.STEP || block == Material.STONE_SLAB2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
package com.redstoner.modules.blockplacemods.mods;
|
|
||||||
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.GameMode;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.block.Block;
|
|
||||||
import org.bukkit.block.BlockFace;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.EventPriority;
|
|
||||||
import org.bukkit.event.block.BlockPlaceEvent;
|
|
||||||
|
|
||||||
import com.redstoner.misc.Main;
|
|
||||||
|
|
||||||
public class ModToggledTorch extends ModToggledAbstract
|
|
||||||
{
|
|
||||||
private final Set<Block> torchesPlaced = new HashSet<>();
|
|
||||||
|
|
||||||
public ModToggledTorch()
|
|
||||||
{
|
|
||||||
super("torch", true);
|
|
||||||
Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.plugin, this::updateTorches, 2, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDescription()
|
|
||||||
{
|
|
||||||
return "If active, redstone torches placed on a redstone block disappear quickly";
|
|
||||||
}
|
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
|
||||||
public void onBlockPlace(BlockPlaceEvent event)
|
|
||||||
{
|
|
||||||
final Player player = event.getPlayer();
|
|
||||||
if (!player.isSneaking() && player.getGameMode() == GameMode.CREATIVE && hasEnabled(player)
|
|
||||||
&& event.getBlock().getType() == Material.REDSTONE_TORCH_ON)
|
|
||||||
{
|
|
||||||
if (isAttachedToRedstoneBlock(event.getBlock()))
|
|
||||||
{
|
|
||||||
torchesPlaced.add(event.getBlock());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
private boolean isAttachedToRedstoneBlock(Block block)
|
|
||||||
{
|
|
||||||
BlockFace towardsAgainst = getFaceTowardsBlockAgainst(block.getData());
|
|
||||||
return towardsAgainst != null && block.getRelative(towardsAgainst).getType() == Material.REDSTONE_BLOCK;
|
|
||||||
}
|
|
||||||
|
|
||||||
private BlockFace getFaceTowardsBlockAgainst(byte data)
|
|
||||||
{
|
|
||||||
switch (data)
|
|
||||||
{
|
|
||||||
case 1:
|
|
||||||
return BlockFace.WEST;
|
|
||||||
case 2:
|
|
||||||
return BlockFace.EAST;
|
|
||||||
case 3:
|
|
||||||
return BlockFace.NORTH;
|
|
||||||
case 4:
|
|
||||||
return BlockFace.SOUTH;
|
|
||||||
case 5:
|
|
||||||
return BlockFace.DOWN;
|
|
||||||
default:
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateTorches()
|
|
||||||
{
|
|
||||||
for (Iterator<Block> it = torchesPlaced.iterator(); it.hasNext();)
|
|
||||||
{
|
|
||||||
Block block = it.next();
|
|
||||||
if (block.getType() == Material.REDSTONE_TORCH_OFF)
|
|
||||||
{
|
|
||||||
block.setType(Material.AIR);
|
|
||||||
it.remove();
|
|
||||||
}
|
|
||||||
else if (block.getType() != Material.REDSTONE_TORCH_ON || !isAttachedToRedstoneBlock(block))
|
|
||||||
{
|
|
||||||
it.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
command bc {
|
|
||||||
[string:message...] {
|
|
||||||
help Sends a message in BuildTeam Chat;
|
|
||||||
perm utils.bc;
|
|
||||||
run bc_msg message;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
command bcn {
|
|
||||||
[string:name] [string:message...] {
|
|
||||||
help Sends a message in BuildTeam Chat;
|
|
||||||
perm utils.bc;
|
|
||||||
type console;
|
|
||||||
run bcn_msg name message;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
command bckey {
|
|
||||||
[string:key] {
|
|
||||||
help Sets your BuildTeam Chat key;
|
|
||||||
perm utils.bc;
|
|
||||||
type player;
|
|
||||||
run setbckey key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
command bct {
|
|
||||||
on {
|
|
||||||
help Turns on bct;
|
|
||||||
perm utils.bc;
|
|
||||||
run bct_on;
|
|
||||||
}
|
|
||||||
off {
|
|
||||||
help Turns off bct;
|
|
||||||
perm utils.bc;
|
|
||||||
run bct_off;
|
|
||||||
}
|
|
||||||
[empty] {
|
|
||||||
help toggles BuildTeam Chat;
|
|
||||||
perm utils.bc;
|
|
||||||
run bct;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,207 +0,0 @@
|
|||||||
package com.redstoner.modules.buildchat;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
|
||||||
import org.json.simple.JSONObject;
|
|
||||||
|
|
||||||
import com.nemez.cmdmgr.Command;
|
|
||||||
import com.redstoner.annotations.AutoRegisterListener;
|
|
||||||
import com.redstoner.annotations.Commands;
|
|
||||||
import com.redstoner.annotations.Version;
|
|
||||||
import com.redstoner.misc.BroadcastFilter;
|
|
||||||
import com.redstoner.misc.CommandHolderType;
|
|
||||||
import com.redstoner.misc.JsonManager;
|
|
||||||
import com.redstoner.misc.Main;
|
|
||||||
import com.redstoner.misc.Utils;
|
|
||||||
import com.redstoner.modules.Module;
|
|
||||||
|
|
||||||
/** BuildTeamChat module. Allows the build team to chat privately using /bc \<message\> as well as a one char prefix or a toggle.
|
|
||||||
*
|
|
||||||
* @author Pepich */
|
|
||||||
@Commands(CommandHolderType.File)
|
|
||||||
@AutoRegisterListener
|
|
||||||
@Version(major = 4, minor = 1, revision = 0, compatible = 4)
|
|
||||||
public class BuildChat implements Module, Listener
|
|
||||||
{
|
|
||||||
private static final char defaultKey = ';';
|
|
||||||
private static final File keysLocation = new File(Main.plugin.getDataFolder(), "buildchat_keys.json");
|
|
||||||
private ArrayList<UUID> bctoggled;
|
|
||||||
private static JSONObject keys;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onEnable()
|
|
||||||
{
|
|
||||||
keys = JsonManager.getObject(keysLocation);
|
|
||||||
if (keys == null)
|
|
||||||
{
|
|
||||||
keys = new JSONObject();
|
|
||||||
saveKeys();
|
|
||||||
}
|
|
||||||
bctoggled = new ArrayList<>();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Command(hook = "bc_msg")
|
|
||||||
public boolean bcSay(CommandSender sender, String message)
|
|
||||||
{
|
|
||||||
String name;
|
|
||||||
if (sender instanceof Player)
|
|
||||||
name = ((Player) sender).getDisplayName();
|
|
||||||
else
|
|
||||||
name = sender.getName();
|
|
||||||
Utils.broadcast("§8[§cBC§8] §9" + name + "§8: §b", message, new BroadcastFilter()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public boolean sendTo(CommandSender recipient)
|
|
||||||
{
|
|
||||||
return recipient.hasPermission("utils.bc");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Command(hook = "bcn_msg")
|
|
||||||
public boolean bcnSay(CommandSender sender, String name, String message)
|
|
||||||
{
|
|
||||||
Utils.broadcast("§8[§cBC§8] §9" + name + "§8: §b", message, new BroadcastFilter()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public boolean sendTo(CommandSender recipient)
|
|
||||||
{
|
|
||||||
return recipient.hasPermission("utils.bc");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Let's a Player toggle their auto-cg status to allow for automatically sending chat messages to their chatgroup.
|
|
||||||
*
|
|
||||||
* @param sender the issuer of the command.
|
|
||||||
* @param _void ignored.
|
|
||||||
* @return true. */
|
|
||||||
@Command(hook = "bct")
|
|
||||||
public boolean bcToggleCommand(CommandSender sender)
|
|
||||||
{
|
|
||||||
if (bctoggled.contains(((Player) sender).getUniqueId()))
|
|
||||||
{
|
|
||||||
bctoggled.remove(((Player) sender).getUniqueId());
|
|
||||||
getLogger().message(sender, "BCT now §cdisabled");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bctoggled.add(((Player) sender).getUniqueId());
|
|
||||||
getLogger().message(sender, "BCT now §aenabled");
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Let's a Player toggle their auto-cg status to allow for automatically sending chat messages to their chatgroup.
|
|
||||||
*
|
|
||||||
* @param sender the issuer of the command.
|
|
||||||
* @return true. */
|
|
||||||
@Command(hook = "bct_on")
|
|
||||||
public boolean bcToggleOnCommand(CommandSender sender)
|
|
||||||
{
|
|
||||||
if (!bctoggled.contains(((Player) sender).getUniqueId()))
|
|
||||||
{
|
|
||||||
bctoggled.add(((Player) sender).getUniqueId());
|
|
||||||
getLogger().message(sender, "BCT now §aenabled");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
getLogger().message(sender, "BCT was already enabled");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Let's a Player toggle their auto-cg status to allow for automatically sending chat messages to their chatgroup.
|
|
||||||
*
|
|
||||||
* @param sender the issuer of the command.
|
|
||||||
* @return true. */
|
|
||||||
@Command(hook = "bct_off")
|
|
||||||
public boolean bcToggleOffCommand(CommandSender sender)
|
|
||||||
{
|
|
||||||
if (bctoggled.remove(((Player) sender).getUniqueId()))
|
|
||||||
getLogger().message(sender, "BCT now §cdisabled");
|
|
||||||
else
|
|
||||||
getLogger().message(sender, "BCT was already disabled");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Deals with chat events to allow for bckeys and bctoggle.
|
|
||||||
*
|
|
||||||
* @param event the chat event containing the player and the message. */
|
|
||||||
@EventHandler
|
|
||||||
public void onPlayerChat(AsyncPlayerChatEvent event)
|
|
||||||
{
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
if (!player.hasPermission("utils.bc"))
|
|
||||||
return;
|
|
||||||
if (event.getMessage().startsWith(getKey(player)))
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
bcSay(event.getPlayer(), event.getMessage().replaceFirst(Pattern.quote(getKey(player)), ""));
|
|
||||||
}
|
|
||||||
else if (bctoggled.contains(event.getPlayer().getUniqueId()))
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
bcSay(event.getPlayer(), event.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Sets the bckey of a Player.
|
|
||||||
*
|
|
||||||
* @param sender the issuer of the command.
|
|
||||||
* @param key the key to be set. Set to NULL or "" to get your current key.
|
|
||||||
* @return true. */
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@Command(hook = "setbckey")
|
|
||||||
public boolean setBcKey(CommandSender sender, String key)
|
|
||||||
{
|
|
||||||
if (key.length() > 1)
|
|
||||||
{
|
|
||||||
getLogger().message(sender, true,
|
|
||||||
"Could not set your key to §6" + key + " §7, it can be at most one char.");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (key == null || key.length() == 0)
|
|
||||||
{
|
|
||||||
getBcKey(sender);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
getLogger().message(sender, "Set your key to §6" + key);
|
|
||||||
keys.put(((Player) sender).getUniqueId().toString(), key + "");
|
|
||||||
saveKeys();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** This method will find the ChatgGroup key of any player.
|
|
||||||
*
|
|
||||||
* @param player the player to get the key from.
|
|
||||||
* @return the key. */
|
|
||||||
public static String getKey(Player player)
|
|
||||||
{
|
|
||||||
String key = (String) keys.get(player.getUniqueId().toString());
|
|
||||||
return (key == null ? "" + defaultKey : key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Prints a Players bckey to their chat.
|
|
||||||
*
|
|
||||||
* @param sender the issuer of the command. */
|
|
||||||
public void getBcKey(CommandSender sender)
|
|
||||||
{
|
|
||||||
getLogger().message(sender, "Your current bckey is §6" + getKey((Player) sender));
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Saves the keys. */
|
|
||||||
private void saveKeys()
|
|
||||||
{
|
|
||||||
JsonManager.save(keys, keysLocation);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
command teleport {
|
|
||||||
alias tp;
|
|
||||||
alias tele;
|
|
||||||
[string:player...] {
|
|
||||||
run teleport player;
|
|
||||||
}
|
|
||||||
type player;
|
|
||||||
}
|
|
||||||
|
|
||||||
command team_add {
|
|
||||||
[string:player] {
|
|
||||||
run team_add player;
|
|
||||||
perm utils.buildteam.manage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
command team_remove {
|
|
||||||
[string:player] {
|
|
||||||
run team_remove player;
|
|
||||||
perm utils.buildteam.manage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
package com.redstoner.modules.buildteam;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
import com.nemez.cmdmgr.Command;
|
|
||||||
import com.redstoner.annotations.Commands;
|
|
||||||
import com.redstoner.annotations.Version;
|
|
||||||
import com.redstoner.misc.CommandHolderType;
|
|
||||||
import com.redstoner.modules.Module;
|
|
||||||
|
|
||||||
@Commands(CommandHolderType.File)
|
|
||||||
@Version(major = 4, minor = 0, revision = 0, compatible = 4)
|
|
||||||
public class BuildTeam implements Module
|
|
||||||
{
|
|
||||||
@Command(hook = "teleport")
|
|
||||||
public boolean teleport(CommandSender sender, String target_name)
|
|
||||||
{
|
|
||||||
final Player player = (Player) sender;
|
|
||||||
final Player target = Bukkit.getPlayer(target_name);
|
|
||||||
if (target == null || !player.hasPermission("utils.buildteam.teleport")
|
|
||||||
|| !target.getLocation().getWorld().getName().equals("BuildTeam"))
|
|
||||||
{
|
|
||||||
player.performCommand("essentials:tp " + target_name);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
player.teleport(target);
|
|
||||||
getLogger().message(sender, "Teleported you to &e" + target.getDisplayName() + "&7!");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Command(hook = "team_add")
|
|
||||||
public boolean add(CommandSender sender, String target_name)
|
|
||||||
{
|
|
||||||
if (!target_name.matches("^\\w{2,16}$"))
|
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "This doesn't look like a valid playername!");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "pex user " + target_name + " group add +buildteam");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Command(hook = "team_remove")
|
|
||||||
public boolean remove(CommandSender sender, String target_name)
|
|
||||||
{
|
|
||||||
if (!target_name.matches("^\\w{2,16}$"))
|
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "This doesn't look like a valid playername!");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "pex user " + target_name + " group remove +buildteam");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
command alias {
|
|
||||||
add [flag:-r] [string:keyword] [string:replacement...] {
|
|
||||||
help Adds a new alias. Set -r to make it a regex-alias.;
|
|
||||||
run addalias -r keyword replacement;
|
|
||||||
}
|
|
||||||
del [flag:-r] [string:keyword] {
|
|
||||||
help Deletes an alias. -r indicates if it was a regex-alias.;
|
|
||||||
run delalias -r keyword;
|
|
||||||
}
|
|
||||||
list {
|
|
||||||
help Lists your aliases.;
|
|
||||||
run listaliases;
|
|
||||||
}
|
|
||||||
perm utils.alias;
|
|
||||||
type player;
|
|
||||||
}
|
|
||||||
@@ -1,400 +0,0 @@
|
|||||||
package com.redstoner.modules.chatgroups;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
|
||||||
import org.json.simple.JSONObject;
|
|
||||||
|
|
||||||
import com.nemez.cmdmgr.Command;
|
|
||||||
import com.redstoner.annotations.AutoRegisterListener;
|
|
||||||
import com.redstoner.annotations.Commands;
|
|
||||||
import com.redstoner.annotations.Version;
|
|
||||||
import com.redstoner.coremods.moduleLoader.ModuleLoader;
|
|
||||||
import com.redstoner.misc.BroadcastFilter;
|
|
||||||
import com.redstoner.misc.CommandHolderType;
|
|
||||||
import com.redstoner.misc.JsonManager;
|
|
||||||
import com.redstoner.misc.Main;
|
|
||||||
import com.redstoner.misc.Utils;
|
|
||||||
import com.redstoner.modules.Module;
|
|
||||||
import com.redstoner.modules.ignore.Ignore;
|
|
||||||
import com.redstoner.modules.socialspy.Socialspy;
|
|
||||||
|
|
||||||
import net.nemez.chatapi.ChatAPI;
|
|
||||||
|
|
||||||
/** The ChatGroups module. Allows people to have private sub-chats that can be accessed via a single char prefix or a toggle.
|
|
||||||
*
|
|
||||||
* @author Pepich */
|
|
||||||
@Commands(CommandHolderType.File)
|
|
||||||
@AutoRegisterListener
|
|
||||||
@Version(major = 4, minor = 1, revision = 0, compatible = 4)
|
|
||||||
public class Chatgroups implements Module, Listener
|
|
||||||
{
|
|
||||||
private static final char defaultKey = ':';
|
|
||||||
private static final File groupsLocation = new File(Main.plugin.getDataFolder(), "chatgroups.json");
|
|
||||||
private static final File keysLocation = new File(Main.plugin.getDataFolder(), "chatgroup_keys.json");
|
|
||||||
private ArrayList<UUID> cgtoggled;
|
|
||||||
private static JSONObject groups, keys;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onEnable()
|
|
||||||
{
|
|
||||||
groups = JsonManager.getObject(groupsLocation);
|
|
||||||
if (groups == null)
|
|
||||||
{
|
|
||||||
groups = new JSONObject();
|
|
||||||
saveGroups();
|
|
||||||
}
|
|
||||||
keys = JsonManager.getObject(keysLocation);
|
|
||||||
if (keys == null)
|
|
||||||
{
|
|
||||||
keys = new JSONObject();
|
|
||||||
saveKeys();
|
|
||||||
}
|
|
||||||
cgtoggled = new ArrayList<>();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDisable()
|
|
||||||
{
|
|
||||||
saveKeys();
|
|
||||||
saveGroups();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Prints chatgroup info (like players in the group, groupname) to the sender.
|
|
||||||
*
|
|
||||||
* @param sender the issuer of the command.
|
|
||||||
* @return true. */
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@Command(hook = "cginfo")
|
|
||||||
public boolean cgInfo(CommandSender sender)
|
|
||||||
{
|
|
||||||
String group = getGroup(sender);
|
|
||||||
if (group == null)
|
|
||||||
getLogger().message(sender, true, "You are not in a chatgroup!");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ArrayList<String> message = new ArrayList<>();
|
|
||||||
message.add("§7Your current chatgroup is: §6" + group);
|
|
||||||
ArrayList<String> players = new ArrayList<>();
|
|
||||||
Iterator<String> iter = groups.keySet().iterator();
|
|
||||||
while (iter.hasNext())
|
|
||||||
{
|
|
||||||
String id = iter.next();
|
|
||||||
if (((String) groups.get(id)).equals(group))
|
|
||||||
{
|
|
||||||
if (!id.equals("CONSOLE"))
|
|
||||||
{
|
|
||||||
UUID uuid = UUID.fromString(id);
|
|
||||||
Player p = Bukkit.getPlayer(uuid);
|
|
||||||
if (p != null)
|
|
||||||
players.add(p.getDisplayName());
|
|
||||||
else
|
|
||||||
players.add(Bukkit.getOfflinePlayer(UUID.fromString(id)).getName());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
players.add(id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
StringBuilder sb = new StringBuilder("&6Other players in this group: &9");
|
|
||||||
for (String player : players)
|
|
||||||
{
|
|
||||||
sb.append(player);
|
|
||||||
sb.append("&7, &9");
|
|
||||||
}
|
|
||||||
sb.delete(sb.length() - 2, sb.length());
|
|
||||||
message.add(sb.toString());
|
|
||||||
getLogger().message(sender, message.toArray(new String[] {}));
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Prints a Players cgkey to their chat.
|
|
||||||
*
|
|
||||||
* @param sender the issuer of the command. */
|
|
||||||
public void getCgKey(CommandSender sender)
|
|
||||||
{
|
|
||||||
getLogger().message(sender, "Your current cgkey is §6" + getKey((Player) sender));
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Sets the cgkey of a Player.
|
|
||||||
*
|
|
||||||
* @param sender the issuer of the command.
|
|
||||||
* @param key the key to be set. Set to NULL or "" to get your current key.
|
|
||||||
* @return true. */
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@Command(hook = "setcgkey")
|
|
||||||
public boolean setCgKey(CommandSender sender, String key)
|
|
||||||
{
|
|
||||||
if (key.length() > 1)
|
|
||||||
{
|
|
||||||
getLogger().message(sender, true,
|
|
||||||
"Could not set your key to §6" + key + " §7, it can be at most one char.");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (key == null || key.length() == 0)
|
|
||||||
{
|
|
||||||
getCgKey(sender);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
getLogger().message(sender, "Set your key to §6" + key);
|
|
||||||
keys.put(((Player) sender).getUniqueId().toString(), key + "");
|
|
||||||
saveKeys();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Let's a Player toggle their auto-cg status to allow for automatically sending chat messages to their chatgroup.
|
|
||||||
*
|
|
||||||
* @param sender the issuer of the command.
|
|
||||||
* @return true. */
|
|
||||||
@Command(hook = "cgtoggle")
|
|
||||||
public boolean cgToggleCommand(CommandSender sender)
|
|
||||||
{
|
|
||||||
if (getGroup(sender) != null)
|
|
||||||
if (cgtoggled.contains(((Player) sender).getUniqueId()))
|
|
||||||
{
|
|
||||||
cgtoggled.remove(((Player) sender).getUniqueId());
|
|
||||||
getLogger().message(sender, "CGT now §cdisabled");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cgtoggled.add(((Player) sender).getUniqueId());
|
|
||||||
getLogger().message(sender, "CGT now §aenabled");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
getLogger().message(sender, true, "You are not in a chatgroup!");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Lets a CommandSender leave their group.
|
|
||||||
*
|
|
||||||
* @param sender the command issuer.
|
|
||||||
* @return true. */
|
|
||||||
@Command(hook = "cgleave")
|
|
||||||
public boolean cgLeave(CommandSender sender)
|
|
||||||
{
|
|
||||||
String group = removeGroup(sender);
|
|
||||||
if (group == null)
|
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "You were not in a chatgroup!");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
String name = Utils.getName(sender);
|
|
||||||
sendToGroup(group, "&9" + name + " &7left the group!");
|
|
||||||
getLogger().message(sender, "Successfully removed you from your group!");
|
|
||||||
if (sender instanceof Player)
|
|
||||||
cgtoggled.remove(((Player) sender).getUniqueId());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Lets a CommandSender join a group.
|
|
||||||
*
|
|
||||||
* @param sender the command issuer.
|
|
||||||
* @param name the name of the group.
|
|
||||||
* @return true. */
|
|
||||||
@Command(hook = "cgjoin")
|
|
||||||
public boolean cgJoin(CommandSender sender, String name)
|
|
||||||
{
|
|
||||||
String pname = Utils.getName(sender);
|
|
||||||
String group = getGroup(sender);
|
|
||||||
if (group != null && group.equals(name))
|
|
||||||
getLogger().message(sender, true, "You were already in group §6" + name);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
setGroup(sender, null);
|
|
||||||
if (group != null)
|
|
||||||
sendToGroup(group, "&9" + pname + " &7left the group!");
|
|
||||||
sendToGroup(name, "&9" + pname + " &7joined the group!");
|
|
||||||
setGroup(sender, name);
|
|
||||||
getLogger().message(sender, "Successfully joined group §6" + name);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Sends a message to a group.
|
|
||||||
*
|
|
||||||
* @param sender the sender of the message - the message will be sent to the group of the sender.
|
|
||||||
* @param message the message to be sent.
|
|
||||||
* @return true. */
|
|
||||||
@Command(hook = "cgsay")
|
|
||||||
public boolean cgSay(CommandSender sender, String message)
|
|
||||||
{
|
|
||||||
String group = getGroup(sender);
|
|
||||||
if (group != null)
|
|
||||||
sendToGroup(sender, message);
|
|
||||||
else
|
|
||||||
getLogger().message(sender, true, "You are not in a chatgroup right now!");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Deals with chat events to allow for cgkeys and cgtoggle.
|
|
||||||
*
|
|
||||||
* @param event the chat event containing the player and the message. */
|
|
||||||
@EventHandler
|
|
||||||
public void onPlayerChat(AsyncPlayerChatEvent event)
|
|
||||||
{
|
|
||||||
String group = getGroup(event.getPlayer());
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
if (group != null)
|
|
||||||
{
|
|
||||||
if (event.getMessage().startsWith(getKey(player)))
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
sendToGroup(event.getPlayer(), event.getMessage().substring(1));
|
|
||||||
}
|
|
||||||
else if (cgtoggled.contains(event.getPlayer().getUniqueId()))
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
sendToGroup(event.getPlayer(), event.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Finds the group of a CommandSender.
|
|
||||||
*
|
|
||||||
* @param target the CommandSender to get the group of.
|
|
||||||
* @return the group of the target or NULL if he doesn't have one. */
|
|
||||||
public static String getGroup(CommandSender target)
|
|
||||||
{
|
|
||||||
if (target instanceof Player)
|
|
||||||
return (String) groups.get(((Player) target).getUniqueId().toString());
|
|
||||||
else
|
|
||||||
return (String) groups.get("CONSOLE");
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Sets the group of the CommandSender.
|
|
||||||
*
|
|
||||||
* @param target the CommandSender to set the group of.
|
|
||||||
* @param group the name of the group to join. */
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
private void setGroup(CommandSender target, String group)
|
|
||||||
{
|
|
||||||
if (target instanceof Player)
|
|
||||||
groups.put(((Player) target).getUniqueId().toString(), group);
|
|
||||||
else
|
|
||||||
groups.put("CONSOLE", group);
|
|
||||||
saveGroups();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Removes a CommandSender from their chatgroup. Will also save the groups after finishing
|
|
||||||
*
|
|
||||||
* @param target the CommandSender to get their group removed. */
|
|
||||||
private String removeGroup(CommandSender target)
|
|
||||||
{
|
|
||||||
String group;
|
|
||||||
if (target instanceof Player)
|
|
||||||
group = (String) groups.remove(((Player) target).getUniqueId().toString());
|
|
||||||
else
|
|
||||||
group = (String) groups.remove("CONSOLE");
|
|
||||||
saveGroups();
|
|
||||||
return group;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** This method will find the ChatgGroup key of any player.
|
|
||||||
*
|
|
||||||
* @param player the player to get the key from.
|
|
||||||
* @return the key. */
|
|
||||||
public static String getKey(Player player)
|
|
||||||
{
|
|
||||||
String key = (String) keys.get(player.getUniqueId().toString());
|
|
||||||
return (key == null ? "" + defaultKey : key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** This method sends a message to a chatgroup.
|
|
||||||
*
|
|
||||||
* @param sender the sender of the message. Also defines which group the message will be sent to.
|
|
||||||
* @param message the message to be sent. */
|
|
||||||
private void sendToGroup(CommandSender sender, String message)
|
|
||||||
{
|
|
||||||
String name = Utils.getName(sender);
|
|
||||||
String group = getGroup(sender);
|
|
||||||
message = ChatAPI.colorify(null, message);
|
|
||||||
|
|
||||||
BroadcastFilter ignore = ModuleLoader.exists("Ignore")? Ignore.getIgnoredBy(sender) : null;
|
|
||||||
Utils.broadcast("§8[§bCG§8] §9", name + "§8: §6" + message, new BroadcastFilter()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public boolean sendTo(CommandSender recipient)
|
|
||||||
{
|
|
||||||
|
|
||||||
String rgroup = getGroup(recipient);
|
|
||||||
if ( rgroup != null && (ignore == null? true : ignore.sendTo(recipient)) )
|
|
||||||
return rgroup.equals(group);
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (ModuleLoader.getModule("Socialspy") != null)
|
|
||||||
{
|
|
||||||
Socialspy.spyBroadcast(sender, "§e" + group + " §a(cg)", message, "/cg", new BroadcastFilter()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public boolean sendTo(CommandSender recipient)
|
|
||||||
{
|
|
||||||
return getGroup(recipient) == null || !getGroup(recipient).equals(group);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (getGroup(Bukkit.getConsoleSender()) == null || !getGroup(Bukkit.getConsoleSender()).equals(group))
|
|
||||||
{
|
|
||||||
getLogger().info(name + " in " + group + ": " + message + " §8(hidden)");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** This method sends a message to a chatgroup.
|
|
||||||
*
|
|
||||||
* @param sender the sender of the message. Also defines which group the message will be sent to.
|
|
||||||
* @param message the message to be sent. */
|
|
||||||
private void sendToGroup(String group, String message)
|
|
||||||
{
|
|
||||||
message = ChatAPI.colorify(null, message);
|
|
||||||
Utils.broadcast(null, message, new BroadcastFilter()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public boolean sendTo(CommandSender recipient)
|
|
||||||
{
|
|
||||||
String rgroup = getGroup(recipient);
|
|
||||||
if (rgroup != null)
|
|
||||||
return rgroup.equals(group);
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if (ModuleLoader.getModule("Socialspy") != null)
|
|
||||||
{
|
|
||||||
Socialspy.spyBroadcast(Bukkit.getConsoleSender(), "§e" + group + " §a(cg)", message, "/cg",
|
|
||||||
new BroadcastFilter()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public boolean sendTo(CommandSender recipient)
|
|
||||||
{
|
|
||||||
return getGroup(recipient) == null || !getGroup(recipient).equals(group);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (getGroup(Bukkit.getConsoleSender()) == null || !getGroup(Bukkit.getConsoleSender()).equals(group))
|
|
||||||
{
|
|
||||||
getLogger().info("In " + group + ": " + message + " §8(hidden)");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Saves the groups. */
|
|
||||||
private void saveGroups()
|
|
||||||
{
|
|
||||||
JsonManager.save(groups, groupsLocation);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Saves the keys. */
|
|
||||||
private void saveKeys()
|
|
||||||
{
|
|
||||||
JsonManager.save(keys, keysLocation);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,247 +0,0 @@
|
|||||||
package com.redstoner.modules.check;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.net.URL;
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Scanner;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.json.simple.JSONArray;
|
|
||||||
import org.json.simple.JSONObject;
|
|
||||||
import org.json.simple.parser.JSONParser;
|
|
||||||
|
|
||||||
import com.nemez.cmdmgr.Command;
|
|
||||||
import com.nemez.cmdmgr.Command.AsyncType;
|
|
||||||
import com.nemez.cmdmgr.CommandManager;
|
|
||||||
import com.redstoner.annotations.Commands;
|
|
||||||
import com.redstoner.annotations.Version;
|
|
||||||
import com.redstoner.coremods.moduleLoader.ModuleLoader;
|
|
||||||
import com.redstoner.misc.CommandHolderType;
|
|
||||||
import com.redstoner.misc.Main;
|
|
||||||
import com.redstoner.misc.mysql.JSONManager;
|
|
||||||
import com.redstoner.misc.mysql.MysqlHandler;
|
|
||||||
import com.redstoner.misc.mysql.elements.ConstraintOperator;
|
|
||||||
import com.redstoner.misc.mysql.elements.MysqlConstraint;
|
|
||||||
import com.redstoner.misc.mysql.elements.MysqlDatabase;
|
|
||||||
import com.redstoner.misc.mysql.elements.MysqlTable;
|
|
||||||
import com.redstoner.modules.Module;
|
|
||||||
|
|
||||||
import net.nemez.chatapi.click.Message;
|
|
||||||
|
|
||||||
@Commands(CommandHolderType.File)
|
|
||||||
@Version(major = 4, minor = 1, revision = 0, compatible = 4)
|
|
||||||
public class Check implements Module, Listener
|
|
||||||
{
|
|
||||||
MysqlTable table;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onEnable()
|
|
||||||
{
|
|
||||||
Map<Serializable, Serializable> config = JSONManager.getConfiguration("check.json");
|
|
||||||
if (config == null || !config.containsKey("database") || !config.containsKey("table"))
|
|
||||||
{
|
|
||||||
getLogger().error("Could not load the Check config file, disabling!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
MysqlDatabase database = MysqlHandler.INSTANCE
|
|
||||||
.getDatabase((String) config.get("database") + "?autoReconnect=true");
|
|
||||||
table = database.getTable((String) config.get("table"));
|
|
||||||
}
|
|
||||||
catch (NullPointerException e)
|
|
||||||
{
|
|
||||||
getLogger().error("Could not use the Check config, disabling!");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void postEnable()
|
|
||||||
{
|
|
||||||
CommandManager.registerCommand(getCommandString(), this, Main.plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
@Command(hook = "checkCommand", async = AsyncType.ALWAYS)
|
|
||||||
public void checkCommand(final CommandSender sender, final String player)
|
|
||||||
{
|
|
||||||
getLogger().message(sender, "&7Please note that the data may not be fully accurate!");
|
|
||||||
OfflinePlayer oPlayer;
|
|
||||||
oPlayer = Bukkit.getPlayer(player);
|
|
||||||
if (oPlayer == null)
|
|
||||||
oPlayer = Bukkit.getServer().getOfflinePlayer(player);
|
|
||||||
sendData(sender, oPlayer);
|
|
||||||
if (ModuleLoader.exists("Tag"))
|
|
||||||
Bukkit.dispatchCommand(sender, "tag check " + player);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String read(URL url)
|
|
||||||
{
|
|
||||||
String data = "";
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Scanner in = new Scanner(new InputStreamReader(url.openStream()));
|
|
||||||
while (in.hasNextLine())
|
|
||||||
{
|
|
||||||
data += in.nextLine();
|
|
||||||
}
|
|
||||||
in.close();
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
catch (IOException e)
|
|
||||||
{}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public JSONObject getIpInfo(OfflinePlayer player)
|
|
||||||
{
|
|
||||||
String ip = "";
|
|
||||||
if (player.isOnline())
|
|
||||||
{
|
|
||||||
ip = player.getPlayer().getAddress().getHostString();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ip = (String) table.get("last_ip", new MysqlConstraint("uuid", ConstraintOperator.EQUAL,
|
|
||||||
player.getUniqueId().toString().replace("-", "")))[0];
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
URL ipinfo = new URL("https://ipinfo.io/" + ip + "/json");
|
|
||||||
String rawJson = read(ipinfo);
|
|
||||||
return (JSONObject) new JSONParser().parse(rawJson);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getFirstJoin(OfflinePlayer player)
|
|
||||||
{
|
|
||||||
Long firstJoin = player.getFirstPlayed();
|
|
||||||
Date date = new Date(firstJoin);
|
|
||||||
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
|
||||||
return format.format(date);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getLastSeen(OfflinePlayer player)
|
|
||||||
{
|
|
||||||
Long lastSeen = player.getLastPlayed();
|
|
||||||
Date date = new Date(lastSeen);
|
|
||||||
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
|
||||||
return format.format(date);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Object[] getWebsiteData(OfflinePlayer player)
|
|
||||||
{
|
|
||||||
MysqlConstraint constraint = new MysqlConstraint("uuid", ConstraintOperator.EQUAL,
|
|
||||||
player.getUniqueId().toString().replace("-", ""));
|
|
||||||
try
|
|
||||||
{
|
|
||||||
int id = (int) table.get("id", constraint)[0];
|
|
||||||
String email = (String) table.get("email", constraint)[0];
|
|
||||||
boolean confirmed = (boolean) table.get("confirmed", constraint)[0];
|
|
||||||
return new Object[] {"https://redstoner.com/users/" + id, email, confirmed};
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
int id = (int) table.get("id", constraint)[0];
|
|
||||||
String email = (String) table.get("email", constraint)[0];
|
|
||||||
boolean confirmed = (boolean) table.get("confirmed", constraint)[0];
|
|
||||||
return new Object[] {"https://redstoner.com/users/" + id, email, confirmed};
|
|
||||||
}
|
|
||||||
catch (Exception e2)
|
|
||||||
{}
|
|
||||||
return new Object[] {null};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCountry(JSONObject data)
|
|
||||||
{
|
|
||||||
return (String) data.get("country");
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAllNames(OfflinePlayer player)
|
|
||||||
{
|
|
||||||
String uuid = player.getUniqueId().toString().replace("-", "");
|
|
||||||
String nameString = "";
|
|
||||||
try
|
|
||||||
{
|
|
||||||
String rawJson = read(new URL("https://api.mojang.com/user/profiles/" + uuid + "/names"));
|
|
||||||
JSONArray names = (JSONArray) new JSONParser().parse(rawJson);
|
|
||||||
for (Object obj : names)
|
|
||||||
{
|
|
||||||
nameString += "&e" + ((JSONObject) obj).get("name") + "&7, ";
|
|
||||||
}
|
|
||||||
nameString = nameString.substring(0, nameString.length() - 2);
|
|
||||||
return nameString;
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void sendData(CommandSender sender, OfflinePlayer player)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
JSONObject ipInfo = getIpInfo(player);
|
|
||||||
// data
|
|
||||||
String firstJoin = getFirstJoin(player);
|
|
||||||
String lastSeen = getLastSeen(player);
|
|
||||||
firstJoin = (firstJoin.equals("1970-01-01 01:00")) ? "&eNever" : "&7(yyyy-MM-dd hh:mm) &e" + firstJoin;
|
|
||||||
lastSeen = (lastSeen.equals("1970-1-1 01:00")) ? "&eNever" : "&7(yyyy-MM-dd hh:mm) &e" + lastSeen;
|
|
||||||
Object[] websiteData = getWebsiteData(player);
|
|
||||||
String websiteUrl = (websiteData[0] == null) ? "None" : (String) websiteData[0];
|
|
||||||
String email = (websiteData[0] == null) ? "Unknown" : (String) websiteData[1];
|
|
||||||
boolean emailNotConfirmed = (websiteData[0] == null) ? false : !((boolean) websiteData[2]);
|
|
||||||
String country = (ipInfo == null) ? "Unknown" : getCountry(ipInfo);
|
|
||||||
String namesUsed = getAllNames(player);
|
|
||||||
if (namesUsed == null)
|
|
||||||
namesUsed = "None";
|
|
||||||
// messages
|
|
||||||
List<Message> messages = new ArrayList<>();
|
|
||||||
messages.add(new Message(sender, null).appendText(getLogger().getHeader()));
|
|
||||||
messages.add(new Message(sender, null).appendText("&7Data provided by redstoner:"));
|
|
||||||
messages.add(new Message(sender, null).appendSuggestHover("&6> UUID: &e" + player.getUniqueId().toString(),
|
|
||||||
player.getUniqueId().toString(), "Click to copy into chatbox!"));
|
|
||||||
messages.add(new Message(sender, null).appendText("&6> First joined: &e" + firstJoin));
|
|
||||||
messages.add(new Message(sender, null).appendText("&6> Last seen: &e" + lastSeen));
|
|
||||||
messages.add(
|
|
||||||
new Message(sender, null).appendText("&6> Website account: &e").appendLink(websiteUrl, websiteUrl));
|
|
||||||
messages.add(new Message(sender, null).appendText("&6> Email: &e")
|
|
||||||
.appendText((emailNotConfirmed ? "&6> &4Email NOT Confirmed!&e" : "&e") + email));
|
|
||||||
messages.add(new Message(sender, null).appendText("&7Data provided by ipinfo:"));
|
|
||||||
messages.add(new Message(sender, null).appendText("&6> Country: &e" + country));
|
|
||||||
messages.add(new Message(sender, null).appendText("&7Data provided by mojang:"));
|
|
||||||
messages.add(new Message(sender, null).appendText("&6> All ingame names used so far: &e" + namesUsed));
|
|
||||||
for (Message m : messages)
|
|
||||||
m.send();
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "Sorry, something went wrong while fetching data");
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
command tempadd {
|
|
||||||
perm pex;
|
|
||||||
[string:user] [string:group] {
|
|
||||||
help Adds a user to a group for 1w.;
|
|
||||||
run tempadddef user group;
|
|
||||||
}
|
|
||||||
[string:user] [string:group] [string:duration] {
|
|
||||||
help Adds a user to a group for a specified duration.;
|
|
||||||
run tempadd user group duration;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
command echo {
|
|
||||||
[string:text...] {
|
|
||||||
help Echoes back to you.;
|
|
||||||
run echo text;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
command ping {
|
|
||||||
[empty] {
|
|
||||||
help Pongs :D;
|
|
||||||
run ping;
|
|
||||||
}
|
|
||||||
[string:password] {
|
|
||||||
help Pongs :D;
|
|
||||||
run ping2 password;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
command sudo {
|
|
||||||
perm utils.sudo;
|
|
||||||
[string:name] [string:command...] {
|
|
||||||
help Sudo'es another user (or console);
|
|
||||||
run sudo name command;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
command hasperm {
|
|
||||||
[flag:-f] [string:name] [string:node] {
|
|
||||||
perm utils.hasperm;
|
|
||||||
run hasperm -f name node;
|
|
||||||
help Checks if a player has a given permission node or not. Returns \"true/false\" in chat. When -f is set, it returns it unformatted.;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
command nightvision {
|
|
||||||
alias nv;
|
|
||||||
[empty] {
|
|
||||||
run illuminate;
|
|
||||||
type player;
|
|
||||||
help Gives the player infinte night vision;
|
|
||||||
perm utils.illuminate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,281 +0,0 @@
|
|||||||
package com.redstoner.modules.misc;
|
|
||||||
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.event.EventHandler;
|
|
||||||
import org.bukkit.event.EventPriority;
|
|
||||||
import org.bukkit.event.Listener;
|
|
||||||
import org.bukkit.event.block.BlockBreakEvent;
|
|
||||||
import org.bukkit.event.block.BlockFromToEvent;
|
|
||||||
import org.bukkit.event.player.PlayerJoinEvent;
|
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
|
|
||||||
import org.bukkit.potion.PotionEffect;
|
|
||||||
import org.bukkit.potion.PotionEffectType;
|
|
||||||
import org.json.simple.JSONArray;
|
|
||||||
import org.json.simple.JSONObject;
|
|
||||||
|
|
||||||
import com.nemez.cmdmgr.Command;
|
|
||||||
import com.redstoner.annotations.AutoRegisterListener;
|
|
||||||
import com.redstoner.annotations.Commands;
|
|
||||||
import com.redstoner.annotations.Version;
|
|
||||||
import com.redstoner.misc.CommandHolderType;
|
|
||||||
import com.redstoner.misc.Utils;
|
|
||||||
import com.redstoner.modules.Module;
|
|
||||||
import net.nemez.chatapi.ChatAPI;
|
|
||||||
import net.nemez.chatapi.click.Message;
|
|
||||||
|
|
||||||
@Commands(CommandHolderType.File)
|
|
||||||
@AutoRegisterListener
|
|
||||||
@Version(major = 4, minor = 1, revision = 0, compatible = 4)
|
|
||||||
public class Misc implements Module, Listener
|
|
||||||
{
|
|
||||||
private final String[] sudoBlacklist = new String[] {"(.*:)?e?sudo", "(.*:)?script.*", "(.*:)?stop",
|
|
||||||
"(.*:)?modules", "(.*:)?sayn", "(.*:)?pex", "(.*:)?console_.*", "(.*:)?op", "(.*:)?login", "(.*:)?register",
|
|
||||||
"(.*:)?.*pass"};
|
|
||||||
JSONObject config;
|
|
||||||
JSONArray unprotectedRegions;
|
|
||||||
|
|
||||||
@EventHandler
|
|
||||||
public void onFirstJoin(PlayerJoinEvent event)
|
|
||||||
{
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
if (!player.hasPlayedBefore())
|
|
||||||
{
|
|
||||||
Utils.broadcast("", "\n§a§lPlease welcome §f" + player.getDisplayName() + " §a§lto Redstoner!\n", null);
|
|
||||||
String[] message = new String[] {" \n \n \n \n \n \n \n \n \n \n \n \n ",
|
|
||||||
" &4Welcome to the Redstoner Server!", " &6Before you ask us things, take a quick",
|
|
||||||
" &6look at &a&nredstoner.com/info", " \n&6thank you and happy playing ;)", " \n \n"};
|
|
||||||
getLogger().message(player, message);
|
|
||||||
}
|
|
||||||
Material spawnBlock = player.getLocation().getBlock().getType();
|
|
||||||
if (spawnBlock == Material.PORTAL || spawnBlock == Material.ENDER_PORTAL)
|
|
||||||
{
|
|
||||||
getLogger().message(player, "&4Looks like you spawned in a portal... Let me help you out");
|
|
||||||
getLogger().message(player, "&6You can use /back if you &nreally&6 want to go back");
|
|
||||||
player.teleport(player.getWorld().getSpawnLocation());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disables spectator teleportation
|
|
||||||
@EventHandler(priority = EventPriority.LOWEST)
|
|
||||||
public void onTeleport(PlayerTeleportEvent event)
|
|
||||||
{
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
if (!event.isCancelled() && event.getCause() == TeleportCause.SPECTATE && !player.hasPermission("utils.tp"))
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
getLogger().message(event.getPlayer(), true, "Spectator teleportation is disabled!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disables water and lava breaking stuff
|
|
||||||
@EventHandler
|
|
||||||
public void onLiquidFlow(BlockFromToEvent event)
|
|
||||||
{
|
|
||||||
Material m = event.getToBlock().getType();
|
|
||||||
switch (m)
|
|
||||||
{
|
|
||||||
case AIR:
|
|
||||||
case WATER:
|
|
||||||
case STATIONARY_WATER:
|
|
||||||
case LAVA:
|
|
||||||
case STATIONARY_LAVA:
|
|
||||||
return;
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Command(hook = "tempadddef")
|
|
||||||
public boolean tempAddDef(CommandSender sender, String user, String group)
|
|
||||||
{
|
|
||||||
return tempAdd(sender, user, group, "604800");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Command(hook = "tempadd")
|
|
||||||
public boolean tempAdd(CommandSender sender, String user, String group, String duration)
|
|
||||||
{
|
|
||||||
// Use it to make a proper duration output later. Too lazy rn.
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
int i = 0;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
i = Integer.valueOf(duration);
|
|
||||||
}
|
|
||||||
catch (NumberFormatException e)
|
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "That is not a valid number!");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
Bukkit.dispatchCommand(sender, "pex user " + user + " group add " + group + " * " + duration);
|
|
||||||
getLogger().message(sender, "Added to group " + group + "for " + duration + " seconds.");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Command(hook = "echo")
|
|
||||||
public boolean echo(CommandSender sender, String text)
|
|
||||||
{
|
|
||||||
sender.sendMessage(ChatAPI.colorify(null, text));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Command(hook = "ping")
|
|
||||||
public boolean ping(CommandSender sender)
|
|
||||||
{
|
|
||||||
if (sender instanceof Player)
|
|
||||||
{
|
|
||||||
int ping = getPing((Player) sender);
|
|
||||||
getLogger().message(sender, "Your ping is " + ping + "ms.");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sender.sendMessage("Pong!");
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Command(hook = "ping2")
|
|
||||||
public boolean ping(CommandSender sender, String password)
|
|
||||||
{
|
|
||||||
if (password.equals("pong"))
|
|
||||||
if (sender instanceof Player)
|
|
||||||
{
|
|
||||||
int ping = getPing((Player) sender);
|
|
||||||
getLogger().message(sender, new String[] {"Your ping is " + ping + "ms.", ping < 20
|
|
||||||
? "&aThat's gr8 m8 r8 8/8"
|
|
||||||
: (ping < 50 ? "F&eair enough you cunt!"
|
|
||||||
: (ping < 100 ? "&eShite, but not shite enough."
|
|
||||||
: "&cLooks like the server is about two months ahead of you. GET A NEW FRIGGIN' ISP ALREADY"))});
|
|
||||||
}
|
|
||||||
else
|
|
||||||
getLogger().message(sender, true,
|
|
||||||
"M8 you shitty cunt are not supposed to run this shit it's for players only!!!");
|
|
||||||
else
|
|
||||||
getLogger().message(sender, true, "&4WRONG PASSWORD, 4/3 ATTEMPTS FAILED! BAN COMMENCING!");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getPing(Player player)
|
|
||||||
{
|
|
||||||
return ((CraftPlayer) player).getHandle().ping;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Command(hook = "sudo")
|
|
||||||
public boolean sudo(CommandSender sender, String name, String command)
|
|
||||||
{
|
|
||||||
CommandSender target;
|
|
||||||
if (name.equalsIgnoreCase("console"))
|
|
||||||
{
|
|
||||||
target = Bukkit.getConsoleSender();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
target = Bukkit.getPlayer(name);
|
|
||||||
if (target == null)
|
|
||||||
{
|
|
||||||
getLogger().message(sender, false, "That player couldn't be found!");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (command.startsWith("/") || target.equals(Bukkit.getConsoleSender()))
|
|
||||||
{
|
|
||||||
String[] args = command.split(" ");
|
|
||||||
for (String regex : sudoBlacklist)
|
|
||||||
{
|
|
||||||
if (args[0].matches((target.equals(Bukkit.getConsoleSender()) ? "" : "\\/") + regex))
|
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "You can't sudo anyone into using that command!");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Bukkit.dispatchCommand(target, command.replaceFirst("/", ""));
|
|
||||||
getLogger().message(sender, "Sudoed " + Utils.getName(target) + "&7 into running " + command);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
((Player) target).chat(command);
|
|
||||||
getLogger().message(sender, "Sudoed " + Utils.getName(target) + "&7 into saying " + command);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Command(hook = "hasperm")
|
|
||||||
public boolean hasPerm(CommandSender sender, boolean noformat, String name, String node)
|
|
||||||
{
|
|
||||||
Player p;
|
|
||||||
if (name.contains("-"))
|
|
||||||
try
|
|
||||||
{
|
|
||||||
p = Bukkit.getPlayer(UUID.fromString(name));
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
if (noformat)
|
|
||||||
sender.sendMessage("ERR: Invalid UUID");
|
|
||||||
else
|
|
||||||
getLogger().message(sender, "That UUID is not valid!");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
p = Bukkit.getPlayer(name);
|
|
||||||
if (p == null)
|
|
||||||
{
|
|
||||||
if (noformat)
|
|
||||||
{
|
|
||||||
Message m = new Message(sender, null);
|
|
||||||
m.appendText("ERR: Invalid player");
|
|
||||||
m.send();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
getLogger().message(sender, "That player couldn't be found!");
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (noformat)
|
|
||||||
{
|
|
||||||
Message m = new Message(sender, null);
|
|
||||||
m.appendText("" + p.hasPermission(node));
|
|
||||||
m.send();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
getLogger().message(sender, "" + p.hasPermission(node));
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean canBuild(Player player, Location location)
|
|
||||||
{
|
|
||||||
BlockBreakEvent event = new BlockBreakEvent(location.getBlock(), player);
|
|
||||||
Bukkit.getPluginManager().callEvent(event);
|
|
||||||
return event.isCancelled();
|
|
||||||
}
|
|
||||||
|
|
||||||
PotionEffect nightvision = new PotionEffect(PotionEffectType.NIGHT_VISION, Integer.MAX_VALUE, 0, false, false);
|
|
||||||
|
|
||||||
@Command(hook = "illuminate")
|
|
||||||
public void illuminate(CommandSender sender)
|
|
||||||
{
|
|
||||||
Player player = (Player) sender;
|
|
||||||
if (player.hasPotionEffect(PotionEffectType.NIGHT_VISION))
|
|
||||||
{
|
|
||||||
player.removePotionEffect(PotionEffectType.NIGHT_VISION);
|
|
||||||
getLogger().message(sender, "Night Vision Disabled.");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
player.addPotionEffect(nightvision, true);
|
|
||||||
getLogger().message(sender, "Night Vision Enabled.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
command setmotd {
|
|
||||||
[string:motd...] {
|
|
||||||
help Sets the motd. Use --reset to reset to default;
|
|
||||||
run setmotd motd;
|
|
||||||
perm utils.setmotd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
command getmotd {
|
|
||||||
[empty] {
|
|
||||||
help Returns the motd;
|
|
||||||
run getmotd;
|
|
||||||
perm utils.getmotd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -21,26 +21,22 @@ import com.redstoner.modules.Module;
|
|||||||
|
|
||||||
@Commands(CommandHolderType.File)
|
@Commands(CommandHolderType.File)
|
||||||
@AutoRegisterListener
|
@AutoRegisterListener
|
||||||
@Version(major = 4, minor = 1, revision = 0, compatible = 4)
|
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
public class Abot implements Module, Listener
|
public class Abot implements Module, Listener {
|
||||||
{
|
|
||||||
private File answerFile = new File(Main.plugin.getDataFolder(), "abot.json");
|
private File answerFile = new File(Main.plugin.getDataFolder(), "abot.json");
|
||||||
JSONArray answers;
|
JSONArray answers;
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerChat(AsyncPlayerChatEvent event)
|
public void onPlayerChat(AsyncPlayerChatEvent event) {
|
||||||
{
|
for (Object rawObject : answers) {
|
||||||
for (Object rawObject : answers)
|
|
||||||
{
|
|
||||||
JSONObject entry = (JSONObject) rawObject;
|
JSONObject entry = (JSONObject) rawObject;
|
||||||
JSONArray regexes = (JSONArray) entry.get("regex");
|
JSONArray regexes = (JSONArray) entry.get("regex");
|
||||||
for (Object regex : regexes)
|
|
||||||
{
|
for (Object regex : regexes) {
|
||||||
if (event.getMessage().toLowerCase().matches((String) regex))
|
if (event.getMessage().toLowerCase().matches((String) regex)) {
|
||||||
{
|
|
||||||
Object hideperm = entry.get("hide-perm");
|
Object hideperm = entry.get("hide-perm");
|
||||||
if (hideperm == null || !event.getPlayer().hasPermission((String) hideperm))
|
|
||||||
{
|
if (hideperm == null || !event.getPlayer().hasPermission((String) hideperm)) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
getLogger().message(event.getPlayer(), (String) entry.get("message"));
|
getLogger().message(event.getPlayer(), (String) entry.get("message"));
|
||||||
return;
|
return;
|
||||||
@@ -51,17 +47,15 @@ public class Abot implements Module, Listener
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "abot_reload")
|
@Command(hook = "abot_reload")
|
||||||
public void loadAnswers(CommandSender sender)
|
public void loadAnswers(CommandSender sender) {
|
||||||
{
|
|
||||||
answers = JsonManager.getArray(answerFile);
|
answers = JsonManager.getArray(answerFile);
|
||||||
if (answers == null)
|
if (answers == null) answers = new JSONArray();
|
||||||
answers = new JSONArray();
|
|
||||||
getLogger().message(sender, "Loaded the abot.json file!");
|
getLogger().message(sender, "Loaded the abot.json file!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onEnable()
|
public boolean onEnable() {
|
||||||
{
|
|
||||||
loadAnswers(Bukkit.getConsoleSender());
|
loadAnswers(Bukkit.getConsoleSender());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
3
src/main/java/com/redstoner/modules/abot/module.info
Normal file
3
src/main/java/com/redstoner/modules/abot/module.info
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: Abot
|
||||||
|
category: Other
|
||||||
|
description: An annoying little bot to automatically answer questions in chat
|
||||||
@@ -1,42 +1,40 @@
|
|||||||
command ac {
|
command ac {
|
||||||
|
perm utils.ac;
|
||||||
[string:message...] {
|
[string:message...] {
|
||||||
help Sends a message in Admin Chat;
|
help Sends a message in Admin Chat;
|
||||||
perm utils.ac;
|
|
||||||
run ac_msg message;
|
run ac_msg message;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
command acn {
|
command acn {
|
||||||
|
perm utils.ac;
|
||||||
[string:name] [string:message...] {
|
[string:name] [string:message...] {
|
||||||
help Sends a message in Admin Chat;
|
help Sends a message in Admin Chat;
|
||||||
perm utils.ac;
|
|
||||||
type console;
|
type console;
|
||||||
run acn_msg name message;
|
run acn_msg name message;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
command ackey {
|
command ackey {
|
||||||
|
perm utils.ac;
|
||||||
[string:key] {
|
[string:key] {
|
||||||
help Sets your Admin Chat key;
|
help Sets your Admin Chat key;
|
||||||
perm utils.ac;
|
|
||||||
type player;
|
type player;
|
||||||
run setackey key;
|
run setackey key;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
command act {
|
command act {
|
||||||
|
perm utils.ac;
|
||||||
on {
|
on {
|
||||||
help Turns on act;
|
help Turns on act;
|
||||||
perm utils.ac;
|
|
||||||
run act_on;
|
run act_on;
|
||||||
}
|
}
|
||||||
off {
|
off {
|
||||||
help Turns off act;
|
help Turns off act;
|
||||||
perm utils.ac;
|
|
||||||
run act_off;
|
run act_off;
|
||||||
}
|
}
|
||||||
[empty] {
|
[empty] {
|
||||||
help toggles Admin Chat;
|
help toggles Admin Chat;
|
||||||
perm utils.ac;
|
|
||||||
run act;
|
run act;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -25,190 +25,185 @@ import com.redstoner.modules.Module;
|
|||||||
|
|
||||||
import net.nemez.chatapi.ChatAPI;
|
import net.nemez.chatapi.ChatAPI;
|
||||||
|
|
||||||
/** AdminChat module. Allows staff to chat to other staff using /ac \<message\> as well as a one char prefix or a toggle.
|
/**
|
||||||
|
* AdminChat module. Allows staff to chat to other staff using /ac \<message\>
|
||||||
|
* as well as a one char prefix or a toggle.
|
||||||
*
|
*
|
||||||
* @author Pepich */
|
* @author Pepich
|
||||||
|
*/
|
||||||
@Commands(CommandHolderType.File)
|
@Commands(CommandHolderType.File)
|
||||||
@AutoRegisterListener
|
@AutoRegisterListener
|
||||||
@Version(major = 4, minor = 1, revision = 0, compatible = 4)
|
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
public class Adminchat implements Module, Listener
|
public class Adminchat implements Module, Listener {
|
||||||
{
|
|
||||||
private static final char defaultKey = ',';
|
private static final char defaultKey = ',';
|
||||||
private static final File keysLocation = new File(Main.plugin.getDataFolder(), "adminchat_keys.json");
|
private static final File keysLocation = new File(Main.plugin.getDataFolder(), "adminchat_keys.json");
|
||||||
private ArrayList<UUID> actoggled;
|
private ArrayList<UUID> actoggled;
|
||||||
private static JSONObject keys;
|
private static JSONObject keys;
|
||||||
|
|
||||||
|
private static final BroadcastFilter AC_PERM_BROADCAST_FILTER = new BroadcastFilter() {
|
||||||
@Override
|
@Override
|
||||||
public boolean onEnable()
|
public boolean sendTo(CommandSender recipient) {
|
||||||
{
|
return recipient.hasPermission("utils.ac");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onEnable() {
|
||||||
keys = JsonManager.getObject(keysLocation);
|
keys = JsonManager.getObject(keysLocation);
|
||||||
if (keys == null)
|
|
||||||
{
|
if (keys == null) {
|
||||||
keys = new JSONObject();
|
keys = new JSONObject();
|
||||||
saveKeys();
|
saveKeys();
|
||||||
}
|
}
|
||||||
|
|
||||||
actoggled = new ArrayList<>();
|
actoggled = new ArrayList<>();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "ac_msg")
|
@Command(hook = "ac_msg")
|
||||||
public boolean acSay(CommandSender sender, String message)
|
public boolean acSay(CommandSender sender, String message) {
|
||||||
{
|
|
||||||
String name;
|
String name;
|
||||||
if (sender instanceof Player)
|
|
||||||
name = ((Player) sender).getDisplayName();
|
if (sender instanceof Player) name = ((Player) sender).getDisplayName();
|
||||||
else
|
else name = sender.getName();
|
||||||
name = sender.getName();
|
|
||||||
Utils.broadcast("§8[§cAC§8] §9" + name + "§8: §b", ChatAPI.colorify(sender, message), new BroadcastFilter()
|
Utils.broadcast("§8[§cAC§8] §9" + name + "§8: §b", ChatAPI.colorify(sender, message), AC_PERM_BROADCAST_FILTER);
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public boolean sendTo(CommandSender recipient)
|
|
||||||
{
|
|
||||||
return recipient.hasPermission("utils.ac");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "acn_msg")
|
@Command(hook = "acn_msg")
|
||||||
public boolean acnSay(CommandSender sender, String name, String message)
|
public boolean acnSay(CommandSender sender, String name, String message) {
|
||||||
{
|
Utils.broadcast("§8[§cAC§8] §9" + name + "§8: §b", ChatAPI.colorify(sender, message), AC_PERM_BROADCAST_FILTER);
|
||||||
Utils.broadcast("§8[§cAC§8] §9" + name + "§8: §b", ChatAPI.colorify(sender, message), new BroadcastFilter()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public boolean sendTo(CommandSender recipient)
|
|
||||||
{
|
|
||||||
return recipient.hasPermission("utils.ac");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Let's a Player toggle their ac-toglge status to allow for automatically sending chat messages to adminchat.
|
/**
|
||||||
|
* Lets a Player toggle their AC toggle status to allow automatically sending
|
||||||
|
* chat messages to admin chat.
|
||||||
*
|
*
|
||||||
* @param sender the issuer of the command.
|
* @param sender the issuer of the command.
|
||||||
* @param _void ignored.
|
* @param _void ignored.
|
||||||
* @return true. */
|
* @return true.
|
||||||
|
*/
|
||||||
@Command(hook = "act")
|
@Command(hook = "act")
|
||||||
public boolean acToggleCommand(CommandSender sender)
|
public boolean acToggleCommand(CommandSender sender) {
|
||||||
{
|
if (actoggled.contains(((Player) sender).getUniqueId())) {
|
||||||
if (actoggled.contains(((Player) sender).getUniqueId()))
|
|
||||||
{
|
|
||||||
actoggled.remove(((Player) sender).getUniqueId());
|
actoggled.remove(((Player) sender).getUniqueId());
|
||||||
getLogger().message(sender, "ACT now §cdisabled");
|
getLogger().message(sender, "ACT now §cdisabled");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
actoggled.add(((Player) sender).getUniqueId());
|
actoggled.add(((Player) sender).getUniqueId());
|
||||||
getLogger().message(sender, "ACT now §aenabled");
|
getLogger().message(sender, "ACT now §aenabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Let's a Player toggle their ac-toglge status to allow for automatically sending chat messages to adminchat.
|
/**
|
||||||
|
* Lets a Player toggle their AC toggle status to allow automatically sending
|
||||||
|
* chat messages to admin chat.
|
||||||
*
|
*
|
||||||
* @param sender the issuer of the command.
|
* @param sender the issuer of the command.
|
||||||
* @return true. */
|
* @return true.
|
||||||
|
*/
|
||||||
@Command(hook = "act_on")
|
@Command(hook = "act_on")
|
||||||
public boolean acToggleOnCommand(CommandSender sender)
|
public boolean acToggleOnCommand(CommandSender sender) {
|
||||||
{
|
if (!actoggled.contains(((Player) sender).getUniqueId())) {
|
||||||
if (!actoggled.contains(((Player) sender).getUniqueId()))
|
|
||||||
{
|
|
||||||
actoggled.add(((Player) sender).getUniqueId());
|
actoggled.add(((Player) sender).getUniqueId());
|
||||||
getLogger().message(sender, "ACT now §aenabled");
|
getLogger().message(sender, "ACT now §aenabled");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
getLogger().message(sender, "ACT was already enabled");
|
getLogger().message(sender, "ACT was already enabled");
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Let's a Player toggle their ac-toglge status to allow for automatically sending chat messages to adminchat.
|
/**
|
||||||
|
* Lets a Player toggle their AC toggle status to allow automatically sending chat messages to admin chat.
|
||||||
*
|
*
|
||||||
* @param sender the issuer of the command.
|
* @param sender the issuer of the command.
|
||||||
* @return true. */
|
* @return true.
|
||||||
|
*/
|
||||||
@Command(hook = "act_off")
|
@Command(hook = "act_off")
|
||||||
public boolean acToggleOffCommand(CommandSender sender)
|
public boolean acToggleOffCommand(CommandSender sender) {
|
||||||
{
|
if (actoggled.contains(((Player) sender).getUniqueId())) {
|
||||||
if (actoggled.contains(((Player) sender).getUniqueId()))
|
|
||||||
{
|
|
||||||
actoggled.remove(((Player) sender).getUniqueId());
|
actoggled.remove(((Player) sender).getUniqueId());
|
||||||
getLogger().message(sender, "ACT now §cdisabled");
|
getLogger().message(sender, "ACT now §cdisabled");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
getLogger().message(sender, "ACT was already disabled");
|
getLogger().message(sender, "ACT was already disabled");
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Deals with chat events to allow for ackeys and actoggle.
|
/**
|
||||||
|
* Deals with chat events to allow for ackeys and actoggle.
|
||||||
*
|
*
|
||||||
* @param event the chat event containing the player and the message. */
|
* @param event the chat event containing the player and the message.
|
||||||
|
*/
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerChat(AsyncPlayerChatEvent event)
|
public void onPlayerChat(AsyncPlayerChatEvent event) {
|
||||||
{
|
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
if (!player.hasPermission("utils.ac"))
|
|
||||||
return;
|
if (!player.hasPermission("utils.ac")) return;
|
||||||
if (event.getMessage().startsWith(getKey(player)))
|
|
||||||
{
|
if (event.getMessage().startsWith(getKey(player))) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
acSay(event.getPlayer(), event.getMessage().replaceFirst(Pattern.quote(getKey(player)), ""));
|
acSay(event.getPlayer(), event.getMessage().replaceFirst(Pattern.quote(getKey(player)), ""));
|
||||||
}
|
} else if (actoggled.contains(event.getPlayer().getUniqueId())) {
|
||||||
else if (actoggled.contains(event.getPlayer().getUniqueId()))
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
acSay(event.getPlayer(), event.getMessage());
|
acSay(event.getPlayer(), event.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sets the ackey of a Player.
|
/**
|
||||||
|
* Sets the ackey of a Player.
|
||||||
*
|
*
|
||||||
* @param sender the issuer of the command.
|
* @param sender the issuer of the command.
|
||||||
* @param key the key to be set. Set to NULL or "" to get your current key.
|
* @param key the key to be set. Set to NULL or "" to get your current key.
|
||||||
* @return true. */
|
* @return true.
|
||||||
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Command(hook = "setackey")
|
@Command(hook = "setackey")
|
||||||
public boolean setAcKey(CommandSender sender, String key)
|
public boolean setAcKey(CommandSender sender, String key) {
|
||||||
{
|
if (key.length() > 1) {
|
||||||
if (key.length() > 1)
|
getLogger().message(sender, true, "Could not set your key to §6" + key + " §7, it can be at most one char.");
|
||||||
{
|
|
||||||
getLogger().message(sender, true,
|
|
||||||
"Could not set your key to §6" + key + " §7, it can be at most one char.");
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (key == null || key.length() == 0)
|
|
||||||
{
|
if (key == null || key.length() == 0) {
|
||||||
getAcKey(sender);
|
getAcKey(sender);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
getLogger().message(sender, "Set your key to §6" + key);
|
getLogger().message(sender, "Set your key to §6" + key);
|
||||||
keys.put(((Player) sender).getUniqueId().toString(), key + "");
|
keys.put(((Player) sender).getUniqueId().toString(), key + "");
|
||||||
|
|
||||||
saveKeys();
|
saveKeys();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** This method will find the AdminChat key of any player.
|
/**
|
||||||
|
* This method will find the AdminChat key of any player.
|
||||||
*
|
*
|
||||||
* @param player the player to get the key from.
|
* @param player the player to get the key from.
|
||||||
* @return the key. */
|
* @return the key.
|
||||||
public static String getKey(Player player)
|
*/
|
||||||
{
|
public static String getKey(Player player) {
|
||||||
String key = (String) keys.get(player.getUniqueId().toString());
|
String key = (String) keys.get(player.getUniqueId().toString());
|
||||||
return (key == null ? "" + defaultKey : key);
|
return (key == null ? "" + defaultKey : key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Prints a Players ackey to their chat.
|
/**
|
||||||
|
* Prints a Player's ackey to their chat.
|
||||||
*
|
*
|
||||||
* @param sender the issuer of the command. */
|
* @param sender the issuer of the command.
|
||||||
public void getAcKey(CommandSender sender)
|
*/
|
||||||
{
|
public void getAcKey(CommandSender sender) {
|
||||||
getLogger().message(sender, "Your current ackey is §6" + getKey((Player) sender));
|
getLogger().message(sender, "Your current ackey is §6" + getKey((Player) sender));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Saves the keys. */
|
/** Saves the keys. */
|
||||||
private void saveKeys()
|
private void saveKeys() {
|
||||||
{
|
|
||||||
JsonManager.save(keys, keysLocation);
|
JsonManager.save(keys, keysLocation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: Adminchat
|
||||||
|
category: Staff
|
||||||
|
description: A secondary chat used for staff to communicate with each other
|
||||||
@@ -2,13 +2,19 @@ command afk {
|
|||||||
alias eafk;
|
alias eafk;
|
||||||
alias away;
|
alias away;
|
||||||
alias eaway;
|
alias eaway;
|
||||||
|
|
||||||
|
perm utils.afk;
|
||||||
|
|
||||||
[empty] {
|
[empty] {
|
||||||
run afk;
|
run afk;
|
||||||
perm utils.afk;
|
|
||||||
}
|
}
|
||||||
[string:reason...] {
|
|
||||||
run afk2 reason;
|
[optional:-s] {
|
||||||
perm utils.afk;
|
run afksilent -s;
|
||||||
|
}
|
||||||
|
|
||||||
|
[optional:-s] [string:reason...] {
|
||||||
|
run afkreason -s reason;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
100
src/main/java/com/redstoner/modules/afk/AFK.java
Normal file
100
src/main/java/com/redstoner/modules/afk/AFK.java
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
package com.redstoner.modules.afk;
|
||||||
|
|
||||||
|
import com.nemez.cmdmgr.Command;
|
||||||
|
import com.redstoner.annotations.AutoRegisterListener;
|
||||||
|
import com.redstoner.annotations.Commands;
|
||||||
|
import com.redstoner.annotations.Version;
|
||||||
|
import com.redstoner.coremods.moduleLoader.ModuleLoader;
|
||||||
|
import com.redstoner.misc.CommandHolderType;
|
||||||
|
import com.redstoner.misc.Utils;
|
||||||
|
import com.redstoner.modules.Module;
|
||||||
|
import com.redstoner.modules.datamanager.DataManager;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
|
||||||
|
@Commands(CommandHolderType.File)
|
||||||
|
@AutoRegisterListener
|
||||||
|
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
|
public class AFK implements Module {
|
||||||
|
private AFKListener listener;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void firstLoad() {
|
||||||
|
String[] choices = new String[] { "listen", "ignore" };
|
||||||
|
|
||||||
|
DataManager.setConfig("indicator", "&7[AFK]");
|
||||||
|
|
||||||
|
DataManager.setConfig("move", "listen", choices);
|
||||||
|
DataManager.setConfig("look", "ignore", choices);
|
||||||
|
DataManager.setConfig("chat", "listen", choices);
|
||||||
|
DataManager.setConfig("interact", "listen", choices);
|
||||||
|
DataManager.setConfig("command", "ignore", choices);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void migrate(Version old) {
|
||||||
|
if (old.major() == 4 && old.minor() == 0 && old.revision() == 3) {
|
||||||
|
String[] choices = new String[] { "listen", "ignore" };
|
||||||
|
DataManager.setConfig("look", "ignore", choices);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void postEnable() {
|
||||||
|
listener = new AFKListener();
|
||||||
|
|
||||||
|
Bukkit.getServer().getPluginManager().registerEvents(listener, ModuleLoader.getPlugin());
|
||||||
|
update_afk_listeners(Bukkit.getConsoleSender());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable() {
|
||||||
|
HandlerList.unregisterAll(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command(hook = "afk")
|
||||||
|
public boolean afk(CommandSender sender) {
|
||||||
|
return afk(sender, false, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command(hook = "afksilent")
|
||||||
|
public boolean afk(CommandSender sender, boolean silent) {
|
||||||
|
return afk(sender, silent, "");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command(hook = "afkreason")
|
||||||
|
public boolean afk(CommandSender sender, boolean silent, String reason) {
|
||||||
|
if (AFKUtil.isAfk(sender)) {
|
||||||
|
AFKUtil.unAfk(sender, silent);
|
||||||
|
} else {
|
||||||
|
DataManager.setData(sender, "afk_time", System.currentTimeMillis());
|
||||||
|
DataManager.setData(sender, "afk_reason", reason);
|
||||||
|
DataManager.setState(sender, "afk_silent", silent);
|
||||||
|
DataManager.setState(sender, "afk", true);
|
||||||
|
|
||||||
|
if (!silent) Utils.broadcast("§7 * ", Utils.getName(sender) + "§7 is now AFK", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean getListenSetting(String name, String def) {
|
||||||
|
return DataManager.getConfigOrDefault(name, def).equals("listen");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command(hook = "update_afk_listeners")
|
||||||
|
public boolean update_afk_listeners(CommandSender sender) {
|
||||||
|
Utils.broadcast(null, "Updating afk listeners...", recipient -> recipient.hasPermission("utils.afk.admin"));
|
||||||
|
|
||||||
|
listener.listenTo(
|
||||||
|
getListenSetting("move", "listen"),
|
||||||
|
getListenSetting("look", "ignore"),
|
||||||
|
getListenSetting("chat", "listen"),
|
||||||
|
getListenSetting("interact", "listen"),
|
||||||
|
getListenSetting("command", "ignore")
|
||||||
|
);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
64
src/main/java/com/redstoner/modules/afk/AFKListener.java
Normal file
64
src/main/java/com/redstoner/modules/afk/AFKListener.java
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
package com.redstoner.modules.afk;
|
||||||
|
|
||||||
|
import com.redstoner.misc.Utils;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.*;
|
||||||
|
|
||||||
|
public class AFKListener implements Listener {
|
||||||
|
private boolean
|
||||||
|
move = false,
|
||||||
|
look = false,
|
||||||
|
chat = false,
|
||||||
|
interact = false,
|
||||||
|
command = false;
|
||||||
|
|
||||||
|
protected void listenTo(boolean move, boolean look, boolean chat, boolean interact, boolean command) {
|
||||||
|
this.move = move;
|
||||||
|
this.look = look;
|
||||||
|
this.chat = chat;
|
||||||
|
this.interact = interact;
|
||||||
|
this.command = command;
|
||||||
|
|
||||||
|
String lt = "Listening to:";
|
||||||
|
|
||||||
|
if (move) lt += " move";
|
||||||
|
if (look) lt += " look";
|
||||||
|
if (chat) lt += " chat";
|
||||||
|
if (interact) lt+= " interact";
|
||||||
|
if (command) lt += " command";
|
||||||
|
|
||||||
|
Utils.broadcast(null, lt, recipient -> recipient.hasPermission("utils.afk.admin"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onMove(PlayerMoveEvent event) {
|
||||||
|
double distance = event.getFrom().distance(event.getTo());
|
||||||
|
|
||||||
|
boolean moved = distance > 0;
|
||||||
|
boolean looked = (event.getFrom().getPitch() != event.getTo().getPitch()) || (event.getFrom().getYaw() != event.getTo().getYaw());
|
||||||
|
|
||||||
|
if ((move && moved) || (look && looked)) AFKUtil.checkedUnAfk(event.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public void onChat(PlayerChatEvent event) {
|
||||||
|
if (chat) AFKUtil.checkedUnAfk(event.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onInteract(PlayerInteractEvent event) {
|
||||||
|
if (interact) AFKUtil.checkedUnAfk(event.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onCommand(PlayerCommandPreprocessEvent event) {
|
||||||
|
if (command) AFKUtil.checkedUnAfk(event.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onLeave(PlayerQuitEvent event) {
|
||||||
|
AFKUtil.unAfk(event.getPlayer(), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
30
src/main/java/com/redstoner/modules/afk/AFKUtil.java
Normal file
30
src/main/java/com/redstoner/modules/afk/AFKUtil.java
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
package com.redstoner.modules.afk;
|
||||||
|
|
||||||
|
import com.redstoner.misc.Utils;
|
||||||
|
import com.redstoner.modules.datamanager.DataManager;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
public class AFKUtil {
|
||||||
|
protected static void unAfk(CommandSender sender, boolean silent) {
|
||||||
|
DataManager.setState(sender, "afk", false);
|
||||||
|
|
||||||
|
if (!silent) Utils.broadcast("§7 * ", Utils.getName(sender) + "§7 is no longer AFK", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static boolean isAfk(CommandSender sender) {
|
||||||
|
return DataManager.getState(sender, "afk");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static boolean isVanished(Player player) {
|
||||||
|
return DataManager.getState(player, "vanished");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static boolean isSilent(CommandSender sender) {
|
||||||
|
return DataManager.getState(sender, "afk_silent");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void checkedUnAfk(Player player) {
|
||||||
|
if (isAfk(player) && !isVanished(player)) unAfk(player, isSilent(player));
|
||||||
|
}
|
||||||
|
}
|
||||||
3
src/main/java/com/redstoner/modules/afk/module.info
Normal file
3
src/main/java/com/redstoner/modules/afk/module.info
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: AFK
|
||||||
|
category: Chat
|
||||||
|
description: Allows a user to announce they're afk ,and will also notify players messaging them, that they're afk and might not see the message
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package com.redstoner.modules.blockplacemods;
|
||||||
|
|
||||||
|
import com.redstoner.modules.datamanager.DataManager;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
public class BlockPlaceMod implements Listener {
|
||||||
|
public final String name;
|
||||||
|
public final String[] aliases;
|
||||||
|
public final String description;
|
||||||
|
public final ModType type;
|
||||||
|
public final String typeDescription;
|
||||||
|
|
||||||
|
public final boolean enabledByDefault;
|
||||||
|
|
||||||
|
protected BlockPlaceMod(String name, String description, ModType type, String typeDescription, boolean enabledByDefault, String... aliases) {
|
||||||
|
this.name = name;
|
||||||
|
this.aliases = aliases;
|
||||||
|
this.description = description;
|
||||||
|
|
||||||
|
this.type = type;
|
||||||
|
this.typeDescription = typeDescription;
|
||||||
|
|
||||||
|
this.enabledByDefault = enabledByDefault;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final boolean hasEnabled(Player player) {
|
||||||
|
String uuid = player.getUniqueId().toString();
|
||||||
|
return (boolean) DataManager.getOrDefault(uuid, "BlockPlaceMods", name, enabledByDefault);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final Object getState(Player player) {
|
||||||
|
String uuid = player.getUniqueId().toString();
|
||||||
|
return DataManager.getOrDefault(uuid, "BlockPlaceMods", name + "_state", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean onEnable() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onDisable() {}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
command bpm {
|
||||||
|
alias set;
|
||||||
|
alias toggle;
|
||||||
|
alias mod;
|
||||||
|
|
||||||
|
perm blockplacemods.use;
|
||||||
|
type player;
|
||||||
|
|
||||||
|
[empty] {
|
||||||
|
help Lists the block place mods and their statuses.;
|
||||||
|
run list_mods;
|
||||||
|
}
|
||||||
|
|
||||||
|
list [empty] {
|
||||||
|
help Lists the block place mods and their statuses.;
|
||||||
|
run list_mods;
|
||||||
|
}
|
||||||
|
|
||||||
|
reset [string:mod] {
|
||||||
|
help Resets the specified mod's settings to the default value.;
|
||||||
|
run reset_mod mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
toggle [string:mod] {
|
||||||
|
help Toggles a block place mod.;
|
||||||
|
run toggle_mod mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
set [string:mod] [string:value] {
|
||||||
|
help Sets the specified mod's state to the specified value. Only works for mods that have a state.;
|
||||||
|
run set_mod_value mod value;
|
||||||
|
}
|
||||||
|
|
||||||
|
[string:mod] {
|
||||||
|
help Toggles a block place mod.;
|
||||||
|
run toggle_mod_no_prefix mod;
|
||||||
|
}
|
||||||
|
|
||||||
|
[string:mod] [string:value] {
|
||||||
|
help Sets the specified mod's state to the specified value. Only works for mods that have a state.;
|
||||||
|
run set_mod_value mod value;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,213 @@
|
|||||||
|
package com.redstoner.modules.blockplacemods;
|
||||||
|
|
||||||
|
import com.nemez.cmdmgr.Command;
|
||||||
|
import com.redstoner.annotations.AutoRegisterListener;
|
||||||
|
import com.redstoner.annotations.Commands;
|
||||||
|
import com.redstoner.annotations.Version;
|
||||||
|
import com.redstoner.coremods.moduleLoader.ModuleLoader;
|
||||||
|
import com.redstoner.misc.CommandHolderType;
|
||||||
|
import com.redstoner.misc.Main;
|
||||||
|
import com.redstoner.modules.Module;
|
||||||
|
import com.redstoner.modules.blockplacemods.mods.ModBetterDirectional;
|
||||||
|
import com.redstoner.modules.blockplacemods.mods.ModCauldron;
|
||||||
|
import com.redstoner.modules.blockplacemods.mods.ModSlab;
|
||||||
|
import com.redstoner.modules.datamanager.DataManager;
|
||||||
|
import net.nemez.chatapi.click.Message;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.HandlerList;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Commands (CommandHolderType.File)
|
||||||
|
@AutoRegisterListener
|
||||||
|
@Version (major = 4, minor = 1, revision = 1, compatible = 4)
|
||||||
|
public class BlockPlaceMods implements Module, Listener {
|
||||||
|
private static final Map<String, BlockPlaceMod> mods = new HashMap<>();
|
||||||
|
private static final List<BlockPlaceMod> enabledMods = new ArrayList<>();
|
||||||
|
|
||||||
|
private final BlockPlaceMod[] modsToRegister = {
|
||||||
|
new ModCauldron(),
|
||||||
|
new ModSlab(),
|
||||||
|
new ModBetterDirectional("Observer", Material.OBSERVER, "observers", false),
|
||||||
|
new ModBetterDirectional("Piston", Material.PISTON, "pistons", false),
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onEnable() {
|
||||||
|
for (BlockPlaceMod mod : modsToRegister) {
|
||||||
|
mods.put(mod.name.toLowerCase(), mod);
|
||||||
|
|
||||||
|
for (String alias : mod.aliases) {
|
||||||
|
mods.put(alias.toLowerCase(), mod);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mod.onEnable()) {
|
||||||
|
enabledMods.add(mod);
|
||||||
|
Bukkit.getPluginManager().registerEvents(mod, Main.plugin);
|
||||||
|
} else {
|
||||||
|
getLogger().warn("Failed to enable the mod, &e" + mod.name + "&7!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable() {
|
||||||
|
for (BlockPlaceMod mod : enabledMods) {
|
||||||
|
mod.onDisable();
|
||||||
|
HandlerList.unregisterAll(mod);
|
||||||
|
}
|
||||||
|
|
||||||
|
enabledMods.clear();
|
||||||
|
mods.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command (async = Command.AsyncType.ALWAYS, hook = "list_mods")
|
||||||
|
public void listMods(CommandSender sender) {
|
||||||
|
Player player = (Player) sender;
|
||||||
|
String uuid = player.getUniqueId().toString();
|
||||||
|
|
||||||
|
Message msg = new Message(sender, sender);
|
||||||
|
|
||||||
|
msg.appendText(getLogger().getHeader() + "\n");
|
||||||
|
|
||||||
|
int curMod = 1;
|
||||||
|
for (BlockPlaceMod mod : modsToRegister) {
|
||||||
|
|
||||||
|
boolean enabled = (boolean) DataManager.getOrDefault(uuid, "BlockPlaceMods", mod.name, mod.enabledByDefault);
|
||||||
|
boolean loaded = enabledMods.contains(mod);
|
||||||
|
|
||||||
|
String text = (enabled? "&a" : "&c") + (loaded? "" : "&m") + mod.name;
|
||||||
|
String hover = (enabled? "&aEnabled" : "&cDisabled") + (loaded? "" : "\n&c&oThis mod is not loaded, report to staff!");
|
||||||
|
|
||||||
|
if (mod.type != ModType.STATELESS) {
|
||||||
|
Object state = DataManager.getOrDefault(uuid, "BlockPlaceMods", mod.name + "_state", null);
|
||||||
|
if (state != null)
|
||||||
|
hover += ("\n\n&7Value: &e" + state.toString() + "\n&7Type: &e" + mod.type.asString() + " \n&7Meaning: " + mod.typeDescription);
|
||||||
|
}
|
||||||
|
|
||||||
|
hover += "\n\n&7" + mod.description + "\n&e&oClick to " + (enabled? "&c&oDisable" : "&a&oEnable");
|
||||||
|
msg.appendSendChatHover(text, "/bpm " + mod.name, hover);
|
||||||
|
|
||||||
|
if (curMod != modsToRegister.length)
|
||||||
|
msg.appendText("&7, ");
|
||||||
|
curMod++;
|
||||||
|
}
|
||||||
|
msg.appendText("\n\n&2Hover over a mod for details.")
|
||||||
|
.send();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command (async = Command.AsyncType.ALWAYS, hook = "reset_mod")
|
||||||
|
public void resetMod(CommandSender sender, String mod) {
|
||||||
|
BlockPlaceMod bpm = mods.get(mod.toLowerCase());
|
||||||
|
|
||||||
|
if (bpm == null) {
|
||||||
|
getLogger().message(sender, true, "The mod, &e" + mod + "&7, does not exist!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Player player = (Player) sender;
|
||||||
|
DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", bpm.name);
|
||||||
|
DataManager.removeData(player.getUniqueId().toString(), "BlockPlaceMods", bpm.name + "_state");
|
||||||
|
|
||||||
|
getLogger().message(sender, "The &3" + bpm.name + "&7 mod has been reset back to it's original settings.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command (async = Command.AsyncType.ALWAYS, hook = "toggle_mod_no_prefix")
|
||||||
|
public void toggleModNoPrefix(CommandSender sender, String mod) {
|
||||||
|
if (mod.equals("help"))
|
||||||
|
try {
|
||||||
|
Bukkit.getScheduler().callSyncMethod(ModuleLoader.getPlugin(), () -> Bukkit.dispatchCommand(sender, "bpm help 1")).get();
|
||||||
|
} catch (Exception e) {
|
||||||
|
getLogger().message(sender, true, "&4An error accorded trying to show you the help! Please inform a staff member!");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
toggleMod(sender, mod);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command (async = Command.AsyncType.ALWAYS, hook = "toggle_mod")
|
||||||
|
public void toggleMod(CommandSender sender, String mod) {
|
||||||
|
BlockPlaceMod bpm = mods.get(mod.toLowerCase());
|
||||||
|
|
||||||
|
if (bpm == null) {
|
||||||
|
getLogger().message(sender, true, "The mod, &e" + mod + "&7, does not exist!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Player player = (Player) sender;
|
||||||
|
String uuid = player.getUniqueId().toString();
|
||||||
|
|
||||||
|
boolean current = (boolean) DataManager.getOrDefault(uuid, "BlockPlaceMods", bpm.name, bpm.enabledByDefault);
|
||||||
|
DataManager.setData(uuid, "BlockPlaceMods", bpm.name, !current);
|
||||||
|
|
||||||
|
getLogger().message(sender, "The &3" + bpm.name + "&7 mod has been " + (current ? "&cDisabled&7!" : "&aEnabled&7!"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command (async = Command.AsyncType.ALWAYS, hook = "set_mod_value")
|
||||||
|
public void setModValue(CommandSender sender, String mod, String value) {
|
||||||
|
BlockPlaceMod bpm = mods.get(mod.toLowerCase());
|
||||||
|
|
||||||
|
if (bpm == null) {
|
||||||
|
getLogger().message(sender, true, "The mod, &e" + mod + "&7, does not exist!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Player player = (Player) sender;
|
||||||
|
String uuid = player.getUniqueId().toString();
|
||||||
|
|
||||||
|
switch (bpm.type) {
|
||||||
|
case STATELESS:
|
||||||
|
getLogger().message(sender, true, "You cannot change the value of a stateless mod!");
|
||||||
|
break;
|
||||||
|
case STRING:
|
||||||
|
DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", value);
|
||||||
|
getLogger().message(sender, "Changed the value of &3" + bpm.name + "&7 to &e" + value);
|
||||||
|
break;
|
||||||
|
case INTEGER:
|
||||||
|
try {
|
||||||
|
DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", Integer.parseInt(value));
|
||||||
|
getLogger().message(sender, "Changed the value of &3" + bpm.name + "&7 to &e" + value);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
getLogger().message(sender, true, "The specified value must be an integer!");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case UNSIGNED_INTEGER:
|
||||||
|
try {
|
||||||
|
int val = Integer.parseInt(value);
|
||||||
|
|
||||||
|
if (val < 0) {
|
||||||
|
getLogger().message(sender, true, "The specified value must be zero or a positive integer!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", val);
|
||||||
|
getLogger().message(sender, "Changed the value of &3" + bpm.name + "&7 to &e" + value);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
getLogger().message(sender, true, "The specified value must be zero or a positive integer!");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case REDSTONE_LEVEL:
|
||||||
|
try {
|
||||||
|
int val = Integer.parseInt(value);
|
||||||
|
|
||||||
|
if (val < 1 || val > 15) {
|
||||||
|
getLogger().message(sender, true, "The specified value must be an integer between 1 and 15!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
DataManager.setData(uuid, "BlockPlaceMods", bpm.name + "_state", val);
|
||||||
|
getLogger().message(sender, "Changed the value of &3" + bpm.name + "&7 to &e" + value);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
getLogger().message(sender, true, "The specified value must be an integer between 1 and 15!");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package com.redstoner.modules.blockplacemods;
|
||||||
|
|
||||||
|
public enum ModType {
|
||||||
|
STATELESS("Stateless"),
|
||||||
|
INTEGER("Integer"),
|
||||||
|
UNSIGNED_INTEGER("Positive Integer"),
|
||||||
|
STRING("String"),
|
||||||
|
REDSTONE_LEVEL("Redstone Level");
|
||||||
|
|
||||||
|
private String asString;
|
||||||
|
|
||||||
|
private ModType(String asString) {
|
||||||
|
this.asString = asString;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String asString() {
|
||||||
|
return asString;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
package com.redstoner.modules.blockplacemods.mods;
|
||||||
|
|
||||||
|
import com.redstoner.modules.blockplacemods.BlockPlaceMod;
|
||||||
|
import com.redstoner.modules.blockplacemods.ModType;
|
||||||
|
import org.bukkit.GameMode;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.BlockFace;
|
||||||
|
import org.bukkit.block.data.Directional;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
|
|
||||||
|
public class ModBetterDirectional extends BlockPlaceMod {
|
||||||
|
private static final BlockFace[][][] dirMap = {
|
||||||
|
{
|
||||||
|
{ null, null, null },
|
||||||
|
{ null, BlockFace.WEST, null }, // (-1, 0, 0)
|
||||||
|
{ null, null, null }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ null, BlockFace.DOWN, null }, // (0, -1, 0)
|
||||||
|
{ BlockFace.NORTH, BlockFace.SELF, BlockFace.SOUTH }, // (0, 0, x)
|
||||||
|
{ null, BlockFace.UP, null } // (0, 1, 0)
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{ null, null, null },
|
||||||
|
{ null, BlockFace.EAST, null }, // (1, 0, 0)
|
||||||
|
{ null, null, null }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private final Material material;
|
||||||
|
|
||||||
|
public ModBetterDirectional(String name, Material material, String materialPlural, boolean enabledByDefault) {
|
||||||
|
super(
|
||||||
|
name,
|
||||||
|
"With this mod enabled " + materialPlural + " are placed with the bottom on the block clicked.",
|
||||||
|
ModType.STATELESS,
|
||||||
|
null,
|
||||||
|
enabledByDefault,
|
||||||
|
"BetterDirectional" + material.name().toLowerCase()
|
||||||
|
);
|
||||||
|
|
||||||
|
this.material = material;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
|
public void onBlockPlace(BlockPlaceEvent event) {
|
||||||
|
if (
|
||||||
|
event.getBlock().getType() == material
|
||||||
|
&& !event.getPlayer().isSneaking()
|
||||||
|
&& hasEnabled(event.getPlayer())
|
||||||
|
&& event.getPlayer().getGameMode() == GameMode.CREATIVE
|
||||||
|
) {
|
||||||
|
Block block = event.getBlock();
|
||||||
|
Directional data = (Directional) block.getBlockData();
|
||||||
|
|
||||||
|
data.setFacing(getDirection(event));
|
||||||
|
block.setBlockData(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private BlockFace getDirection(BlockPlaceEvent event) {
|
||||||
|
Location original = event.getBlockPlaced().getLocation();
|
||||||
|
Location against = event.getBlockAgainst().getLocation();
|
||||||
|
|
||||||
|
Location dir = original.subtract(against);
|
||||||
|
|
||||||
|
return dirMap[dir.getBlockX() + 1][dir.getBlockY() + 1][dir.getBlockZ() + 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
package com.redstoner.modules.blockplacemods.mods;
|
||||||
|
|
||||||
|
import com.redstoner.modules.blockplacemods.BlockPlaceMod;
|
||||||
|
import com.redstoner.modules.blockplacemods.ModType;
|
||||||
|
import org.bukkit.GameMode;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.data.Levelled;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.block.Action;
|
||||||
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
|
|
||||||
|
public class ModCauldron extends BlockPlaceMod {
|
||||||
|
public ModCauldron() {
|
||||||
|
super(
|
||||||
|
"Cauldron",
|
||||||
|
"With this mod enabled cauldrons are placed filled and cycle on a shiftless right click with an empty hand.",
|
||||||
|
ModType.STATELESS,
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
"CauldronFill", "AutoCauldron"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||||
|
if (
|
||||||
|
event.getAction() == Action.RIGHT_CLICK_BLOCK
|
||||||
|
&& !event.isCancelled()
|
||||||
|
&& !event.getPlayer().isSneaking()
|
||||||
|
&& event.getClickedBlock().getType() == Material.CAULDRON
|
||||||
|
&& hasEnabled(event.getPlayer())
|
||||||
|
&& event.getPlayer().getGameMode() == GameMode.CREATIVE
|
||||||
|
&& event.getPlayer().getInventory().getItemInMainHand().getType() == Material.AIR
|
||||||
|
) {
|
||||||
|
Block block = event.getClickedBlock();
|
||||||
|
Levelled data = (Levelled) block.getBlockData();
|
||||||
|
|
||||||
|
int newLevel = (data.getLevel() + 1) % (data.getMaximumLevel() + 1);
|
||||||
|
|
||||||
|
data.setLevel(newLevel);
|
||||||
|
block.setBlockData(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
|
public void onBlockPlace(BlockPlaceEvent event) {
|
||||||
|
if (
|
||||||
|
event.getBlock().getType() == Material.CAULDRON
|
||||||
|
&& !event.getPlayer().isSneaking()
|
||||||
|
&& hasEnabled(event.getPlayer())
|
||||||
|
&& event.getPlayer().getGameMode() == GameMode.CREATIVE
|
||||||
|
) {
|
||||||
|
Block block = event.getBlock();
|
||||||
|
Levelled data = (Levelled) block.getBlockData();
|
||||||
|
|
||||||
|
data.setLevel(data.getMaximumLevel());
|
||||||
|
block.setBlockData(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package com.redstoner.modules.blockplacemods.mods;
|
||||||
|
|
||||||
|
import com.redstoner.modules.blockplacemods.BlockPlaceMod;
|
||||||
|
import com.redstoner.modules.blockplacemods.ModType;
|
||||||
|
import org.bukkit.GameMode;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.block.data.type.Slab;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
|
|
||||||
|
public class ModSlab extends BlockPlaceMod {
|
||||||
|
public ModSlab() {
|
||||||
|
super(
|
||||||
|
"Slab",
|
||||||
|
"With this mod enabled Slabs are placed on the top half of the block unless you are sneaking.",
|
||||||
|
ModType.STATELESS,
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
"Step", "AutoSlab", "AutoStep", "SlabRotation", "StepRotation"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
|
public void onBlockPlace(BlockPlaceEvent event) {
|
||||||
|
if (
|
||||||
|
event.getBlock().getBlockData() instanceof Slab
|
||||||
|
&& !event.getPlayer().isSneaking()
|
||||||
|
&& hasEnabled(event.getPlayer())
|
||||||
|
&& event.getPlayer().getGameMode() == GameMode.CREATIVE
|
||||||
|
) {
|
||||||
|
Block block = event.getBlock();
|
||||||
|
Slab data = (Slab) block.getBlockData();
|
||||||
|
|
||||||
|
data.setType(Slab.Type.TOP);
|
||||||
|
block.setBlockData(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
package com.redstoner.modules.blockplacemods.mods;
|
||||||
|
|
||||||
|
import com.redstoner.misc.Main;
|
||||||
|
import com.redstoner.modules.blockplacemods.BlockPlaceMod;
|
||||||
|
import com.redstoner.modules.blockplacemods.ModType;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.GameMode;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.block.BlockPlaceEvent;
|
||||||
|
import org.bukkit.material.RedstoneTorch;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class ModTorch extends BlockPlaceMod {
|
||||||
|
private static final Map<Block, Block> monitorBlocks = new HashMap<>();
|
||||||
|
|
||||||
|
private int monitorId = -1;
|
||||||
|
|
||||||
|
public ModTorch() {
|
||||||
|
super(
|
||||||
|
"Torch",
|
||||||
|
"With this mod enabled redstone torches placed on redstone blocks get auto removed after they turn off.",
|
||||||
|
ModType.STATELESS,
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
"AutoTorch", "TorchRemoval", "RedstoneTorch"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onEnable() {
|
||||||
|
monitorId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.plugin, () -> {
|
||||||
|
for (Block block : monitorBlocks.keySet()) {
|
||||||
|
Block against = monitorBlocks.get(block);
|
||||||
|
|
||||||
|
if (block.getType() != Material.REDSTONE_TORCH || against.getType() != Material.REDSTONE_BLOCK) {
|
||||||
|
monitorBlocks.remove(block);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
RedstoneTorch data = (RedstoneTorch) block.getBlockData();
|
||||||
|
|
||||||
|
if (!data.isPowered()) {
|
||||||
|
block.setType(Material.AIR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 2, 2);
|
||||||
|
|
||||||
|
return monitorId != -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable() {
|
||||||
|
Bukkit.getScheduler().cancelTask(monitorId);
|
||||||
|
monitorId = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
|
public void onBlockPlace(BlockPlaceEvent event) {
|
||||||
|
if (
|
||||||
|
event.getBlock().getType() == Material.REDSTONE_TORCH
|
||||||
|
&& !event.getPlayer().isSneaking()
|
||||||
|
&& hasEnabled(event.getPlayer())
|
||||||
|
&& event.getPlayer().getGameMode() == GameMode.CREATIVE
|
||||||
|
) {
|
||||||
|
Block block = event.getBlock();
|
||||||
|
Block against = event.getBlockAgainst();
|
||||||
|
|
||||||
|
if (against.getType() == Material.REDSTONE_BLOCK) {
|
||||||
|
monitorBlocks.put(block, against);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: BlockPlaceMods
|
||||||
|
category: Other
|
||||||
|
description: Adds features to block placing.
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
command me {
|
command me {
|
||||||
perm utils.me;
|
perm utils.chat.me;
|
||||||
[string:text...] {
|
[string:text...] {
|
||||||
help /me's in chat.;
|
help /me's in chat.;
|
||||||
run me text;
|
run me text;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
command action {
|
command action {
|
||||||
perm utils.action;
|
perm utils.chat.action;
|
||||||
[string:text...] {
|
[string:text...] {
|
||||||
help /action's in chat.;
|
help /action's in chat.;
|
||||||
run action text;
|
run action text;
|
||||||
@@ -14,34 +14,41 @@ command action {
|
|||||||
}
|
}
|
||||||
command chat {
|
command chat {
|
||||||
alias speak;
|
alias speak;
|
||||||
[string:message...] {
|
|
||||||
perm utils.chat;
|
perm utils.chat;
|
||||||
|
[string:message...] {
|
||||||
run chat message;
|
run chat message;
|
||||||
help A way to speak in normal chat with normal formatting if you have ACT or CGT on.;
|
help A way to speak in normal chat with normal formatting if you have ACT or CGT on.;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
command chatn {
|
||||||
|
alias speakn;
|
||||||
|
perm utils.chat.chatn;
|
||||||
|
[string:name] [string:message...] {
|
||||||
|
run chatn name message;
|
||||||
|
help A way to speak in normal chat with normal formatting for console users.;
|
||||||
|
}
|
||||||
|
}
|
||||||
command shrug {
|
command shrug {
|
||||||
|
perm utils.chat.shrug;
|
||||||
[string:message...] {
|
[string:message...] {
|
||||||
perm utils.shrug;
|
|
||||||
run shrug message;
|
run shrug message;
|
||||||
help Appends the shrug emoticon to the end of your message.;
|
help Appends the shrug emoticon to the end of your message.;
|
||||||
}
|
}
|
||||||
[empty] {
|
[empty] {
|
||||||
perm utils.shrug;
|
|
||||||
run shrugnoarg;
|
run shrugnoarg;
|
||||||
help Just the shrug emoticon.;
|
help Just the shrug emoticon.;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
command say {
|
command say {
|
||||||
|
perm utils.chat.say;
|
||||||
[string:message...] {
|
[string:message...] {
|
||||||
perm utils.say;
|
|
||||||
run say message;
|
run say message;
|
||||||
help A replacement for the default say command to make the format be more consistant.;
|
help A replacement for the default say command to make the format be more consistant.;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
command sayn {
|
command sayn {
|
||||||
|
perm utils.chat.sayn;
|
||||||
[string:name] [string:message...] {
|
[string:name] [string:message...] {
|
||||||
perm utils.sayn;
|
|
||||||
type console;
|
type console;
|
||||||
run sayn name message;
|
run sayn name message;
|
||||||
help A replacement for the default say command to make the format be more consistant.;
|
help A replacement for the default say command to make the format be more consistant.;
|
||||||
@@ -49,25 +56,35 @@ command sayn {
|
|||||||
}
|
}
|
||||||
|
|
||||||
command mute {
|
command mute {
|
||||||
|
perm utils.chat.mute;
|
||||||
[string:player] {
|
[string:player] {
|
||||||
perm utils.chat.admin;
|
|
||||||
run mute player;
|
run mute player;
|
||||||
help Mutes a player.;
|
help Mutes a player.;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
command print {
|
command print {
|
||||||
|
perm utils.chat.print;
|
||||||
[string:message...] {
|
[string:message...] {
|
||||||
perm utils.print;
|
|
||||||
run print message;
|
run print message;
|
||||||
help A way to just print something in to chat with all the formatting things a user has.;
|
help A way to just print something in to chat with all the formatting things a user has.;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
command unmute {
|
command unmute {
|
||||||
|
perm utils.chat.mute;
|
||||||
[string:player] {
|
[string:player] {
|
||||||
perm utils.chat.admin;
|
|
||||||
run unmute player;
|
run unmute player;
|
||||||
help Unmutes a player.;
|
help Unmutes a player.;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
command chatonly {
|
||||||
|
alias co;
|
||||||
|
perm utilschat.chatonly;
|
||||||
|
[empty] {
|
||||||
|
run chatonly;
|
||||||
|
help Shows that you're onlu able to chat, nothing else.;
|
||||||
|
type player;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
package com.redstoner.modules.chat;
|
package com.redstoner.modules.chat;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
@@ -11,6 +14,7 @@ import org.bukkit.event.EventHandler;
|
|||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
|
||||||
import com.nemez.cmdmgr.Command;
|
import com.nemez.cmdmgr.Command;
|
||||||
import com.redstoner.annotations.AutoRegisterListener;
|
import com.redstoner.annotations.AutoRegisterListener;
|
||||||
@@ -25,182 +29,209 @@ import com.redstoner.modules.datamanager.DataManager;
|
|||||||
import com.redstoner.modules.ignore.Ignore;
|
import com.redstoner.modules.ignore.Ignore;
|
||||||
|
|
||||||
import net.nemez.chatapi.ChatAPI;
|
import net.nemez.chatapi.ChatAPI;
|
||||||
|
import net.nemez.chatapi.click.Message;
|
||||||
|
|
||||||
@Commands(CommandHolderType.File)
|
@Commands(CommandHolderType.File)
|
||||||
@AutoRegisterListener
|
@AutoRegisterListener
|
||||||
@Version(major = 4, minor = 1, revision = 0, compatible = 4)
|
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
public class Chat implements Module, Listener
|
public class Chat implements Module, Listener {
|
||||||
{
|
|
||||||
private final Map<String, String> defaults = new HashMap<>();
|
private final Map<String, String> defaults = new HashMap<>();
|
||||||
|
private Set<UUID> chatonly = new HashSet<>();
|
||||||
|
|
||||||
public Chat()
|
public Chat() {
|
||||||
{
|
defaults.put("chat", " %n %c§7→§r %m");
|
||||||
defaults.put("chat", " %n §7→§r %m");
|
defaults.put("me", " §7- %n %c§7⇦ %m");
|
||||||
defaults.put("me", " §7- %n §7⇦ %m");
|
defaults.put("action", " §7- %n %c§7⇦ %m");
|
||||||
defaults.put("action", " §7- %n §7⇦ %m");
|
defaults.put("say", " §7[§9%n§7]%c§7:§r %m");
|
||||||
defaults.put("say", " §7[§9%n§7]:§r %m");
|
defaults.put("shrug", " %n %c§7→§r %m ¯\\_(ツ)_/¯");
|
||||||
defaults.put("shrug", " %n §7→§r %m ¯\\_(ツ)_/¯");
|
|
||||||
defaults.put("print", "%m");
|
defaults.put("print", "%m");
|
||||||
|
defaults.put("%c", "§c*");
|
||||||
|
defaults.put("%c-hover", "§cChat Only");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void firstLoad()
|
public void firstLoad() {
|
||||||
{
|
|
||||||
Module.super.firstLoad();
|
|
||||||
DataManager.setConfig("chat", defaults.get("chat"));
|
DataManager.setConfig("chat", defaults.get("chat"));
|
||||||
DataManager.setConfig("me", defaults.get("me"));
|
DataManager.setConfig("me", defaults.get("me"));
|
||||||
DataManager.setConfig("action", defaults.get("action"));
|
DataManager.setConfig("action", defaults.get("action"));
|
||||||
DataManager.setConfig("say", defaults.get("say"));
|
DataManager.setConfig("say", defaults.get("say"));
|
||||||
DataManager.setConfig("shrug", defaults.get("shrug"));
|
DataManager.setConfig("shrug", defaults.get("shrug"));
|
||||||
DataManager.setConfig("print", defaults.get("print"));
|
DataManager.setConfig("print", defaults.get("print"));
|
||||||
|
DataManager.setConfig("%c", defaults.get("%c"));
|
||||||
|
DataManager.setConfig("%c-hover", defaults.get("%c-hover"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||||
public void onPlayerChat(AsyncPlayerChatEvent event)
|
public void onPlayerChat(AsyncPlayerChatEvent event) {
|
||||||
{
|
|
||||||
if (event.isCancelled())
|
|
||||||
return;
|
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
String message = event.getMessage();
|
String message = event.getMessage();
|
||||||
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
broadcastFormatted("chat", player, message, event);
|
broadcastFormatted("chat", player, message, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onLeave(PlayerQuitEvent event) {
|
||||||
|
chatonly.remove(event.getPlayer().getUniqueId());
|
||||||
|
}
|
||||||
|
|
||||||
@Command(hook = "me")
|
@Command(hook = "me")
|
||||||
public boolean me(CommandSender sender, String message)
|
public boolean me(CommandSender sender, String message) {
|
||||||
{
|
|
||||||
broadcastFormatted("me", sender, message);
|
broadcastFormatted("me", sender, message);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "chat")
|
@Command(hook = "chat")
|
||||||
public boolean chat(CommandSender sender, String message)
|
public boolean chat(CommandSender sender, String message) {
|
||||||
{
|
|
||||||
broadcastFormatted("chat", sender, message);
|
broadcastFormatted("chat", sender, message);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Command(hook = "chatn")
|
||||||
|
public boolean chatn(CommandSender sender, String name, String message) {
|
||||||
|
broadcastFormatted("chat", sender, message, name);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Command(hook = "action")
|
@Command(hook = "action")
|
||||||
public boolean action(CommandSender sender, String message)
|
public boolean action(CommandSender sender, String message) {
|
||||||
{
|
|
||||||
broadcastFormatted("action", sender, message);
|
broadcastFormatted("action", sender, message);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "say")
|
@Command(hook = "say")
|
||||||
public boolean say(CommandSender sender, String message)
|
public boolean say(CommandSender sender, String message) {
|
||||||
{
|
|
||||||
String name;
|
String name;
|
||||||
if (sender instanceof Player)
|
|
||||||
name = ((Player) sender).getName();
|
if (sender instanceof Player) name = ((Player) sender).getName();
|
||||||
else
|
else name = "§9CONSOLE";
|
||||||
name = "§9CONSOLE";
|
|
||||||
broadcastFormatted("say", sender, message, name);
|
broadcastFormatted("say", sender, message, name);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "sayn")
|
@Command(hook = "sayn")
|
||||||
public boolean say(CommandSender sender, String name, String message)
|
public boolean say(CommandSender sender, String name, String message) {
|
||||||
{
|
|
||||||
broadcastFormatted("say", sender, message, name);
|
broadcastFormatted("say", sender, message, name);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "shrug")
|
@Command(hook = "shrug")
|
||||||
public boolean shrug(CommandSender sender, String message)
|
public boolean shrug(CommandSender sender, String message) {
|
||||||
{
|
|
||||||
broadcastFormatted("shrug", sender, message);
|
broadcastFormatted("shrug", sender, message);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "shrugnoarg")
|
@Command(hook = "shrugnoarg")
|
||||||
public boolean shrug(CommandSender sender)
|
public boolean shrug(CommandSender sender) {
|
||||||
{
|
|
||||||
broadcastFormatted("shrug", sender, "");
|
broadcastFormatted("shrug", sender, "");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "print")
|
@Command(hook = "print")
|
||||||
public boolean print(CommandSender sender, String message)
|
public boolean print(CommandSender sender, String message) {
|
||||||
{
|
|
||||||
broadcastFormatted("print", sender, message);
|
broadcastFormatted("print", sender, message);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "mute")
|
@Command(hook = "mute")
|
||||||
public boolean mute(CommandSender sender, String player)
|
public boolean mute(CommandSender sender, String player) {
|
||||||
{
|
|
||||||
Player p = Bukkit.getPlayer(player);
|
Player p = Bukkit.getPlayer(player);
|
||||||
if (p == null)
|
|
||||||
{
|
if (p == null) {
|
||||||
getLogger().message(sender, true, "That player couldn't be found!");
|
getLogger().message(sender, true, "That player couldn't be found!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
DataManager.setData(p, "muted", true);
|
DataManager.setData(p, "muted", true);
|
||||||
|
|
||||||
getLogger().message(sender, "Muted player &e" + Utils.getName(p) + "&7!");
|
getLogger().message(sender, "Muted player &e" + Utils.getName(p) + "&7!");
|
||||||
getLogger().message(p, "You have been &cmuted&7!");
|
getLogger().message(p, "You have been &cmuted&7!");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "unmute")
|
@Command(hook = "unmute")
|
||||||
public boolean unmute(CommandSender sender, String player)
|
public boolean unmute(CommandSender sender, String player) {
|
||||||
{
|
|
||||||
Player p = Bukkit.getPlayer(player);
|
Player p = Bukkit.getPlayer(player);
|
||||||
if (p == null)
|
|
||||||
{
|
if (p == null) {
|
||||||
getLogger().message(sender, true, "That player couldn't be found!");
|
getLogger().message(sender, true, "That player couldn't be found!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
DataManager.setData(p, "muted", false);
|
DataManager.setData(p, "muted", false);
|
||||||
|
|
||||||
getLogger().message(sender, "Unmuted player &e" + Utils.getName(p) + "&7!");
|
getLogger().message(sender, "Unmuted player &e" + Utils.getName(p) + "&7!");
|
||||||
getLogger().message(p, "You have been &aunmuted&7!");
|
getLogger().message(p, "You have been &aunmuted&7!");
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean broadcastFormatted(String format, CommandSender sender, String message)
|
@Command(hook = "chatonly")
|
||||||
{
|
public void chatonly(CommandSender sender) {
|
||||||
|
UUID uuid = ((Player) sender).getUniqueId();
|
||||||
|
|
||||||
|
if (chatonly.contains(uuid)) {
|
||||||
|
chatonly.remove(uuid);
|
||||||
|
getLogger().message(sender, "You are no longer tagged with being only able to chat.");
|
||||||
|
} else {
|
||||||
|
chatonly.add(uuid);
|
||||||
|
getLogger().message(sender, "You are now tagged with being only able to chat.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean broadcastFormatted(String format, CommandSender sender, String message) {
|
||||||
return broadcastFormatted(format, sender, message, Utils.getName(sender), null);
|
return broadcastFormatted(format, sender, message, Utils.getName(sender), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean broadcastFormatted(String format, CommandSender sender, String message, String name)
|
public boolean broadcastFormatted(String format, CommandSender sender, String message, String name) {
|
||||||
{
|
|
||||||
return broadcastFormatted(format, sender, message, name, null);
|
return broadcastFormatted(format, sender, message, name, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean broadcastFormatted(String format, CommandSender sender, String message, AsyncPlayerChatEvent event)
|
public boolean broadcastFormatted(String format, CommandSender sender, String message, AsyncPlayerChatEvent event) {
|
||||||
{
|
|
||||||
return broadcastFormatted(format, sender, message, Utils.getName(sender), event);
|
return broadcastFormatted(format, sender, message, Utils.getName(sender), event);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean broadcastFormatted(String format, CommandSender sender, String message, String name,
|
public boolean broadcastFormatted(String format, CommandSender sender, String message, String name, AsyncPlayerChatEvent event) {
|
||||||
AsyncPlayerChatEvent event)
|
boolean isChatOnly = sender instanceof Player && chatonly.contains(((Player) sender).getUniqueId());
|
||||||
{
|
|
||||||
if ((boolean) DataManager.getOrDefault(sender, "muted", false))
|
if ((boolean) DataManager.getOrDefault(sender, "muted", false)) {
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "You have been muted!");
|
getLogger().message(sender, true, "You have been muted!");
|
||||||
getLogger().info(" &7User &e" + Utils.getName(sender) + " &7tried to &e" + format + " &7(&e" + message
|
getLogger().info(" &7User &e" + Utils.getName(sender) + " &7tried to &e" + format + " &7(&e" + message + "&7) while being &cmuted&7.");
|
||||||
+ "&7) while being &cmuted&7.");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
String raw = (String) DataManager.getConfigOrDefault(format, defaults.get(format));
|
String raw = (String) DataManager.getConfigOrDefault(format, defaults.get(format));
|
||||||
String formatted = raw.replace("%n", name).replace("%m", message);
|
String formatted = raw.replace("%n", name).replace("%m", message);
|
||||||
Utils.broadcast("", ChatAPI.colorify(sender, formatted),
|
BroadcastFilter filter = wrap(ModuleLoader.exists("Ignore") ? Ignore.getIgnoredBy(sender) : null, event);
|
||||||
wrap(ModuleLoader.exists("Ignore") ? Ignore.getIgnoredBy(sender) : null, event));
|
|
||||||
|
if (isChatOnly) {
|
||||||
|
|
||||||
|
String part1 = formatted.substring(0, formatted.indexOf("%c"));
|
||||||
|
String part2 = formatted.substring(formatted.indexOf("%c") + 2);
|
||||||
|
String indicatior = (String) DataManager.getConfigOrDefault("%c", defaults.get("%c"));
|
||||||
|
String indicatiorHover = (String) DataManager.getConfigOrDefault("%c-hover", defaults.get("%c-hover"));
|
||||||
|
|
||||||
|
Message msg = ChatAPI.createMessage(null)
|
||||||
|
.appendText(part1)
|
||||||
|
.appendTextHover(indicatior, indicatiorHover)
|
||||||
|
.appendText(part2);
|
||||||
|
Utils.broadcast("", msg, filter);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BroadcastFilter wrap(BroadcastFilter filter, AsyncPlayerChatEvent event)
|
Utils.broadcast("", ChatAPI.colorify(sender, formatted.replace("%c", "")), filter);
|
||||||
{
|
|
||||||
if (event == null)
|
|
||||||
return filter;
|
|
||||||
else
|
|
||||||
return new BroadcastFilter()
|
|
||||||
{
|
|
||||||
@Override
|
|
||||||
public boolean sendTo(CommandSender recipient)
|
|
||||||
{
|
|
||||||
if (recipient instanceof ConsoleCommandSender)
|
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BroadcastFilter wrap(BroadcastFilter filter, AsyncPlayerChatEvent event) {
|
||||||
|
if (event == null) return filter;
|
||||||
|
else return new BroadcastFilter() {
|
||||||
|
@Override
|
||||||
|
public boolean sendTo(CommandSender recipient) {
|
||||||
|
if (recipient instanceof ConsoleCommandSender || filter == null) return true;
|
||||||
return filter.sendTo(recipient) && event.getRecipients().contains(recipient);
|
return filter.sendTo(recipient) && event.getRecipients().contains(recipient);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
3
src/main/java/com/redstoner/modules/chat/module.info
Normal file
3
src/main/java/com/redstoner/modules/chat/module.info
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: Chat
|
||||||
|
category: Chat
|
||||||
|
description: Stylizes chat and adds a bunch of chat commands, including &e/me&7 and &e/shrug
|
||||||
16
src/main/java/com/redstoner/modules/chatalias/Chatalias.cmd
Normal file
16
src/main/java/com/redstoner/modules/chatalias/Chatalias.cmd
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
command alias {
|
||||||
|
add [flag:-r] [flag:-rnd] [string:keyword] [string:replacement...] {
|
||||||
|
help Adds a new alias. Set -r to make it a regex-alias. \nSet -rnd to make it a random alias and use `&e || &b` (with the spaces) to separate the results.;
|
||||||
|
run addalias -r -rnd keyword replacement;
|
||||||
|
}
|
||||||
|
del [flag:-r] [flag:-rnd] [string:keyword] {
|
||||||
|
help Deletes an alias. -r indicates if it was a regex-alias and -rnd indicates if it was a random-alias. ;
|
||||||
|
run delalias -r -rnd keyword;
|
||||||
|
}
|
||||||
|
list {
|
||||||
|
help Lists your aliases.;
|
||||||
|
run listaliases;
|
||||||
|
}
|
||||||
|
perm utils.alias;
|
||||||
|
type player;
|
||||||
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package com.redstoner.modules.chatalias;
|
package com.redstoner.modules.chatalias;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
@@ -32,274 +32,291 @@ import net.nemez.chatapi.ChatAPI;
|
|||||||
|
|
||||||
@Commands(CommandHolderType.File)
|
@Commands(CommandHolderType.File)
|
||||||
@AutoRegisterListener
|
@AutoRegisterListener
|
||||||
@Version(major = 4, minor = 1, revision = 0, compatible = 4)
|
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
public class Chatalias implements Module, Listener
|
public class Chatalias implements Module, Listener {
|
||||||
{
|
private final String[] commands = new String[] { "e?r", "e?m .+?", "e?t", "e?w", "e?msg .+?", "e?message .+?", "e?whisper .+?", "e?me", "cgsay", "ac", "bc",
|
||||||
private final String[] commands = new String[] {"e?r", "e?m .+?", "e?t", "e?w", "e?msg .+?", "e?message .+?",
|
"say", "sayn .+?", "chat", "shrug", "action", "speak", "chatn", "speakn" };
|
||||||
"e?whisper .+?", "e?me", "cgsay", "ac", "bc", "say", "sayn .+?", "chat", "shrug", "action"};
|
|
||||||
private JSONObject aliases = new JSONObject();
|
private JSONObject aliases = new JSONObject();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onEnable()
|
public boolean onEnable() {
|
||||||
{
|
for (Player p : Bukkit.getOnlinePlayers()) {
|
||||||
for (Player p : Bukkit.getOnlinePlayers())
|
|
||||||
{
|
|
||||||
loadAliases(p.getUniqueId());
|
loadAliases(p.getUniqueId());
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisable()
|
public void onDisable() {
|
||||||
{
|
for (Object key : aliases.keySet()) {
|
||||||
for (Object key : aliases.keySet())
|
|
||||||
{
|
|
||||||
UUID uuid = UUID.fromString((String) key);
|
UUID uuid = UUID.fromString((String) key);
|
||||||
saveAliases(uuid);
|
saveAliases(uuid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerJoin(PlayerJoinEvent event)
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||||
{
|
|
||||||
loadAliases(event.getPlayer().getUniqueId());
|
loadAliases(event.getPlayer().getUniqueId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onPlayerLeave(PlayerQuitEvent event)
|
public void onPlayerLeave(PlayerQuitEvent event) {
|
||||||
{
|
|
||||||
aliases.remove(event.getPlayer().getUniqueId().toString());
|
aliases.remove(event.getPlayer().getUniqueId().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@EventHandler(priority = EventPriority.LOWEST)
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
public void onPlayerChat(AsyncPlayerChatEvent event)
|
public void onPlayerChat(AsyncPlayerChatEvent event) {
|
||||||
{
|
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
UUID uuid = player.getUniqueId();
|
UUID uuid = player.getUniqueId();
|
||||||
if (!aliases.containsKey(uuid.toString()))
|
|
||||||
{
|
if (!aliases.containsKey(uuid.toString())) {
|
||||||
loadAliases(player.getUniqueId());
|
loadAliases(player.getUniqueId());
|
||||||
if (!aliases.containsKey(uuid.toString()))
|
|
||||||
return;
|
if (!aliases.containsKey(uuid.toString())) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONObject playerAliases = (JSONObject) aliases.get(uuid.toString());
|
JSONObject playerAliases = (JSONObject) aliases.get(uuid.toString());
|
||||||
boolean changed = false;
|
boolean changed = false;
|
||||||
for (Object key : playerAliases.keySet())
|
|
||||||
{
|
for (Object key : playerAliases.keySet()) {
|
||||||
String keyword = (String) key;
|
String keyword = (String) key;
|
||||||
String replacement = (String) playerAliases.get(key);
|
String replacement = (String) playerAliases.get(key);
|
||||||
if (keyword.startsWith("R: "))
|
|
||||||
{
|
if (keyword.startsWith("RND;")) {
|
||||||
|
keyword = keyword.replace("RND;", "");
|
||||||
|
String[] results = replacement.split(" \\|\\| ");
|
||||||
|
|
||||||
|
for (String str : results) {
|
||||||
|
System.out.println(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
int rand = ThreadLocalRandom.current().nextInt(0, results.length);
|
||||||
|
|
||||||
|
replacement = results[rand];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keyword.startsWith("R: ")) {
|
||||||
keyword = keyword.replace("R: ", "");
|
keyword = keyword.replace("R: ", "");
|
||||||
event.setMessage(event.getMessage().replaceAll(keyword, replacement));
|
event.setMessage(event.getMessage().replaceAll(keyword, replacement));
|
||||||
}
|
} else {
|
||||||
else
|
if (keyword.startsWith("N: ")) keyword = keyword.replace("N: ", "");
|
||||||
{
|
else {
|
||||||
if (keyword.startsWith("N: "))
|
|
||||||
keyword = keyword.replace("N: ", "");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
changed = true;
|
changed = true;
|
||||||
playerAliases.put("N: " + key, replacement);
|
playerAliases.put("N: " + key, replacement);
|
||||||
}
|
}
|
||||||
|
|
||||||
event.setMessage(event.getMessage().replace(keyword, replacement));
|
event.setMessage(event.getMessage().replace(keyword, replacement));
|
||||||
}
|
}
|
||||||
|
|
||||||
int maxLength;
|
int maxLength;
|
||||||
try
|
|
||||||
{
|
try {
|
||||||
maxLength = Integer.valueOf(getPermissionContent(player, "utils.alias.length."));
|
maxLength = Integer.valueOf(getPermissionContent(player, "utils.alias.length."));
|
||||||
}
|
} catch (NumberFormatException e) {
|
||||||
catch (NumberFormatException e)
|
|
||||||
{
|
|
||||||
maxLength = 255;
|
maxLength = 255;
|
||||||
}
|
}
|
||||||
if (event.getMessage().length() > maxLength)
|
|
||||||
{
|
if (event.getMessage().length() > maxLength) {
|
||||||
getLogger().message(player, true, "The generated message is too long!");
|
getLogger().message(player, true, "The generated message is too long!");
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
event.setMessage(ChatAPI.colorify(event.getPlayer(), event.getMessage()));
|
event.setMessage(ChatAPI.colorify(event.getPlayer(), event.getMessage()));
|
||||||
if (changed)
|
|
||||||
saveAliases(uuid);
|
if (changed) saveAliases(uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.LOWEST)
|
@EventHandler(priority = EventPriority.LOWEST)
|
||||||
public void onPlayerCommand(PlayerCommandPreprocessEvent event)
|
public void onPlayerCommand(PlayerCommandPreprocessEvent event) {
|
||||||
{
|
if (event.isCancelled()) return;
|
||||||
if (event.isCancelled())
|
|
||||||
return;
|
|
||||||
boolean listening = false;
|
boolean listening = false;
|
||||||
String command = "";
|
String command = "";
|
||||||
for (String s : commands)
|
|
||||||
{
|
for (String s : commands) {
|
||||||
command = "^\\/(.*:)?" + s + " ";
|
command = "^\\/(.*:)?" + s + " ";
|
||||||
if (event.getMessage().matches(command + ".*"))
|
|
||||||
{
|
if (event.getMessage().matches(command + ".*")) {
|
||||||
listening = true;
|
listening = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!listening)
|
|
||||||
return;
|
if (!listening) return;
|
||||||
|
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
UUID uuid = player.getUniqueId();
|
UUID uuid = player.getUniqueId();
|
||||||
JSONObject playerAliases = (JSONObject) aliases.get(uuid.toString());
|
JSONObject playerAliases = (JSONObject) aliases.get(uuid.toString());
|
||||||
String temp = event.getMessage().replaceAll(command, "");
|
String temp = event.getMessage().replaceAll(command, "");
|
||||||
|
|
||||||
command = event.getMessage().replaceAll(Pattern.quote(temp) + "$", "");
|
command = event.getMessage().replaceAll(Pattern.quote(temp) + "$", "");
|
||||||
event.setMessage(event.getMessage().replaceFirst(Pattern.quote(command), ""));
|
event.setMessage(event.getMessage().replaceFirst(Pattern.quote(command), ""));
|
||||||
for (Object key : playerAliases.keySet())
|
|
||||||
{
|
for (Object key : playerAliases.keySet()) {
|
||||||
String keyword = (String) key;
|
String keyword = (String) key;
|
||||||
String replacement = (String) playerAliases.get(key);
|
String replacement = (String) playerAliases.get(key);
|
||||||
if (keyword.startsWith("R: "))
|
|
||||||
{
|
if (keyword.startsWith("RND;")) {
|
||||||
|
keyword = keyword.replace("RND;", "");
|
||||||
|
String[] results = replacement.split(" \\|\\| ");
|
||||||
|
|
||||||
|
int rand = ThreadLocalRandom.current().nextInt(0, results.length);
|
||||||
|
|
||||||
|
replacement = results[rand];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keyword.startsWith("R: ")) {
|
||||||
keyword = keyword.replace("R: ", "");
|
keyword = keyword.replace("R: ", "");
|
||||||
event.setMessage(event.getMessage().replaceAll(keyword, replacement));
|
event.setMessage(event.getMessage().replaceAll(keyword, replacement));
|
||||||
}
|
} else {
|
||||||
else
|
if (keyword.startsWith("N: ")) keyword = keyword.replace("N: ", "");
|
||||||
{
|
|
||||||
if (keyword.startsWith("N: "))
|
|
||||||
keyword = keyword.replace("N: ", "");
|
|
||||||
event.setMessage(event.getMessage().replace(keyword, replacement));
|
event.setMessage(event.getMessage().replace(keyword, replacement));
|
||||||
}
|
}
|
||||||
|
|
||||||
int maxLength;
|
int maxLength;
|
||||||
try
|
|
||||||
{
|
try {
|
||||||
maxLength = Integer.valueOf(getPermissionContent(player, "utils.alias.length."));
|
maxLength = Integer.valueOf(getPermissionContent(player, "utils.alias.length."));
|
||||||
}
|
} catch (NumberFormatException e) {
|
||||||
catch (NumberFormatException e)
|
|
||||||
{
|
|
||||||
maxLength = 255;
|
maxLength = 255;
|
||||||
}
|
}
|
||||||
if (event.getMessage().length() > maxLength)
|
|
||||||
{
|
if (event.getMessage().length() > maxLength) {
|
||||||
getLogger().message(player, true, "The generated message is too long!");
|
getLogger().message(player, true, "The generated message is too long!");
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
event.setMessage(command + event.getMessage());
|
event.setMessage(command + event.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Command(hook = "addalias")
|
@Command(hook = "addalias")
|
||||||
public boolean addAlias(CommandSender sender, boolean regex, String keyword, String replacement)
|
public boolean addAlias(CommandSender sender, boolean regex, boolean random, String keyword, String replacement) {
|
||||||
{
|
if (regex && keyword.equals(".*")) {
|
||||||
if (regex && keyword.equals(".*"))
|
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "You may not define the wildcard regex as an alias.");
|
getLogger().message(sender, true, "You may not define the wildcard regex as an alias.");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Player player = (Player) sender;
|
Player player = (Player) sender;
|
||||||
UUID uuid = player.getUniqueId();
|
UUID uuid = player.getUniqueId();
|
||||||
JSONObject data = (JSONObject) aliases.get(uuid.toString());
|
JSONObject data = (JSONObject) aliases.get(uuid.toString());
|
||||||
keyword = (regex ? "R: " : "N: ") + keyword;
|
keyword = (random ? "RND;" : "") + (regex ? "R: " : "N: ") + keyword;
|
||||||
if (!data.containsKey(keyword))
|
|
||||||
{
|
if (!data.containsKey(keyword)) {
|
||||||
int maxAmount;
|
int maxAmount;
|
||||||
try
|
|
||||||
{
|
try {
|
||||||
maxAmount = Integer.valueOf(getPermissionContent(player, "utils.alias.amount."));
|
maxAmount = Integer.valueOf(getPermissionContent(player, "utils.alias.amount."));
|
||||||
}
|
} catch (NumberFormatException e) {
|
||||||
catch (NumberFormatException e)
|
|
||||||
{
|
|
||||||
maxAmount = 25;
|
maxAmount = 25;
|
||||||
}
|
}
|
||||||
if (data.size() == maxAmount)
|
|
||||||
{
|
if (data.size() == maxAmount) {
|
||||||
getLogger().message(sender, true, "You already reached your maximum of aliases!");
|
getLogger().message(sender, true, "You already reached your maximum of aliases!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
data.put(keyword, replacement);
|
data.put(keyword, replacement);
|
||||||
if (sender.hasPermission("essentials.chat.color"))
|
|
||||||
getLogger().message(sender,
|
if (sender.hasPermission("essentials.chat.color")) {
|
||||||
"Successfully created alias " + keyword.substring(3) + " §7-> " + replacement + " §7for you.");
|
getLogger().message(sender, "Successfully created alias " + keyword.substring(random ? 7 : 3) + " §7-> " + replacement + " §7for you.");
|
||||||
else
|
} else {
|
||||||
getLogger().message(sender,
|
getLogger().message(sender, "Successfully created alias " + keyword.substring(random ? 7 : 3) + " §7-> " + replacement + " §7for you.");
|
||||||
"Successfully created alias " + keyword.substring(3) + " §7-> " + replacement + " §7for you.");
|
}
|
||||||
|
|
||||||
saveAliases(uuid);
|
saveAliases(uuid);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "delalias")
|
@Command(hook = "delalias")
|
||||||
public boolean delAlias(CommandSender sender, boolean regex, String keyword)
|
public boolean delAlias(CommandSender sender, boolean regex, boolean random, String keyword) {
|
||||||
{
|
|
||||||
Player player = (Player) sender;
|
Player player = (Player) sender;
|
||||||
UUID uuid = player.getUniqueId();
|
UUID uuid = player.getUniqueId();
|
||||||
JSONObject data = (JSONObject) aliases.get(uuid.toString());
|
JSONObject data = (JSONObject) aliases.get(uuid.toString());
|
||||||
keyword = (regex ? "R: " : "N: ") + keyword;
|
|
||||||
if (data.remove(keyword) != null)
|
keyword = (random ? "RND;" : "") + (regex ? "R: " : "N: ") + keyword;
|
||||||
{
|
|
||||||
|
if (data.remove(keyword) != null) {
|
||||||
getLogger().message(sender, "Successfully removed the alias!");
|
getLogger().message(sender, "Successfully removed the alias!");
|
||||||
saveAliases(uuid);
|
saveAliases(uuid);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
} else {
|
||||||
else
|
getLogger().message(sender, true, "That alias doesn't exist! Hint: regex/no regex and random/not random does matter for this.");
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "That alias doesn't exist! Hint: regex/no regex does matter for this.");
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "listaliases")
|
@Command(hook = "listaliases")
|
||||||
public boolean listAliases(CommandSender sender)
|
public boolean listAliases(CommandSender sender) {
|
||||||
{
|
ChatAPI.createMessage(sender).appendText(getLogger().getHeader()).send();
|
||||||
ArrayList<String> message = new ArrayList<>();
|
|
||||||
Player player = (Player) sender;
|
Player player = (Player) sender;
|
||||||
UUID uuid = player.getUniqueId();
|
UUID uuid = player.getUniqueId();
|
||||||
JSONObject data = (JSONObject) aliases.get(uuid.toString());
|
JSONObject data = (JSONObject) aliases.get(uuid.toString());
|
||||||
for (Object key : data.keySet())
|
|
||||||
message.add((String) key + " §7-> " + data.get(key));
|
for (Object key : data.keySet()) {
|
||||||
getLogger().message(sender, message.toArray(new String[] {}));
|
String d_key = (String) key;
|
||||||
|
d_key = d_key.replace("RND;N:", "RND:").replace("RND;R:", "R-RND:");
|
||||||
|
|
||||||
|
ChatAPI.createMessage(sender).appendText(d_key + " §7-> " + data.get(key)).send();
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getPermissionContent(Player player, String permnode)
|
private String getPermissionContent(Player player, String permnode) {
|
||||||
{
|
|
||||||
Set<PermissionAttachmentInfo> perms = player.getEffectivePermissions();
|
Set<PermissionAttachmentInfo> perms = player.getEffectivePermissions();
|
||||||
for (PermissionAttachmentInfo perm : perms)
|
|
||||||
if (perm.getPermission().toString().startsWith(permnode))
|
for (PermissionAttachmentInfo perm : perms) if (perm.getPermission().toString().startsWith(permnode)) return perm.getPermission().replace(permnode, "");
|
||||||
return perm.getPermission().replace(permnode, "");
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private void loadAliases(UUID uuid)
|
private void loadAliases(UUID uuid) {
|
||||||
{
|
|
||||||
JSONObject defaults = new JSONObject();
|
JSONObject defaults = new JSONObject();
|
||||||
defaults.put("dataFormat", "v1");
|
defaults.put("dataFormat", "v2");
|
||||||
|
|
||||||
JSONObject data = new JSONObject();
|
JSONObject data = new JSONObject();
|
||||||
data.put("N: ./", "/");
|
data.put("N: ./", "/");
|
||||||
|
|
||||||
defaults.put("data", data);
|
defaults.put("data", data);
|
||||||
JSONObject playerAliases = JsonManager
|
|
||||||
.getObject(new File(Main.plugin.getDataFolder(), "aliases/" + uuid.toString() + ".json"));
|
JSONObject playerAliases = JsonManager.getObject(new File(Main.plugin.getDataFolder(), "aliases/" + uuid.toString() + ".json"));
|
||||||
if (playerAliases == null)
|
|
||||||
{
|
if (playerAliases == null) {
|
||||||
playerAliases = defaults;
|
playerAliases = defaults;
|
||||||
}
|
}
|
||||||
|
|
||||||
String dataFormat = (String) playerAliases.get("dataFormat");
|
String dataFormat = (String) playerAliases.get("dataFormat");
|
||||||
if (dataFormat == null)
|
|
||||||
{
|
if (dataFormat == null) {
|
||||||
JSONObject temp = new JSONObject();
|
JSONObject temp = new JSONObject();
|
||||||
temp.put("dataFormat", "v1");
|
temp.put("dataFormat", "v2");
|
||||||
|
|
||||||
JSONObject tempAliases = new JSONObject();
|
JSONObject tempAliases = new JSONObject();
|
||||||
{
|
|
||||||
for (Object key : playerAliases.keySet())
|
for (Object key : playerAliases.keySet()) {
|
||||||
{
|
|
||||||
tempAliases.put("N: " + key, playerAliases.get(key));
|
tempAliases.put("N: " + key, playerAliases.get(key));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
temp.put("data", tempAliases);
|
temp.put("data", tempAliases);
|
||||||
aliases.put(uuid.toString(), temp.get("data"));
|
aliases.put(uuid.toString(), temp.get("data"));
|
||||||
}
|
|
||||||
else if (dataFormat.equals("v1"))
|
} else if (dataFormat.equals("v2")) {
|
||||||
aliases.put(uuid.toString(), playerAliases.get("data"));
|
aliases.put(uuid.toString(), playerAliases.get("data"));
|
||||||
else
|
} else if (dataFormat.equals("v1")) {
|
||||||
{
|
aliases.put(uuid.toString(), playerAliases.get("data"));
|
||||||
|
saveAliases(uuid);
|
||||||
|
} else {
|
||||||
getLogger().error("Unknown data format for alias set of player " + uuid.toString());
|
getLogger().error("Unknown data format for alias set of player " + uuid.toString());
|
||||||
aliases.put(uuid.toString(), ((JSONObject) defaults.get("data")).clone());
|
aliases.put(uuid.toString(), ((JSONObject) defaults.get("data")).clone());
|
||||||
saveAliases(uuid);
|
saveAliases(uuid);
|
||||||
@@ -307,11 +324,12 @@ public class Chatalias implements Module, Listener
|
|||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private void saveAliases(UUID uuid)
|
private void saveAliases(UUID uuid) {
|
||||||
{
|
|
||||||
JSONObject temp = new JSONObject();
|
JSONObject temp = new JSONObject();
|
||||||
temp.put("dataFormat", "v1");
|
|
||||||
|
temp.put("dataFormat", "v2");
|
||||||
temp.put("data", aliases.get(uuid.toString()));
|
temp.put("data", aliases.get(uuid.toString()));
|
||||||
|
|
||||||
JsonManager.save(temp, new File(Main.plugin.getDataFolder(), "aliases/" + uuid.toString() + ".json"));
|
JsonManager.save(temp, new File(Main.plugin.getDataFolder(), "aliases/" + uuid.toString() + ".json"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: ChatAlias
|
||||||
|
category: Chat
|
||||||
|
description: Allows players to create aliases. For example wb -> Welcome Back
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
command cgt {
|
command cgt {
|
||||||
|
perm utils.chatgroups;
|
||||||
[empty] {
|
[empty] {
|
||||||
help Toggles your cgtoggle status.;
|
help Toggles your cgtoggle status.;
|
||||||
type player;
|
type player;
|
||||||
@@ -6,6 +7,7 @@ command cgt {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
command cgkey {
|
command cgkey {
|
||||||
|
perm utils.chatgroups;
|
||||||
[string:key] {
|
[string:key] {
|
||||||
help Sets your chatgroup key.;
|
help Sets your chatgroup key.;
|
||||||
run setcgkey key;
|
run setcgkey key;
|
||||||
@@ -13,12 +15,14 @@ command cgkey {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
command cgsay {
|
command cgsay {
|
||||||
|
perm utils.chatgroups;
|
||||||
[string:message...] {
|
[string:message...] {
|
||||||
help Chats in your chatgroup.;
|
help Chats in your chatgroup.;
|
||||||
run cgsay message;
|
run cgsay message;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
command cg {
|
command cg {
|
||||||
|
perm utils.chatgroups;
|
||||||
join [string:group] {
|
join [string:group] {
|
||||||
help Joins a chatgroup.;
|
help Joins a chatgroup.;
|
||||||
run cgjoin group;
|
run cgjoin group;
|
||||||
363
src/main/java/com/redstoner/modules/chatgroups/Chatgroups.java
Normal file
363
src/main/java/com/redstoner/modules/chatgroups/Chatgroups.java
Normal file
@@ -0,0 +1,363 @@
|
|||||||
|
package com.redstoner.modules.chatgroups;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
|
import com.nemez.cmdmgr.Command;
|
||||||
|
import com.redstoner.annotations.AutoRegisterListener;
|
||||||
|
import com.redstoner.annotations.Commands;
|
||||||
|
import com.redstoner.annotations.Version;
|
||||||
|
import com.redstoner.coremods.moduleLoader.ModuleLoader;
|
||||||
|
import com.redstoner.misc.BroadcastFilter;
|
||||||
|
import com.redstoner.misc.CommandHolderType;
|
||||||
|
import com.redstoner.misc.JsonManager;
|
||||||
|
import com.redstoner.misc.Main;
|
||||||
|
import com.redstoner.misc.Utils;
|
||||||
|
import com.redstoner.modules.Module;
|
||||||
|
import com.redstoner.modules.ignore.Ignore;
|
||||||
|
import com.redstoner.modules.socialspy.Socialspy;
|
||||||
|
|
||||||
|
import net.nemez.chatapi.ChatAPI;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ChatGroups module. Allows people to have private sub-chats that can be
|
||||||
|
* accessed via a single char prefix or a toggle.
|
||||||
|
*
|
||||||
|
* @author Pepich
|
||||||
|
*/
|
||||||
|
@Commands(CommandHolderType.File)
|
||||||
|
@AutoRegisterListener
|
||||||
|
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
|
public class Chatgroups implements Module, Listener {
|
||||||
|
private static final char defaultKey = ':';
|
||||||
|
private static final File groupsLocation = new File(Main.plugin.getDataFolder(), "chatgroups.json");
|
||||||
|
private static final File keysLocation = new File(Main.plugin.getDataFolder(), "chatgroup_keys.json");
|
||||||
|
private ArrayList<UUID> cgtoggled;
|
||||||
|
private static JSONObject groups, keys;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onEnable() {
|
||||||
|
groups = JsonManager.getObject(groupsLocation);
|
||||||
|
if (groups == null) {
|
||||||
|
groups = new JSONObject();
|
||||||
|
saveGroups();
|
||||||
|
}
|
||||||
|
keys = JsonManager.getObject(keysLocation);
|
||||||
|
if (keys == null) {
|
||||||
|
keys = new JSONObject();
|
||||||
|
saveKeys();
|
||||||
|
}
|
||||||
|
cgtoggled = new ArrayList<>();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDisable() {
|
||||||
|
saveKeys();
|
||||||
|
saveGroups();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints chatgroup info (like players in the group, groupname) to the sender.
|
||||||
|
*
|
||||||
|
* @param sender the issuer of the command.
|
||||||
|
* @return true.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Command(hook = "cginfo")
|
||||||
|
public boolean cgInfo(CommandSender sender) {
|
||||||
|
String group = getGroup(sender);
|
||||||
|
if (group == null) getLogger().message(sender, true, "You are not in a chatgroup!");
|
||||||
|
else {
|
||||||
|
ArrayList<String> message = new ArrayList<>();
|
||||||
|
message.add("§7Your current chatgroup is: §6" + group);
|
||||||
|
ArrayList<String> players = new ArrayList<>();
|
||||||
|
Iterator<String> iter = groups.keySet().iterator();
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
String id = iter.next();
|
||||||
|
if (((String) groups.get(id)).equals(group)) {
|
||||||
|
if (!id.equals("CONSOLE")) {
|
||||||
|
UUID uuid = UUID.fromString(id);
|
||||||
|
Player p = Bukkit.getPlayer(uuid);
|
||||||
|
if (p != null) players.add(p.getDisplayName());
|
||||||
|
else players.add(Bukkit.getOfflinePlayer(UUID.fromString(id)).getName());
|
||||||
|
} else players.add(id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
StringBuilder sb = new StringBuilder("&6Other players in this group: &9");
|
||||||
|
for (String player : players) {
|
||||||
|
sb.append(player);
|
||||||
|
sb.append("&7, &9");
|
||||||
|
}
|
||||||
|
sb.delete(sb.length() - 2, sb.length());
|
||||||
|
message.add(sb.toString());
|
||||||
|
getLogger().message(sender, message.toArray(new String[] {}));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints a Players cgkey to their chat.
|
||||||
|
*
|
||||||
|
* @param sender the issuer of the command.
|
||||||
|
*/
|
||||||
|
public void getCgKey(CommandSender sender) {
|
||||||
|
getLogger().message(sender, "Your current cgkey is §6" + getKey((Player) sender));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the cgkey of a Player.
|
||||||
|
*
|
||||||
|
* @param sender the issuer of the command.
|
||||||
|
* @param key the key to be set. Set to NULL or "" to get your current key.
|
||||||
|
* @return true.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Command(hook = "setcgkey")
|
||||||
|
public boolean setCgKey(CommandSender sender, String key) {
|
||||||
|
if (key.length() > 1) {
|
||||||
|
getLogger().message(sender, true, "Could not set your key to §6" + key + " §7, it can be at most one char.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (key == null || key.length() == 0) {
|
||||||
|
getCgKey(sender);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
getLogger().message(sender, "Set your key to §6" + key);
|
||||||
|
keys.put(((Player) sender).getUniqueId().toString(), key + "");
|
||||||
|
saveKeys();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lets a Player toggle their auto-cg status to allow for automatically sending
|
||||||
|
* chat messages to their chatgroup.
|
||||||
|
*
|
||||||
|
* @param sender the issuer of the command.
|
||||||
|
* @return true.
|
||||||
|
*/
|
||||||
|
@Command(hook = "cgtoggle")
|
||||||
|
public boolean cgToggleCommand(CommandSender sender) {
|
||||||
|
if (getGroup(sender) != null) if (cgtoggled.contains(((Player) sender).getUniqueId())) {
|
||||||
|
cgtoggled.remove(((Player) sender).getUniqueId());
|
||||||
|
getLogger().message(sender, "CGT now §cdisabled");
|
||||||
|
} else {
|
||||||
|
cgtoggled.add(((Player) sender).getUniqueId());
|
||||||
|
getLogger().message(sender, "CGT now §aenabled");
|
||||||
|
}
|
||||||
|
else getLogger().message(sender, true, "You are not in a chatgroup!");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lets a CommandSender leave their group.
|
||||||
|
*
|
||||||
|
* @param sender the command issuer.
|
||||||
|
* @return true.
|
||||||
|
*/
|
||||||
|
@Command(hook = "cgleave")
|
||||||
|
public boolean cgLeave(CommandSender sender) {
|
||||||
|
String group = removeGroup(sender);
|
||||||
|
if (group == null) {
|
||||||
|
getLogger().message(sender, true, "You were not in a chatgroup!");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
String name = Utils.getName(sender);
|
||||||
|
sendToGroup(group, "&9" + name + " &7left the group!");
|
||||||
|
getLogger().message(sender, "Successfully removed you from your group!");
|
||||||
|
if (sender instanceof Player) cgtoggled.remove(((Player) sender).getUniqueId());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lets a CommandSender join a group.
|
||||||
|
*
|
||||||
|
* @param sender the command issuer.
|
||||||
|
* @param name the name of the group.
|
||||||
|
* @return true.
|
||||||
|
*/
|
||||||
|
@Command(hook = "cgjoin")
|
||||||
|
public boolean cgJoin(CommandSender sender, String name) {
|
||||||
|
String pname = Utils.getName(sender);
|
||||||
|
String group = getGroup(sender);
|
||||||
|
if (group != null && group.equals(name)) getLogger().message(sender, true, "You were already in group §6" + name);
|
||||||
|
else {
|
||||||
|
setGroup(sender, null);
|
||||||
|
if (group != null) sendToGroup(group, "&9" + pname + " &7left the group!");
|
||||||
|
sendToGroup(name, "&9" + pname + " &7joined the group!");
|
||||||
|
setGroup(sender, name);
|
||||||
|
getLogger().message(sender, "Successfully joined group §6" + name);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a message to a group.
|
||||||
|
*
|
||||||
|
* @param sender the sender of the message - the message will be sent to the
|
||||||
|
* group of the sender.
|
||||||
|
* @param message the message to be sent.
|
||||||
|
* @return true.
|
||||||
|
*/
|
||||||
|
@Command(hook = "cgsay")
|
||||||
|
public boolean cgSay(CommandSender sender, String message) {
|
||||||
|
String group = getGroup(sender);
|
||||||
|
if (group != null) sendToGroup(sender, message);
|
||||||
|
else getLogger().message(sender, true, "You are not in a chatgroup right now!");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deals with chat events to allow for cgkeys and cgtoggle.
|
||||||
|
*
|
||||||
|
* @param event the chat event containing the player and the message.
|
||||||
|
*/
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerChat(AsyncPlayerChatEvent event) {
|
||||||
|
String group = getGroup(event.getPlayer());
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
if (group != null) {
|
||||||
|
if (event.getMessage().startsWith(getKey(player))) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
sendToGroup(event.getPlayer(), event.getMessage().substring(1));
|
||||||
|
} else if (cgtoggled.contains(event.getPlayer().getUniqueId())) {
|
||||||
|
event.setCancelled(true);
|
||||||
|
sendToGroup(event.getPlayer(), event.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the group of a CommandSender.
|
||||||
|
*
|
||||||
|
* @param target the CommandSender to get the group of.
|
||||||
|
* @return the group of the target or NULL if he doesn't have one.
|
||||||
|
*/
|
||||||
|
public static String getGroup(CommandSender target) {
|
||||||
|
if (target instanceof Player) return (String) groups.get(((Player) target).getUniqueId().toString());
|
||||||
|
else return (String) groups.get("CONSOLE");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the group of the CommandSender.
|
||||||
|
*
|
||||||
|
* @param target the CommandSender to set the group of.
|
||||||
|
* @param group the name of the group to join.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private void setGroup(CommandSender target, String group) {
|
||||||
|
if (target instanceof Player) groups.put(((Player) target).getUniqueId().toString(), group);
|
||||||
|
else groups.put("CONSOLE", group);
|
||||||
|
saveGroups();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes a CommandSender from their chatgroup. Will also save the groups after
|
||||||
|
* finishing
|
||||||
|
*
|
||||||
|
* @param target the CommandSender to get their group removed.
|
||||||
|
*/
|
||||||
|
private String removeGroup(CommandSender target) {
|
||||||
|
String group;
|
||||||
|
if (target instanceof Player) group = (String) groups.remove(((Player) target).getUniqueId().toString());
|
||||||
|
else group = (String) groups.remove("CONSOLE");
|
||||||
|
saveGroups();
|
||||||
|
return group;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method will find the ChatgGroup key of any player.
|
||||||
|
*
|
||||||
|
* @param player the player to get the key from.
|
||||||
|
* @return the key.
|
||||||
|
*/
|
||||||
|
public static String getKey(Player player) {
|
||||||
|
String key = (String) keys.get(player.getUniqueId().toString());
|
||||||
|
return (key == null ? "" + defaultKey : key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method sends a message to a chatgroup.
|
||||||
|
*
|
||||||
|
* @param sender the sender of the message. Also defines which group the
|
||||||
|
* message will be sent to.
|
||||||
|
* @param message the message to be sent.
|
||||||
|
*/
|
||||||
|
private void sendToGroup(CommandSender sender, String message) {
|
||||||
|
String name = Utils.getName(sender);
|
||||||
|
String group = getGroup(sender);
|
||||||
|
message = ChatAPI.colorify(null, message);
|
||||||
|
|
||||||
|
BroadcastFilter ignore = ModuleLoader.exists("Ignore") ? Ignore.getIgnoredBy(sender) : null;
|
||||||
|
Utils.broadcast("§8[§bCG§8] §9", name + "§8: §6" + message, new BroadcastFilter() {
|
||||||
|
@Override
|
||||||
|
public boolean sendTo(CommandSender recipient) {
|
||||||
|
|
||||||
|
String rgroup = getGroup(recipient);
|
||||||
|
if (rgroup != null && (ignore == null ? true : ignore.sendTo(recipient))) return rgroup.equals(group);
|
||||||
|
else return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (ModuleLoader.getModule("Socialspy") != null) {
|
||||||
|
Socialspy.spyBroadcast(sender, "§e" + group + " §a(cg)", message, "/cg", new BroadcastFilter() {
|
||||||
|
@Override
|
||||||
|
public boolean sendTo(CommandSender recipient) {
|
||||||
|
return getGroup(recipient) == null || !getGroup(recipient).equals(group);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (getGroup(Bukkit.getConsoleSender()) == null || !getGroup(Bukkit.getConsoleSender()).equals(group)) {
|
||||||
|
getLogger().info(name + " in " + group + ": " + message + " §8(hidden)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method sends a message to a chatgroup.
|
||||||
|
*
|
||||||
|
* @param sender the sender of the message. Also defines which group the
|
||||||
|
* message will be sent to.
|
||||||
|
* @param message the message to be sent.
|
||||||
|
*/
|
||||||
|
private void sendToGroup(String group, String message) {
|
||||||
|
message = ChatAPI.colorify(null, message);
|
||||||
|
Utils.broadcast(null, message, new BroadcastFilter() {
|
||||||
|
@Override
|
||||||
|
public boolean sendTo(CommandSender recipient) {
|
||||||
|
String rgroup = getGroup(recipient);
|
||||||
|
if (rgroup != null) return rgroup.equals(group);
|
||||||
|
else return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if (ModuleLoader.getModule("Socialspy") != null) {
|
||||||
|
Socialspy.spyBroadcast(Bukkit.getConsoleSender(), "§e" + group + " §a(cg)", message, "/cg", new BroadcastFilter() {
|
||||||
|
@Override
|
||||||
|
public boolean sendTo(CommandSender recipient) {
|
||||||
|
return getGroup(recipient) == null || !getGroup(recipient).equals(group);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (getGroup(Bukkit.getConsoleSender()) == null || !getGroup(Bukkit.getConsoleSender()).equals(group)) {
|
||||||
|
getLogger().info("In " + group + ": " + message + " §8(hidden)");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Saves the groups. */
|
||||||
|
private void saveGroups() {
|
||||||
|
JsonManager.save(groups, groupsLocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Saves the keys. */
|
||||||
|
private void saveKeys() {
|
||||||
|
JsonManager.save(keys, keysLocation);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: ChatGroups
|
||||||
|
category: Chat
|
||||||
|
description: Adds a secondary chat for people who speak a different language or working on projects together
|
||||||
@@ -6,3 +6,11 @@ command check {
|
|||||||
help Get info on a player;
|
help Get info on a player;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
command ipinfo {
|
||||||
|
perm utils.check;
|
||||||
|
|
||||||
|
[string:ip] {
|
||||||
|
run ipinfo ip;
|
||||||
|
help Get the info about the given IP.;
|
||||||
|
}
|
||||||
|
}
|
||||||
320
src/main/java/com/redstoner/modules/check/Check.java
Normal file
320
src/main/java/com/redstoner/modules/check/Check.java
Normal file
@@ -0,0 +1,320 @@
|
|||||||
|
package com.redstoner.modules.check;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.Scanner;
|
||||||
|
import java.util.concurrent.ExecutionException;
|
||||||
|
|
||||||
|
import com.redstoner.exceptions.NonSaveableConfigException;
|
||||||
|
import com.redstoner.misc.mysql.Config;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.OfflinePlayer;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.json.simple.JSONArray;
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
import org.json.simple.parser.JSONParser;
|
||||||
|
|
||||||
|
import com.nemez.cmdmgr.Command;
|
||||||
|
import com.nemez.cmdmgr.Command.AsyncType;
|
||||||
|
import com.nemez.cmdmgr.CommandManager;
|
||||||
|
import com.redstoner.annotations.Commands;
|
||||||
|
import com.redstoner.annotations.Version;
|
||||||
|
import com.redstoner.coremods.moduleLoader.ModuleLoader;
|
||||||
|
import com.redstoner.misc.CommandHolderType;
|
||||||
|
import com.redstoner.misc.Main;
|
||||||
|
import com.redstoner.misc.mysql.MysqlHandler;
|
||||||
|
import com.redstoner.misc.mysql.elements.ConstraintOperator;
|
||||||
|
import com.redstoner.misc.mysql.elements.MysqlConstraint;
|
||||||
|
import com.redstoner.misc.mysql.elements.MysqlDatabase;
|
||||||
|
import com.redstoner.misc.mysql.elements.MysqlTable;
|
||||||
|
import com.redstoner.modules.Module;
|
||||||
|
|
||||||
|
import net.nemez.chatapi.click.Message;
|
||||||
|
|
||||||
|
@Commands(CommandHolderType.File)
|
||||||
|
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
|
public class Check implements Module, Listener {
|
||||||
|
MysqlTable table;
|
||||||
|
String noTableReason;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onEnable() {
|
||||||
|
Config config;
|
||||||
|
|
||||||
|
try {
|
||||||
|
config = Config.getConfig("check.json");
|
||||||
|
} catch (IOException | org.json.simple.parser.ParseException e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config == null || !config.containsKey("database") || !config.containsKey("table")) {
|
||||||
|
getLogger().warn("Could not load the Check config file, ip info for offline users and website data will be unavaliable!");
|
||||||
|
noTableReason = "Could not load the config file";
|
||||||
|
|
||||||
|
config.put("database", "redstoner");
|
||||||
|
config.put("table", "users");
|
||||||
|
|
||||||
|
try {
|
||||||
|
config.save();
|
||||||
|
getLogger().info("A default config file has been created for you.");
|
||||||
|
} catch (IOException | NonSaveableConfigException e) {
|
||||||
|
getLogger().error("A default config file was unable to be created.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
getLogger().info("Attempting to load the database and the table, this might take a few seconds.");
|
||||||
|
MysqlDatabase database = MysqlHandler.INSTANCE.getDatabase(config.get("database") + "?autoReconnect=true");
|
||||||
|
table = database.getTable(config.get("table"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
getLogger().warn("Could not use the Check config file, ip info for offline users and website data will be unavaliable!");
|
||||||
|
noTableReason = "Could not use the config file";
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void postEnable() {
|
||||||
|
CommandManager.registerCommand(getCommandString(), this, Main.plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
@Command(hook = "checkCommand", async = AsyncType.ALWAYS)
|
||||||
|
public void checkCommand(final CommandSender sender, final String player) {
|
||||||
|
OfflinePlayer oPlayer = Bukkit.getPlayer(player);
|
||||||
|
if (oPlayer == null) oPlayer = Bukkit.getServer().getOfflinePlayer(player);
|
||||||
|
|
||||||
|
sendData(sender, oPlayer);
|
||||||
|
|
||||||
|
if (ModuleLoader.exists("Tag")) {
|
||||||
|
try {
|
||||||
|
Bukkit.getScheduler().callSyncMethod(ModuleLoader.getPlugin(), () -> Bukkit.dispatchCommand(sender, "tag check " + player)).get();
|
||||||
|
} catch (ExecutionException | InterruptedException e) {
|
||||||
|
Message msg = new Message(sender, null);
|
||||||
|
msg.appendText("&4Running /tag check failed! Please inform a dev about this incident!");
|
||||||
|
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command(hook = "ipinfo", async = AsyncType.ALWAYS)
|
||||||
|
public void ipinfo(final CommandSender sender, final String ip) {
|
||||||
|
String[] info = getIpInfo(ip);
|
||||||
|
|
||||||
|
Message msg = new Message(sender, null);
|
||||||
|
|
||||||
|
if (info == null) {
|
||||||
|
msg.appendText("\n&6> &cData Unavailable");
|
||||||
|
} else {
|
||||||
|
String region = info[1];
|
||||||
|
String asn = info[2];
|
||||||
|
String org = info[3];
|
||||||
|
|
||||||
|
msg.appendText("\n&6> IP: ").appendSuggestHover("&e" + ip, ip, "Click to copy!");
|
||||||
|
msg.appendText("\n&6> Region: ").appendSuggestHover("&e" + region, region, "Click to copy!");
|
||||||
|
msg.appendText("\n&6> ASN: ").appendSuggestHover("&e" + asn, asn, "Click to copy!");
|
||||||
|
msg.appendText("\n&6> Org: ").appendSuggestHover("&e" + org, org, "Click to copy!");
|
||||||
|
}
|
||||||
|
|
||||||
|
msg.send();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String read(URL url) {
|
||||||
|
String data = "";
|
||||||
|
|
||||||
|
try {
|
||||||
|
Scanner in = new Scanner(new InputStreamReader(url.openStream()));
|
||||||
|
|
||||||
|
while (in.hasNextLine()) {
|
||||||
|
data += in.nextLine();
|
||||||
|
}
|
||||||
|
|
||||||
|
in.close();
|
||||||
|
return data;
|
||||||
|
} catch (IOException e) {}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getIpInfo(OfflinePlayer player) {
|
||||||
|
String ip = "";
|
||||||
|
|
||||||
|
if (player.isOnline()) {
|
||||||
|
ip = player.getPlayer().getAddress().getHostString();
|
||||||
|
} else if (table != null) {
|
||||||
|
try {
|
||||||
|
ip = (String) table.get("last_ip", new MysqlConstraint("uuid", ConstraintOperator.EQUAL, player.getUniqueId().toString().replace("-", "")))[0];
|
||||||
|
} catch (Exception e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return getIpInfo(ip);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getIpInfo(String ip) {
|
||||||
|
String[] info = new String[4];
|
||||||
|
|
||||||
|
try {
|
||||||
|
URL ipinfo = new URL("https://ipapi.co/" + ip + "/json");
|
||||||
|
JSONObject json = (JSONObject) new JSONParser().parse(read(ipinfo));
|
||||||
|
|
||||||
|
info[0] = ip;
|
||||||
|
|
||||||
|
Object o_country = json.get("country_name");
|
||||||
|
Object o_region = json.get("region");
|
||||||
|
Object o_asn = json.get("asn");
|
||||||
|
Object o_org = json.get("org");
|
||||||
|
|
||||||
|
String country = o_country == null ? "Unknown" : (String) o_country;
|
||||||
|
String region = o_region == null ? "" : ", " + (String) o_region;
|
||||||
|
String asn = o_asn == null ? "Unknown" : (String) o_asn;
|
||||||
|
String org = o_org == null ? "Unknown" : (String) o_org;
|
||||||
|
|
||||||
|
info[1] = country.equals("") ? "Unknown" : country + (region.equals(", ") ? "" : region);
|
||||||
|
info[2] = asn.equals("") ? "Unknown" : asn;
|
||||||
|
info[3] = org.equals("") ? "Unknown" : org;
|
||||||
|
|
||||||
|
return info;
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFirstJoin(OfflinePlayer player) {
|
||||||
|
Long firstJoin = player.getFirstPlayed();
|
||||||
|
Date date = new Date(firstJoin);
|
||||||
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
||||||
|
|
||||||
|
return format.format(date);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLastSeen(OfflinePlayer player) {
|
||||||
|
Long lastSeen = player.getLastPlayed();
|
||||||
|
Date date = new Date(lastSeen);
|
||||||
|
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
|
||||||
|
|
||||||
|
return format.format(date);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object[] getWebsiteData(OfflinePlayer player) {
|
||||||
|
if (table == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
MysqlConstraint constraint = new MysqlConstraint("uuid", ConstraintOperator.EQUAL, player.getUniqueId().toString().replace("-", ""));
|
||||||
|
|
||||||
|
try {
|
||||||
|
int id = (int) table.get("id", constraint)[0];
|
||||||
|
String email = (String) table.get("email", constraint)[0];
|
||||||
|
boolean confirmed = (boolean) table.get("confirmed", constraint)[0];
|
||||||
|
|
||||||
|
return new Object[] { "https://redstoner.com/users/" + id, email, confirmed };
|
||||||
|
} catch (Exception e) {
|
||||||
|
try {
|
||||||
|
int id = (int) table.get("id", constraint)[0];
|
||||||
|
String email = (String) table.get("email", constraint)[0];
|
||||||
|
boolean confirmed = (boolean) table.get("confirmed", constraint)[0];
|
||||||
|
|
||||||
|
return new Object[] { "https://redstoner.com/users/" + id, email, confirmed };
|
||||||
|
} catch (Exception e2) {}
|
||||||
|
|
||||||
|
return new Object[] { null };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAllNames(OfflinePlayer player) {
|
||||||
|
String uuid = player.getUniqueId().toString().replace("-", "");
|
||||||
|
String nameString = "";
|
||||||
|
|
||||||
|
try {
|
||||||
|
String rawJson = read(new URL("https://api.mojang.com/user/profiles/" + uuid + "/names"));
|
||||||
|
JSONArray names = (JSONArray) new JSONParser().parse(rawJson);
|
||||||
|
|
||||||
|
for (Object obj : names) {
|
||||||
|
nameString += "&e" + ((JSONObject) obj).get("name") + "&7, ";
|
||||||
|
}
|
||||||
|
|
||||||
|
nameString = nameString.substring(0, nameString.length() - 2);
|
||||||
|
return nameString;
|
||||||
|
} catch (Exception e) {}
|
||||||
|
|
||||||
|
return "None";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendData(CommandSender sender, OfflinePlayer player) {
|
||||||
|
try {
|
||||||
|
// data
|
||||||
|
String uuid = player.getUniqueId().toString();
|
||||||
|
|
||||||
|
String firstJoin = getFirstJoin(player);
|
||||||
|
String lastSeen = getLastSeen(player);
|
||||||
|
firstJoin = (firstJoin.equals("1970-01-01 01:00")) ? "&eNever" : "&7(yyyy-MM-dd hh:mm) &e" + firstJoin;
|
||||||
|
lastSeen = (lastSeen.equals("1970-1-1 01:00")) ? "&eNever" : "&7(yyyy-MM-dd hh:mm) &e" + lastSeen;
|
||||||
|
|
||||||
|
Object[] websiteData = getWebsiteData(player);
|
||||||
|
|
||||||
|
|
||||||
|
String[] ipInfo = getIpInfo(player);
|
||||||
|
|
||||||
|
String namesUsed = getAllNames(player);
|
||||||
|
|
||||||
|
// messages
|
||||||
|
Message msg = new Message(sender, null);
|
||||||
|
|
||||||
|
msg.appendText("\n" + getLogger().getHeader());
|
||||||
|
msg.appendText("\n&7Data provided by redstoner:");
|
||||||
|
msg.appendText("\n&6> UUID: ").appendSuggestHover("&e" + uuid, uuid, "Click to copy!");
|
||||||
|
msg.appendText("\n&6> First joined: &e" + firstJoin);
|
||||||
|
msg.appendText("\n&6> Last Seen: &e" + lastSeen);
|
||||||
|
|
||||||
|
if (websiteData != null) {
|
||||||
|
String websiteUrl = (websiteData[0] == null) ? "None" : (String) websiteData[0];
|
||||||
|
String email = (websiteData[0] == null) ? "Unknown" : (String) websiteData[1];
|
||||||
|
boolean emailNotConfirmed = (websiteData[0] == null) ? false : !((boolean) websiteData[2]);
|
||||||
|
|
||||||
|
msg.appendText("\n&6> Website account: &e").appendLink(websiteUrl, websiteUrl);
|
||||||
|
msg.appendText("\n&6> Email: &e" + (emailNotConfirmed ? "\n&6> &cEmail NOT Confirmed!" : "")).appendSuggestHover("&e" + email, email, "Click to copy!");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
msg.appendTextHover("\n&6> Website account: &cData Unavailable", "&c" + noTableReason);
|
||||||
|
msg.appendTextHover("\n&6> Email: &cData Unavailable", "&c" + noTableReason);
|
||||||
|
}
|
||||||
|
msg.appendText("\n\n&7Data provided by ipapi.co:");
|
||||||
|
|
||||||
|
if (ipInfo == null && table == null) {
|
||||||
|
msg.appendTextHover("\n&6> &cData Unavailable", "&c" + noTableReason);
|
||||||
|
} else if (ipInfo == null) {
|
||||||
|
msg.appendText("\n&6> &cData Unavailable");
|
||||||
|
} else {
|
||||||
|
String ip = ipInfo[0];
|
||||||
|
String region = ipInfo[1];
|
||||||
|
String asn = ipInfo[2];
|
||||||
|
String org = ipInfo[3];
|
||||||
|
|
||||||
|
msg.appendText("\n&6> IP: ").appendSuggestHover("&e" + ip, ip, "Click to copy!");
|
||||||
|
msg.appendText("\n&6> Region: ").appendSuggestHover("&e" + region, region, "Click to copy!");
|
||||||
|
msg.appendText("\n&6> ASN: ").appendSuggestHover("&e" + asn, asn, "Click to copy!");
|
||||||
|
msg.appendText("\n&6> Org: ").appendSuggestHover("&e" + org, org, "Click to copy!");
|
||||||
|
}
|
||||||
|
|
||||||
|
msg.appendText("\n\n&7Data provided by mojang:");
|
||||||
|
msg.appendText("\n&6> All ingame names used so far: &e" + namesUsed);
|
||||||
|
msg.send();
|
||||||
|
} catch (Exception e) {
|
||||||
|
getLogger().message(sender, true, "Sorry, something went wrong while fetching data");
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
3
src/main/java/com/redstoner/modules/check/module.info
Normal file
3
src/main/java/com/redstoner/modules/check/module.info
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: Check
|
||||||
|
category: Staff
|
||||||
|
description: A tool to get basic data about players, such as forums account, playtimes and similar
|
||||||
@@ -7,7 +7,7 @@ command clear{
|
|||||||
}
|
}
|
||||||
[string:player] {
|
[string:player] {
|
||||||
help Clears someone elses inventory;
|
help Clears someone elses inventory;
|
||||||
perm utils.admin.clear;
|
perm utils.clear.other;
|
||||||
run clearother player;
|
run clearother player;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -12,33 +12,31 @@ import com.redstoner.misc.CommandHolderType;
|
|||||||
import com.redstoner.modules.Module;
|
import com.redstoner.modules.Module;
|
||||||
|
|
||||||
@Commands(CommandHolderType.File)
|
@Commands(CommandHolderType.File)
|
||||||
@Version(major = 4, minor = 1, revision = 0, compatible = 4)
|
@Version(major = 4, minor = 0, revision = 0, compatible = 4)
|
||||||
public class Clear implements Module
|
public class Clear implements Module {
|
||||||
{
|
|
||||||
@Command(hook = "clear")
|
@Command(hook = "clear")
|
||||||
public boolean clearInventory(CommandSender sender)
|
public boolean clearInventory(CommandSender sender) {
|
||||||
{
|
|
||||||
Player player = (Player) sender;
|
Player player = (Player) sender;
|
||||||
|
|
||||||
Inventory inv = player.getInventory();
|
Inventory inv = player.getInventory();
|
||||||
for (int i = 0; i < 36; i++)
|
for (int i = 0; i < 36; i++) inv.clear(i);
|
||||||
inv.clear(i);
|
|
||||||
getLogger().message(sender, "Cleared your inventory!");
|
getLogger().message(sender, "Cleared your inventory!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "clearother")
|
@Command(hook = "clearother")
|
||||||
public boolean clearOtherInventory(CommandSender sender, String name)
|
public boolean clearOtherInventory(CommandSender sender, String name) {
|
||||||
{
|
|
||||||
Player player = Bukkit.getPlayer(name);
|
Player player = Bukkit.getPlayer(name);
|
||||||
if (player == null)
|
|
||||||
getLogger().message(sender, true, "That player couldn't be found!");
|
if (player == null) getLogger().message(sender, true, "That player couldn't be found!");
|
||||||
else
|
else {
|
||||||
{
|
|
||||||
Inventory inv = player.getInventory();
|
Inventory inv = player.getInventory();
|
||||||
for (int i = 0; i < 36; i++)
|
for (int i = 0; i < 36; i++) inv.clear(i);
|
||||||
inv.clear(i);
|
|
||||||
getLogger().message(sender, "Cleared " + player.getDisplayName() + "&7's inventory!");
|
getLogger().message(sender, "Cleared " + player.getDisplayName() + "&7's inventory!");
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
3
src/main/java/com/redstoner/modules/clear/module.info
Normal file
3
src/main/java/com/redstoner/modules/clear/module.info
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: Clear
|
||||||
|
category: Other
|
||||||
|
description: Allows players to clear their inventories
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
command cycle {
|
command cycle {
|
||||||
|
perm utils.cycle;
|
||||||
|
type player;
|
||||||
on {
|
on {
|
||||||
help Turns on cycle;
|
help Turns on cycle;
|
||||||
type player;
|
|
||||||
run cycle_on;
|
run cycle_on;
|
||||||
}
|
}
|
||||||
off {
|
off {
|
||||||
help Turns off cycle;
|
help Turns off cycle;
|
||||||
type player;
|
|
||||||
run cycle_off;
|
run cycle_off;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -24,119 +24,109 @@ import com.redstoner.modules.Module;
|
|||||||
|
|
||||||
@Commands(CommandHolderType.File)
|
@Commands(CommandHolderType.File)
|
||||||
@AutoRegisterListener
|
@AutoRegisterListener
|
||||||
@Version(major = 4, minor = 1, revision = 0, compatible = 4)
|
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
public class Cycle implements Module, Listener
|
public class Cycle implements Module, Listener {
|
||||||
{
|
|
||||||
private File cycleFile = new File(Main.plugin.getDataFolder(), "cycle.json");
|
private File cycleFile = new File(Main.plugin.getDataFolder(), "cycle.json");
|
||||||
private JSONArray no_cyclers;
|
private JSONArray no_cyclers;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onEnable()
|
public boolean onEnable() {
|
||||||
{
|
|
||||||
no_cyclers = JsonManager.getArray(cycleFile);
|
no_cyclers = JsonManager.getArray(cycleFile);
|
||||||
if (no_cyclers == null)
|
if (no_cyclers == null) no_cyclers = new JSONArray();
|
||||||
no_cyclers = new JSONArray();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisable()
|
public void onDisable() {
|
||||||
{
|
|
||||||
saveCyclers();
|
saveCyclers();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void saveCyclers()
|
private void saveCyclers() {
|
||||||
{
|
|
||||||
JsonManager.save(no_cyclers, cycleFile);
|
JsonManager.save(no_cyclers, cycleFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "cycle_on")
|
@Command(hook = "cycle_on")
|
||||||
public boolean cycleOn(CommandSender sender)
|
public boolean cycleOn(CommandSender sender) {
|
||||||
{
|
|
||||||
UUID uid = ((Player) sender).getUniqueId();
|
UUID uid = ((Player) sender).getUniqueId();
|
||||||
if (no_cyclers.remove(uid.toString()))
|
|
||||||
{
|
if (no_cyclers.remove(uid.toString())) {
|
||||||
getLogger().message(sender, "Cycle enabled!");
|
getLogger().message(sender, "Cycle enabled!");
|
||||||
saveCyclers();
|
saveCyclers();
|
||||||
}
|
} else getLogger().message(sender, "Cycle was already enabled!");
|
||||||
else
|
|
||||||
getLogger().message(sender, "Cycle was already enabled!");
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@Command(hook = "cycle_off")
|
@Command(hook = "cycle_off")
|
||||||
public boolean cycleOff(CommandSender sender)
|
public boolean cycleOff(CommandSender sender) {
|
||||||
{
|
|
||||||
UUID uid = ((Player) sender).getUniqueId();
|
UUID uid = ((Player) sender).getUniqueId();
|
||||||
if (!no_cyclers.contains(uid.toString()))
|
|
||||||
{
|
if (!no_cyclers.contains(uid.toString())) {
|
||||||
getLogger().message(sender, "Cycle disabled!");
|
getLogger().message(sender, "Cycle disabled!");
|
||||||
no_cyclers.add(uid.toString());
|
no_cyclers.add(uid.toString());
|
||||||
saveCyclers();
|
saveCyclers();
|
||||||
}
|
} else getLogger().message(sender, "Cycle was already disabled!");
|
||||||
else
|
|
||||||
getLogger().message(sender, "Cycle was already disabled!");
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
public void onInventoryCycle(PlayerItemHeldEvent event)
|
public void onInventoryCycle(PlayerItemHeldEvent event) {
|
||||||
{
|
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
UUID uid = player.getUniqueId();
|
UUID uid = player.getUniqueId();
|
||||||
if (!player.getGameMode().equals(GameMode.CREATIVE) || player.isSneaking()
|
|
||||||
|| no_cyclers.contains(uid.toString()))
|
if (!player.getGameMode().equals(GameMode.CREATIVE) || player.isSneaking() || no_cyclers.contains(uid.toString())) return;
|
||||||
return;
|
|
||||||
int prev_slot = event.getPreviousSlot();
|
int prev_slot = event.getPreviousSlot();
|
||||||
int new_slot = event.getNewSlot();
|
int new_slot = event.getNewSlot();
|
||||||
if (prev_slot == 0 && new_slot == 8)
|
|
||||||
shift(player, false);
|
if (prev_slot == 0 && new_slot == 8) shift(player, false);
|
||||||
else if (prev_slot == 8 && new_slot == 0)
|
else if (prev_slot == 8 && new_slot == 0) shift(player, true);
|
||||||
shift(player, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void shift(Player player, boolean down)
|
private void shift(Player player, boolean down) {
|
||||||
{
|
|
||||||
Inventory inv = player.getInventory();
|
Inventory inv = player.getInventory();
|
||||||
ItemStack[] items = inv.getStorageContents();
|
ItemStack[] items = inv.getStorageContents();
|
||||||
|
|
||||||
int shift = down ? -9 : 9;
|
int shift = down ? -9 : 9;
|
||||||
shift = (shift + items.length) % items.length;
|
shift = (shift + items.length) % items.length;
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
for (int i = 0; i < 4; i++) {
|
||||||
items = join(subset(items, shift, items.length), subset(items, 0, shift));
|
items = join(subset(items, shift, items.length), subset(items, 0, shift));
|
||||||
|
|
||||||
ItemStack[] hotbar = subset(items, 0, 9);
|
ItemStack[] hotbar = subset(items, 0, 9);
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
for (ItemStack item : hotbar)
|
|
||||||
if (item != null)
|
for (ItemStack item : hotbar) if (item != null) {
|
||||||
{
|
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (found)
|
|
||||||
break;
|
if (found) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
inv.setStorageContents(items);
|
inv.setStorageContents(items);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ItemStack[] subset(ItemStack[] items, int start, int end)
|
private ItemStack[] subset(ItemStack[] items, int start, int end) {
|
||||||
{
|
|
||||||
ItemStack[] result = new ItemStack[end - start];
|
ItemStack[] result = new ItemStack[end - start];
|
||||||
for (int i = start; i < end; i++)
|
|
||||||
{
|
for (int i = start; i < end; i++) {
|
||||||
result[i - start] = items[i];
|
result[i - start] = items[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ItemStack[] join(ItemStack[] items1, ItemStack[] items2)
|
private ItemStack[] join(ItemStack[] items1, ItemStack[] items2) {
|
||||||
{
|
|
||||||
ItemStack[] result = new ItemStack[items1.length + items2.length];
|
ItemStack[] result = new ItemStack[items1.length + items2.length];
|
||||||
for (int i = 0; i < items1.length; i++)
|
|
||||||
result[i] = items1[i];
|
for (int i = 0; i < items1.length; i++) result[i] = items1[i];
|
||||||
int offset = items1.length;
|
int offset = items1.length;
|
||||||
for (int i = 0; i < items2.length; i++)
|
for (int i = 0; i < items2.length; i++) result[i + offset] = items2[i];
|
||||||
result[i + offset] = items2[i];
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
3
src/main/java/com/redstoner/modules/cycle/module.info
Normal file
3
src/main/java/com/redstoner/modules/cycle/module.info
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: Cycle
|
||||||
|
category: Other
|
||||||
|
description: Basically more hotbars. When you scroll over, it will load the next line of your inventory as your hotbar
|
||||||
@@ -1,15 +1,14 @@
|
|||||||
command damnspam {
|
command damnspam {
|
||||||
perm utils.damnspam;
|
perm utils.damnspam;
|
||||||
|
type player;
|
||||||
|
|
||||||
[double:seconds] {
|
[double:seconds] {
|
||||||
run damnspamSingle seconds;
|
run damnspamSingle seconds;
|
||||||
help Set single input cooldown for button or lever.;
|
help Set single input cooldown for button or lever.;
|
||||||
type player;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[double:secondsOff] [double:secondsOn] {
|
[double:secondsOff] [double:secondsOn] {
|
||||||
run damnspamDouble secondsOff secondsOn;
|
run damnspamDouble secondsOff secondsOn;
|
||||||
help Set input cooldown after it's been turned off and turned on (for lever only).;
|
help Set input cooldown after it's been turned off and turned on (for lever only).;
|
||||||
type player;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -39,265 +39,272 @@ import com.redstoner.modules.Module;
|
|||||||
|
|
||||||
@Commands(CommandHolderType.File)
|
@Commands(CommandHolderType.File)
|
||||||
@AutoRegisterListener
|
@AutoRegisterListener
|
||||||
@Version(major = 4, minor = 1, revision = 0, compatible = 4)
|
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
public class DamnSpam implements Module, Listener
|
public class DamnSpam implements Module, Listener {
|
||||||
{
|
|
||||||
File configFile = new File(Main.plugin.getDataFolder(), "DamnSpam.json");
|
File configFile = new File(Main.plugin.getDataFolder(), "DamnSpam.json");
|
||||||
|
|
||||||
Map<String, SpamInput> inputs;
|
Map<String, SpamInput> inputs;
|
||||||
boolean changingInput = false;
|
|
||||||
List<Material> acceptedInputs;
|
List<Material> acceptedInputs;
|
||||||
|
|
||||||
HashMap<Material, int[][]> attachedBlocks;
|
HashMap<Material, int[][]> attachedBlocks;
|
||||||
HashMap<Player, SpamInput> players;
|
HashMap<Player, SpamInput> players;
|
||||||
|
|
||||||
|
boolean changingInput = false;
|
||||||
int maxTimeout = 240;
|
int maxTimeout = 240;
|
||||||
|
|
||||||
String timeoutErrorString = "The timeout must be -1 or within 0 and " + maxTimeout;
|
String timeoutErrorString = "The timeout must be -1 or within 0 and " + maxTimeout;
|
||||||
|
|
||||||
|
private static final BlockFace[] DIRECTIONS = { BlockFace.DOWN, BlockFace.UP, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST, BlockFace.EAST };
|
||||||
|
|
||||||
|
private static final int[][] LEVER_ATTACHED_BLOCKS = new int[][] { { 0, 7, 8, 15 }, { 5, 6, 13, 14 }, { 4, 12 }, { 3, 11 }, { 2, 10 }, { 1, 9 } };
|
||||||
|
private static final int[][] BUTTON_ATTACHED_BLOCKS = new int[][] { { 0, 8 }, { 5, 6, 7, 13, 14, 15 }, { 4, 12 }, { 3, 11 }, { 2, 10 }, { 1, 9 } };
|
||||||
|
|
||||||
|
// @formatter:off
|
||||||
|
private static final Material[] BUTTONS = {
|
||||||
|
Material.ACACIA_BUTTON,
|
||||||
|
Material.BIRCH_BUTTON,
|
||||||
|
Material.DARK_OAK_BUTTON,
|
||||||
|
Material.JUNGLE_BUTTON,
|
||||||
|
Material.OAK_BUTTON,
|
||||||
|
Material.SPRUCE_BUTTON,
|
||||||
|
Material.STONE_BUTTON
|
||||||
|
};
|
||||||
|
// @formatter:on
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onEnable()
|
public boolean onEnable() {
|
||||||
{
|
|
||||||
loadInputs();
|
loadInputs();
|
||||||
|
|
||||||
acceptedInputs = new ArrayList<Material>();
|
acceptedInputs = new ArrayList<Material>();
|
||||||
Collections.addAll(acceptedInputs, Material.WOOD_BUTTON, Material.STONE_BUTTON, Material.LEVER);
|
acceptedInputs.add(Material.LEVER);
|
||||||
|
|
||||||
|
Collections.addAll(acceptedInputs, BUTTONS);
|
||||||
|
|
||||||
attachedBlocks = new HashMap<Material, int[][]>();
|
attachedBlocks = new HashMap<Material, int[][]>();
|
||||||
attachedBlocks.put(Material.LEVER,
|
attachedBlocks.put(Material.LEVER, LEVER_ATTACHED_BLOCKS);
|
||||||
new int[][] {{0, 7, 8, 15}, {5, 6, 13, 14}, {4, 12}, {3, 11}, {2, 10}, {1, 9}});
|
|
||||||
attachedBlocks.put(Material.STONE_BUTTON,
|
for (Material button : BUTTONS) {
|
||||||
new int[][] {{0, 8}, {5, 6, 7, 13, 14, 15}, {4, 12}, {3, 11}, {2, 10}, {1, 9}});
|
attachedBlocks.put(button, BUTTON_ATTACHED_BLOCKS);
|
||||||
attachedBlocks.put(Material.WOOD_BUTTON,
|
}
|
||||||
new int[][] {{0, 8}, {5, 6, 7, 13, 14, 15}, {4, 12}, {3, 11}, {2, 10}, {1, 9}});
|
|
||||||
players = new HashMap<Player, SpamInput>();
|
players = new HashMap<Player, SpamInput>();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadInputs()
|
public void loadInputs() {
|
||||||
{
|
|
||||||
inputs = new HashMap<String, SpamInput>();
|
inputs = new HashMap<String, SpamInput>();
|
||||||
try
|
|
||||||
{
|
try {
|
||||||
FileReader reader = new FileReader(configFile);
|
FileReader reader = new FileReader(configFile);
|
||||||
JSONObject json = (JSONObject) new JSONParser().parse(reader);
|
JSONObject json = (JSONObject) new JSONParser().parse(reader);
|
||||||
for (Object key : json.keySet())
|
|
||||||
{
|
for (Object key : json.keySet()) {
|
||||||
JSONObject inputData = (JSONObject) json.get(key);
|
JSONObject inputData = (JSONObject) json.get(key);
|
||||||
String uuid = (String) inputData.get("creator");
|
String uuid = (String) inputData.get("creator");
|
||||||
Double timeoutOn = (Double) inputData.get("timeout_on");
|
Double timeoutOn = (Double) inputData.get("timeout_on");
|
||||||
Double timeoutOff = (Double) inputData.get("timeout_off");
|
Double timeoutOff = (Double) inputData.get("timeout_off");
|
||||||
Double lastTime = (Double) inputData.get("last_time");
|
Double lastTime = (Double) inputData.get("last_time");
|
||||||
|
|
||||||
inputs.put((String) key, new SpamInput(uuid, timeoutOff, timeoutOn, lastTime));
|
inputs.put((String) key, new SpamInput(uuid, timeoutOff, timeoutOn, lastTime));
|
||||||
}
|
}
|
||||||
}
|
} catch (IOException | ParseException e) {
|
||||||
catch (IOException | ParseException e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public void saveInputs()
|
public void saveInputs() {
|
||||||
{
|
|
||||||
JSONObject json = new JSONObject();
|
JSONObject json = new JSONObject();
|
||||||
for (String key : inputs.keySet())
|
|
||||||
{
|
for (String key : inputs.keySet()) {
|
||||||
JSONObject jsonInput = new JSONObject();
|
JSONObject jsonInput = new JSONObject();
|
||||||
SpamInput input = inputs.get(key);
|
SpamInput input = inputs.get(key);
|
||||||
|
|
||||||
jsonInput.put("creator", input.player);
|
jsonInput.put("creator", input.player);
|
||||||
jsonInput.put("timeout_on", input.timeoutOn);
|
jsonInput.put("timeout_on", input.timeoutOn);
|
||||||
jsonInput.put("timeout_off", input.timeoutOff);
|
jsonInput.put("timeout_off", input.timeoutOff);
|
||||||
jsonInput.put("last_time", input.lastTime);
|
jsonInput.put("last_time", input.lastTime);
|
||||||
|
|
||||||
json.put(key, jsonInput);
|
json.put(key, jsonInput);
|
||||||
}
|
}
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
PrintWriter writer = new PrintWriter(configFile);
|
PrintWriter writer = new PrintWriter(configFile);
|
||||||
writer.write(json.toJSONString());
|
writer.write(json.toJSONString());
|
||||||
writer.close();
|
writer.close();
|
||||||
}
|
} catch (FileNotFoundException e) {
|
||||||
catch (FileNotFoundException e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String locationString(Location loc)
|
public String locationString(Location loc) {
|
||||||
{
|
|
||||||
return loc.getWorld().getName() + ";" + loc.getBlockX() + ";" + loc.getBlockY() + ";" + loc.getBlockZ();
|
return loc.getWorld().getName() + ";" + loc.getBlockX() + ";" + loc.getBlockY() + ";" + loc.getBlockZ();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isAcceptableTimeout(double timeout)
|
public boolean isAcceptableTimeout(double timeout) {
|
||||||
{
|
|
||||||
return (timeout > 0 && timeout <= maxTimeout) || timeout == -1;
|
return (timeout > 0 && timeout <= maxTimeout) || timeout == -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canBuild(Player player, Block block)
|
public boolean canBuild(Player player, Block block) {
|
||||||
{
|
|
||||||
BlockBreakEvent event = new BlockBreakEvent(block, player);
|
BlockBreakEvent event = new BlockBreakEvent(block, player);
|
||||||
Bukkit.getPluginManager().callEvent(event);
|
Bukkit.getPluginManager().callEvent(event);
|
||||||
|
|
||||||
return !event.isCancelled();
|
return !event.isCancelled();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "damnspamSingle")
|
@Command(hook = "damnspamSingle")
|
||||||
public void damnspam(CommandSender sender, double seconds)
|
public void damnspam(CommandSender sender, double seconds) {
|
||||||
{
|
|
||||||
boolean destroyingInput = false;
|
boolean destroyingInput = false;
|
||||||
|
|
||||||
seconds = (double) Math.round(seconds * 100) / 100;
|
seconds = (double) Math.round(seconds * 100) / 100;
|
||||||
if (seconds == 0)
|
|
||||||
destroyingInput = true;
|
if (seconds == 0) destroyingInput = true;
|
||||||
else if (!isAcceptableTimeout(seconds))
|
else if (!isAcceptableTimeout(seconds)) {
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "The timeout must be -1 or within 0 and " + maxTimeout);
|
getLogger().message(sender, true, "The timeout must be -1 or within 0 and " + maxTimeout);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
getLogger().message(sender, "Please click the input you would like to set.");
|
getLogger().message(sender, "Please click the input you would like to set.");
|
||||||
setPlayer((Player) sender, destroyingInput, seconds, seconds);
|
setPlayer((Player) sender, destroyingInput, seconds, seconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "damnspamDouble")
|
@Command(hook = "damnspamDouble")
|
||||||
public void damnspam(CommandSender sender, double secondsOff, double secondsOn)
|
public void damnspam(CommandSender sender, double secondsOff, double secondsOn) {
|
||||||
{
|
|
||||||
boolean destroyingInput = false;
|
boolean destroyingInput = false;
|
||||||
|
|
||||||
secondsOn = (double) Math.round(secondsOn * 100) / 100;
|
secondsOn = (double) Math.round(secondsOn * 100) / 100;
|
||||||
secondsOff = (double) Math.round(secondsOff * 100) / 100;
|
secondsOff = (double) Math.round(secondsOff * 100) / 100;
|
||||||
if (secondsOn == 0 && secondsOff == 0)
|
|
||||||
{
|
if (secondsOn == 0 && secondsOff == 0) {
|
||||||
destroyingInput = true;
|
destroyingInput = true;
|
||||||
}
|
} else if (!(isAcceptableTimeout(secondsOn) && isAcceptableTimeout(secondsOff))) {
|
||||||
else if (!(isAcceptableTimeout(secondsOn) && isAcceptableTimeout(secondsOff)))
|
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "The timeout must be -1 or within 0 and " + maxTimeout);
|
getLogger().message(sender, true, "The timeout must be -1 or within 0 and " + maxTimeout);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
getLogger().message(sender, "Please click the input you would like to set.");
|
getLogger().message(sender, "Please click the input you would like to set.");
|
||||||
setPlayer((Player) sender, destroyingInput, secondsOff, secondsOn);
|
setPlayer((Player) sender, destroyingInput, secondsOff, secondsOn);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPlayer(Player player, boolean destroying, double timeoutOff, double timeoutOn)
|
public void setPlayer(Player player, boolean destroying, double timeoutOff, double timeoutOn) {
|
||||||
{
|
|
||||||
SpamInput input = null;
|
SpamInput input = null;
|
||||||
if (!destroying)
|
|
||||||
{
|
if (!destroying) {
|
||||||
input = new SpamInput(player.getUniqueId().toString(), timeoutOff, timeoutOn, 0);
|
input = new SpamInput(player.getUniqueId().toString(), timeoutOff, timeoutOn, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
players.put(player, input);
|
players.put(player, input);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean attemptInputRegister(Player player, Block block, Cancellable event)
|
public boolean attemptInputRegister(Player player, Block block, Cancellable event) {
|
||||||
{
|
if (players.containsKey(player)) {
|
||||||
if (players.containsKey(player))
|
if (!acceptedInputs.contains(block.getType())) {
|
||||||
{
|
|
||||||
if (!acceptedInputs.contains(block.getType()))
|
|
||||||
{
|
|
||||||
getLogger().message(player, true, "That block is not an acceptable input!");
|
getLogger().message(player, true, "That block is not an acceptable input!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
String typeStr = block.getType().toString().toLowerCase().replace("_", " ");
|
String typeStr = block.getType().toString().toLowerCase().replace("_", " ");
|
||||||
String locationStr = locationString(block.getLocation());
|
String locationStr = locationString(block.getLocation());
|
||||||
|
|
||||||
changingInput = true;
|
changingInput = true;
|
||||||
boolean buildCheck = canBuild(player, block);
|
boolean buildCheck = canBuild(player, block);
|
||||||
changingInput = false;
|
changingInput = false;
|
||||||
if (!buildCheck)
|
|
||||||
{
|
if (!buildCheck) {
|
||||||
getLogger().message(player, true,
|
getLogger().message(player, true, "Something went wrong trying to change the timeout on this " + typeStr + "!");
|
||||||
"Something went wrong trying to change the timeout on this " + typeStr + "!");
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
SpamInput input = players.get(player);
|
SpamInput input = players.get(player);
|
||||||
if (input == null)
|
|
||||||
{
|
if (input == null) {
|
||||||
if (!inputs.containsKey(locationStr))
|
if (!inputs.containsKey(locationStr)) {
|
||||||
{
|
getLogger().message(player, true, "Something went wrong trying to change the timeout on this " + typeStr + "!");
|
||||||
getLogger().message(player, true,
|
|
||||||
"Something went wrong trying to change the timeout on this " + typeStr + "!");
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
inputs.remove(locationStr);
|
inputs.remove(locationStr);
|
||||||
getLogger().message(player, "Successfully removed the timeout for this " + typeStr);
|
getLogger().message(player, "Successfully removed the timeout for this " + typeStr);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
inputs.put(locationStr, players.get(player));
|
inputs.put(locationStr, players.get(player));
|
||||||
getLogger().message(player, "Successfully set a timeout for this " + typeStr);
|
getLogger().message(player, "Successfully set a timeout for this " + typeStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
players.remove(player);
|
players.remove(player);
|
||||||
saveInputs();
|
saveInputs();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkBlockBreak(BlockBreakEvent event, Block block)
|
public void checkBlockBreak(BlockBreakEvent event, Block block) {
|
||||||
{
|
if (!acceptedInputs.contains(block.getType())) return;
|
||||||
if (!acceptedInputs.contains(block.getType()))
|
|
||||||
return;
|
|
||||||
String posStr = locationString(block.getLocation());
|
String posStr = locationString(block.getLocation());
|
||||||
if (!inputs.containsKey(posStr))
|
if (!inputs.containsKey(posStr)) return;
|
||||||
return;
|
|
||||||
SpamInput input = inputs.get(posStr);
|
SpamInput input = inputs.get(posStr);
|
||||||
Player sender = event.getPlayer();
|
Player sender = event.getPlayer();
|
||||||
|
|
||||||
String typeStr = block.getType().toString().toLowerCase().replace("_", " ");
|
String typeStr = block.getType().toString().toLowerCase().replace("_", " ");
|
||||||
String inputStr = (block.getLocation().equals(event.getBlock()) ? "this " + typeStr
|
String inputStr = (block.getLocation().equals(event.getBlock()) ? "this " + typeStr : "the " + typeStr + " attached to that block");
|
||||||
: "the " + typeStr + " attached to that block");
|
|
||||||
if (!sender.isSneaking())
|
if (!sender.isSneaking()) {
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "You cannot destroy " + inputStr);
|
getLogger().message(sender, true, "You cannot destroy " + inputStr);
|
||||||
getLogger().message(sender, true, "Sneak and break or set the timeout to 0 if you want to remove it.");
|
getLogger().message(sender, true, "Sneak and break or set the timeout to 0 if you want to remove it.");
|
||||||
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (sender.hasPermission("damnspam.admin") || sender.getUniqueId().toString().equals(input.player))
|
|
||||||
{
|
if (sender.hasPermission("damnspam.admin") || sender.getUniqueId().toString().equals(input.player)) {
|
||||||
inputs.remove(posStr);
|
inputs.remove(posStr);
|
||||||
saveInputs();
|
saveInputs();
|
||||||
getLogger().message(sender, "Succesfully removed " + inputStr);
|
getLogger().message(sender, "Succesfully removed " + inputStr);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "You are not allowed to remove " + inputStr);
|
getLogger().message(sender, true, "You are not allowed to remove " + inputStr);
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public List<Block> getAttachedBlocks(Block block)
|
public List<Block> getAttachedBlocks(Block block) {
|
||||||
{
|
|
||||||
List<Block> blocks = new ArrayList<Block>();
|
List<Block> blocks = new ArrayList<Block>();
|
||||||
BlockFace[] directions = {BlockFace.DOWN, BlockFace.UP, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.WEST,
|
|
||||||
BlockFace.EAST};
|
for (int i = 0; i < DIRECTIONS.length; i++) {
|
||||||
for (int i = 0; i < directions.length; i++)
|
Block side = block.getRelative(DIRECTIONS[i]);
|
||||||
{
|
|
||||||
Block side = block.getRelative(directions[i]);
|
|
||||||
int[][] dvalues = attachedBlocks.get(side.getType());
|
int[][] dvalues = attachedBlocks.get(side.getType());
|
||||||
if (dvalues != null)
|
|
||||||
{
|
if (dvalues != null) {
|
||||||
boolean onSide = false;
|
boolean onSide = false;
|
||||||
for (int val : dvalues[i])
|
|
||||||
{
|
for (int val : dvalues[i]) {
|
||||||
if (side.getData() == (byte) val)
|
if (side.getData() == (byte) val) {
|
||||||
{
|
|
||||||
onSide = true;
|
onSide = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (onSide)
|
|
||||||
blocks.add(side);
|
if (onSide) blocks.add(side);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return blocks;
|
return blocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.NORMAL)
|
@EventHandler(priority = EventPriority.NORMAL)
|
||||||
public void onBreak(BlockBreakEvent event)
|
public void onBreak(BlockBreakEvent event) {
|
||||||
{
|
if (changingInput || event.isCancelled()) return;
|
||||||
if (changingInput || event.isCancelled())
|
|
||||||
return;
|
|
||||||
boolean register = attemptInputRegister(event.getPlayer(), event.getBlock(), event);
|
boolean register = attemptInputRegister(event.getPlayer(), event.getBlock(), event);
|
||||||
if (!register)
|
|
||||||
{
|
if (!register) {
|
||||||
Block block = event.getBlock();
|
Block block = event.getBlock();
|
||||||
checkBlockBreak(event, block);
|
checkBlockBreak(event, block);
|
||||||
for (Block affected : getAttachedBlocks(block))
|
|
||||||
{
|
for (Block affected : getAttachedBlocks(block)) {
|
||||||
checkBlockBreak(event, affected);
|
checkBlockBreak(event, affected);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -305,43 +312,36 @@ public class DamnSpam implements Module, Listener
|
|||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
@EventHandler(priority = EventPriority.HIGHEST)
|
@EventHandler(priority = EventPriority.HIGHEST)
|
||||||
public void onInteract(PlayerInteractEvent event)
|
public void onInteract(PlayerInteractEvent event) {
|
||||||
{
|
if (event.getClickedBlock() == null) return;
|
||||||
if (event.getClickedBlock() == null)
|
|
||||||
return;
|
|
||||||
boolean register = attemptInputRegister(event.getPlayer(), event.getClickedBlock(), event);
|
boolean register = attemptInputRegister(event.getPlayer(), event.getClickedBlock(), event);
|
||||||
if (!register && event.getAction().equals(Action.RIGHT_CLICK_BLOCK) && !event.isCancelled())
|
|
||||||
{
|
if (!register && event.getAction().equals(Action.RIGHT_CLICK_BLOCK) && !event.isCancelled()) {
|
||||||
Player sender = event.getPlayer();
|
Player sender = event.getPlayer();
|
||||||
Block block = event.getClickedBlock();
|
Block block = event.getClickedBlock();
|
||||||
String posStr = locationString(block.getLocation());
|
String posStr = locationString(block.getLocation());
|
||||||
SpamInput data = inputs.get(posStr);
|
SpamInput data = inputs.get(posStr);
|
||||||
if (data != null)
|
|
||||||
{
|
if (data != null) {
|
||||||
String btype = block.getType().toString().toLowerCase().replace("_", " ");
|
String btype = block.getType().toString().toLowerCase().replace("_", " ");
|
||||||
double checktime = 0;
|
double checktime = 0;
|
||||||
if (btype.equals("lever") && block.getData() < 8)
|
|
||||||
checktime = data.timeoutOff;
|
if (btype.equals("lever") && block.getData() < 8) checktime = data.timeoutOff;
|
||||||
else
|
else checktime = data.timeoutOn;
|
||||||
checktime = data.timeoutOn;
|
|
||||||
double timeLeft = (data.lastTime + checktime)
|
double timeLeft = (data.lastTime + checktime) - ((double) Math.round((double) System.currentTimeMillis() / 10) / 100);
|
||||||
- ((double) Math.round((double) System.currentTimeMillis() / 10) / 100);
|
|
||||||
timeLeft = (double) Math.round(timeLeft * 100) / 100;
|
timeLeft = (double) Math.round(timeLeft * 100) / 100;
|
||||||
if (checktime == -1)
|
|
||||||
{
|
if (checktime == -1) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
getLogger().message(sender, "This " + btype + " is locked permanently by /damnspam.");
|
getLogger().message(sender, "This " + btype + " is locked permanently by /damnspam.");
|
||||||
}
|
} else if (timeLeft > 0) {
|
||||||
else if (timeLeft > 0)
|
|
||||||
{
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
getLogger().message(sender, "This " + btype + " has a damnspam timeout of " + checktime + ", with "
|
getLogger().message(sender, "This " + btype + " has a damnspam timeout of " + checktime + ", with " + timeLeft + " left.");
|
||||||
+ timeLeft + " left.");
|
} else {
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
data.lastTime = (double) Math.round((double) System.currentTimeMillis() / 10) / 100;
|
data.lastTime = (double) Math.round((double) System.currentTimeMillis() / 10) / 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
inputs.put(posStr, data);
|
inputs.put(posStr, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
3
src/main/java/com/redstoner/modules/damnspam/module.info
Normal file
3
src/main/java/com/redstoner/modules/damnspam/module.info
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: Damnspam
|
||||||
|
category: Other
|
||||||
|
description: Protects levers and buttons from being spammed by providing a configurable timeout for inputs
|
||||||
@@ -9,7 +9,7 @@ command config {
|
|||||||
alias configs;
|
alias configs;
|
||||||
alias setting;
|
alias setting;
|
||||||
alias settings;
|
alias settings;
|
||||||
perm datamanager.admin;
|
perm utils.datamanager.admin;
|
||||||
list {
|
list {
|
||||||
run config_list;
|
run config_list;
|
||||||
help Lists all modules that have at least one config setting.;
|
help Lists all modules that have at least one config setting.;
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: Datamanager
|
||||||
|
category: Other
|
||||||
|
description: Adds easy module and player based data management
|
||||||
8
src/main/java/com/redstoner/modules/discord/Discord.cmd
Normal file
8
src/main/java/com/redstoner/modules/discord/Discord.cmd
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
command discord {
|
||||||
|
perm utils.discord;
|
||||||
|
[empty] {
|
||||||
|
help Info, Register Instructions, and Token for the Discord;
|
||||||
|
run discord;
|
||||||
|
type player;
|
||||||
|
}
|
||||||
|
}
|
||||||
126
src/main/java/com/redstoner/modules/discord/Discord.java
Normal file
126
src/main/java/com/redstoner/modules/discord/Discord.java
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
package com.redstoner.modules.discord;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.security.SecureRandom;
|
||||||
|
|
||||||
|
import com.redstoner.exceptions.NonSaveableConfigException;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import com.nemez.cmdmgr.Command;
|
||||||
|
import com.redstoner.annotations.Commands;
|
||||||
|
import com.redstoner.annotations.Version;
|
||||||
|
import com.redstoner.misc.CommandHolderType;
|
||||||
|
import com.redstoner.misc.mysql.Config;
|
||||||
|
import com.redstoner.misc.mysql.MysqlHandler;
|
||||||
|
import com.redstoner.misc.mysql.elements.ConstraintOperator;
|
||||||
|
import com.redstoner.misc.mysql.elements.MysqlConstraint;
|
||||||
|
import com.redstoner.misc.mysql.elements.MysqlDatabase;
|
||||||
|
import com.redstoner.misc.mysql.elements.MysqlField;
|
||||||
|
import com.redstoner.misc.mysql.elements.MysqlTable;
|
||||||
|
import com.redstoner.misc.mysql.types.number.TinyInt;
|
||||||
|
import com.redstoner.misc.mysql.types.text.VarChar;
|
||||||
|
import com.redstoner.modules.Module;
|
||||||
|
|
||||||
|
import net.nemez.chatapi.click.Message;
|
||||||
|
|
||||||
|
@Commands(CommandHolderType.File)
|
||||||
|
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
|
public class Discord implements Module {
|
||||||
|
private MysqlTable table;
|
||||||
|
|
||||||
|
private String inviteLink;
|
||||||
|
|
||||||
|
private final String tokenCharacters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
||||||
|
private SecureRandom rnd = new SecureRandom();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onEnable() {
|
||||||
|
Config config;
|
||||||
|
|
||||||
|
try {
|
||||||
|
config = Config.getConfig("Discord.json");
|
||||||
|
} catch (IOException | org.json.simple.parser.ParseException e1) {
|
||||||
|
e1.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config == null || !config.containsKey("database") || !config.containsKey("table") || !config.containsKey("inviteLink")) {
|
||||||
|
getLogger().error("Could not load the Discord config file, disabling!");
|
||||||
|
|
||||||
|
config.put("database", "redstoner");
|
||||||
|
config.put("table", "discord");
|
||||||
|
config.put("inviteLink", "https://discord.gg/example");
|
||||||
|
|
||||||
|
try {
|
||||||
|
config.save();
|
||||||
|
} catch (IOException | NonSaveableConfigException e) {}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
inviteLink = config.get("inviteLink");
|
||||||
|
|
||||||
|
try {
|
||||||
|
MysqlDatabase database = MysqlHandler.INSTANCE.getDatabase(config.get("database") + "?autoReconnect=true");
|
||||||
|
|
||||||
|
MysqlField token = new MysqlField("token", new VarChar(8), false);
|
||||||
|
MysqlField uuid = new MysqlField("uuid", new VarChar(36), false);
|
||||||
|
MysqlField used = new MysqlField("used", new TinyInt(1), false);
|
||||||
|
|
||||||
|
database.createTableIfNotExists((String) config.get("table"), token, uuid, used);
|
||||||
|
|
||||||
|
table = database.getTable(config.get("table"));
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
getLogger().error("Could not use the Discord config, aborting!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command(hook = "discord")
|
||||||
|
public void discord(CommandSender sender) {
|
||||||
|
Player p = (Player) sender;
|
||||||
|
String pUUID = p.getUniqueId().toString().replaceAll("-", "");
|
||||||
|
|
||||||
|
String token = null;
|
||||||
|
int tries = 0;
|
||||||
|
|
||||||
|
while (token == null) {
|
||||||
|
token = randomToken(8);
|
||||||
|
Object[] results = table.get("token", new MysqlConstraint("token", ConstraintOperator.EQUAL, token));
|
||||||
|
|
||||||
|
if (results.length > 0) {
|
||||||
|
token = null;
|
||||||
|
tries++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tries > 10) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (token == null) {
|
||||||
|
new Message(sender, null).appendText(
|
||||||
|
"\n&4Could not find an unused token in 10 tries (a 1 in over 20 trillion chance)! Please take a screenshot and run the command again!")
|
||||||
|
.send();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.delete(new MysqlConstraint("uuid", ConstraintOperator.EQUAL, pUUID));
|
||||||
|
table.insert(pUUID, token);
|
||||||
|
|
||||||
|
new Message(sender, null).appendText("\n&cRedstoner&7 has a &2Discord&7 Now! \nClick ")
|
||||||
|
.appendLinkHover("&e" + inviteLink, inviteLink, "&aClick to Join").appendText("&7 to join. \n\nTo sync you rank, copy ")
|
||||||
|
.appendSuggestHover("&e" + token, token, "&aClick to Copy").appendText("&7 into &3#rank-sync&7.\n").send();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String randomToken(int length) {
|
||||||
|
StringBuilder sb = new StringBuilder(length);
|
||||||
|
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
sb.append(tokenCharacters.charAt(rnd.nextInt(tokenCharacters.length())));
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
3
src/main/java/com/redstoner/modules/discord/module.info
Normal file
3
src/main/java/com/redstoner/modules/discord/module.info
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: Discord
|
||||||
|
category: External
|
||||||
|
description: Links your minecraft account to your discord account to sync your rank.
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.redstoner.modules.friends;
|
package com.redstoner.modules.friends;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@@ -30,39 +29,38 @@ import com.redstoner.modules.datamanager.DataManager;
|
|||||||
|
|
||||||
@AutoRegisterListener
|
@AutoRegisterListener
|
||||||
@Commands(CommandHolderType.File)
|
@Commands(CommandHolderType.File)
|
||||||
@Version(major = 4, minor = 0, revision = 0, compatible = 4)
|
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
public class Friends implements CoreModule
|
public class Friends implements CoreModule {
|
||||||
{
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void onPlayerJoin(PlayerJoinEvent e)
|
public void onPlayerJoin(PlayerJoinEvent e) {
|
||||||
{
|
|
||||||
JSONArray friended_by = (JSONArray) DataManager.getOrDefault(e.getPlayer(), "friended_by", new JSONArray());
|
JSONArray friended_by = (JSONArray) DataManager.getOrDefault(e.getPlayer(), "friended_by", new JSONArray());
|
||||||
for (Object obj : friended_by)
|
|
||||||
{
|
for (Object obj : friended_by) {
|
||||||
UUID uuid = UUID.fromString((String) obj);
|
UUID uuid = UUID.fromString((String) obj);
|
||||||
Player p = Bukkit.getPlayer(uuid);
|
Player p = Bukkit.getPlayer(uuid);
|
||||||
if (p != null && p.canSee(e.getPlayer()))
|
|
||||||
{
|
if (p != null && p.canSee(e.getPlayer())) {
|
||||||
getLogger().message(p, "Your friend &e" + e.getPlayer().getDisplayName() + "&7 just joined!");
|
getLogger().message(p, "Your friend &e" + e.getPlayer().getDisplayName() + "&7 just joined!");
|
||||||
p.playSound(p.getLocation(), Sound.ENTITY_CHICKEN_EGG, 1, 1);
|
p.playSound(p.getLocation(), Sound.ENTITY_CHICKEN_EGG, 1, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
JSONArray notifications = (JSONArray) DataManager.getOrDefault(e.getPlayer(), "scheduled_notifications",
|
|
||||||
new JSONArray());
|
JSONArray notifications = (JSONArray) DataManager.getOrDefault(e.getPlayer(), "scheduled_notifications", new JSONArray());
|
||||||
for (Object obj : notifications)
|
|
||||||
|
for (Object obj : notifications) {
|
||||||
getLogger().message(e.getPlayer(), (String) obj);
|
getLogger().message(e.getPlayer(), (String) obj);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void onPlayerLeave(PlayerQuitEvent e)
|
public void onPlayerLeave(PlayerQuitEvent e) {
|
||||||
{
|
|
||||||
JSONArray friended_by = (JSONArray) DataManager.getOrDefault(e.getPlayer(), "friended_by", new JSONArray());
|
JSONArray friended_by = (JSONArray) DataManager.getOrDefault(e.getPlayer(), "friended_by", new JSONArray());
|
||||||
for (Object obj : friended_by)
|
|
||||||
{
|
for (Object obj : friended_by) {
|
||||||
UUID uuid = UUID.fromString((String) obj);
|
UUID uuid = UUID.fromString((String) obj);
|
||||||
Player p = Bukkit.getPlayer(uuid);
|
Player p = Bukkit.getPlayer(uuid);
|
||||||
if (p != null && p.canSee(e.getPlayer()))
|
|
||||||
{
|
if (p != null && p.canSee(e.getPlayer())) {
|
||||||
getLogger().message(p, "Your friend &e" + e.getPlayer().getDisplayName() + "&7 just left!");
|
getLogger().message(p, "Your friend &e" + e.getPlayer().getDisplayName() + "&7 just left!");
|
||||||
p.playSound(p.getLocation(), Sound.ENTITY_CHICKEN_EGG, 1, 1);
|
p.playSound(p.getLocation(), Sound.ENTITY_CHICKEN_EGG, 1, 1);
|
||||||
}
|
}
|
||||||
@@ -71,290 +69,283 @@ public class Friends implements CoreModule
|
|||||||
|
|
||||||
@SuppressWarnings({ "unchecked", "deprecation" })
|
@SuppressWarnings({ "unchecked", "deprecation" })
|
||||||
@Command(hook = "add")
|
@Command(hook = "add")
|
||||||
public boolean add(CommandSender sender, String target)
|
public boolean add(CommandSender sender, String target) {
|
||||||
{
|
if (target.equalsIgnoreCase("CONSOLE")) {
|
||||||
if (target.equalsIgnoreCase("CONSOLE"))
|
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "You can't add console to your friends!");
|
getLogger().message(sender, true, "You can't add console to your friends!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
OfflinePlayer p = Bukkit.getPlayer(target);
|
OfflinePlayer p = Bukkit.getPlayer(target);
|
||||||
if (p == null)
|
|
||||||
p = Bukkit.getOfflinePlayer(target);
|
if (p == null) p = Bukkit.getOfflinePlayer(target);
|
||||||
if (p == null)
|
if (p == null) {
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "That player couldn't be found!");
|
getLogger().message(sender, true, "That player couldn't be found!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "friends", new JSONArray()));
|
JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "friends", new JSONArray()));
|
||||||
if (friends.contains(p.getUniqueId().toString()))
|
|
||||||
{
|
if (friends.contains(p.getUniqueId().toString())) {
|
||||||
getLogger().message(sender, true, "You are already friends with this person!");
|
getLogger().message(sender, true, "You are already friends with this person!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
friends.add(p.getUniqueId().toString());
|
friends.add(p.getUniqueId().toString());
|
||||||
|
DataManager.setData(sender, "friends", friends);
|
||||||
DataManager.save(sender);
|
DataManager.save(sender);
|
||||||
JSONArray friended_by = ((JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "friended_by",
|
|
||||||
new JSONArray()));
|
JSONArray friended_by = ((JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "friended_by", new JSONArray()));
|
||||||
friended_by.add(getID(sender));
|
friended_by.add(getID(sender));
|
||||||
|
DataManager.setData(p.getUniqueId().toString(), "friended_by", friended_by);
|
||||||
|
|
||||||
DataManager.save(p.getUniqueId().toString());
|
DataManager.save(p.getUniqueId().toString());
|
||||||
|
|
||||||
getLogger().message(sender, "You are now friends with &e" + p.getName() + "&7!");
|
getLogger().message(sender, "You are now friends with &e" + p.getName() + "&7!");
|
||||||
if (p instanceof Player)
|
|
||||||
{
|
if (p instanceof Player) {
|
||||||
getLogger().message((Player) p, "&e" + Utils.getName(sender) + "&7 added you as a friend!");
|
getLogger().message((Player) p, "&e" + Utils.getName(sender) + "&7 added you as a friend!");
|
||||||
}
|
} else {
|
||||||
else
|
JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "scheduled_notifications", new JSONArray());
|
||||||
{
|
|
||||||
JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(),
|
|
||||||
"scheduled_notifications", new JSONArray());
|
|
||||||
notifications.add("&e" + Utils.getName(sender) + "&7 added you as a friend!");
|
notifications.add("&e" + Utils.getName(sender) + "&7 added you as a friend!");
|
||||||
notifications.remove("&e" + Utils.getName(sender) + "&7 removed you as a friend!");
|
notifications.remove("&e" + Utils.getName(sender) + "&7 removed you as a friend!");
|
||||||
|
|
||||||
DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications);
|
DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "deprecation", "unchecked" })
|
@SuppressWarnings({ "deprecation", "unchecked" })
|
||||||
@Command(hook = "add_grouped")
|
@Command(hook = "add_grouped")
|
||||||
public boolean add_grouped(CommandSender sender, String target, String group)
|
public boolean add_grouped(CommandSender sender, String target, String group) {
|
||||||
{
|
if (target.equalsIgnoreCase("CONSOLE")) {
|
||||||
if (target.equalsIgnoreCase("CONSOLE"))
|
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "You can't add console to your friends!");
|
getLogger().message(sender, true, "You can't add console to your friends!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
OfflinePlayer p = Bukkit.getPlayer(target);
|
OfflinePlayer p = Bukkit.getPlayer(target);
|
||||||
if (p == null)
|
|
||||||
p = Bukkit.getOfflinePlayer(target);
|
if (p == null) p = Bukkit.getOfflinePlayer(target);
|
||||||
if (p == null)
|
if (p == null) {
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "That player couldn't be found!");
|
getLogger().message(sender, true, "That player couldn't be found!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "groups." + group, new JSONArray()));
|
JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "groups." + group, new JSONArray()));
|
||||||
if (friends.contains(p.getUniqueId().toString()))
|
|
||||||
{
|
if (friends.contains(p.getUniqueId().toString())) {
|
||||||
getLogger().message(sender, true, "This person already is part of that friendsgroup!");
|
getLogger().message(sender, true, "This person already is part of that friendsgroup!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
friends.add(p.getUniqueId().toString());
|
friends.add(p.getUniqueId().toString());
|
||||||
|
DataManager.setData(sender, "groups." + group, friends);
|
||||||
DataManager.save(sender);
|
DataManager.save(sender);
|
||||||
|
|
||||||
getLogger().message(sender, "&e" + p.getName() + "&7 is now part of the group &e" + group + "&7!");
|
getLogger().message(sender, "&e" + p.getName() + "&7 is now part of the group &e" + group + "&7!");
|
||||||
if (p instanceof Player)
|
|
||||||
{
|
if (p instanceof Player) {
|
||||||
getLogger().message((Player) p,
|
getLogger().message((Player) p, "&e" + Utils.getName(sender) + " &7added you to their friendsgroup &e" + group + "&7!");
|
||||||
"&e" + Utils.getName(sender) + " &7added you to their friendsgroup &e" + group + "&7!");
|
} else {
|
||||||
}
|
JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "scheduled_notifications", new JSONArray());
|
||||||
else
|
|
||||||
{
|
|
||||||
JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(),
|
|
||||||
"scheduled_notifications", new JSONArray());
|
|
||||||
notifications.add("&e" + Utils.getName(sender) + " &7added you to their friendsgroup &e" + group + "&7!");
|
notifications.add("&e" + Utils.getName(sender) + " &7added you to their friendsgroup &e" + group + "&7!");
|
||||||
notifications
|
notifications.remove("&e" + Utils.getName(sender) + " &7removed you from their friendsgroup &e" + group + "&7!");
|
||||||
.remove("&e" + Utils.getName(sender) + " &7removed you from their friendsgroup &e" + group + "&7!");
|
|
||||||
DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications);
|
DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "deprecation", "unchecked" })
|
@SuppressWarnings({ "deprecation", "unchecked" })
|
||||||
@Command(hook = "del")
|
@Command(hook = "del")
|
||||||
public boolean del(CommandSender sender, String target)
|
public boolean del(CommandSender sender, String target) {
|
||||||
{
|
if (target.equalsIgnoreCase("CONSOLE")) {
|
||||||
if (target.equalsIgnoreCase("CONSOLE"))
|
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "You can't add console to your friends!");
|
getLogger().message(sender, true, "You can't add console to your friends!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
OfflinePlayer p = Bukkit.getPlayer(target);
|
OfflinePlayer p = Bukkit.getPlayer(target);
|
||||||
if (p == null)
|
|
||||||
p = Bukkit.getOfflinePlayer(target);
|
if (p == null) p = Bukkit.getOfflinePlayer(target);
|
||||||
if (p == null)
|
if (p == null) {
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "That player couldn't be found!");
|
getLogger().message(sender, true, "That player couldn't be found!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "friends", new JSONArray()));
|
JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "friends", new JSONArray()));
|
||||||
if (friends.contains(p.getUniqueId().toString()))
|
|
||||||
{
|
if (!friends.contains(p.getUniqueId().toString())) {
|
||||||
getLogger().message(sender, true, "You are already friends with this person!");
|
getLogger().message(sender, true, "You are not friends with that player!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
friends.remove(p.getUniqueId().toString());
|
friends.remove(p.getUniqueId().toString());
|
||||||
|
DataManager.setData(sender, "friends", friends);
|
||||||
DataManager.save(sender);
|
DataManager.save(sender);
|
||||||
JSONArray friended_by = ((JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "friended_by",
|
|
||||||
new JSONArray()));
|
JSONArray friended_by = ((JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "friended_by", new JSONArray()));
|
||||||
|
DataManager.setData(p.getUniqueId().toString(), "friended_by", friended_by);
|
||||||
friended_by.remove(getID(sender));
|
friended_by.remove(getID(sender));
|
||||||
|
|
||||||
DataManager.save(p.getUniqueId().toString());
|
DataManager.save(p.getUniqueId().toString());
|
||||||
getLogger().message(sender, "You are now friends with &e" + p.getName() + "&7!");
|
|
||||||
if (p instanceof Player)
|
getLogger().message(sender, "You are no longer friends with &e" + p.getName() + "&7!");
|
||||||
{
|
|
||||||
getLogger().message((Player) p, "&e" + Utils.getName(sender) + "&7 added you as a friend!");
|
if (p instanceof Player) {
|
||||||
}
|
getLogger().message((Player) p, "&e" + Utils.getName(sender) + "&7 removed you as a friend!");
|
||||||
else
|
} else {
|
||||||
{
|
JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "scheduled_notifications", new JSONArray());
|
||||||
JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(),
|
|
||||||
"scheduled_notifications", new JSONArray());
|
|
||||||
notifications.add("&e" + Utils.getName(sender) + "&7 removed you as a friend!");
|
notifications.add("&e" + Utils.getName(sender) + "&7 removed you as a friend!");
|
||||||
notifications.remove("&e" + Utils.getName(sender) + "&7 added you as a friend!");
|
notifications.remove("&e" + Utils.getName(sender) + "&7 added you as a friend!");
|
||||||
|
|
||||||
DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications);
|
DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "deprecation", "unchecked" })
|
@SuppressWarnings({ "deprecation", "unchecked" })
|
||||||
@Command(hook = "del_grouped")
|
@Command(hook = "del_grouped")
|
||||||
public boolean del_grouped(CommandSender sender, String target, String group)
|
public boolean del_grouped(CommandSender sender, String target, String group) {
|
||||||
{
|
if (target.equalsIgnoreCase("CONSOLE")) {
|
||||||
if (target.equalsIgnoreCase("CONSOLE"))
|
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "You can't add console to your friends!");
|
getLogger().message(sender, true, "You can't add console to your friends!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
OfflinePlayer p = Bukkit.getPlayer(target);
|
OfflinePlayer p = Bukkit.getPlayer(target);
|
||||||
if (p == null)
|
|
||||||
p = Bukkit.getOfflinePlayer(target);
|
if (p == null) p = Bukkit.getOfflinePlayer(target);
|
||||||
if (p == null)
|
if (p == null) {
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "That player couldn't be found!");
|
getLogger().message(sender, true, "That player couldn't be found!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "groups." + group, new JSONArray()));
|
JSONArray friends = ((JSONArray) DataManager.getOrDefault(sender, "groups." + group, new JSONArray()));
|
||||||
if (friends.contains(p.getUniqueId().toString()))
|
|
||||||
{
|
if (!friends.contains(p.getUniqueId().toString())) {
|
||||||
getLogger().message(sender, true, "This person already is part of that friendsgroup!");
|
getLogger().message(sender, true, "This person isn't a part of that friendsgroup!");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
friends.add(p.getUniqueId().toString());
|
friends.add(p.getUniqueId().toString());
|
||||||
|
DataManager.setData(sender, "groups." + group, friends);
|
||||||
DataManager.save(sender);
|
DataManager.save(sender);
|
||||||
getLogger().message(sender, "&e" + p.getName() + "&7 is now part of the group &e" + group + "&7!");
|
|
||||||
if (p instanceof Player)
|
getLogger().message(sender, "&e" + p.getName() + "&7 is no longer a part of the group &e" + group + "&7!");
|
||||||
{
|
|
||||||
getLogger().message((Player) p,
|
if (p instanceof Player) {
|
||||||
"&e" + Utils.getName(sender) + " &7added you to their friendsgroup &e" + group + "&7!");
|
getLogger().message((Player) p, "&e" + Utils.getName(sender) + " &7removed you from their friendsgroup &e" + group + "&7!");
|
||||||
}
|
} else {
|
||||||
else
|
JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(), "scheduled_notifications", new JSONArray());
|
||||||
{
|
|
||||||
JSONArray notifications = (JSONArray) DataManager.getOrDefault(p.getUniqueId().toString(),
|
notifications.add("&e" + Utils.getName(sender) + " &7removed you from their friendsgroup &e" + group + "&7!");
|
||||||
"scheduled_notifications", new JSONArray());
|
notifications.remove("&e" + Utils.getName(sender) + " &7added you to their friendsgroup &e" + group + "&7!");
|
||||||
notifications
|
|
||||||
.add("&e" + Utils.getName(sender) + " &7removed you from their friendsgroup &e" + group + "&7!");
|
|
||||||
notifications
|
|
||||||
.remove("&e" + Utils.getName(sender) + " &7added you to their friendsgroup &e" + group + "&7!");
|
|
||||||
DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications);
|
DataManager.setData(p.getUniqueId().toString(), "scheduled_notifications", notifications);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "list")
|
@Command(hook = "list")
|
||||||
public boolean list(CommandSender sender)
|
public boolean list(CommandSender sender) {
|
||||||
{
|
|
||||||
JSONArray friends = (JSONArray) DataManager.getOrDefault(sender, "friends", new JSONArray());
|
JSONArray friends = (JSONArray) DataManager.getOrDefault(sender, "friends", new JSONArray());
|
||||||
if (friends.size() == 0)
|
|
||||||
{
|
if (friends.size() == 0) {
|
||||||
getLogger().message(sender, true, "You didn't add anyone to your friends list yet.");
|
getLogger().message(sender, true, "You didn't add anyone to your friends list yet.");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
for (Object o : friends.toArray())
|
|
||||||
{
|
for (Object o : friends.toArray()) {
|
||||||
UUID id = UUID.fromString((String) o);
|
UUID id = UUID.fromString((String) o);
|
||||||
Player p = Bukkit.getPlayer(id);
|
Player p = Bukkit.getPlayer(id);
|
||||||
if (p != null)
|
|
||||||
sb.append(p.getDisplayName() + "&7, ");
|
if (p != null) sb.append(p.getDisplayName() + "&7, ");
|
||||||
else
|
else sb.append("&9" + Bukkit.getOfflinePlayer(id).getName() + "&7, ");
|
||||||
sb.append("&9" + Bukkit.getOfflinePlayer(id).getName() + "&7, ");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String out = sb.toString().replaceAll(", $", "");
|
String out = sb.toString().replaceAll(", $", "");
|
||||||
getLogger().message(sender, "You have a total of &e" + friends.size() + "&7 friends:", out);
|
getLogger().message(sender, "You have a total of &e" + friends.size() + "&7 friends:", out);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "list_group")
|
@Command(hook = "list_group")
|
||||||
public boolean list_group(CommandSender sender, String group)
|
public boolean list_group(CommandSender sender, String group) {
|
||||||
{
|
|
||||||
JSONArray friends = (JSONArray) DataManager.getOrDefault(sender, "group." + group, new JSONArray());
|
JSONArray friends = (JSONArray) DataManager.getOrDefault(sender, "group." + group, new JSONArray());
|
||||||
if (friends.size() == 0)
|
|
||||||
{
|
if (friends.size() == 0) {
|
||||||
getLogger().message(sender, true, "You didn't add anyone to this group yet.");
|
getLogger().message(sender, true, "You didn't add anyone to this group yet.");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
for (Object o : friends.toArray())
|
|
||||||
{
|
for (Object o : friends.toArray()) {
|
||||||
UUID id = UUID.fromString((String) o);
|
UUID id = UUID.fromString((String) o);
|
||||||
Player p = Bukkit.getPlayer(id);
|
Player p = Bukkit.getPlayer(id);
|
||||||
if (p != null)
|
|
||||||
sb.append(p.getDisplayName() + "&7, ");
|
if (p != null) sb.append(p.getDisplayName() + "&7, ");
|
||||||
else
|
else sb.append("&9" + Bukkit.getOfflinePlayer(id).getName() + "&7, ");
|
||||||
sb.append("&9" + Bukkit.getOfflinePlayer(id).getName() + "&7, ");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String out = sb.toString().replaceAll(", $", "");
|
String out = sb.toString().replaceAll(", $", "");
|
||||||
getLogger().message(sender, "You have a total of &e" + friends.size() + "&7 friends added to this group:", out);
|
getLogger().message(sender, "You have a total of &e" + friends.size() + "&7 friends added to this group:", out);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "list_groups")
|
@Command(hook = "list_groups")
|
||||||
public boolean list_groups(CommandSender sender)
|
public boolean list_groups(CommandSender sender) {
|
||||||
{
|
|
||||||
JSONObject raw = (JSONObject) DataManager.getOrDefault(sender, null, new JSONObject());
|
JSONObject raw = (JSONObject) DataManager.getOrDefault(sender, null, new JSONObject());
|
||||||
Set<?> keys = raw.keySet();
|
Set<?> keys = raw.keySet();
|
||||||
if (keys.size() == 0 || (keys.contains("friends") && keys.size() == 1))
|
|
||||||
{
|
if (keys.size() == 0 || (keys.contains("friends") && keys.size() == 1)) {
|
||||||
getLogger().message(sender, true, "You don't have any custom groups made yet.");
|
getLogger().message(sender, true, "You don't have any custom groups made yet.");
|
||||||
return true;
|
return true;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
for (Object o : keys)
|
|
||||||
{
|
for (Object o : keys) {
|
||||||
sb.append("&e" + (String) o + "&7, ");
|
sb.append("&e" + ((String) o).substring(6) + "&7, ");
|
||||||
}
|
}
|
||||||
|
|
||||||
String out = sb.toString().replaceAll(", $", "");
|
String out = sb.toString().replaceAll(", $", "");
|
||||||
getLogger().message(sender, "", out);
|
getLogger().message(sender, "", out);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isFriend(CommandSender player, CommandSender friend)
|
public static boolean isFriend(CommandSender player, CommandSender friend) {
|
||||||
{
|
|
||||||
return isFriend(player, friend, null);
|
return isFriend(player, friend, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isFriend(CommandSender player, CommandSender friend, String condition)
|
public static boolean isFriend(CommandSender player, CommandSender friend, String condition) {
|
||||||
{
|
try {
|
||||||
try
|
|
||||||
{
|
|
||||||
Module mod = ModuleLoader.getModule("Friends");
|
Module mod = ModuleLoader.getModule("Friends");
|
||||||
Method m = mod.getClass().getDeclaredMethod("isFriend_", String.class);
|
Method m = mod.getClass().getDeclaredMethod("isFriend_", String.class);
|
||||||
|
|
||||||
return (boolean) m.invoke(mod, player, friend, condition);
|
return (boolean) m.invoke(mod, player, friend, condition);
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
|
|
||||||
| InvocationTargetException e)
|
|
||||||
{}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isFriend_(CommandSender player, CommandSender friend, String group) {
|
||||||
|
if (group == null) group = "friends";
|
||||||
|
else if (!group.startsWith("group.")) group = "group." + group;
|
||||||
|
|
||||||
protected boolean isFriend_(CommandSender player, CommandSender friend, String group)
|
|
||||||
{
|
|
||||||
if (group == null)
|
|
||||||
group = "friends";
|
|
||||||
else if (!group.startsWith("group."))
|
|
||||||
group = "group." + group;
|
|
||||||
JSONArray array = (JSONArray) DataManager.getOrDefault(player, group, new JSONArray());
|
JSONArray array = (JSONArray) DataManager.getOrDefault(player, group, new JSONArray());
|
||||||
return array.contains(getID(friend));
|
return array.contains(getID(friend));
|
||||||
}
|
}
|
||||||
|
|
||||||
private final String getID(CommandSender sender)
|
private final String getID(CommandSender sender) {
|
||||||
{
|
if (sender instanceof Player) return ((Player) sender).getUniqueId().toString();
|
||||||
if (sender instanceof Player)
|
else return sender.getName();
|
||||||
return ((Player) sender).getUniqueId().toString();
|
|
||||||
else
|
|
||||||
return sender.getName();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
3
src/main/java/com/redstoner/modules/friends/module.info
Normal file
3
src/main/java/com/redstoner/modules/friends/module.info
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: Friends
|
||||||
|
category: Other
|
||||||
|
description: Notifies players when a friend comes online. Also used by other modules for various features
|
||||||
@@ -1,20 +1,19 @@
|
|||||||
command ignore {
|
command ignore {
|
||||||
[string:player] {
|
|
||||||
perm utils.ignore;
|
perm utils.ignore;
|
||||||
|
[string:player] {
|
||||||
run ignore player;
|
run ignore player;
|
||||||
type player;
|
type player;
|
||||||
help Ignores or Unignores a player.;
|
help Ignores or Unignores a player.;
|
||||||
}
|
}
|
||||||
[empty] {
|
[empty] {
|
||||||
perm utils.ignore;
|
|
||||||
run list;
|
run list;
|
||||||
type player;
|
type player;
|
||||||
help Lists everyone you ignore.;
|
help Lists everyone you ignore.;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
command unignore {
|
command unignore {
|
||||||
[string:player] {
|
|
||||||
perm utils.ignore;
|
perm utils.ignore;
|
||||||
|
[string:player] {
|
||||||
run unignore player;
|
run unignore player;
|
||||||
type player;
|
type player;
|
||||||
help Unignore a player.;
|
help Unignore a player.;
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.redstoner.modules.ignore;
|
package com.redstoner.modules.ignore;
|
||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@@ -26,31 +25,25 @@ import net.nemez.chatapi.click.Message;
|
|||||||
|
|
||||||
@Commands(CommandHolderType.File)
|
@Commands(CommandHolderType.File)
|
||||||
@AutoRegisterListener
|
@AutoRegisterListener
|
||||||
@Version(major = 4, minor = 0, revision = 0, compatible = 4)
|
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
public class Ignore implements Module
|
public class Ignore implements Module {
|
||||||
{
|
|
||||||
|
|
||||||
@Command(hook = "unignore", async = AsyncType.ALWAYS)
|
@Command(hook = "unignore", async = AsyncType.ALWAYS)
|
||||||
public boolean unignore(CommandSender sender, String player)
|
public boolean unignore(CommandSender sender, String player) {
|
||||||
{
|
|
||||||
return ignore(sender, player, false);
|
return ignore(sender, player, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "ignore", async = AsyncType.ALWAYS)
|
@Command(hook = "ignore", async = AsyncType.ALWAYS)
|
||||||
public boolean ignore(CommandSender sender, String player)
|
public boolean ignore(CommandSender sender, String player) {
|
||||||
{
|
|
||||||
return ignore(sender, player, true);
|
return ignore(sender, player, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "list", async = AsyncType.ALWAYS)
|
@Command(hook = "list", async = AsyncType.ALWAYS)
|
||||||
public boolean list(CommandSender sender)
|
public boolean list(CommandSender sender) {
|
||||||
{
|
|
||||||
getLogger().message(sender, "§7You are currently ignoring:");
|
getLogger().message(sender, "§7You are currently ignoring:");
|
||||||
|
|
||||||
JSONArray ignores = (JSONArray) DataManager.getOrDefault(sender, "ignores", new JSONArray());
|
JSONArray ignores = (JSONArray) DataManager.getOrDefault(sender, "ignores", new JSONArray());
|
||||||
|
|
||||||
if (ignores.isEmpty())
|
if (ignores.isEmpty()) {
|
||||||
{
|
|
||||||
new Message(sender, null).appendText(" §7Nobody \\o/").send();
|
new Message(sender, null).appendText(" §7Nobody \\o/").send();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -59,8 +52,7 @@ public class Ignore implements Module
|
|||||||
OfflinePlayer pi = Bukkit.getOfflinePlayer(UUID.fromString((String) ignores.get(0)));
|
OfflinePlayer pi = Bukkit.getOfflinePlayer(UUID.fromString((String) ignores.get(0)));
|
||||||
players = " §3" + pi.getName() + "§7";
|
players = " §3" + pi.getName() + "§7";
|
||||||
|
|
||||||
for (int i = 1; i < ignores.size(); i++)
|
for (int i = 1; i < ignores.size(); i++) {
|
||||||
{
|
|
||||||
OfflinePlayer p = Bukkit.getOfflinePlayer(UUID.fromString((String) ignores.get(i)));
|
OfflinePlayer p = Bukkit.getOfflinePlayer(UUID.fromString((String) ignores.get(i)));
|
||||||
players += ", §3" + p.getName() + "§7";
|
players += ", §3" + p.getName() + "§7";
|
||||||
}
|
}
|
||||||
@@ -68,92 +60,77 @@ public class Ignore implements Module
|
|||||||
Message m = new Message(sender, null);
|
Message m = new Message(sender, null);
|
||||||
m.appendText(players);
|
m.appendText(players);
|
||||||
m.send();
|
m.send();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({ "unchecked", "deprecation" })
|
@SuppressWarnings({ "unchecked", "deprecation" })
|
||||||
public boolean ignore(CommandSender sender, String player, boolean allowIgnore)
|
public boolean ignore(CommandSender sender, String player, boolean allowIgnore) {
|
||||||
{
|
|
||||||
JSONArray ignores = (JSONArray) DataManager.getOrDefault(sender, "ignores", new JSONArray());
|
JSONArray ignores = (JSONArray) DataManager.getOrDefault(sender, "ignores", new JSONArray());
|
||||||
|
|
||||||
Player p = Utils.isUUID(player) ? Bukkit.getPlayer(UUID.fromString(player)) : Bukkit.getPlayer(player);
|
Player p = Utils.isUUID(player) ? Bukkit.getPlayer(UUID.fromString(player)) : Bukkit.getPlayer(player);
|
||||||
|
|
||||||
OfflinePlayer op = Utils.isUUID(player) ? Bukkit.getOfflinePlayer(UUID.fromString(player))
|
OfflinePlayer op = Utils.isUUID(player) ? Bukkit.getOfflinePlayer(UUID.fromString(player)) : Bukkit.getOfflinePlayer(player);
|
||||||
: Bukkit.getOfflinePlayer(player);
|
|
||||||
|
|
||||||
String pName = p != null ? p.getDisplayName() : op.getName();
|
String pName = p != null ? p.getDisplayName() : op.getName();
|
||||||
String pUUID = p != null ? p.getUniqueId().toString() : op.getUniqueId().toString();
|
String pUUID = p != null ? p.getUniqueId().toString() : op.getUniqueId().toString();
|
||||||
String sUUID = ((Player) sender).getUniqueId().toString();
|
String sUUID = ((Player) sender).getUniqueId().toString();
|
||||||
|
|
||||||
if (pUUID.equals(sUUID))
|
if (pUUID.equals(sUUID)) {
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "§7You can't ignore yourself :P");
|
getLogger().message(sender, true, "§7You can't ignore yourself :P");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ignores.contains(pUUID))
|
if (ignores.contains(pUUID)) {
|
||||||
{
|
|
||||||
ignores.remove(pUUID);
|
ignores.remove(pUUID);
|
||||||
getLogger().message(sender, "§7You are no longer ignoring §3" + pName + "§7.");
|
getLogger().message(sender, "§7You are no longer ignoring §3" + pName + "§7.");
|
||||||
}
|
} else if (!allowIgnore) {
|
||||||
else if (!allowIgnore)
|
|
||||||
{
|
|
||||||
getLogger().message(sender, "§7You weren't ignoring §3" + pName + "§7.");
|
getLogger().message(sender, "§7You weren't ignoring §3" + pName + "§7.");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
ignores.add(pUUID);
|
ignores.add(pUUID);
|
||||||
getLogger().message(sender, "§7You are now ignoring §3" + pName + "§7.");
|
getLogger().message(sender, "§7You are now ignoring §3" + pName + "§7.");
|
||||||
}
|
}
|
||||||
|
|
||||||
DataManager.setData(sender, "ignores", ignores);
|
DataManager.setData(sender, "ignores", ignores);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BroadcastFilter getIgnoredBy(CommandSender sender)
|
public static BroadcastFilter getIgnoredBy(CommandSender sender) {
|
||||||
{
|
try {
|
||||||
try
|
|
||||||
{
|
|
||||||
Module mod = ModuleLoader.getModule("Ignore");
|
Module mod = ModuleLoader.getModule("Ignore");
|
||||||
|
|
||||||
Method m = mod.getClass().getDeclaredMethod("_getIgnoredBy", CommandSender.class);
|
Method m = mod.getClass().getDeclaredMethod("_getIgnoredBy", CommandSender.class);
|
||||||
m.setAccessible(true);
|
m.setAccessible(true);
|
||||||
|
|
||||||
return (BroadcastFilter) m.invoke(mod, sender);
|
return (BroadcastFilter) m.invoke(mod, sender);
|
||||||
}
|
} catch (Exception e) {
|
||||||
catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException
|
|
||||||
| InvocationTargetException e)
|
|
||||||
{}
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
private BroadcastFilter _getIgnoredBy(CommandSender sender)
|
private BroadcastFilter _getIgnoredBy(CommandSender sender) {
|
||||||
{
|
return new BroadcastFilter() {
|
||||||
return new BroadcastFilter()
|
private final String sUUID = sender instanceof Player ? ((Player) sender).getUniqueId().toString() : "CONSOLE";
|
||||||
{
|
|
||||||
|
|
||||||
private final String sUUID = sender instanceof Player ? ((Player) sender).getUniqueId().toString()
|
|
||||||
: "CONSOLE";
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean sendTo(CommandSender recipient)
|
public boolean sendTo(CommandSender recipient) {
|
||||||
{
|
if (sUUID.equals("CONSOLE")) return true;
|
||||||
if (sUUID.equals("CONSOLE"))
|
|
||||||
return true;
|
if ((recipient instanceof Player)) {
|
||||||
|
|
||||||
if (recipient instanceof Player)
|
|
||||||
{
|
|
||||||
Player player = (Player) recipient;
|
Player player = (Player) recipient;
|
||||||
|
|
||||||
if (sender.hasPermission("utils.ignore.override"))
|
if (sender.hasPermission("utils.ignore.override")) return true;
|
||||||
return true;
|
|
||||||
|
|
||||||
JSONArray ignores = (JSONArray) DataManager.getOrDefault(recipient, "ignores", new JSONArray());
|
JSONArray ignores = (JSONArray) DataManager.getOrDefault(recipient, "ignores", new JSONArray());
|
||||||
return !ignores.contains(sUUID);
|
return !ignores.contains(sUUID);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
3
src/main/java/com/redstoner/modules/ignore/module.info
Normal file
3
src/main/java/com/redstoner/modules/ignore/module.info
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: Ignore
|
||||||
|
category: Chat
|
||||||
|
description: Allows someone to ignore players' chat messages and integrates with other modules
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
command lc {
|
command lc {
|
||||||
|
alias lagchunks;
|
||||||
perm utils.lagchunks;
|
perm utils.lagchunks;
|
||||||
|
|
||||||
list {
|
list {
|
||||||
@@ -1,81 +1,68 @@
|
|||||||
package com.redstoner.modules.lagchunks;
|
package com.redstoner.modules.lagchunks;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.Chunk;
|
|
||||||
import org.bukkit.Location;
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
|
|
||||||
import com.nemez.cmdmgr.Command;
|
import com.nemez.cmdmgr.Command;
|
||||||
import com.nemez.cmdmgr.Command.AsyncType;
|
import com.nemez.cmdmgr.Command.AsyncType;
|
||||||
import com.redstoner.annotations.Commands;
|
import com.redstoner.annotations.Commands;
|
||||||
import com.redstoner.annotations.Version;
|
import com.redstoner.annotations.Version;
|
||||||
import com.redstoner.misc.CommandHolderType;
|
import com.redstoner.misc.CommandHolderType;
|
||||||
import com.redstoner.modules.Module;
|
import com.redstoner.modules.Module;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Chunk;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Commands (CommandHolderType.File)
|
@Commands (CommandHolderType.File)
|
||||||
@Version(major = 4, minor = 1, revision = 0, compatible = 4)
|
@Version (major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
public class LagChunks implements Module
|
public class LagChunks implements Module {
|
||||||
{
|
private List<LaggyChunk> laggyChunks = new ArrayList<>();
|
||||||
private List<LaggyChunk> laggyChunks = new ArrayList<LaggyChunk>();
|
|
||||||
|
|
||||||
private void scan(int amount)
|
private void scan(int amount) {
|
||||||
{
|
|
||||||
laggyChunks.clear();
|
laggyChunks.clear();
|
||||||
for (World world : Bukkit.getServer().getWorlds())
|
|
||||||
{
|
for (World world : Bukkit.getServer().getWorlds()) {
|
||||||
for (Chunk chunk : world.getLoadedChunks())
|
for (Chunk chunk : world.getLoadedChunks()) {
|
||||||
{
|
if (chunk.getEntities().length > amount) {
|
||||||
if (chunk.getEntities().length > amount)
|
|
||||||
{
|
|
||||||
Location entLoc = chunk.getEntities()[0].getLocation();
|
Location entLoc = chunk.getEntities()[0].getLocation();
|
||||||
laggyChunks.add(new LaggyChunk(entLoc.getBlockX(), entLoc.getBlockY(), entLoc.getBlockZ(), world,
|
laggyChunks.add(new LaggyChunk(entLoc.getBlockX(), entLoc.getBlockY(), entLoc.getBlockZ(), world,
|
||||||
chunk.getEntities().length));
|
chunk.getEntities().length
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command (hook = "list_cmd")
|
@Command (hook = "list_cmd")
|
||||||
public void list(CommandSender sender)
|
public void list(CommandSender sender) {
|
||||||
{
|
if (laggyChunks.size() > 0) {
|
||||||
if (laggyChunks.size() > 0)
|
ArrayList<String> message = new ArrayList<>();
|
||||||
{
|
for (LaggyChunk lc : laggyChunks) {
|
||||||
ArrayList<String> message = new ArrayList<String>();
|
|
||||||
for (LaggyChunk lc : laggyChunks)
|
|
||||||
{
|
|
||||||
message.add("§b[§a" + laggyChunks.indexOf(lc) + "§b]: §a" + lc.x + "§7, §a" + lc.y + "§7, §a" + lc.z
|
message.add("§b[§a" + laggyChunks.indexOf(lc) + "§b]: §a" + lc.x + "§7, §a" + lc.y + "§7, §a" + lc.z
|
||||||
+ " §7(" + lc.world.getName() + ") §a- §b" + lc.amount + " entities");
|
+ " §7(" + lc.world.getName() + ") §a- §b" + lc.amount + " entities");
|
||||||
}
|
}
|
||||||
message.add("§2-------------------");
|
message.add("§2-------------------");
|
||||||
getLogger().message(sender, message.toArray(new String[] {}));
|
getLogger().message(sender, message.toArray(new String[] {}));
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
getLogger().message(sender, true, "Couldn't find any chunks with that many entities.");
|
getLogger().message(sender, true, "Couldn't find any chunks with that many entities.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command (hook = "scan_cmd", async = AsyncType.ALWAYS)
|
@Command (hook = "scan_cmd", async = AsyncType.ALWAYS)
|
||||||
public void scan_cmd(CommandSender sender, int amount)
|
public void scan_cmd(CommandSender sender, int amount) {
|
||||||
{
|
|
||||||
scan(amount);
|
scan(amount);
|
||||||
list(sender);
|
list(sender);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command (hook = "tp")
|
@Command (hook = "tp")
|
||||||
public void tp(CommandSender sender, int number)
|
public void tp(CommandSender sender, int number) {
|
||||||
{
|
|
||||||
Player player = (Player) sender;
|
Player player = (Player) sender;
|
||||||
if (number < laggyChunks.size())
|
if (number < laggyChunks.size()) {
|
||||||
{
|
|
||||||
player.teleport(laggyChunks.get(number).getLocation());
|
player.teleport(laggyChunks.get(number).getLocation());
|
||||||
getLogger().message(player, "§aTeleported to chunk " + number + "!");
|
getLogger().message(player, "§aTeleported to chunk " + number + "!");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
getLogger().message(sender, true, "§4Invalid chunk number! Use §e/lc list §4to show laggy chunks!");
|
getLogger().message(sender, true, "§4Invalid chunk number! Use §e/lc list §4to show laggy chunks!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: LagChunks
|
||||||
|
category: Staff
|
||||||
|
description: Collects information about entities across the map and displays chunk info
|
||||||
@@ -9,6 +9,7 @@ command list {
|
|||||||
alias eplist;
|
alias eplist;
|
||||||
alias who;
|
alias who;
|
||||||
alias ewho;
|
alias ewho;
|
||||||
|
perm utils.list;
|
||||||
[empty] {
|
[empty] {
|
||||||
run list;
|
run list;
|
||||||
help Shows all online players sorted by rank.;
|
help Shows all online players sorted by rank.;
|
||||||
@@ -19,6 +20,7 @@ command list {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
command staff {
|
command staff {
|
||||||
|
perm utils.list;
|
||||||
[empty] {
|
[empty] {
|
||||||
help Shows all online staff.;
|
help Shows all online staff.;
|
||||||
run staff;
|
run staff;
|
||||||
@@ -18,7 +18,7 @@ import com.redstoner.modules.datamanager.DataManager;
|
|||||||
import net.nemez.chatapi.click.Message;
|
import net.nemez.chatapi.click.Message;
|
||||||
|
|
||||||
@Commands(CommandHolderType.File)
|
@Commands(CommandHolderType.File)
|
||||||
@Version(major = 4, minor = 0, revision = 5, compatible = 4)
|
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
public class List implements Module
|
public class List implements Module
|
||||||
{
|
{
|
||||||
private HashMap<String, Integer> onConsole;
|
private HashMap<String, Integer> onConsole;
|
||||||
3
src/main/java/com/redstoner/modules/list/module.info
Normal file
3
src/main/java/com/redstoner/modules/list/module.info
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: List
|
||||||
|
category: Other
|
||||||
|
description: Lists the players online separated by rank and subrank.
|
||||||
@@ -15,6 +15,7 @@ import org.bukkit.event.player.PlayerMoveEvent;
|
|||||||
import org.bukkit.event.player.PlayerPickupArrowEvent;
|
import org.bukkit.event.player.PlayerPickupArrowEvent;
|
||||||
import org.bukkit.event.player.PlayerPickupItemEvent;
|
import org.bukkit.event.player.PlayerPickupItemEvent;
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public class CancelledEventsHandler implements Listener {
|
public class CancelledEventsHandler implements Listener {
|
||||||
private LoginSecurity mainClass;
|
private LoginSecurity mainClass;
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ import com.redstoner.modules.Module;
|
|||||||
|
|
||||||
@Commands(CommandHolderType.File)
|
@Commands(CommandHolderType.File)
|
||||||
@AutoRegisterListener
|
@AutoRegisterListener
|
||||||
@Version(major = 4, minor = 1, revision = 0, compatible = 4)
|
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
public class LoginSecurity implements Module, Listener
|
public class LoginSecurity implements Module, Listener
|
||||||
{
|
{
|
||||||
protected static Map<UUID, Location> loggingIn;
|
protected static Map<UUID, Location> loggingIn;
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: LoginSecurity
|
||||||
|
category: Other
|
||||||
|
description: Secure your account with an additional password required when you join the server
|
||||||
@@ -7,7 +7,8 @@ import java.io.FileReader;
|
|||||||
import java.io.FilenameFilter;
|
import java.io.FilenameFilter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.util.ArrayList;
|
import java.util.Map;
|
||||||
|
import java.util.TreeMap;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.regex.PatternSyntaxException;
|
import java.util.regex.PatternSyntaxException;
|
||||||
import java.util.zip.GZIPInputStream;
|
import java.util.zip.GZIPInputStream;
|
||||||
@@ -22,11 +23,12 @@ public class LogHandler extends Thread
|
|||||||
{
|
{
|
||||||
private CommandSender sender;
|
private CommandSender sender;
|
||||||
private String regex, fileName;
|
private String regex, fileName;
|
||||||
private static ArrayList<CommandSender> stillSearching = new ArrayList<>();
|
private static Map<String, LogHandler> activeSearches = new TreeMap<>();
|
||||||
public int totalFiles = 0;
|
public int totalFiles = 0;
|
||||||
public int filesSearched = 0;
|
public int filesSearched = 0;
|
||||||
public int totalLines = 0;
|
public int totalLines = 0;
|
||||||
public int currentLine = 0;
|
public int currentLine = 0;
|
||||||
|
private boolean isCanceled = false;
|
||||||
|
|
||||||
protected LogHandler(CommandSender sender, String regex, String fileName)
|
protected LogHandler(CommandSender sender, String regex, String fileName)
|
||||||
{
|
{
|
||||||
@@ -37,15 +39,24 @@ public class LogHandler extends Thread
|
|||||||
|
|
||||||
public void doSearch()
|
public void doSearch()
|
||||||
{
|
{
|
||||||
if (stillSearching.contains(sender))
|
String id = Utils.getID(sender);
|
||||||
|
if (activeSearches.containsKey(id))
|
||||||
{
|
{
|
||||||
Logs.logger.message(sender, true, "§4 DO NOT EVER TRY TO QUERY TWO SEARCHES AT ONCE. Go die...!");
|
Logs.logger.message(sender, true, "§4 DO NOT EVER TRY TO QUERY TWO SEARCHES AT ONCE. Go die...!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
stillSearching.add(sender);
|
activeSearches.put(Utils.getID(sender), this);
|
||||||
this.start();
|
this.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void cancel(CommandSender sender) {
|
||||||
|
LogHandler handler = activeSearches.remove(Utils.getID(sender));
|
||||||
|
if (handler == null)
|
||||||
|
Logs.logger.message(sender, true, "You aren't running a search.");
|
||||||
|
else
|
||||||
|
handler.isCanceled = true;
|
||||||
|
}
|
||||||
|
|
||||||
/** Searches the logs for a certain regex and forwards any matches to the sender.
|
/** Searches the logs for a certain regex and forwards any matches to the sender.
|
||||||
*
|
*
|
||||||
* @param sender the issuer of the search
|
* @param sender the issuer of the search
|
||||||
@@ -55,8 +66,10 @@ public class LogHandler extends Thread
|
|||||||
{
|
{
|
||||||
long starttime = System.currentTimeMillis();
|
long starttime = System.currentTimeMillis();
|
||||||
int matches = 0;
|
int matches = 0;
|
||||||
|
String id = Utils.getID(sender);
|
||||||
Logs.logger.message(sender, "Starting log search for &e" + regex + "&7 in &e" + fileName
|
Logs.logger.message(sender, "Starting log search for &e" + regex + "&7 in &e" + fileName
|
||||||
+ " &7now. &cPlease do not query any other searches until this one completes.");
|
+ " &7now.");
|
||||||
|
Logs.logger.message(sender, "&cDon't run another query until this one is done!");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!regex.startsWith("^"))
|
if (!regex.startsWith("^"))
|
||||||
@@ -72,9 +85,11 @@ public class LogHandler extends Thread
|
|||||||
catch (PatternSyntaxException e)
|
catch (PatternSyntaxException e)
|
||||||
{
|
{
|
||||||
Logs.logger.message(sender, true, "An error occured trying to compile the filename pattern!");
|
Logs.logger.message(sender, true, "An error occured trying to compile the filename pattern!");
|
||||||
stillSearching.remove(sender);
|
Logs.logger.message(sender, true, "&2Reason: &7" + e.getDescription());
|
||||||
|
activeSearches.remove(id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
File[] files = logFolder.listFiles(new FilenameFilter()
|
File[] files = logFolder.listFiles(new FilenameFilter()
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
@@ -83,11 +98,11 @@ public class LogHandler extends Thread
|
|||||||
return fileNamePattern.matcher(name).matches();
|
return fileNamePattern.matcher(name).matches();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
totalFiles = files.length;
|
totalFiles = files == null? 0 : files.length;
|
||||||
if (totalFiles == 0)
|
if (totalFiles == 0)
|
||||||
{
|
{
|
||||||
Logs.logger.message(sender, true, "No files found!");
|
Logs.logger.message(sender, true, "No files found!");
|
||||||
stillSearching.remove(sender);
|
activeSearches.remove(id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -102,7 +117,8 @@ public class LogHandler extends Thread
|
|||||||
catch (PatternSyntaxException e)
|
catch (PatternSyntaxException e)
|
||||||
{
|
{
|
||||||
Logs.logger.message(sender, true, "An error occured trying to compile the search pattern!");
|
Logs.logger.message(sender, true, "An error occured trying to compile the search pattern!");
|
||||||
stillSearching.remove(sender);
|
Logs.logger.message(sender, true, "&2Reason: " + e.getDescription());
|
||||||
|
activeSearches.remove(id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (File file : files)
|
for (File file : files)
|
||||||
@@ -114,12 +130,16 @@ public class LogHandler extends Thread
|
|||||||
new InputStreamReader(new GZIPInputStream(new FileInputStream(file))));
|
new InputStreamReader(new GZIPInputStream(new FileInputStream(file))));
|
||||||
matches += searchStream(inputReader, searchPattern, sender, file.getName());
|
matches += searchStream(inputReader, searchPattern, sender, file.getName());
|
||||||
inputReader.close();
|
inputReader.close();
|
||||||
|
if (isCanceled)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
BufferedReader inputReader = new BufferedReader(new FileReader(file));
|
BufferedReader inputReader = new BufferedReader(new FileReader(file));
|
||||||
matches += searchStream(inputReader, searchPattern, sender, file.getName());
|
matches += searchStream(inputReader, searchPattern, sender, file.getName());
|
||||||
inputReader.close();
|
inputReader.close();
|
||||||
|
if (isCanceled)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
filesSearched++;
|
filesSearched++;
|
||||||
if (progress)
|
if (progress)
|
||||||
@@ -133,14 +153,15 @@ public class LogHandler extends Thread
|
|||||||
{
|
{
|
||||||
Logs.logger.message(sender, true,
|
Logs.logger.message(sender, true,
|
||||||
"An unexpected error occured, please check your search parameters and try again!");
|
"An unexpected error occured, please check your search parameters and try again!");
|
||||||
stillSearching.remove(sender);
|
activeSearches.remove(id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
stillSearching.remove(sender);
|
activeSearches.remove(id);
|
||||||
|
|
||||||
if ((boolean) DataManager.getOrDefault(Utils.getID(sender), "Logs", "summary", true))
|
if ((boolean) DataManager.getOrDefault(Utils.getID(sender), "Logs", "summary", true))
|
||||||
{
|
{
|
||||||
String[] message = new String[2];
|
String[] message = new String[2];
|
||||||
message[0] = "§aYour search completed after " + (System.currentTimeMillis() - starttime) + "ms!";
|
message[0] = (isCanceled? "§aYou search was §cterminated§a after " : "§aYour search completed after ") + (System.currentTimeMillis() - starttime) + "ms!";
|
||||||
message[1] = "§7In total: §e" + filesSearched + "§7 File(s) and §e" + totalLines
|
message[1] = "§7In total: §e" + filesSearched + "§7 File(s) and §e" + totalLines
|
||||||
+ "§7 Line(s) were searched, §a" + matches + "§7 Match(es) were found!";
|
+ "§7 Line(s) were searched, §a" + matches + "§7 Match(es) were found!";
|
||||||
Logs.logger.message(sender, message);
|
Logs.logger.message(sender, message);
|
||||||
@@ -170,13 +191,15 @@ public class LogHandler extends Thread
|
|||||||
currentLine = 0;
|
currentLine = 0;
|
||||||
while ((line = inputReader.readLine()) != null)
|
while ((line = inputReader.readLine()) != null)
|
||||||
{
|
{
|
||||||
|
if (isCanceled)
|
||||||
|
break;
|
||||||
totalLines++;
|
totalLines++;
|
||||||
currentLine++;
|
currentLine++;
|
||||||
if (searchPattern.matcher(line).matches())
|
if (searchPattern.matcher(line).matches())
|
||||||
{
|
{
|
||||||
if (((p != null) && (!p.isOnline())))
|
if (((p != null) && (!p.isOnline())))
|
||||||
{
|
{
|
||||||
stillSearching.remove(sender);
|
activeSearches.remove(Utils.getID(sender));
|
||||||
throw new IOException("The player has left during the search. Aborting now.");
|
throw new IOException("The player has left during the search. Aborting now.");
|
||||||
}
|
}
|
||||||
LogEntry entry = new LogEntry(filename, line, currentLine, totalLines);
|
LogEntry entry = new LogEntry(filename, line, currentLine, totalLines);
|
||||||
@@ -1,34 +1,34 @@
|
|||||||
command log {
|
command log {
|
||||||
perm utils.logs;
|
perm utils.logs;
|
||||||
alias logs;
|
alias logs;
|
||||||
|
type player;
|
||||||
|
|
||||||
search [string:file(s)] [string:search...] {
|
search [string:file(s)] [string:search...] {
|
||||||
run search_logs file(s) search;
|
run search_logs file(s) search;
|
||||||
help Performs the specified search operation on the logs. Wildcards are supported in filenames. Search string is a regex.;
|
help Performs the specified search operation on the logs. Wildcards are supported in filenames. Search string is a regex.;
|
||||||
type player;
|
}
|
||||||
|
terminate {
|
||||||
|
run terminate_search;
|
||||||
|
help Stops the search.;
|
||||||
}
|
}
|
||||||
format {
|
format {
|
||||||
run show_format;
|
run show_format;
|
||||||
help Displays your current log output format with an example result.;
|
help Displays your current log output format with an example result.;
|
||||||
type player;
|
|
||||||
}
|
}
|
||||||
format_help {
|
format_help {
|
||||||
run show_format_help;
|
run show_format_help;
|
||||||
help Displays all available placeholders for the formatting;
|
help Displays all available placeholders for the formatting;
|
||||||
type player;
|
|
||||||
}
|
}
|
||||||
option_help {
|
option_help {
|
||||||
run show_option_help;
|
run show_option_help;
|
||||||
help Displays all available options.;
|
help Displays all available options.;
|
||||||
type player;
|
|
||||||
}
|
}
|
||||||
set format [string:format] {
|
set format [string:format] {
|
||||||
run set_format format;
|
run set_format format;
|
||||||
help Sets a new log output format;
|
help Sets a new log output format;
|
||||||
type player;
|
|
||||||
}
|
}
|
||||||
set [string:option] [boolean:state] {
|
set [string:option] [boolean:state] {
|
||||||
run set_option option state;
|
run set_option option state;
|
||||||
help Allows you to enable or disable various features such as sumamries, live progress updates, etc...;
|
help Allows you to enable or disable various features such as sumamries, live progress updates, etc...;
|
||||||
type player;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -15,7 +15,7 @@ import com.redstoner.modules.ModuleLogger;
|
|||||||
import com.redstoner.modules.datamanager.DataManager;
|
import com.redstoner.modules.datamanager.DataManager;
|
||||||
|
|
||||||
@Commands(CommandHolderType.File)
|
@Commands(CommandHolderType.File)
|
||||||
@Version(major = 4, minor = 0, revision = 4, compatible = 4)
|
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
public class Logs implements Module
|
public class Logs implements Module
|
||||||
{
|
{
|
||||||
public static final String defaultFormat = "§7 > %f: %r";
|
public static final String defaultFormat = "§7 > %f: %r";
|
||||||
@@ -25,13 +25,6 @@ public class Logs implements Module
|
|||||||
"[01:23:45] [Server thread/INFO]: admin issued server command: /ban FooBar Ab00se", 15, 74);
|
"[01:23:45] [Server thread/INFO]: admin issued server command: /ban FooBar Ab00se", 15, 74);
|
||||||
protected static ModuleLogger logger;
|
protected static ModuleLogger logger;
|
||||||
|
|
||||||
@Override
|
|
||||||
public void firstLoad()
|
|
||||||
{
|
|
||||||
Module.super.firstLoad();
|
|
||||||
DataManager.setConfig("logs.root", "/etc/minecraft/redstoner/logs");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onEnable()
|
public boolean onEnable()
|
||||||
{
|
{
|
||||||
@@ -42,7 +35,7 @@ public class Logs implements Module
|
|||||||
|
|
||||||
public static File getLogsDir()
|
public static File getLogsDir()
|
||||||
{
|
{
|
||||||
return new File((String) DataManager.getConfigOrDefault("logs.root", "../logs"));
|
return new File((String) DataManager.getConfigOrDefault("logs.root", "logs"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Command(hook = "search_logs")
|
@Command(hook = "search_logs")
|
||||||
@@ -53,6 +46,13 @@ public class Logs implements Module
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Command(hook = "terminate_search")
|
||||||
|
public boolean terminate_search(CommandSender sender)
|
||||||
|
{
|
||||||
|
LogHandler.cancel(sender);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// FORMATTING
|
// FORMATTING
|
||||||
@Command(hook = "show_format")
|
@Command(hook = "show_format")
|
||||||
public boolean show_format(CommandSender sender)
|
public boolean show_format(CommandSender sender)
|
||||||
3
src/main/java/com/redstoner/modules/logs/module.info
Normal file
3
src/main/java/com/redstoner/modules/logs/module.info
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
displayName: Logs
|
||||||
|
category: Staff
|
||||||
|
description: Allows staff to Search server logs in-game
|
||||||
81
src/main/java/com/redstoner/modules/mail/Mail.cmd
Normal file
81
src/main/java/com/redstoner/modules/mail/Mail.cmd
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
command mail {
|
||||||
|
perm utils.mail;
|
||||||
|
type player;
|
||||||
|
|
||||||
|
[empty] {
|
||||||
|
run read;
|
||||||
|
help Shows your inbox of mails.;
|
||||||
|
}
|
||||||
|
read [empty] {
|
||||||
|
run read;
|
||||||
|
help Shows your inbox of messages.;
|
||||||
|
}
|
||||||
|
delete [int:id] {
|
||||||
|
run delete id;
|
||||||
|
help Deletes the given message.;
|
||||||
|
}
|
||||||
|
clear [empty] {
|
||||||
|
run clear;
|
||||||
|
help Clears your inbox.;
|
||||||
|
}
|
||||||
|
send [string:player] [string:message...] {
|
||||||
|
run send player message;
|
||||||
|
help Send a message to the given player.;
|
||||||
|
}
|
||||||
|
reply [int:id] [string:message...] {
|
||||||
|
run reply id message;
|
||||||
|
help Reply to a players message.;
|
||||||
|
}
|
||||||
|
retract [int:id] {
|
||||||
|
run retract_id id;
|
||||||
|
help Retract the given message, if the player has not read it yet.;
|
||||||
|
}
|
||||||
|
retract [empty] {
|
||||||
|
run retract;
|
||||||
|
help Retract the last message you sent, if the player has not read it yet.;
|
||||||
|
}
|
||||||
|
archive [empty] {
|
||||||
|
run archive_read;
|
||||||
|
help Shoes are archived messages.;
|
||||||
|
}
|
||||||
|
archive read [empty]{
|
||||||
|
run archive_read;
|
||||||
|
help Shoes are archived messages.;
|
||||||
|
}
|
||||||
|
archive [int:id] {
|
||||||
|
run archive id;
|
||||||
|
help Archives a message.;
|
||||||
|
}
|
||||||
|
unarchive [int:id] {
|
||||||
|
run unarchive id;
|
||||||
|
help Unarchives a message.;
|
||||||
|
}
|
||||||
|
settings theme {
|
||||||
|
[string:s_theme] {
|
||||||
|
run settings_theme_set s_theme;
|
||||||
|
help Sets the theme for your inbox. Available themes are: Light, Dark, and Gold.;
|
||||||
|
}
|
||||||
|
run settings_theme;
|
||||||
|
help Shows your current theme setting.;
|
||||||
|
}
|
||||||
|
settings actions {
|
||||||
|
[string:s_actions] {
|
||||||
|
run settings_actions_set s_actions;
|
||||||
|
help Sets the action set for your inbox. Available options are: \nMinimal: No click actions,\nSimple: Delete, and \nStandard: Delete, and Reply. \nAll actions are still available as commands.;
|
||||||
|
}
|
||||||
|
run settings_actions;
|
||||||
|
help Shows your current action set setting.;
|
||||||
|
}
|
||||||
|
settings names {
|
||||||
|
[string:s_names] {
|
||||||
|
run settings_names_set s_names;
|
||||||
|
help Sets if you want to see player's username or display name. Available options are: username or displayname;
|
||||||
|
}
|
||||||
|
run settings_names;
|
||||||
|
help Shows your current names setting.;
|
||||||
|
}
|
||||||
|
[string:player] [string:message...] {
|
||||||
|
run send player message;
|
||||||
|
help Send a message to the given player.;
|
||||||
|
}
|
||||||
|
}
|
||||||
620
src/main/java/com/redstoner/modules/mail/Mail.java
Normal file
620
src/main/java/com/redstoner/modules/mail/Mail.java
Normal file
@@ -0,0 +1,620 @@
|
|||||||
|
package com.redstoner.modules.mail;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.TimeZone;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.OfflinePlayer;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.json.simple.JSONArray;
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
|
import com.nemez.cmdmgr.Command;
|
||||||
|
import com.redstoner.annotations.AutoRegisterListener;
|
||||||
|
import com.redstoner.annotations.Commands;
|
||||||
|
import com.redstoner.annotations.Version;
|
||||||
|
import com.redstoner.coremods.moduleLoader.ModuleLoader;
|
||||||
|
import com.redstoner.misc.CommandHolderType;
|
||||||
|
import com.redstoner.misc.JsonManager;
|
||||||
|
import com.redstoner.misc.Main;
|
||||||
|
import com.redstoner.misc.Utils;
|
||||||
|
import com.redstoner.modules.Module;
|
||||||
|
import com.redstoner.modules.datamanager.DataManager;
|
||||||
|
import com.redstoner.modules.ignore.Ignore;
|
||||||
|
|
||||||
|
import net.nemez.chatapi.ChatAPI;
|
||||||
|
|
||||||
|
@AutoRegisterListener
|
||||||
|
@Commands(CommandHolderType.File)
|
||||||
|
@Version(major = 5, minor = 0, revision = 0, compatible = 4)
|
||||||
|
public class Mail implements Module, Listener
|
||||||
|
{
|
||||||
|
|
||||||
|
private Map<String, List<Msg>> playerToMsg = new HashMap<>();
|
||||||
|
private Map<Integer, Msg> idToMsg = new HashMap<>();
|
||||||
|
private Map<String, Integer> lastSent = new HashMap<>();
|
||||||
|
private Map<String, Map<Integer, Msg>> archives = new HashMap<>();
|
||||||
|
private int lastID = 1;
|
||||||
|
|
||||||
|
@Command(hook = "read")
|
||||||
|
public void read(CommandSender sender) {
|
||||||
|
|
||||||
|
String uuid = ((Player)sender).getUniqueId().toString();
|
||||||
|
|
||||||
|
List<Msg> list = playerToMsg.get(uuid);
|
||||||
|
if (list == null) {
|
||||||
|
getLogger().message(sender, true, "You have no new messages.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean shownTut = (boolean) DataManager.getOrDefault(sender, "showntut", false);
|
||||||
|
|
||||||
|
if (!shownTut) {
|
||||||
|
ChatAPI.createMessage(sender)
|
||||||
|
.appendText(getLogger().getHeader() + "\n&7Looks like you've never read your"
|
||||||
|
+ " messages before, here is a quick overview of it.\n\n&9There are 3 themes: ")
|
||||||
|
.appendSendChatHover("&eLight", "/mail settings theme light",
|
||||||
|
"&7[&cX&7][&9I&7][&8Reply&7] &afriend22&7: &fTest message!")
|
||||||
|
.appendText("&7, ")
|
||||||
|
.appendSendChatHover("&eDark", "/mail settings theme dark",
|
||||||
|
"&8[&cX&8][&9I&8][&7Reply&8] &afriend22&7: &fTest message!")
|
||||||
|
.appendText("&7, and ")
|
||||||
|
.appendSendChatHover("&eGold", "/mail settings theme gold",
|
||||||
|
"&6[&fX&6][&fI&6][&fReply&6] &afriend22&6: &fTest message!")
|
||||||
|
.appendText("\n&7&o Hover to preview, click to select. Default is Dark.")
|
||||||
|
|
||||||
|
.appendText("\n&9There are also 4 action sets: ")
|
||||||
|
.appendSendChatHover("&eMinimal", "/mail settings actions minimal",
|
||||||
|
"&8[&9I&8] &afriend22&7: &fTest message!")
|
||||||
|
.appendText("&7, ")
|
||||||
|
.appendSendChatHover("&eSimple", "/mail settings actions simple",
|
||||||
|
"&8[&cX&8][&9I&8] &afriend22&7: &fTest message!")
|
||||||
|
.appendText("&7, ")
|
||||||
|
.appendSendChatHover("&eNormal", "/mail settings actions normal",
|
||||||
|
"&8[&cX&8][&9I&8][&7Reply&8] &afriend22&7: &fTest message!")
|
||||||
|
.appendText("&7, and ")
|
||||||
|
.appendSendChatHover("&eFull", "/mail settings actions full",
|
||||||
|
"&8[&cX&8][&9I&8][&7Reply&8][&6Archive&8] &afriend22&7: &fTest message!")
|
||||||
|
.appendText("\n&7&o Hover to preview, click to select. Default is Normal")
|
||||||
|
|
||||||
|
.appendText("\n&9You can see names in 2 ways: ")
|
||||||
|
.appendSendChatHover("&eUsernames", "/mail settings names username",
|
||||||
|
"&8[&cX&8][&9I&8][&7Reply&8] &afriend22&7: &fTest message!")
|
||||||
|
.appendText("&7 or ")
|
||||||
|
.appendSendChatHover("&eDisplayName", "/mail settings names displayname",
|
||||||
|
"&8[&cX&8][&9I&8][&7Reply&8] &a&ofriendinator&r&7: &fTest message!")
|
||||||
|
.appendText("\n&7&o Hover to preview, click to select. Default is Username")
|
||||||
|
|
||||||
|
.appendText("\n\n&9What the things on the left mean:\n"
|
||||||
|
+ " &8[&cX&8]&7 - Deletes the message\n"
|
||||||
|
+ " &8[&9I&8]&7 - Shows some basic info when hovered over.\n"
|
||||||
|
+ " &8[&7Reply&8]&7 - Replys to the message; forms a message chain.\n"
|
||||||
|
+ " &8[&6Archive&8]&7 - Archives the message.\n\n"
|
||||||
|
+ "For command help run ")
|
||||||
|
.appendSendChatHover("&e/mail help", "/mail help", "Click to run")
|
||||||
|
.appendText("&7 to get a list of commands.\n&2Now do ")
|
||||||
|
.appendSendChatHover("&e/mail read","/mail","Click to run")
|
||||||
|
.appendText("&2 again to start reading.")
|
||||||
|
.send();
|
||||||
|
DataManager.setData(sender, "showntut", true);
|
||||||
|
DataManager.setData(sender, "theme", "DARK");
|
||||||
|
DataManager.setData(sender, "actions", "NORMAL");
|
||||||
|
DataManager.setData(sender, "names", "username");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String themeStr = (String) DataManager.getData(sender, "theme");
|
||||||
|
String actions = (String) DataManager.getData(sender, "actions");
|
||||||
|
String names = (String) DataManager.getData(sender, "names");
|
||||||
|
Theme theme;
|
||||||
|
|
||||||
|
if (!isValidTheme(themeStr)) {
|
||||||
|
theme = Theme.DARK;
|
||||||
|
DataManager.setData(sender, "theme", theme);
|
||||||
|
getLogger().message(sender, true, "Something went wrong with your theme setting. The setting has been reset.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
theme = Theme.valueOf(themeStr);
|
||||||
|
if (!isValidActions(actions)) {
|
||||||
|
actions = "NORMAL";
|
||||||
|
DataManager.setData(sender, "actions", actions);
|
||||||
|
getLogger().message(sender, true, "Something went wrong with your action set setting. The setting has been reset.");
|
||||||
|
}
|
||||||
|
if (!isValidNames(names)) {
|
||||||
|
names = "username";
|
||||||
|
DataManager.setData(sender, "names", names);
|
||||||
|
getLogger().message(sender, true, "Something went wrong with your names setting. The setting has been reset.");
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean useDisplayName = names.equals("displayname");
|
||||||
|
|
||||||
|
ChatAPI.send(sender, "\n" + getLogger().getHeader());
|
||||||
|
ChatAPI.send(sender, "");
|
||||||
|
switch (actions) {
|
||||||
|
case "MINIMAL":
|
||||||
|
for (Msg m : list) {
|
||||||
|
m.showMinimal(sender, theme, useDisplayName);
|
||||||
|
m.read();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "SIMPLE":
|
||||||
|
for (Msg m : list) {
|
||||||
|
m.showSimple(sender, theme, useDisplayName);
|
||||||
|
m.read();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "NORMAL":
|
||||||
|
for (Msg m : list) {
|
||||||
|
m.showNormal(sender, theme, useDisplayName);
|
||||||
|
m.read();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "FULL":
|
||||||
|
for (Msg m : list) {
|
||||||
|
m.showFull(sender, theme, useDisplayName);
|
||||||
|
m.read();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
ChatAPI.createMessage(sender).appendText("\n" + theme.getClearColor() + "Do ")
|
||||||
|
.appendSendChatHover(theme.getClearAccentColor() + "/mail clear","/mail clear","&cClick to Clear")
|
||||||
|
.appendText(theme.getClearColor() + " to clear all of your messages.")
|
||||||
|
.send();
|
||||||
|
|
||||||
|
savePlayerMsgs(uuid);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command(hook = "delete")
|
||||||
|
public void delete(CommandSender sender, int id) {
|
||||||
|
Msg msg = idToMsg.get(id);
|
||||||
|
String uuid = ((Player)sender).getUniqueId().toString();
|
||||||
|
|
||||||
|
if (msg == null || !msg.getReciever().equals(uuid)) {
|
||||||
|
getLogger().message(sender, true, "You have no messages with that ID[" + id + "].");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
idToMsg.remove(id);
|
||||||
|
|
||||||
|
List<Msg> list = playerToMsg.get(uuid);
|
||||||
|
list.remove(msg);
|
||||||
|
if (list.isEmpty())
|
||||||
|
playerToMsg.remove(uuid);
|
||||||
|
else
|
||||||
|
playerToMsg.put(uuid, list);
|
||||||
|
|
||||||
|
getLogger().message(sender, "Message Deleted. [ID=" + id + "]");
|
||||||
|
savePlayerMsgs(uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command(hook = "clear")
|
||||||
|
public void clear(CommandSender sender) {
|
||||||
|
String uuid = ((Player)sender).getUniqueId().toString();
|
||||||
|
|
||||||
|
List<Msg> list = playerToMsg.get(uuid);
|
||||||
|
|
||||||
|
if (list == null) {
|
||||||
|
getLogger().message(sender, "Messages Cleared.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
playerToMsg.remove(uuid);
|
||||||
|
for (Msg m : list)
|
||||||
|
idToMsg.remove(m.getID());
|
||||||
|
|
||||||
|
getLogger().message(sender, "Messages Cleared.");
|
||||||
|
savePlayerMsgs(uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command(hook = "send")
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public void send(CommandSender sender, String player, String message) {
|
||||||
|
OfflinePlayer op = Bukkit.getOfflinePlayer(player);
|
||||||
|
if (!op.hasPlayedBefore())
|
||||||
|
getLogger().message(sender, true, "&e" + player + "&7 has never joined the server.");
|
||||||
|
else
|
||||||
|
sendMessage(sender, op.getPlayer().getUniqueId().toString(), message, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command(hook = "reply")
|
||||||
|
public void reply(CommandSender sender, int id, String message) {
|
||||||
|
String uuid = ((Player)sender).getUniqueId().toString();
|
||||||
|
|
||||||
|
Msg msg = idToMsg.get(id);
|
||||||
|
|
||||||
|
if (msg == null || !msg.getReciever().equals(uuid)) {
|
||||||
|
getLogger().message(sender, true, "You have no messages with that ID[" + id + "].");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sendMessage(sender, msg.getSender(), message, msg.getChain());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void sendMessage(CommandSender sender, String r_uuid, String message, String chain) {
|
||||||
|
|
||||||
|
Player r = Bukkit.getOfflinePlayer(UUID.fromString(r_uuid)).getPlayer();
|
||||||
|
|
||||||
|
if (ModuleLoader.exists("Ignore") ? !Ignore.getIgnoredBy(sender).sendTo(r) : false)
|
||||||
|
{
|
||||||
|
getLogger().message(sender, true, Utils.getName(r) + " has ignored you. Your message was not sent.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String s_uuid = ((Player)sender).getUniqueId().toString();
|
||||||
|
|
||||||
|
Date date = new Date();
|
||||||
|
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
|
||||||
|
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||||
|
|
||||||
|
int id = getNextID();
|
||||||
|
|
||||||
|
Msg msg = new Msg(id, s_uuid, r_uuid, dateFormat.format(date), message, chain, false);
|
||||||
|
|
||||||
|
idToMsg.put(id, msg);
|
||||||
|
List<Msg> list = playerToMsg.getOrDefault(r_uuid, new ArrayList<>());
|
||||||
|
list.add(msg);
|
||||||
|
playerToMsg.put(r_uuid, list);
|
||||||
|
lastSent.put(s_uuid, id);
|
||||||
|
|
||||||
|
getLogger().message(sender, "Message Sent! [ID=" + id + "]");
|
||||||
|
ChatAPI.createMessage(sender)
|
||||||
|
.appendText(getLogger().getPrefix() + "Click ")
|
||||||
|
.appendSendChatHover("&ehere", "/mail retract " + id, "&cClick to Retract")
|
||||||
|
.appendText("&7 or do ")
|
||||||
|
.appendSuggestHover("&e/mail retract [id]", "/mail retract", "Click to Copy")
|
||||||
|
.appendText("&7 to retract it.")
|
||||||
|
.send();
|
||||||
|
|
||||||
|
|
||||||
|
if (r.isOnline()) {
|
||||||
|
int num = playerToMsg.get(r_uuid).size();
|
||||||
|
ChatAPI.createMessage(r)
|
||||||
|
.appendText(getLogger().getPrefix() + "&7You got &e" + num + "&7 message" + (num == 1? "" : "s") + "! Do ")
|
||||||
|
.appendSendChatHover("&e/mail", "/mail", "Click to read your messages")
|
||||||
|
.appendText("&7 to read them.")
|
||||||
|
.send();
|
||||||
|
}
|
||||||
|
|
||||||
|
savePlayerMsgs(r_uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command(hook = "retract")
|
||||||
|
public void retract(CommandSender sender) {
|
||||||
|
String uuid = ((Player)sender).getUniqueId().toString();
|
||||||
|
int id = lastSent.get(uuid);
|
||||||
|
if (id == 0)
|
||||||
|
getLogger().message(sender, true, "You haven't sent a message this session.");
|
||||||
|
else
|
||||||
|
retract_id(sender, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command(hook = "retract_id")
|
||||||
|
public void retract_id(CommandSender sender, int id) {
|
||||||
|
String uuid = ((Player)sender).getUniqueId().toString();
|
||||||
|
Msg msg = idToMsg.get(id);
|
||||||
|
|
||||||
|
if (msg == null || !msg.getSender().equals(uuid))
|
||||||
|
getLogger().message(sender, true, "Unable to retract, that message doesn't exist. You either put in the wrong id, or it was deleted by the reciever.");
|
||||||
|
else if (msg.isRead())
|
||||||
|
getLogger().message(sender, true, "Unable to retract, message has already been read.");
|
||||||
|
else {
|
||||||
|
idToMsg.remove(id);
|
||||||
|
|
||||||
|
String r_uuid = msg.getReciever();
|
||||||
|
List<Msg> list = playerToMsg.get(r_uuid);
|
||||||
|
list.remove(msg);
|
||||||
|
if (list.isEmpty())
|
||||||
|
playerToMsg.remove(r_uuid);
|
||||||
|
else
|
||||||
|
playerToMsg.put(r_uuid, list);
|
||||||
|
getLogger().message(sender, "Message Retracted.");
|
||||||
|
savePlayerMsgs(r_uuid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command(hook = "archive_read")
|
||||||
|
public void archive_read(CommandSender sender) {
|
||||||
|
String uuid = ((Player)sender).getUniqueId().toString();
|
||||||
|
Map<Integer, Msg> list = archives.get(uuid);
|
||||||
|
|
||||||
|
if (list == null) {
|
||||||
|
getLogger().message(sender, true, "You have no archived messages.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ChatAPI.send(sender, "&2--=[ Archived ]=--");
|
||||||
|
ChatAPI.send(sender, "");
|
||||||
|
|
||||||
|
String themeStr = (String) DataManager.getData(sender, "theme");
|
||||||
|
String names = (String) DataManager.getData(sender, "names");
|
||||||
|
Theme theme;
|
||||||
|
|
||||||
|
if (!isValidTheme(themeStr)) {
|
||||||
|
theme = Theme.DARK;
|
||||||
|
DataManager.setData(sender, "theme", theme);
|
||||||
|
getLogger().message(sender, true, "Something went wrong with your theme setting. The setting has been reset.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
theme = Theme.valueOf(themeStr);
|
||||||
|
if (!isValidNames(names)) {
|
||||||
|
names = "username";
|
||||||
|
DataManager.setData(sender, "names", names);
|
||||||
|
getLogger().message(sender, true, "Something went wrong with your names setting. The setting has been reset.");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Msg m : list.values()) {
|
||||||
|
m.showArchived(sender, theme, names.equals("displayname"));
|
||||||
|
}
|
||||||
|
|
||||||
|
ChatAPI.send(sender, "\n&2These messages don't count towards your mail count.");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command(hook = "archive")
|
||||||
|
public void archive(CommandSender sender, int id) {
|
||||||
|
String uuid = ((Player)sender).getUniqueId().toString();
|
||||||
|
Msg msg = idToMsg.get(id);
|
||||||
|
|
||||||
|
if (msg == null || !msg.getReciever().equals(uuid)) {
|
||||||
|
getLogger().message(sender, true, "You have no messages with that ID[" + id + "].");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
msg.read();
|
||||||
|
|
||||||
|
List<Msg> list = playerToMsg.get(uuid);
|
||||||
|
list.remove(msg);
|
||||||
|
if (list.isEmpty())
|
||||||
|
playerToMsg.remove(uuid);
|
||||||
|
else
|
||||||
|
playerToMsg.put(uuid, list);
|
||||||
|
idToMsg.remove(id);
|
||||||
|
|
||||||
|
Map<Integer,Msg> list2 = archives.getOrDefault(uuid, new HashMap<>());
|
||||||
|
int lastAID = list2.size();
|
||||||
|
list2.put(lastAID, msg);
|
||||||
|
archives.put(uuid, list2);
|
||||||
|
|
||||||
|
msg.setID(list2.size() -1);
|
||||||
|
getLogger().message(sender, "Message Archived. [ID=" + id + "] [ArchiveID=" + lastAID + "]");
|
||||||
|
savePlayerMsgs(uuid);
|
||||||
|
savePlayerArchive(uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command(hook = "unarchive")
|
||||||
|
public void unarchive(CommandSender sender, int id) {
|
||||||
|
String uuid = ((Player)sender).getUniqueId().toString();
|
||||||
|
Map<Integer,Msg> list = archives.get(uuid);
|
||||||
|
|
||||||
|
if (id < 0 || id >= list.size()) {
|
||||||
|
getLogger().message(sender, true, "You have no archived messages with that ID.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Msg msg = list.get(id);
|
||||||
|
msg.setID(getNextID());
|
||||||
|
|
||||||
|
list.remove(id);
|
||||||
|
if (list.isEmpty())
|
||||||
|
archives.remove(uuid);
|
||||||
|
else
|
||||||
|
archives.put(uuid, list);
|
||||||
|
List<Msg> list2 = playerToMsg.getOrDefault(uuid, new ArrayList<>());
|
||||||
|
list2.add(msg);
|
||||||
|
playerToMsg.put(uuid, list2);
|
||||||
|
idToMsg.put(msg.getID(), msg);
|
||||||
|
|
||||||
|
getLogger().message(sender, "Message Unarchived. [ArchiveID=" + id + "] [ID=" + msg.getID() + "]");
|
||||||
|
savePlayerMsgs(uuid);
|
||||||
|
savePlayerArchive(uuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Command(hook = "settings_theme")
|
||||||
|
public void settings_theme(CommandSender sender) {
|
||||||
|
String theme = (String) DataManager.getData(sender, "theme");
|
||||||
|
if (!isValidTheme(theme)) {
|
||||||
|
theme = Theme.DARK.toString();
|
||||||
|
DataManager.setData(sender, "theme", theme);
|
||||||
|
}
|
||||||
|
getLogger().message(sender, "Your current theme is &e" + theme + "&7.");
|
||||||
|
|
||||||
|
}
|
||||||
|
@Command(hook = "settings_theme_set")
|
||||||
|
public void settings_theme_set(CommandSender sender, String theme) {
|
||||||
|
if (!isValidTheme(theme)) {
|
||||||
|
ChatAPI.createMessage(sender)
|
||||||
|
.appendText(getLogger().getPrefix(true) + "Invalid theme. Available themes are: ")
|
||||||
|
.appendSendChatHover("&eLight", "/mail settings theme light", "Click to switch to &eLight")
|
||||||
|
.appendText("&7, ")
|
||||||
|
.appendSendChatHover("&eDark", "/mail settings theme dark", "Click to switch to &eDark")
|
||||||
|
.appendText("&7, ")
|
||||||
|
.appendSendChatHover("&eGold", "/mail settings theme gold", "Click to switch to &eGold")
|
||||||
|
.send();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DataManager.setData(sender, "theme", theme.toUpperCase());
|
||||||
|
getLogger().message(sender, "Theme set to &e" + theme + "&7.");
|
||||||
|
}
|
||||||
|
@Command(hook = "settings_actions")
|
||||||
|
public void settings_actions(CommandSender sender) {
|
||||||
|
String actions = (String) DataManager.getData(sender, "actions");
|
||||||
|
if (!isValidActions(actions)) {
|
||||||
|
actions = "NORMAL";
|
||||||
|
DataManager.setData(sender, "actions", actions);
|
||||||
|
}
|
||||||
|
getLogger().message(sender, "Your current action set is &e" + actions.toLowerCase() + ".");
|
||||||
|
}
|
||||||
|
@Command(hook = "settings_actions_set")
|
||||||
|
public void settings_actions_set(CommandSender sender, String actions) {
|
||||||
|
if (!isValidActions(actions)) {
|
||||||
|
|
||||||
|
ChatAPI.createMessage(sender)
|
||||||
|
.appendText(getLogger().getPrefix(true) + "Invalid action set. Available options are:")
|
||||||
|
.appendSendChatHover("\n &eMinimal", "/mail settings actions minimal", "Click to switch to &eMinimal")
|
||||||
|
.appendText("&7: No click actions, ")
|
||||||
|
.appendSendChatHover("\n &eSimple", "/mail settings actions simple", "Click to switch to &eSimple")
|
||||||
|
.appendText("&7: Delete, ")
|
||||||
|
.appendSendChatHover("\n &eNormal", "/mail settings actions normal", "Click to switch to &eNormal")
|
||||||
|
.appendText("&7: : Delete and Reply.")
|
||||||
|
.appendSendChatHover("\n &eFull", "/mail settings actions full", "Click to switch to &eFull")
|
||||||
|
.appendText("&7: : Delete, Reply, and Archive.\nAll actions are still available with commands.")
|
||||||
|
.send();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DataManager.setData(sender, "actions", actions.toUpperCase());
|
||||||
|
getLogger().message(sender, "Action Set set to &e" + actions.toLowerCase() + "&7.");
|
||||||
|
}
|
||||||
|
@Command(hook = "settings_names")
|
||||||
|
public void settings_names(CommandSender sender) {
|
||||||
|
String names = (String) DataManager.getData(sender, "names");
|
||||||
|
if (!isValidNames(names)) {
|
||||||
|
names = "username";
|
||||||
|
DataManager.setData(sender, "names", names);
|
||||||
|
}
|
||||||
|
getLogger().message(sender, "Your current names setting is &e" + names.toLowerCase() + ".");
|
||||||
|
}
|
||||||
|
@Command(hook = "settings_names_set")
|
||||||
|
public void settings_names_set(CommandSender sender, String names) {
|
||||||
|
if (!isValidNames(names)) {
|
||||||
|
ChatAPI.createMessage(sender)
|
||||||
|
.appendText(getLogger().getPrefix(true) + "Invalid name setting. Available options are: ")
|
||||||
|
.appendSendChatHover("&eusername", "/mail settings names username", "Click to switch to &eusernames")
|
||||||
|
.appendText(" &7or ")
|
||||||
|
.appendSendChatHover("&edisplaynames", "/mail settings names displaynames", "Click to switch to &edisplaynames")
|
||||||
|
.send();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DataManager.setData(sender, "names", names.toLowerCase());
|
||||||
|
getLogger().message(sender, "Names setting set to &e" + names.toLowerCase() + "&7.");
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isValidTheme(String theme) {
|
||||||
|
return theme != null && (theme.equalsIgnoreCase("light")
|
||||||
|
|| theme.equalsIgnoreCase("dark")
|
||||||
|
|| theme.equalsIgnoreCase("gold"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isValidActions(String actions) {
|
||||||
|
return actions != null && (actions.equalsIgnoreCase("minimal")
|
||||||
|
|| actions.equalsIgnoreCase("simple")
|
||||||
|
|| actions.equalsIgnoreCase("normal")
|
||||||
|
|| actions.equalsIgnoreCase("full"));
|
||||||
|
}
|
||||||
|
private boolean isValidNames(String names) {
|
||||||
|
return names != null && (names.equalsIgnoreCase("username")
|
||||||
|
|| names.equalsIgnoreCase("displayname"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getNextID() {
|
||||||
|
if (lastID > 99999999)
|
||||||
|
getLogger().warn("IDs have exceeded 8 digits, reload suggested.");
|
||||||
|
return lastID++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void postEnable() {
|
||||||
|
File dir = new File(Main.plugin.getDataFolder(), "/mail");
|
||||||
|
File[] filesInDir = dir.listFiles();
|
||||||
|
if (filesInDir == null)
|
||||||
|
return;
|
||||||
|
for (File file : filesInDir) {
|
||||||
|
if (file.isFile()) {
|
||||||
|
JSONArray msgs = JsonManager.getArray(file);
|
||||||
|
String uuid = file.getName().substring(0, file.getName().indexOf(".json"));
|
||||||
|
|
||||||
|
List<Msg> list = new ArrayList<>();
|
||||||
|
for (Object o : msgs) {
|
||||||
|
Msg m = Msg.fromJSONObject((JSONObject)o, getNextID());
|
||||||
|
list.add(m);
|
||||||
|
idToMsg.put(m.getID(), m);
|
||||||
|
}
|
||||||
|
if (!list.isEmpty())
|
||||||
|
playerToMsg.put(uuid, list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Bukkit.getOnlinePlayers().forEach((Player p) -> loadPlayer(p));
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onPlayerJoin(PlayerJoinEvent event)
|
||||||
|
{
|
||||||
|
loadPlayer(event.getPlayer());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void loadPlayer(Player p) {
|
||||||
|
String uuid = p.getUniqueId().toString();
|
||||||
|
|
||||||
|
File jsonfile = new File(Main.plugin.getDataFolder(), "/mail/archive/" + uuid + ".json");
|
||||||
|
JSONArray fromArchive = JsonManager.getArray(jsonfile);
|
||||||
|
Map<Integer,Msg> archives = new HashMap<>();
|
||||||
|
|
||||||
|
if (fromArchive != null) {
|
||||||
|
int i = 0;
|
||||||
|
for (Object o : fromArchive) {
|
||||||
|
Msg m = Msg.fromJSONObject(((JSONObject)o), i);
|
||||||
|
archives.put(i, m);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if (!archives.isEmpty())
|
||||||
|
this.archives.put(uuid, archives);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
List<Msg> list = playerToMsg.get(uuid);
|
||||||
|
if (list != null && !list.isEmpty())
|
||||||
|
ChatAPI.createMessage(p)
|
||||||
|
.appendText(getLogger().getPrefix() + "&7You got &e" + list.size() +
|
||||||
|
"&7 message" + (list.size() == 1? "" : "s") + "! Do ")
|
||||||
|
.appendSendChatHover("&e/mail", "/mail", "Click to read your messages")
|
||||||
|
.appendText("&7 to read them.")
|
||||||
|
.send();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public void savePlayerMsgs(String uuid) {
|
||||||
|
|
||||||
|
File jsonfile = new File(Main.plugin.getDataFolder(), "/mail/" + uuid + ".json");
|
||||||
|
|
||||||
|
List<Msg> messages = playerToMsg.getOrDefault(uuid, new ArrayList<>());
|
||||||
|
|
||||||
|
JSONArray m_array = new JSONArray();
|
||||||
|
|
||||||
|
for (Msg m : messages)
|
||||||
|
m_array.add(m.toJSONObject());
|
||||||
|
|
||||||
|
JsonManager.save(m_array, jsonfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public void savePlayerArchive(String uuid) {
|
||||||
|
|
||||||
|
File jsonfile = new File(Main.plugin.getDataFolder(), "/mail/archive/" + uuid + ".json");
|
||||||
|
|
||||||
|
Map<Integer,Msg> arch = archives.getOrDefault(uuid, new HashMap<>());
|
||||||
|
|
||||||
|
JSONArray a_array = new JSONArray();
|
||||||
|
|
||||||
|
for (Msg m : arch.values())
|
||||||
|
a_array.add(m.toJSONObject());
|
||||||
|
|
||||||
|
JsonManager.save(a_array, jsonfile);
|
||||||
|
}
|
||||||
|
}
|
||||||
206
src/main/java/com/redstoner/modules/mail/Msg.java
Normal file
206
src/main/java/com/redstoner/modules/mail/Msg.java
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
package com.redstoner.modules.mail;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.json.simple.JSONObject;
|
||||||
|
|
||||||
|
import net.nemez.chatapi.ChatAPI;
|
||||||
|
import net.nemez.chatapi.click.Message;
|
||||||
|
|
||||||
|
public class Msg {
|
||||||
|
|
||||||
|
private int id;
|
||||||
|
private String sender;
|
||||||
|
private String reciever;
|
||||||
|
private String timeSent;
|
||||||
|
private String message;
|
||||||
|
private String chain;
|
||||||
|
private boolean read;
|
||||||
|
|
||||||
|
public Msg(int id, String sender, String reciever, String timeSent, String message, String chain, boolean read) {
|
||||||
|
this.id = id;
|
||||||
|
this.sender = sender;
|
||||||
|
this.reciever = reciever;
|
||||||
|
this.timeSent = timeSent;
|
||||||
|
this.message = message;
|
||||||
|
this.chain = chain;
|
||||||
|
this.read = read;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSender() {
|
||||||
|
return sender;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getReciever() {
|
||||||
|
return reciever;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void read() {
|
||||||
|
read = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isRead() {
|
||||||
|
return read;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setID(int id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getID() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getChain() {
|
||||||
|
Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer();
|
||||||
|
|
||||||
|
String line = getPrefix(p) + p.getName() + "&7:&f " + message;
|
||||||
|
|
||||||
|
if (chain == null)
|
||||||
|
return line;
|
||||||
|
else
|
||||||
|
return chain + "\n" + line;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showMinimal(CommandSender viewer, Theme theme, boolean showDisplayName) {
|
||||||
|
Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer();
|
||||||
|
String name = getPrefix(p) + p.getName();
|
||||||
|
|
||||||
|
Message msg = ChatAPI.createMessage(viewer)
|
||||||
|
.appendText(theme.getBracketColor() + "[")
|
||||||
|
.appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id)
|
||||||
|
.appendText(theme.getBracketColor() + "] ");
|
||||||
|
if (showDisplayName)
|
||||||
|
msg.appendTextHover(p.getDisplayName(), name);
|
||||||
|
else
|
||||||
|
msg.appendText(name);
|
||||||
|
msg.appendText(theme.getColonColor() + ": ");
|
||||||
|
if (chain == null)
|
||||||
|
msg.appendText(message).send();
|
||||||
|
else
|
||||||
|
msg.appendTextHover(message, chain).send();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showSimple(CommandSender viewer, Theme theme, boolean showDisplayName) {
|
||||||
|
Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer();
|
||||||
|
String name = getPrefix(p) + p.getName();
|
||||||
|
|
||||||
|
Message msg = ChatAPI.createMessage(viewer)
|
||||||
|
.appendText(theme.getBracketColor() + "[")
|
||||||
|
.appendSendChatHover(theme.getDeleteColor() + "X", "/mail delete " + id, "&cDelete")
|
||||||
|
.appendText(theme.getBracketColor() + "][")
|
||||||
|
.appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id)
|
||||||
|
.appendText(theme.getBracketColor() + "] ");
|
||||||
|
if (showDisplayName)
|
||||||
|
msg.appendTextHover(p.getDisplayName(), name);
|
||||||
|
else
|
||||||
|
msg.appendText(name);
|
||||||
|
msg.appendText(theme.getColonColor() + ": ");
|
||||||
|
if (chain == null)
|
||||||
|
msg.appendText(message).send();
|
||||||
|
else
|
||||||
|
msg.appendTextHover(message, chain).send();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showNormal(CommandSender viewer, Theme theme, boolean showDisplayName) {
|
||||||
|
Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer();
|
||||||
|
String name = getPrefix(p) + p.getName();
|
||||||
|
|
||||||
|
Message msg = ChatAPI.createMessage(viewer)
|
||||||
|
.appendText(theme.getBracketColor() + "[")
|
||||||
|
.appendSendChatHover(theme.getDeleteColor() + "X", "/mail delete " + id, "&cDelete")
|
||||||
|
.appendText(theme.getBracketColor() + "][")
|
||||||
|
.appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id)
|
||||||
|
.appendText(theme.getBracketColor() + "][")
|
||||||
|
.appendSuggestHover(theme.getReplyColor() + "Reply", "/mail reply " + id + " ", "&7Reply")
|
||||||
|
.appendText(theme.getBracketColor() + "] ");
|
||||||
|
if (showDisplayName)
|
||||||
|
msg.appendTextHover(p.getDisplayName(), name);
|
||||||
|
else
|
||||||
|
msg.appendText(name);
|
||||||
|
msg.appendText(theme.getColonColor() + ": ");
|
||||||
|
if (chain == null)
|
||||||
|
msg.appendText(message).send();
|
||||||
|
else
|
||||||
|
msg.appendTextHover(message, chain).send();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showFull(CommandSender viewer, Theme theme, boolean showDisplayName) {
|
||||||
|
Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer();
|
||||||
|
String name = getPrefix(p) + p.getName();
|
||||||
|
|
||||||
|
Message msg = ChatAPI.createMessage(viewer)
|
||||||
|
.appendText(theme.getBracketColor() + "[")
|
||||||
|
.appendSendChatHover(theme.getDeleteColor() + "X", "/mail delete " + id, "&cDelete")
|
||||||
|
.appendText(theme.getBracketColor() + "][")
|
||||||
|
.appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id)
|
||||||
|
.appendText(theme.getBracketColor() + "][")
|
||||||
|
.appendSuggestHover(theme.getReplyColor() + "Reply", "/mail reply " + id + " ", "&7Reply")
|
||||||
|
.appendText(theme.getBracketColor() + "][")
|
||||||
|
.appendSendChatHover(theme.getArchiveColor() + "Archive", "/mail archive " + id + " ", "&6Archive")
|
||||||
|
.appendText(theme.getBracketColor() + "] ");
|
||||||
|
if (showDisplayName)
|
||||||
|
msg.appendTextHover(p.getDisplayName(), name);
|
||||||
|
else
|
||||||
|
msg.appendText(name);
|
||||||
|
msg.appendText(theme.getColonColor() + ": ");
|
||||||
|
if (chain == null)
|
||||||
|
msg.appendText(message).send();
|
||||||
|
else
|
||||||
|
msg.appendTextHover(message, chain).send();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showArchived(CommandSender viewer, Theme theme, boolean showDisplayName) {
|
||||||
|
Player p = Bukkit.getOfflinePlayer(UUID.fromString(sender)).getPlayer();
|
||||||
|
String name = getPrefix(p) + p.getName();
|
||||||
|
|
||||||
|
Message msg = ChatAPI.createMessage(viewer)
|
||||||
|
.appendText(theme.getBracketColor() + "[")
|
||||||
|
.appendSendChatHover(theme.getArchiveColor() + "Unarchive", "/mail unarchive " + id, "&6Unarchive")
|
||||||
|
.appendText(theme.getBracketColor() + "][")
|
||||||
|
.appendTextHover(theme.getInfoColor() + "I", "&9Time Sent:\n&7" + timeSent + "\nID: " + id)
|
||||||
|
.appendText(theme.getBracketColor() + "] ");
|
||||||
|
if (showDisplayName)
|
||||||
|
msg.appendTextHover(p.getDisplayName(), name);
|
||||||
|
else
|
||||||
|
msg.appendText(name);
|
||||||
|
msg.appendText(theme.getColonColor() + ": ");
|
||||||
|
if (chain == null)
|
||||||
|
msg.appendText(message).send();
|
||||||
|
else
|
||||||
|
msg.appendTextHover(message, chain).send();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getPrefix(Player player)
|
||||||
|
{
|
||||||
|
String[] teams = new String[] {"admin", "mod", "trainingmod", "helper", "trusted", "builder", "member", "visitor"};
|
||||||
|
String[] prefixes = new String[] {"&4", "&c", "&c", "&9", "&3", "&a", "&f", "&7"};
|
||||||
|
|
||||||
|
for (int i = 0; i < teams.length; i++)
|
||||||
|
if (player.hasPermission("group." + teams[i]))
|
||||||
|
return prefixes[i];
|
||||||
|
return "&7";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public JSONObject toJSONObject() {
|
||||||
|
JSONObject j = new JSONObject();
|
||||||
|
j.put("sender", sender);
|
||||||
|
j.put("reciever", reciever);
|
||||||
|
j.put("timeSent", timeSent);
|
||||||
|
j.put("message", message);
|
||||||
|
j.put("chain", chain);
|
||||||
|
j.put("read", read);
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Msg fromJSONObject(JSONObject j, int id) {
|
||||||
|
return new Msg(id, (String) j.get("sender"), (String) j.get("reciever"), (String) j.get("timeSent"),
|
||||||
|
(String) j.get("message"), (String) j.get("chain"), (boolean)j.get("read"));
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user