From 06d85573ba747083c7c2b75a4be7414eab247afa Mon Sep 17 00:00:00 2001 From: Driftay Date: Sun, 1 Dec 2019 19:25:41 -0500 Subject: [PATCH] The commit that confirms you lost uWu P.S HardCoded for Beta Testing :D --- .../java/com/massivecraft/factions/Conf.java | 4 + .../com/massivecraft/factions/FLocation.java | 4 + .../massivecraft/factions/FactionsPlugin.java | 40 +++-- .../massivecraft/factions/cmd/CmdAdmin.java | 5 +- .../massivecraft/factions/cmd/CmdAudit.java | 34 ++++ .../com/massivecraft/factions/cmd/CmdBan.java | 3 + .../factions/cmd/CmdColeader.java | 3 + .../factions/cmd/CmdDescription.java | 7 +- .../massivecraft/factions/cmd/CmdInvite.java | 3 + .../massivecraft/factions/cmd/CmdJoin.java | 3 + .../massivecraft/factions/cmd/CmdKick.java | 4 + .../com/massivecraft/factions/cmd/CmdMod.java | 3 + .../massivecraft/factions/cmd/CmdSaveAll.java | 10 +- .../com/massivecraft/factions/cmd/CmdTag.java | 2 + .../massivecraft/factions/cmd/FCmdRoot.java | 2 + .../factions/cmd/alts/CmdInviteAlt.java | 5 + .../factions/cmd/alts/CmdKickAlt.java | 4 +- .../factions/cmd/chest/FChestListener.java | 108 ++++++++++++ .../factions/cmd/claim/CmdAutoClaim.java | 7 +- .../factions/cmd/claim/CmdClaim.java | 5 +- .../factions/cmd/claim/CmdClaimAt.java | 3 + .../factions/cmd/claim/CmdClaimLine.java | 6 +- .../factions/cmd/claim/CmdUnclaim.java | 5 + .../factions/cmd/claim/CmdUnclaimall.java | 10 +- .../factions/cmd/econ/CmdMoneyDeposit.java | 3 + .../factions/cmd/econ/CmdMoneyWithdraw.java | 5 + .../cmd/relational/FRelationCommand.java | 4 +- .../factions/cmd/roles/FPromoteCommand.java | 7 + .../massivecraft/factions/cmd/tnt/CmdTnt.java | 7 +- .../listeners/FactionsBlockListener.java | 61 ++++++- .../listeners/FactionsPlayerListener.java | 3 + .../listeners/menu/ClickableItemStack.java | 46 ++++++ .../factions/listeners/menu/GUIMenu.java | 153 +++++++++++++++++ .../factions/listeners/menu/MenuListener.java | 59 +++++++ .../factions/scoreboards/FTeamWrapper.java | 33 +--- .../factions/struct/Permission.java | 1 + .../factions/zcore/faudit/FAuditMenu.java | 154 ++++++++++++++++++ .../factions/zcore/faudit/FLogManager.java | 148 +++++++++++++++++ .../factions/zcore/faudit/FLogType.java | 49 ++++++ .../factions/zcore/faudit/FactionLogs.java | 103 ++++++++++++ .../factions/zcore/faudit/LogTimer.java | 123 ++++++++++++++ .../fperms/gui/PermissableActionFrame.java | 5 + .../factions/zcore/persist/MemoryFPlayer.java | 3 + .../massivecraft/factions/zcore/util/CC.java | 92 +++++++++++ .../factions/zcore/util/ItemUtil.java | 48 ++++++ .../factions/zcore/util/JSONUtils.java | 98 +++++++++++ src/main/resources/config.yml | 2 +- 47 files changed, 1424 insertions(+), 63 deletions(-) create mode 100644 src/main/java/com/massivecraft/factions/cmd/CmdAudit.java create mode 100644 src/main/java/com/massivecraft/factions/cmd/chest/FChestListener.java create mode 100644 src/main/java/com/massivecraft/factions/listeners/menu/ClickableItemStack.java create mode 100644 src/main/java/com/massivecraft/factions/listeners/menu/GUIMenu.java create mode 100644 src/main/java/com/massivecraft/factions/listeners/menu/MenuListener.java create mode 100644 src/main/java/com/massivecraft/factions/zcore/faudit/FAuditMenu.java create mode 100644 src/main/java/com/massivecraft/factions/zcore/faudit/FLogManager.java create mode 100644 src/main/java/com/massivecraft/factions/zcore/faudit/FLogType.java create mode 100644 src/main/java/com/massivecraft/factions/zcore/faudit/FactionLogs.java create mode 100644 src/main/java/com/massivecraft/factions/zcore/faudit/LogTimer.java create mode 100644 src/main/java/com/massivecraft/factions/zcore/util/CC.java create mode 100644 src/main/java/com/massivecraft/factions/zcore/util/ItemUtil.java create mode 100644 src/main/java/com/massivecraft/factions/zcore/util/JSONUtils.java diff --git a/src/main/java/com/massivecraft/factions/Conf.java b/src/main/java/com/massivecraft/factions/Conf.java index bd361ba5..53d7f9fc 100644 --- a/src/main/java/com/massivecraft/factions/Conf.java +++ b/src/main/java/com/massivecraft/factions/Conf.java @@ -220,6 +220,10 @@ public class Conf { public static boolean ownedMessageInsideTerritory = true; public static boolean ownedMessageByChunk = false; public static boolean pistonProtectionThroughDenyBuild = true; + + //logs + public static Set loggableMaterials = EnumSet.noneOf(Material.class); + public static Set territoryProtectedMaterials = EnumSet.noneOf(Material.class); public static Set territoryDenyUsageMaterials = EnumSet.noneOf(Material.class); public static Set territoryProtectedMaterialsWhenOffline = EnumSet.noneOf(Material.class); diff --git a/src/main/java/com/massivecraft/factions/FLocation.java b/src/main/java/com/massivecraft/factions/FLocation.java index 8eacaf44..3ab1f427 100644 --- a/src/main/java/com/massivecraft/factions/FLocation.java +++ b/src/main/java/com/massivecraft/factions/FLocation.java @@ -244,6 +244,10 @@ public class FLocation implements Serializable { return (this.x << 9) + this.z + (this.worldName != null ? this.worldName.hashCode() : 0); } + public String formatXAndZ(String splitter) { + return chunkToBlock(this.x) + "x" + splitter + " " + chunkToBlock(this.z) + "z"; + } + @Override public boolean equals(Object obj) { if (obj == this) { diff --git a/src/main/java/com/massivecraft/factions/FactionsPlugin.java b/src/main/java/com/massivecraft/factions/FactionsPlugin.java index 55788a0f..e73c4596 100755 --- a/src/main/java/com/massivecraft/factions/FactionsPlugin.java +++ b/src/main/java/com/massivecraft/factions/FactionsPlugin.java @@ -11,12 +11,14 @@ import com.massivecraft.factions.cmd.FCommand; import com.massivecraft.factions.cmd.check.CheckTask; import com.massivecraft.factions.cmd.check.WeeWooTask; import com.massivecraft.factions.cmd.chest.AntiChestListener; +import com.massivecraft.factions.cmd.chest.FChestListener; import com.massivecraft.factions.discord.DiscordListener; import com.massivecraft.factions.discord.FactionChatHandler; import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.integration.Worldguard; import com.massivecraft.factions.integration.dynmap.EngineDynmap; import com.massivecraft.factions.listeners.*; +import com.massivecraft.factions.listeners.menu.MenuListener; import com.massivecraft.factions.missions.MissionHandler; import com.massivecraft.factions.shop.ShopConfig; import com.massivecraft.factions.struct.ChatMode; @@ -26,6 +28,8 @@ import com.massivecraft.factions.util.*; import com.massivecraft.factions.util.Particles.ReflectionUtils; import com.massivecraft.factions.zcore.CommandVisibility; import com.massivecraft.factions.zcore.MPlugin; +import com.massivecraft.factions.zcore.faudit.FLogManager; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.Access; import com.massivecraft.factions.zcore.fperms.Permissable; import com.massivecraft.factions.zcore.fperms.PermissableAction; @@ -90,6 +94,7 @@ public class FactionsPlugin extends MPlugin { private Listener[] eventsListener; public List itemList = getConfig().getStringList("fchest.Items-Not-Allowed"); private Worldguard wg; + private FLogManager flogManager; public FactionsPlugin() { @@ -184,6 +189,8 @@ public class FactionsPlugin extends MPlugin { PermissionList.generateFile(); // Load Conf from disk Conf.load(); + flogManager = new FLogManager(); + //Dependency checks if (Conf.dependencyCheck && (!Bukkit.getPluginManager().isPluginEnabled("Vault") && !Bukkit.getPluginManager().isPluginEnabled("Essentials"))) { divider(); @@ -274,7 +281,7 @@ public class FactionsPlugin extends MPlugin { } ShopConfig.setup(); - + flogManager.loadLogs(this); getServer().getPluginManager().registerEvents(factionsPlayerListener = new FactionsPlayerListener(), this); // Register Event Handlers @@ -286,6 +293,8 @@ public class FactionsPlugin extends MPlugin { new FUpgradesGUI(), new UpgradesListener(), new MissionHandler(this), + new FChestListener(), + new MenuListener(), new AntiChestListener() }; @@ -434,6 +443,12 @@ public class FactionsPlugin extends MPlugin { } DiscordListener.saveGuilds(); super.onDisable(); + + try { + flogManager.saveLogs(); + } catch (Exception e) { + e.printStackTrace(); + } } public void startAutoLeaveTask(boolean restartIfRunning) { @@ -559,21 +574,6 @@ public class FactionsPlugin extends MPlugin { } } - public void createTimedHologram(final Location location, String text, Long timeout) { - ArmorStand as = (ArmorStand) location.add(0.5, 1, 0.5).getWorld().spawnEntity(location, EntityType.ARMOR_STAND); //Spawn the ArmorStand - as.setVisible(false); //Makes the ArmorStand invisible - as.setGravity(false); //Make sure it doesn't fall - as.setCanPickupItems(false); //I'm not sure what happens if you leave this as it is, but you might as well disable it - as.setCustomName(FactionsPlugin.instance.color(text)); //Set this to the text you want - as.setCustomNameVisible(true); //This makes the text appear no matter if your looking at the entity or not - final ArmorStand armorStand = as; - - Bukkit.getScheduler().scheduleSyncDelayedTask(FactionsPlugin.instance, () -> { - armorStand.remove(); - getLogger().info("Removing Hologram."); - } - , timeout * 20); - } // -------------------------------------------- // @@ -714,6 +714,14 @@ public class FactionsPlugin extends MPlugin { return hookedPlayervaults; } + public FLogManager getFlogManager() { + return flogManager; + } + + public void logFactionEvent(Faction faction, FLogType type, String... arguments) { + this.flogManager.log(faction, type, arguments); + } + public String getPrimaryGroup(OfflinePlayer player) { AtomicReference primaryGroup = new AtomicReference<>(); diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdAdmin.java b/src/main/java/com/massivecraft/factions/cmd/CmdAdmin.java index 30a9167f..d2ab494d 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdAdmin.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdAdmin.java @@ -3,11 +3,14 @@ package com.massivecraft.factions.cmd; import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayers; import com.massivecraft.factions.Faction; +import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.event.FPlayerJoinEvent; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Role; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.util.TL; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; public class CmdAdmin extends FCommand { @@ -77,7 +80,7 @@ public class CmdAdmin extends FCommand { } fyou.setRole(Role.LEADER); context.msg(TL.COMMAND_ADMIN_PROMOTES, fyou.describeTo(context.fPlayer, true)); - + FactionsPlugin.instance.getFlogManager().log(targetFaction, FLogType.RANK_EDIT, context.fPlayer.getName(), fyou.getName(), ChatColor.RED + "Admin"); // Inform all players for (FPlayer fplayer : FPlayers.getInstance().getOnlinePlayers()) { fplayer.msg(TL.COMMAND_ADMIN_PROMOTED, context.player == null ? TL.GENERIC_SERVERADMIN.toString() : context.fPlayer.describeTo(fplayer, true), fyou.describeTo(fplayer), targetFaction.describeTo(fplayer)); diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdAudit.java b/src/main/java/com/massivecraft/factions/cmd/CmdAudit.java new file mode 100644 index 00000000..2abbc869 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/cmd/CmdAudit.java @@ -0,0 +1,34 @@ +package com.massivecraft.factions.cmd; + +import com.massivecraft.factions.Faction; +import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.faudit.FAuditMenu; +import com.massivecraft.factions.zcore.util.TL; +import org.bukkit.entity.Player; + +public class CmdAudit extends FCommand { + + public CmdAudit() { + super(); + this.aliases.add("audit"); + this.aliases.add("logs"); + this.aliases.add("log"); + + + this.requirements = new CommandRequirements.Builder(Permission.AUDIT) + .playerOnly() + .memberOnly() + .noErrorOnManyArgs() + .build(); + } + @Override + public void perform(CommandContext context) { + Faction faction = context.args.size() == 1 && context.sender.isOp() ? context.argAsFaction(0) : context.faction; + new FAuditMenu((Player)context.sender, faction).open((Player)context.sender); + } + + @Override + public TL getUsageTranslation() { + return null; + } +} diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdBan.java b/src/main/java/com/massivecraft/factions/cmd/CmdBan.java index f9158d10..1fff4709 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdBan.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdBan.java @@ -5,7 +5,9 @@ import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.event.FPlayerLeaveEvent; import com.massivecraft.factions.struct.BanInfo; import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.PermissableAction; +import com.massivecraft.factions.zcore.util.CC; import com.massivecraft.factions.zcore.util.TL; import org.bukkit.Bukkit; @@ -75,6 +77,7 @@ public class CmdBan extends FCommand { // Lets inform the people! target.msg(TL.COMMAND_BAN_TARGET, context.faction.getTag(target.getFaction())); + FactionsPlugin.instance.logFactionEvent(context.faction, FLogType.BANS, context.fPlayer.getName(), CC.Green + "banned", target.getName()); context.faction.msg(TL.COMMAND_BAN_BANNED, context.fPlayer.getName(), target.getName()); } diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdColeader.java b/src/main/java/com/massivecraft/factions/cmd/CmdColeader.java index d19f84a3..8e437364 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdColeader.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdColeader.java @@ -3,8 +3,10 @@ package com.massivecraft.factions.cmd; import com.massivecraft.factions.Conf; import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.Faction; +import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Role; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.util.TL; import mkremins.fanciful.FancyMessage; import org.bukkit.ChatColor; @@ -76,6 +78,7 @@ public class CmdColeader extends FCommand { you.setRole(Role.COLEADER); targetFaction.msg(TL.COMMAND_COLEADER_PROMOTED, you.describeTo(targetFaction, true)); context.msg(TL.COMMAND_COLEADER_PROMOTES, you.describeTo(context.fPlayer, true)); + FactionsPlugin.instance.getFlogManager().log(targetFaction, FLogType.RANK_EDIT, context.fPlayer.getName(), you.getName(), ChatColor.RED + "Co-Leader"); } } diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdDescription.java b/src/main/java/com/massivecraft/factions/cmd/CmdDescription.java index c8142268..c498d07f 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdDescription.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdDescription.java @@ -3,9 +3,12 @@ package com.massivecraft.factions.cmd; import com.massivecraft.factions.Conf; import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FPlayers; +import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.util.TL; import com.massivecraft.factions.zcore.util.TextUtil; +import org.bukkit.Bukkit; public class CmdDescription extends FCommand { @@ -32,7 +35,9 @@ public class CmdDescription extends FCommand { // since "&" color tags seem to work even through plain old FPlayer.sendMessage() for some reason, we need to break those up // And replace all the % because it messes with string formatting and this is easy way around that. - context.faction.setDescription(TextUtil.implode(context.args, " ").replaceAll("%", "").replaceAll("(&([a-f0-9klmnor]))", "& $2")); + String desc = TextUtil.implode(context.args, " ").replaceAll("%", "").replaceAll("(&([a-f0-9klmnor]))", "& $2"); + context.faction.setDescription(desc); + Bukkit.getScheduler().scheduleSyncDelayedTask(FactionsPlugin.instance, () -> FactionsPlugin.instance.logFactionEvent(context.faction, FLogType.FDESC_EDIT, context.fPlayer.getName(), desc)); if (!Conf.broadcastDescriptionChanges) { context.msg(TL.COMMAND_DESCRIPTION_CHANGED, context.faction.describeTo(context.fPlayer)); diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdInvite.java b/src/main/java/com/massivecraft/factions/cmd/CmdInvite.java index 8352e6c6..48008c3d 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdInvite.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdInvite.java @@ -4,7 +4,9 @@ import com.massivecraft.factions.Conf; import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.PermissableAction; +import com.massivecraft.factions.zcore.util.CC; import com.massivecraft.factions.zcore.util.TL; import mkremins.fanciful.FancyMessage; import org.bukkit.ChatColor; @@ -69,6 +71,7 @@ public class CmdInvite extends FCommand { } context.faction.msg(TL.COMMAND_INVITE_INVITED, context.fPlayer.describeTo(context.faction, true), target.describeTo(context.faction)); + FactionsPlugin.instance.logFactionEvent(context.faction, FLogType.INVITES, context.fPlayer.getName(), CC.Green + "invited", target.getName()); } @Override diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdJoin.java b/src/main/java/com/massivecraft/factions/cmd/CmdJoin.java index 1fb9718c..ee24420c 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdJoin.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdJoin.java @@ -3,7 +3,9 @@ package com.massivecraft.factions.cmd; import com.massivecraft.factions.*; import com.massivecraft.factions.event.FPlayerJoinEvent; import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fupgrades.UpgradeType; +import com.massivecraft.factions.zcore.util.CC; import com.massivecraft.factions.zcore.util.TL; import org.bukkit.Bukkit; @@ -117,6 +119,7 @@ public class CmdJoin extends FCommand { faction.deinvite(fplayer); context.fPlayer.setRole(faction.getDefaultRole()); + FactionsPlugin.instance.logFactionEvent(faction, FLogType.INVITES, context.fPlayer.getName(), CC.Green + "joined", "the faction"); if (Conf.logFactionJoin) { if (samePlayer) { diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdKick.java b/src/main/java/com/massivecraft/factions/cmd/CmdKick.java index 4e92666c..5a4ce5df 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdKick.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdKick.java @@ -7,7 +7,9 @@ import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.event.FPlayerLeaveEvent; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Role; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.PermissableAction; +import com.massivecraft.factions.zcore.util.CC; import com.massivecraft.factions.zcore.util.TL; import mkremins.fanciful.FancyMessage; import org.bukkit.Bukkit; @@ -118,6 +120,8 @@ public class CmdKick extends FCommand { if (toKick.getRole() == Role.LEADER) { toKickFaction.promoteNewLeader(); } + + FactionsPlugin.instance.logFactionEvent(toKickFaction, FLogType.INVITES, context.fPlayer.getName(), CC.Red + "kicked", toKick.getName()); toKickFaction.deinvite(toKick); toKick.resetFactionData(); } diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdMod.java b/src/main/java/com/massivecraft/factions/cmd/CmdMod.java index d325119d..2d597510 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdMod.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdMod.java @@ -3,8 +3,10 @@ package com.massivecraft.factions.cmd; import com.massivecraft.factions.Conf; import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.Faction; +import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Role; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.util.TL; import mkremins.fanciful.FancyMessage; import org.bukkit.ChatColor; @@ -72,6 +74,7 @@ public class CmdMod extends FCommand { you.setRole(Role.MODERATOR); targetFaction.msg(TL.COMMAND_MOD_PROMOTED, you.describeTo(targetFaction, true)); context.msg(TL.COMMAND_MOD_PROMOTES, you.describeTo(context.fPlayer, true)); + FactionsPlugin.instance.getFlogManager().log(targetFaction, FLogType.RANK_EDIT, context.fPlayer.getName(), you.getName(), ChatColor.LIGHT_PURPLE + "Mod"); } } diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdSaveAll.java b/src/main/java/com/massivecraft/factions/cmd/CmdSaveAll.java index 32f56822..5c8ffc79 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdSaveAll.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdSaveAll.java @@ -1,9 +1,6 @@ package com.massivecraft.factions.cmd; -import com.massivecraft.factions.Board; -import com.massivecraft.factions.Conf; -import com.massivecraft.factions.FPlayers; -import com.massivecraft.factions.Factions; +import com.massivecraft.factions.*; import com.massivecraft.factions.shop.ShopConfig; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.zcore.util.TL; @@ -25,6 +22,11 @@ public class CmdSaveAll extends FCommand { Factions.getInstance().forceSave(false); Board.getInstance().forceSave(false); Conf.save(); + try { + FactionsPlugin.instance.getFlogManager().saveLogs(); + } catch (Exception e) { + e.printStackTrace(); + } ShopConfig.saveShop(); context.msg(TL.COMMAND_SAVEALL_SUCCESS); } diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdTag.java b/src/main/java/com/massivecraft/factions/cmd/CmdTag.java index 5c5ab560..28f37fd9 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdTag.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdTag.java @@ -6,6 +6,7 @@ import com.massivecraft.factions.scoreboards.FTeamWrapper; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.util.MiscUtil; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.util.TL; import org.bukkit.Bukkit; @@ -61,6 +62,7 @@ public class CmdTag extends FCommand { String oldtag = context.faction.getTag(); context.faction.setTag(tag); + FactionsPlugin.instance.logFactionEvent(context.faction, FLogType.FTAG_EDIT, context.fPlayer.getName(), tag); // Inform for (FPlayer fplayer : FPlayers.getInstance().getOnlinePlayers()) { diff --git a/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java b/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java index a66eb036..89b7c1d9 100644 --- a/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java +++ b/src/main/java/com/massivecraft/factions/cmd/FCmdRoot.java @@ -154,6 +154,7 @@ public class FCmdRoot extends FCommand implements CommandExecutor { public CmdSeeDiscord cmdSeeDiscord = new CmdSeeDiscord(); public CmdInviteBot cmdInviteBot = new CmdInviteBot(); public CmdSetGuild cmdSetGuild = new CmdSetGuild(); + public CmdAudit cmdAudit = new CmdAudit(); public FCmdRoot() { super(); @@ -265,6 +266,7 @@ public class FCmdRoot extends FCommand implements CommandExecutor { this.addSubCommand(this.cmdViewChest); this.addSubCommand(this.cmdConvertConfig); this.addSubCommand(this.cmdSpawnerLock); + this.addSubCommand(this.cmdAudit); if(Conf.useDiscordSystem){ this.addSubCommand(this.cmdInviteBot); diff --git a/src/main/java/com/massivecraft/factions/cmd/alts/CmdInviteAlt.java b/src/main/java/com/massivecraft/factions/cmd/alts/CmdInviteAlt.java index 8bd44283..89ea32bf 100644 --- a/src/main/java/com/massivecraft/factions/cmd/alts/CmdInviteAlt.java +++ b/src/main/java/com/massivecraft/factions/cmd/alts/CmdInviteAlt.java @@ -1,6 +1,7 @@ package com.massivecraft.factions.cmd.alts; import com.massivecraft.factions.Conf; +import com.massivecraft.factions.FLocation; import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.cmd.CommandContext; @@ -8,8 +9,10 @@ import com.massivecraft.factions.cmd.CommandRequirements; import com.massivecraft.factions.cmd.FCommand; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Role; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.Access; import com.massivecraft.factions.zcore.fperms.PermissableAction; +import com.massivecraft.factions.zcore.util.CC; import com.massivecraft.factions.zcore.util.TL; import mkremins.fanciful.FancyMessage; import org.bukkit.ChatColor; @@ -82,6 +85,8 @@ public class CmdInviteAlt extends FCommand { message.send(target.getPlayer()); context.faction.msg(TL.COMMAND_ALTINVITE_INVITED_ALT, context.fPlayer.describeTo(context.faction, true), target.describeTo(context.faction)); + FactionsPlugin.instance.logFactionEvent(context.faction, FLogType.INVITES, context.fPlayer.getName(), CC.Green + "invited", target.getName()); + } @Override diff --git a/src/main/java/com/massivecraft/factions/cmd/alts/CmdKickAlt.java b/src/main/java/com/massivecraft/factions/cmd/alts/CmdKickAlt.java index 1007a42d..3e5f6c01 100644 --- a/src/main/java/com/massivecraft/factions/cmd/alts/CmdKickAlt.java +++ b/src/main/java/com/massivecraft/factions/cmd/alts/CmdKickAlt.java @@ -10,8 +10,10 @@ import com.massivecraft.factions.cmd.FCommand; import com.massivecraft.factions.event.FPlayerLeaveEvent; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Role; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.Access; import com.massivecraft.factions.zcore.fperms.PermissableAction; +import com.massivecraft.factions.zcore.util.CC; import com.massivecraft.factions.zcore.util.TL; import org.bukkit.Bukkit; import org.bukkit.command.ConsoleCommandSender; @@ -122,7 +124,7 @@ public class CmdKickAlt extends FCommand { toKickFaction.promoteNewLeader(); } - + FactionsPlugin.instance.logFactionEvent(toKickFaction, FLogType.INVITES, context.fPlayer.getName(), CC.Red + "kicked alt", toKick.getName()); toKickFaction.removeAltPlayer(toKick); toKickFaction.deinvite(toKick); toKick.resetFactionData(); diff --git a/src/main/java/com/massivecraft/factions/cmd/chest/FChestListener.java b/src/main/java/com/massivecraft/factions/cmd/chest/FChestListener.java new file mode 100644 index 00000000..dee6eb4f --- /dev/null +++ b/src/main/java/com/massivecraft/factions/cmd/chest/FChestListener.java @@ -0,0 +1,108 @@ +package com.massivecraft.factions.cmd.chest; + +import com.massivecraft.factions.FPlayer; +import com.massivecraft.factions.FPlayers; +import com.massivecraft.factions.Faction; +import com.massivecraft.factions.FactionsPlugin; +import com.massivecraft.factions.zcore.faudit.FLogType; +import com.massivecraft.factions.zcore.util.CC; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryDragEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.util.Arrays; + +public class FChestListener implements Listener { + + @EventHandler + public void onInventoryDrag(InventoryDragEvent e) { + + Player player = (Player) e.getWhoClicked(); + FPlayer fPlayer = FPlayers.getInstance().getByPlayer(player); + if (!fPlayer.isInFactionsChest()) return; + if (e.isCancelled()) return; + e.setCancelled(true); + e.getWhoClicked().sendMessage(CC.RedB + "(!) " + CC.Red + "You cannot drag items while viewing a /f chest!"); + } + + + @EventHandler( + priority = EventPriority.HIGHEST, + ignoreCancelled = true + ) + public void onPlayerClickInventory(InventoryClickEvent event) { + Player player = (Player) event.getWhoClicked(); + FPlayer fPlayer = FPlayers.getInstance().getByPlayer(player); + if (!fPlayer.isInFactionsChest()) return; + + if (event.getClick() == ClickType.UNKNOWN) { + event.setCancelled(true); + player.sendMessage(CC.RedB + "(!) " + CC.Red + "You cannot use that click type inside the /f chest!"); + return; + } + + ItemStack currentItem = event.getCurrentItem(); + if (event.getClick() == ClickType.NUMBER_KEY) { + currentItem = event.getClickedInventory().getItem(event.getSlot()); + } + + Material currentItemType = currentItem != null ? currentItem.getType() : Material.AIR; + + ItemStack cursorItem = event.getCursor(); + if (event.getClick() == ClickType.NUMBER_KEY) { + cursorItem = player.getInventory().getItem(event.getHotbarButton()); + } + + Material cursorItemType = cursorItem != null ? cursorItem.getType() : Material.AIR; + FPlayer fplayer = FPlayers.getInstance().getByPlayer(player); + Faction faction; + if (fplayer == null || !(faction = fplayer.getFaction()).isNormal()) { + player.closeInventory(); + player.sendMessage(CC.RedB + "(!) " + CC.Red + "You are no longer in your faction!"); + return; + } + + if (event.getClickedInventory() == null) { + return; + } + + if (event.getClickedInventory().getName().equalsIgnoreCase(FactionsPlugin.getInstance().color(FactionsPlugin.getInstance().getConfig().getString("fchest.Inventory-Title")))) { + if (currentItemType != Material.AIR) { + Inventory ours = faction.getChestInventory(); + if (ours == null || !ours.contains(currentItem)) { + event.setCancelled(true); + player.sendMessage(CC.RedB + "(!) That item not longer exists!"); + Bukkit.getLogger().info("[FactionChest] " + player.getName() + " tried to remove " + currentItem + " from /f chest when it didnt contain! Items: " + (ours == null ? "none" : Arrays.toString(ours.getContents()))); + player.closeInventory(); + return; + } + + this.logRemoveItem(currentItem, fplayer, player); + } else if (cursorItemType != Material.AIR && !event.isShiftClick()) { + this.logAddItem(cursorItem, fplayer, player); + } + } else if (event.isShiftClick() && currentItemType != Material.AIR) { + this.logAddItem(currentItem, fplayer, player); + } + } + + private void logAddItem(ItemStack cursorItem, FPlayer fplayer, Player player) { + String itemName = cursorItem.hasItemMeta() && cursorItem.getItemMeta().hasDisplayName() ? cursorItem.getItemMeta().getDisplayName() : StringUtils.capitaliseAllWords(cursorItem.getType().name().replace("_", " ").toLowerCase()); + FactionsPlugin.instance.logFactionEvent(fplayer.getFaction(), FLogType.FCHEST_EDIT, player.getName(), CC.GreenB + "ADDED", itemName); + } + + private void logRemoveItem(ItemStack currentItem, FPlayer fplayer, Player player) { + String itemName = currentItem.hasItemMeta() && currentItem.getItemMeta().hasDisplayName() ? currentItem.getItemMeta().getDisplayName() : StringUtils.capitaliseAllWords(currentItem.getType().name().replace("_", " ").toLowerCase()); + FactionsPlugin.instance.logFactionEvent(fplayer.getFaction(), FLogType.FCHEST_EDIT, player.getName(), CC.RedB + "TOOK", itemName); + } +} + diff --git a/src/main/java/com/massivecraft/factions/cmd/claim/CmdAutoClaim.java b/src/main/java/com/massivecraft/factions/cmd/claim/CmdAutoClaim.java index 74ecd1d8..c4e1d78e 100644 --- a/src/main/java/com/massivecraft/factions/cmd/claim/CmdAutoClaim.java +++ b/src/main/java/com/massivecraft/factions/cmd/claim/CmdAutoClaim.java @@ -1,13 +1,17 @@ package com.massivecraft.factions.cmd.claim; +import com.massivecraft.factions.FLocation; import com.massivecraft.factions.Faction; +import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.cmd.CommandContext; import com.massivecraft.factions.cmd.CommandRequirements; import com.massivecraft.factions.cmd.FCommand; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Role; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.Access; import com.massivecraft.factions.zcore.fperms.PermissableAction; +import com.massivecraft.factions.zcore.util.CC; import com.massivecraft.factions.zcore.util.TL; public class CmdAutoClaim extends FCommand { @@ -53,11 +57,10 @@ public class CmdAutoClaim extends FCommand { return; } - context.fPlayer.setAutoClaimFor(forFaction); - context.msg(TL.COMMAND_AUTOCLAIM_ENABLED, forFaction.describeTo(context.fPlayer)); context.fPlayer.attemptClaim(forFaction, context.fPlayer.getPlayer().getLocation(), true); + FactionsPlugin.instance.logFactionEvent(forFaction, FLogType.CHUNK_CLAIMS, context.fPlayer.getName(), CC.GreenB + "CLAIMED", "1", new FLocation(context.fPlayer.getPlayer().getLocation()).formatXAndZ(",")); } @Override diff --git a/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaim.java b/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaim.java index 26cc7b04..980faa5d 100644 --- a/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaim.java +++ b/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaim.java @@ -3,14 +3,17 @@ package com.massivecraft.factions.cmd.claim; import com.massivecraft.factions.Conf; import com.massivecraft.factions.FLocation; import com.massivecraft.factions.Faction; +import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.cmd.CommandContext; import com.massivecraft.factions.cmd.CommandRequirements; import com.massivecraft.factions.cmd.FCommand; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.util.SpiralTask; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.Access; import com.massivecraft.factions.zcore.fperms.PermissableAction; +import com.massivecraft.factions.zcore.util.CC; import com.massivecraft.factions.zcore.util.TL; @@ -69,11 +72,11 @@ public class CmdClaim extends FCommand { boolean success = context.fPlayer.attemptClaim(forFaction, this.currentLocation(), true); if (success) { failCount = 0; + FactionsPlugin.instance.logFactionEvent(forFaction, FLogType.CHUNK_CLAIMS, context.fPlayer.getName(), CC.GreenB + "CLAIMED", "1", (new FLocation(context.fPlayer.getPlayer().getLocation())).formatXAndZ(",")); } else if (failCount++ >= limit) { this.stop(); return false; } - return true; } }; diff --git a/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaimAt.java b/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaimAt.java index 4da6446c..36e63938 100644 --- a/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaimAt.java +++ b/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaimAt.java @@ -2,11 +2,14 @@ package com.massivecraft.factions.cmd.claim; import com.massivecraft.factions.Conf; import com.massivecraft.factions.FLocation; +import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.cmd.CommandContext; import com.massivecraft.factions.cmd.CommandRequirements; import com.massivecraft.factions.cmd.FCommand; import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.PermissableAction; +import com.massivecraft.factions.zcore.util.CC; import com.massivecraft.factions.zcore.util.TL; public class CmdClaimAt extends FCommand { diff --git a/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaimLine.java b/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaimLine.java index 6f153d79..2d146280 100644 --- a/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaimLine.java +++ b/src/main/java/com/massivecraft/factions/cmd/claim/CmdClaimLine.java @@ -1,13 +1,17 @@ package com.massivecraft.factions.cmd.claim; import com.massivecraft.factions.Conf; +import com.massivecraft.factions.FLocation; import com.massivecraft.factions.Faction; +import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.cmd.CommandContext; import com.massivecraft.factions.cmd.CommandRequirements; import com.massivecraft.factions.cmd.FCommand; import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.Access; import com.massivecraft.factions.zcore.fperms.PermissableAction; +import com.massivecraft.factions.zcore.util.CC; import com.massivecraft.factions.zcore.util.TL; import org.bukkit.Location; import org.bukkit.block.BlockFace; @@ -79,7 +83,7 @@ public class CmdClaimLine extends FCommand { for (int i = 0; i < amount; i++) { context.fPlayer.attemptClaim(forFaction, location, true); location = location.add(blockFace.getModX() * 16, 0, blockFace.getModZ() * 16); - } + FactionsPlugin.instance.logFactionEvent(forFaction, FLogType.CHUNK_CLAIMS, context.fPlayer.getName(), CC.GreenB + "CLAIMED", String.valueOf(i), new FLocation(context.player.getLocation()).formatXAndZ(",")); } } @Override diff --git a/src/main/java/com/massivecraft/factions/cmd/claim/CmdUnclaim.java b/src/main/java/com/massivecraft/factions/cmd/claim/CmdUnclaim.java index 1be2100a..d955b2bc 100644 --- a/src/main/java/com/massivecraft/factions/cmd/claim/CmdUnclaim.java +++ b/src/main/java/com/massivecraft/factions/cmd/claim/CmdUnclaim.java @@ -9,8 +9,10 @@ import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.util.SpiralTask; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.Access; import com.massivecraft.factions.zcore.fperms.PermissableAction; +import com.massivecraft.factions.zcore.util.CC; import com.massivecraft.factions.zcore.util.TL; import org.bukkit.Bukkit; @@ -124,6 +126,7 @@ public class CmdUnclaim extends FCommand { Board.getInstance().removeAt(target); targetFaction.msg(TL.COMMAND_UNCLAIM_UNCLAIMED, context.fPlayer.describeTo(targetFaction, true)); + FactionsPlugin.instance.logFactionEvent(targetFaction, FLogType.CHUNK_CLAIMS, context.fPlayer.getName(), CC.RedB + "UNCLAIMED", "1", (new FLocation(context.fPlayer.getPlayer().getLocation())).formatXAndZ(",")); context.msg(TL.COMMAND_UNCLAIM_UNCLAIMS); if (Conf.logLandUnclaims) { @@ -176,6 +179,8 @@ public class CmdUnclaim extends FCommand { Board.getInstance().removeAt(target); context.faction.msg(TL.COMMAND_UNCLAIM_FACTIONUNCLAIMED, context.fPlayer.describeTo(context.faction, true)); + FactionsPlugin.instance.logFactionEvent(targetFaction, FLogType.CHUNK_CLAIMS, context.fPlayer.getName(), CC.RedB + "UNCLAIMED", "1", (new FLocation(context.fPlayer.getPlayer().getLocation())).formatXAndZ(",")); + if (Conf.logLandUnclaims) { FactionsPlugin.getInstance().log(TL.COMMAND_UNCLAIM_LOG.format(context.fPlayer.getName(), target.getCoordString(), targetFaction.getTag())); diff --git a/src/main/java/com/massivecraft/factions/cmd/claim/CmdUnclaimall.java b/src/main/java/com/massivecraft/factions/cmd/claim/CmdUnclaimall.java index 8df9fba8..bec679ad 100644 --- a/src/main/java/com/massivecraft/factions/cmd/claim/CmdUnclaimall.java +++ b/src/main/java/com/massivecraft/factions/cmd/claim/CmdUnclaimall.java @@ -1,16 +1,15 @@ package com.massivecraft.factions.cmd.claim; -import com.massivecraft.factions.Board; -import com.massivecraft.factions.Conf; -import com.massivecraft.factions.Faction; -import com.massivecraft.factions.FactionsPlugin; +import com.massivecraft.factions.*; import com.massivecraft.factions.cmd.CommandContext; import com.massivecraft.factions.cmd.CommandRequirements; import com.massivecraft.factions.cmd.FCommand; import com.massivecraft.factions.event.LandUnclaimAllEvent; import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.PermissableAction; +import com.massivecraft.factions.zcore.util.CC; import com.massivecraft.factions.zcore.util.TL; import org.bukkit.Bukkit; @@ -66,12 +65,15 @@ public class CmdUnclaimall extends FCommand { LandUnclaimAllEvent unclaimAllEvent = new LandUnclaimAllEvent(target, context.fPlayer); Bukkit.getScheduler().runTask(FactionsPlugin.getInstance(), () -> Bukkit.getServer().getPluginManager().callEvent(unclaimAllEvent)); + if (unclaimAllEvent.isCancelled()) { return; } + int unclaimed = target.getAllClaims().size(); Board.getInstance().unclaimAll(target.getId()); context.faction.msg(TL.COMMAND_UNCLAIMALL_UNCLAIMED, context.fPlayer.describeTo(context.faction, true)); + FactionsPlugin.instance.logFactionEvent(context.faction, FLogType.CHUNK_CLAIMS, context.fPlayer.getName(), CC.RedB + "UNCLAIMED", String.valueOf(unclaimed), new FLocation(context.fPlayer.getPlayer().getLocation()).formatXAndZ(",")); if (Conf.logLandUnclaims) { FactionsPlugin.getInstance().log(TL.COMMAND_UNCLAIMALL_LOG.format(context.fPlayer.getName(), context.faction.getTag())); diff --git a/src/main/java/com/massivecraft/factions/cmd/econ/CmdMoneyDeposit.java b/src/main/java/com/massivecraft/factions/cmd/econ/CmdMoneyDeposit.java index 24becf24..d113269d 100644 --- a/src/main/java/com/massivecraft/factions/cmd/econ/CmdMoneyDeposit.java +++ b/src/main/java/com/massivecraft/factions/cmd/econ/CmdMoneyDeposit.java @@ -8,6 +8,7 @@ import com.massivecraft.factions.cmd.FCommand; import com.massivecraft.factions.iface.EconomyParticipator; import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.struct.Permission; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.util.TL; import org.bukkit.ChatColor; @@ -38,6 +39,8 @@ public class CmdMoneyDeposit extends FCommand { if (success && Conf.logMoneyTransactions) { FactionsPlugin.getInstance().log(ChatColor.stripColor(FactionsPlugin.getInstance().txt.parse(TL.COMMAND_MONEYDEPOSIT_DEPOSITED.toString(), context.fPlayer.getName(), Econ.moneyString(amount), faction.describeTo(null)))); + FactionsPlugin.instance.logFactionEvent(context.faction, FLogType.BANK_EDIT, context.fPlayer.getName(), ChatColor.GREEN + ChatColor.BOLD.toString() + "DEPOSITED", amount + ""); + } } diff --git a/src/main/java/com/massivecraft/factions/cmd/econ/CmdMoneyWithdraw.java b/src/main/java/com/massivecraft/factions/cmd/econ/CmdMoneyWithdraw.java index a3cc0686..c4162013 100644 --- a/src/main/java/com/massivecraft/factions/cmd/econ/CmdMoneyWithdraw.java +++ b/src/main/java/com/massivecraft/factions/cmd/econ/CmdMoneyWithdraw.java @@ -1,6 +1,7 @@ package com.massivecraft.factions.cmd.econ; import com.massivecraft.factions.Conf; +import com.massivecraft.factions.Faction; import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.cmd.CommandContext; import com.massivecraft.factions.cmd.CommandRequirements; @@ -9,8 +10,10 @@ import com.massivecraft.factions.iface.EconomyParticipator; import com.massivecraft.factions.integration.Econ; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Role; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.Access; import com.massivecraft.factions.zcore.fperms.PermissableAction; +import com.massivecraft.factions.zcore.util.CC; import com.massivecraft.factions.zcore.util.TL; import org.bukkit.ChatColor; @@ -48,6 +51,8 @@ public class CmdMoneyWithdraw extends FCommand { if (success && Conf.logMoneyTransactions) { FactionsPlugin.getInstance().log(ChatColor.stripColor(FactionsPlugin.getInstance().txt.parse(TL.COMMAND_MONEYWITHDRAW_WITHDRAW.toString(), context.fPlayer.getName(), Econ.moneyString(amount), faction.describeTo(null)))); + FactionsPlugin.instance.logFactionEvent((Faction) faction, FLogType.BANK_EDIT, context.fPlayer.getName(), CC.RedB + "WITHDREW", amount + ""); + } } diff --git a/src/main/java/com/massivecraft/factions/cmd/relational/FRelationCommand.java b/src/main/java/com/massivecraft/factions/cmd/relational/FRelationCommand.java index 4e5e21a3..5a32b7c3 100644 --- a/src/main/java/com/massivecraft/factions/cmd/relational/FRelationCommand.java +++ b/src/main/java/com/massivecraft/factions/cmd/relational/FRelationCommand.java @@ -12,6 +12,7 @@ import com.massivecraft.factions.scoreboards.FTeamWrapper; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Relation; import com.massivecraft.factions.struct.Role; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.util.TL; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -79,7 +80,8 @@ public abstract class FRelationCommand extends FCommand { // trigger the faction relation event FactionRelationEvent relationEvent = new FactionRelationEvent(context.faction, them, oldRelation, currentRelation); Bukkit.getServer().getPluginManager().callEvent(relationEvent); - + FactionsPlugin.instance.logFactionEvent(context.faction, FLogType.RELATION_CHANGE,context.fPlayer.getName(), this.targetRelation.getColor() + this.targetRelation.name(), oldRelation.getColor() + them.getTag()); + FactionsPlugin.instance.logFactionEvent(them, FLogType.RELATION_CHANGE, oldRelation.getColor() + context.fPlayer.getName(), this.targetRelation.getColor() + this.targetRelation.name(), "your faction"); them.msg(TL.COMMAND_RELATIONS_MUTUAL, currentRelationColor + targetRelation.getTranslation(), currentRelationColor + context.faction.getTag()); context.faction.msg(TL.COMMAND_RELATIONS_MUTUAL, currentRelationColor + targetRelation.getTranslation(), currentRelationColor + them.getTag()); } else { diff --git a/src/main/java/com/massivecraft/factions/cmd/roles/FPromoteCommand.java b/src/main/java/com/massivecraft/factions/cmd/roles/FPromoteCommand.java index 360f2d3c..5650679c 100644 --- a/src/main/java/com/massivecraft/factions/cmd/roles/FPromoteCommand.java +++ b/src/main/java/com/massivecraft/factions/cmd/roles/FPromoteCommand.java @@ -1,13 +1,17 @@ package com.massivecraft.factions.cmd.roles; import com.massivecraft.factions.FPlayer; +import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.cmd.CommandContext; import com.massivecraft.factions.cmd.CommandRequirements; import com.massivecraft.factions.cmd.FCommand; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.struct.Role; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.PermissableAction; +import com.massivecraft.factions.zcore.util.CC; import com.massivecraft.factions.zcore.util.TL; +import org.bukkit.ChatColor; public class FPromoteCommand extends FCommand { @@ -51,6 +55,7 @@ public class FPromoteCommand extends FCommand { context.msg(TL.COMMAND_PROMOTE_NOT_SAME); return; } + // Don't allow people to promote people to their same or higher rank. if (context.fPlayer.getRole().value <= promotion.value) { context.msg(TL.COMMAND_PROMOTE_NOT_ALLOWED); @@ -78,6 +83,8 @@ public class FPromoteCommand extends FCommand { } context.msg(TL.COMMAND_PROMOTE_SUCCESS, action, target.getName(), promotion.nicename); + FactionsPlugin.instance.getFlogManager().log(context.faction, FLogType.ROLE_PERM_EDIT, context.fPlayer.getName(), action, target.getName(), promotion.nicename); + } @Override diff --git a/src/main/java/com/massivecraft/factions/cmd/tnt/CmdTnt.java b/src/main/java/com/massivecraft/factions/cmd/tnt/CmdTnt.java index 115e7a72..7476aabf 100644 --- a/src/main/java/com/massivecraft/factions/cmd/tnt/CmdTnt.java +++ b/src/main/java/com/massivecraft/factions/cmd/tnt/CmdTnt.java @@ -1,11 +1,13 @@ package com.massivecraft.factions.cmd.tnt; +import com.massivecraft.factions.Factions; import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.cmd.CommandContext; import com.massivecraft.factions.cmd.CommandRequirements; import com.massivecraft.factions.cmd.FCommand; import com.massivecraft.factions.struct.Permission; import com.massivecraft.factions.util.XMaterial; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.PermissableAction; import com.massivecraft.factions.zcore.util.TL; import org.bukkit.Material; @@ -33,7 +35,6 @@ public class CmdTnt extends FCommand { context.msg(TL.COMMAND_TNT_DISABLED_MSG); return; } - if (context.args.size() == 2) { if (context.args.get(0).equalsIgnoreCase("add") || context.args.get(0).equalsIgnoreCase("a")) { try { @@ -71,6 +72,7 @@ public class CmdTnt extends FCommand { context.faction.addTnt(amount); context.msg(TL.COMMAND_TNT_DEPOSIT_SUCCESS); + FactionsPlugin.instance.getFlogManager().log(context.faction, FLogType.F_TNT, context.fPlayer.getName(), "DEPOSITED", amount + "x TNT"); context.fPlayer.sendMessage(FactionsPlugin.instance.color(TL.COMMAND_TNT_AMOUNT.toString().replace("{amount}", context.faction.getTnt() + "").replace("{maxAmount}", context.faction.getTntBankLimit() + ""))); return; @@ -108,6 +110,7 @@ public class CmdTnt extends FCommand { context.faction.takeTnt(amount); context.player.updateInventory(); context.msg(TL.COMMAND_TNT_WIDTHDRAW_SUCCESS); + FactionsPlugin.instance.getFlogManager().log(context.faction, FLogType.F_TNT, context.fPlayer.getName(), "WITHDREW", amount + "x TNT"); } } else if (context.args.size() == 1) { if (context.args.get(0).equalsIgnoreCase("addall")) { @@ -131,7 +134,9 @@ public class CmdTnt extends FCommand { context.player.updateInventory(); context.faction.addTnt(invTnt); context.msg(TL.COMMAND_TNT_DEPOSIT_SUCCESS); + context.fPlayer.sendMessage(FactionsPlugin.instance.color(TL.COMMAND_TNT_AMOUNT.toString().replace("{amount}", context.faction.getTnt() + "").replace("{maxAmount}", context.faction.getTntBankLimit() + ""))); + FactionsPlugin.instance.getFlogManager().log(context.faction, FLogType.F_TNT, context.fPlayer.getName(), "DEPOSITED", invTnt + "x TNT"); return; } diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsBlockListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsBlockListener.java index 17ef6cc5..c900bb05 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsBlockListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsBlockListener.java @@ -8,6 +8,8 @@ import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.util.ItemBuilder; import com.massivecraft.factions.util.Particles.ParticleEffect; import com.massivecraft.factions.util.XMaterial; +import com.massivecraft.factions.zcore.faudit.FLogManager; +import com.massivecraft.factions.zcore.faudit.LogTimer; import com.massivecraft.factions.zcore.fperms.Access; import com.massivecraft.factions.zcore.fperms.PermissableAction; import com.massivecraft.factions.zcore.util.TL; @@ -15,6 +17,8 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.block.CreatureSpawner; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; @@ -29,17 +33,22 @@ import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.material.MaterialData; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; public class FactionsBlockListener implements Listener { public static HashMap bannerLocations = new HashMap<>(); private HashMap bannerCooldownMap = new HashMap<>(); + private long placeTimer = TimeUnit.SECONDS.toMillis(15L); public static boolean playerCanBuildDestroyBlock(Player player, Location location, String action, boolean justCheck) { @@ -126,6 +135,7 @@ public class FactionsBlockListener implements Listener { @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onBlockPlace(BlockPlaceEvent event) { + Faction at = Board.getInstance().getFactionAt(new FLocation(event.getBlockPlaced())); if (!event.canBuild()) return; // special case for flint&steel, which should only be prevented by DenyUsage list @@ -140,6 +150,7 @@ public class FactionsBlockListener implements Listener { if (Conf.spawnerLock) { event.setCancelled(true); event.getPlayer().sendMessage(FactionsPlugin.getInstance().color(TL.COMMAND_SPAWNER_LOCK_CANNOT_PLACE.toString())); + return; } } } @@ -416,14 +427,12 @@ public class FactionsBlockListener implements Listener { @EventHandler public void onBreak(EntityExplodeEvent e) { if (!Conf.gracePeriod) return; - e.setCancelled(true); } @EventHandler public void entityDamage(EntityDamageEvent e) { if (!Conf.gracePeriod) return; - if (e.getEntity() instanceof Player) { if (e.getCause() == EntityDamageEvent.DamageCause.PROJECTILE) { e.setCancelled(true); @@ -439,7 +448,6 @@ public class FactionsBlockListener implements Listener { if (!fp.isAdminBypassing()) { if (e1.getBlock().getType().equals(Material.TNT)) { e1.setCancelled(true); - fp.msg(TL.COMMAND_GRACE_ENABLED, e1.getBlockPlaced().getType().toString()); } } @@ -459,13 +467,60 @@ public class FactionsBlockListener implements Listener { return !rel.confDenyBuild(otherFaction.hasPlayersOnline()); } + + public void handleSpawnerUpdate(Faction at, Player player, ItemStack spawnerItem, LogTimer.TimerSubType subType) { + FLogManager manager = FactionsPlugin.instance.getFlogManager(); + LogTimer logTimer = manager.getLogTimers().computeIfAbsent(player.getUniqueId(), e -> new LogTimer(player.getName(), at.getId())); + LogTimer.Timer timer = logTimer.attemptLog(LogTimer.TimerType.SPAWNER_EDIT, subType, 0L); + Map currentCounts = (timer.getExtraData() == null) ? new HashMap<>() : ((Map) timer.getExtraData()); + currentCounts.computeIfAbsent(spawnerItem.getData(), e -> new AtomicInteger(0)).addAndGet(1); + timer.setExtraData(currentCounts); + if (timer.isReadyToLog(this.placeTimer)) { + logTimer.pushLogs(at, LogTimer.TimerType.SPAWNER_EDIT); + } + } + + @EventHandler( + priority = EventPriority.HIGH, + ignoreCancelled = true + ) + public void onPlayerPlace(BlockPlaceEvent event) { + ItemStack item = event.getItemInHand(); + if (item != null && item.getType() == XMaterial.SPAWNER.parseMaterial()) { + Faction at = Board.getInstance().getFactionAt(new FLocation(event.getBlockPlaced())); + if (at != null && at.isNormal()) { + FPlayer fplayer = FPlayers.getInstance().getByPlayer(event.getPlayer()); + if (fplayer != null && at.getRelationTo(fplayer.getFaction()).isAtLeast(Relation.TRUCE)) { + this.handleSpawnerUpdate(at, event.getPlayer(), item, LogTimer.TimerSubType.SPAWNER_PLACE); + } + } + } + } + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { + Block block = event.getBlock(); + + Faction at = Board.getInstance().getFactionAt(new FLocation(block)); boolean isSpawner = event.getBlock().getType() == XMaterial.SPAWNER.parseMaterial(); if (!playerCanBuildDestroyBlock(event.getPlayer(), event.getBlock().getLocation(), !isSpawner ? "destroy" : "mine spawners", false)) { event.setCancelled(true); return; } + if (block != null && isSpawner) { + ItemStack item = new ItemStack(block.getType(), 1, (short) block.getData()); + if (at != null && at.isNormal()) { + FPlayer fplayer = FPlayers.getInstance().getByPlayer(event.getPlayer()); + if (fplayer != null) { + BlockState state = block.getState(); + if (state instanceof CreatureSpawner) { + CreatureSpawner spawner = (CreatureSpawner) state; + item.setDurability(spawner.getSpawnedType().getTypeId()); + } + handleSpawnerUpdate(at, event.getPlayer(), item, LogTimer.TimerSubType.SPAWNER_BREAK); + } + } + } } @EventHandler(priority = EventPriority.HIGHEST) diff --git a/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java b/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java index 25793b17..5452d1a0 100644 --- a/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java +++ b/src/main/java/com/massivecraft/factions/listeners/FactionsPlayerListener.java @@ -18,9 +18,11 @@ import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.util.FactionGUI; import com.massivecraft.factions.util.VisualizeUtil; import com.massivecraft.factions.util.XMaterial; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.Access; import com.massivecraft.factions.zcore.fperms.PermissableAction; import com.massivecraft.factions.zcore.persist.MemoryFPlayer; +import com.massivecraft.factions.zcore.util.CC; import com.massivecraft.factions.zcore.util.TL; import com.massivecraft.factions.zcore.util.TagUtil; import com.massivecraft.factions.zcore.util.TextUtil; @@ -738,6 +740,7 @@ public class FactionsPlayerListener implements Listener { if (me.getAutoClaimFor() != null) { me.attemptClaim(me.getAutoClaimFor(), newLocation, true); + FactionsPlugin.instance.logFactionEvent(me.getAutoClaimFor(), FLogType.CHUNK_CLAIMS, me.getName(), CC.GreenB + "CLAIMED", String.valueOf(1), (new FLocation(player.getLocation())).formatXAndZ(",")); if (Conf.disableFlightOnFactionClaimChange) CmdFly.disableFlight(me); } else if (me.isAutoSafeClaimEnabled()) { if (!Permission.MANAGE_SAFE_ZONE.has(player)) { diff --git a/src/main/java/com/massivecraft/factions/listeners/menu/ClickableItemStack.java b/src/main/java/com/massivecraft/factions/listeners/menu/ClickableItemStack.java new file mode 100644 index 00000000..71fc6c76 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/listeners/menu/ClickableItemStack.java @@ -0,0 +1,46 @@ +package com.massivecraft.factions.listeners.menu; + +import com.massivecraft.factions.zcore.util.ItemUtil; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.List; +import java.util.function.Consumer; + +public class ClickableItemStack extends ItemStack { + private Consumer itemCallback; + + public ClickableItemStack(ItemStack clone) { + super(clone); + } + + public ClickableItemStack setClickCallback(Consumer callback) { + this.itemCallback = callback; + return this; + } + + public ClickableItemStack setDisplayName(String name) { + ItemMeta im = this.getItemMeta(); + im.setDisplayName(name); + this.setItemMeta(im); + return this; + } + + + public ClickableItemStack setLore(List lore) { + ItemMeta im = this.getItemMeta(); + im.setLore(lore); + this.setItemMeta(im); + return this; + } + + public ClickableItemStack setDura(short dura) { + this.setDurability(dura); + return this; + } + + public Consumer getItemCallback() { + return this.itemCallback; + } +} diff --git a/src/main/java/com/massivecraft/factions/listeners/menu/GUIMenu.java b/src/main/java/com/massivecraft/factions/listeners/menu/GUIMenu.java new file mode 100644 index 00000000..bb464c96 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/listeners/menu/GUIMenu.java @@ -0,0 +1,153 @@ +package com.massivecraft.factions.listeners.menu; + +import com.google.common.collect.Lists; +import com.massivecraft.factions.FPlayer; +import com.massivecraft.factions.Faction; +import com.massivecraft.factions.FactionsPlugin; +import com.massivecraft.factions.struct.Role; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.DyeColor; +import org.bukkit.Material; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.material.MaterialData; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.function.Consumer; + +public abstract class GUIMenu { + protected Inventory menu; + private Map menuItems = new HashMap(); + private static Map menus = new HashMap(); + private Consumer closeCallback; + private String name; + private int size; + private GUIMenu previousMenu; + + public GUIMenu(String name, int size) { + if (name.length() > 32) { + name = name.substring(0, 32); + } + + this.name = name; + this.size = size; + this.menu = Bukkit.createInventory(null, size, name); + } + + public void setInventorySize(int size) { + if (this.size != size) { + int oldSize = this.size; + this.size = size; + List viewing = Lists.newArrayList(this.menu.getViewers()); + this.menu = Bukkit.createInventory(null, size, this.name); + viewing.forEach((pl) -> { + pl.closeInventory(); + pl.openInventory(this.menu); + menus.put(pl.getUniqueId(), this); + Bukkit.getLogger().info("Reopening Menu for " + pl.getName() + " due to menu changing size from " + oldSize + " -> " + size); + }); + } + } + + public GUIMenu setPreviousMenu(GUIMenu menu) { + this.previousMenu = menu; + return this; + } + + public void setItem(int slot, ClickableItemStack item) { + this.menu.setItem(slot, item); + this.menuItems.put(slot, item); + } + + public abstract void drawItems(); + + private boolean canEditPermissions(Faction faction, FPlayer player) { + Role role = player.getRole(); + if (role != null && role.isAtLeast(Role.COLEADER)) { + Faction theirfac = player.getFaction(); + return theirfac != null && theirfac.isNormal() && theirfac.equals(faction); + } + + return false; + } + + public ClickableItemStack getBackButton(Material data, String name, String... lore) { + return (new ClickableItemStack(new ItemStack(data != null ? data : Material.RED_STAINED_GLASS_PANE, 1, data != null ? (short) 0 : 0 ))).setDisplayName(name != null ? name : ChatColor.RED + ChatColor.BOLD.toString() + "Back").setLore(lore != null ? Lists.newArrayList(lore) : Lists.newArrayList(ChatColor.GRAY + "Click to return to previous menu.")).setClickCallback((e) -> { + if (this.previousMenu != null) { + this.previousMenu.open((Player)e.getWhoClicked()); + } + + }); + } + + protected void clearItems() { + this.getMenuItems().clear(); + this.menu.clear(); + } + + public void open(Player player) { + GUIMenu openMenu = menus.get(player.getUniqueId()); + if (openMenu != null) { + player.closeInventory(); + Bukkit.getScheduler().scheduleSyncDelayedTask(FactionsPlugin.instance, () -> { + this.drawItems(); + player.openInventory(this.menu); + menus.put(player.getUniqueId(), this); + }, 1L); + } else { + this.drawItems(); + player.openInventory(this.menu); + menus.put(player.getUniqueId(), this); + } + + } + + public void fillEmpty(ClickableItemStack item) { + for(int i = 0; i < this.menu.getSize(); ++i) { + ItemStack is = this.menu.getItem(i); + if (is == null || is.getType() == Material.AIR) { + this.setItem(i, item); + } + } + + } + + public static int fitSlots(int size) { + return size <= 9 ? 9 : (size <= 18 ? 18 : (size <= 27 ? 27 : (size <= 36 ? 36 : (size <= 45 ? 45 : (size <= 54 ? 54 : 54))))); + } + + public Map getMenuItems() { + return this.menuItems; + } + + public static Map getMenus() { + return menus; + } + + public Consumer getCloseCallback() { + return this.closeCallback; + } + + public void setCloseCallback(Consumer closeCallback) { + this.closeCallback = closeCallback; + } + + public String getName() { + return this.name; + } + + public int getSize() { + return this.size; + } + + public GUIMenu getPreviousMenu() { + return this.previousMenu; + } +} diff --git a/src/main/java/com/massivecraft/factions/listeners/menu/MenuListener.java b/src/main/java/com/massivecraft/factions/listeners/menu/MenuListener.java new file mode 100644 index 00000000..1b64a699 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/listeners/menu/MenuListener.java @@ -0,0 +1,59 @@ +package com.massivecraft.factions.listeners.menu; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.inventory.ItemStack; + +public class MenuListener implements Listener { + + public MenuListener() { + } + + @EventHandler + public void onInventoryClick(InventoryClickEvent event) { + if (event.getInventory().getName().equals("Faction Logs")) { + event.setCancelled(true); + } + + Player player = (Player)event.getWhoClicked(); + GUIMenu menu = GUIMenu.getMenus().get(player.getUniqueId()); + if (menu != null) { + event.setCancelled(true); + if (!menu.getName().equals(event.getInventory().getName())) { + player.closeInventory(); + return; + } + + ItemStack item = event.getCurrentItem(); + if (item == null) return; + if (event.getRawSlot() >= event.getInventory().getSize()) return; + ClickableItemStack found = menu.getMenuItems().get(event.getRawSlot()); + if (found != null && found.getType() == item.getType() && found.getDurability() == item.getDurability()) { + if (found.getItemCallback() == null) { + return; + } + found.getItemCallback().accept(event); + } + } + } + + @EventHandler + public void onInventoryClose(InventoryCloseEvent event) { + GUIMenu menu = GUIMenu.getMenus().remove(event.getPlayer().getUniqueId()); + if (menu != null && menu.getCloseCallback() != null) { + menu.getCloseCallback().accept(event); + } + } + + @EventHandler + public void onPLayerLeave(PlayerQuitEvent event) { + GUIMenu menu = GUIMenu.getMenus().remove(event.getPlayer().getUniqueId()); + if (menu != null && menu.getCloseCallback() != null) { + menu.getCloseCallback().accept(new InventoryCloseEvent(event.getPlayer().getOpenInventory())); + } + } +} diff --git a/src/main/java/com/massivecraft/factions/scoreboards/FTeamWrapper.java b/src/main/java/com/massivecraft/factions/scoreboards/FTeamWrapper.java index c91501b0..b48ab214 100644 --- a/src/main/java/com/massivecraft/factions/scoreboards/FTeamWrapper.java +++ b/src/main/java/com/massivecraft/factions/scoreboards/FTeamWrapper.java @@ -31,18 +31,9 @@ public class FTeamWrapper { } public static void applyUpdatesLater(final Faction faction) { - if (!FScoreboard.isSupportedByServer()) { - return; - } - - if (faction.isWilderness()) { - return; - } - - if (!FactionsPlugin.getInstance().getConfig().getBoolean("scoreboard.default-prefixes", false) || FactionsPlugin.getInstance().getConfig().getBoolean("See-Invisible-Faction-Members")) { - return; - } - + if (!FScoreboard.isSupportedByServer()) return; + if (faction.isWilderness()) return; + if (!FactionsPlugin.getInstance().getConfig().getBoolean("scoreboard.default-prefixes", false) || FactionsPlugin.getInstance().getConfig().getBoolean("See-Invisible-Faction-Members")) return; if (updating.add(faction)) { Bukkit.getScheduler().runTask(FactionsPlugin.getInstance(), () -> { @@ -53,22 +44,12 @@ public class FTeamWrapper { } public static void applyUpdates(Faction faction) { - if (!FScoreboard.isSupportedByServer()) { - return; - } + if (!FScoreboard.isSupportedByServer()) return; - if (faction.isWilderness()) { - return; - } + if (faction.isWilderness()) return; - if (!FactionsPlugin.getInstance().getConfig().getBoolean("scoreboard.default-prefixes", false) || FactionsPlugin.getInstance().getConfig().getBoolean("See-Invisible-Faction-Members")) { - return; - } - - if (updating.contains(faction)) { - // Faction will be updated soon. - return; - } + if (!FactionsPlugin.getInstance().getConfig().getBoolean("scoreboard.default-prefixes", false) || FactionsPlugin.getInstance().getConfig().getBoolean("See-Invisible-Faction-Members")) return; + if (updating.contains(faction)) return; FTeamWrapper wrapper = wrappers.get(faction); Set factionMembers = faction.getFPlayers(); diff --git a/src/main/java/com/massivecraft/factions/struct/Permission.java b/src/main/java/com/massivecraft/factions/struct/Permission.java index e8828a09..79fd09d3 100755 --- a/src/main/java/com/massivecraft/factions/struct/Permission.java +++ b/src/main/java/com/massivecraft/factions/struct/Permission.java @@ -12,6 +12,7 @@ public enum Permission { ADMIN_ANY("admin.any"), AHOME("ahome"), ANNOUNCE("announce"), + AUDIT("audit"), AUTOCLAIM("autoclaim"), AUTO_LEAVE_BYPASS("autoleavebypass"), BAN("ban"), diff --git a/src/main/java/com/massivecraft/factions/zcore/faudit/FAuditMenu.java b/src/main/java/com/massivecraft/factions/zcore/faudit/FAuditMenu.java new file mode 100644 index 00000000..6a6c1885 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/zcore/faudit/FAuditMenu.java @@ -0,0 +1,154 @@ +package com.massivecraft.factions.zcore.faudit; + +import com.google.common.collect.Lists; +import com.massivecraft.factions.Faction; +import com.massivecraft.factions.FactionsPlugin; +import com.massivecraft.factions.listeners.menu.ClickableItemStack; +import com.massivecraft.factions.listeners.menu.GUIMenu; +import com.massivecraft.factions.util.ItemBuilder; +import com.massivecraft.factions.zcore.util.CC; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +public class FAuditMenu extends GUIMenu { + private static int logsPerPage = 20; + private Player player; + private boolean showTimestamps = true; + private Faction faction; + + public FAuditMenu(Player player, Faction faction) { + super("Faction Logs", 18); + this.faction = faction; + this.player = player; + } + + public void drawItems() { + int index = 0; + FLogType[] logTypes = FLogType.values(); + int length1 = logTypes.length; + + for (FLogType type : logTypes) { + if (type != FLogType.F_TNT || FactionsPlugin.getInstance().getConfig().getBoolean("f-points.Enabled")) { + if (index == 9) { + index = FactionsPlugin.getInstance().getConfig().getBoolean("f-points.Enabled") ? 11 : 12; + } + + FactionLogs logs = FactionsPlugin.instance.getFlogManager().getFactionLogMap().get(this.faction.getId()); + if (logs == null) { + logs = new FactionLogs(); + } + + LinkedList recentLogs = logs.getMostRecentLogs().get(type); + if (recentLogs == null) { + recentLogs = Lists.newLinkedList(); + } + + List lore = Lists.newArrayList("", CC.GreenB + "Recent Logs " + CC.Green + "(" + CC.GreenB + recentLogs.size() + CC.Green + ")"); + int added = 0; + Iterator backwars = recentLogs.descendingIterator(); + while (backwars.hasNext()) { + FactionLogs.FactionLog log = (FactionLogs.FactionLog) backwars.next(); + if (added >= logsPerPage) { + break; + } + + String length = log.getLogLine(type, this.showTimestamps); + lore.add(" " + CC.Yellow + length); + ++added; + } + + int logSize = recentLogs.size(); + int logsLeft = logSize - logsPerPage; + if (logsLeft > 0) { + lore.add(CC.YellowB + logsLeft + CC.Yellow + " more logs..."); + } + + lore.add(""); + if (logsLeft > 0) { + lore.add(CC.Yellow + "Left-Click " + CC.Gray + "to view more logs"); + } + + lore.add(CC.Yellow + "Right-Click " + CC.Gray + "to toggle timestamps"); + this.setItem(index++, (new ClickableItemStack((new ItemBuilder(type.getDisplayMaterial())).name(CC.GreenB + type.getDisplayName()).lore(lore).build())).setClickCallback((click) -> { + click.setCancelled(true); + if (click.getClick() == ClickType.RIGHT) { + this.showTimestamps = !this.showTimestamps; + this.drawItems(); + } else { + if (logsLeft <= 0) { + this.player.sendMessage(CC.Red + "No extra logs to load."); + return; + } + Bukkit.getScheduler().scheduleSyncDelayedTask(FactionsPlugin.instance, () -> (new FAuditLogMenu(this.player, this.faction, type)).open(this.player)); + } + })); + } + } + + } + + class FAuditLogMenu extends GUIMenu { + private Player player; + private Faction faction; + private FLogType logType; + private boolean timeStamp = false; + + public FAuditLogMenu(Player player, Faction faction, FLogType type) { + super("Faction Logs", 9); + this.player = player; + this.faction = faction; + this.logType = type; + } + + public void drawItems() { + FactionLogs logs = FactionsPlugin.instance.getFlogManager().getFactionLogMap().get(faction.getId()); + int perPage = this.logType == FLogType.F_TNT ? 25 : 20; + if (logs != null) { + LinkedList log = logs.getMostRecentLogs().get(this.logType); + if (log != null) { + int slot = this.logType == FLogType.F_TNT ? 0 : 3; + int pagesToShow = (int)Math.max(1.0D, Math.ceil((double)log.size() / (double)perPage)); + + for(int page = 1; page <= pagesToShow; ++page) { + int startIndex = log.size() - (page * perPage - perPage); + if (startIndex >= log.size()) { + startIndex = log.size() - 1; + } + + List lore = Lists.newArrayList("", CC.GreenB + "Logs"); + + for(int i = startIndex; i > startIndex - perPage; --i) { + if (i < log.size()) { + if (i < 0) { + break; + } + + FactionLogs.FactionLog l = log.get(i); + lore.add(" " + CC.Yellow + l.getLogLine(this.logType, this.timeStamp)); + } + } + + lore.add(""); + lore.add(CC.Gray + "Click to toggle timestamp"); + this.setItem(slot++, (new ClickableItemStack((new ItemBuilder(Material.PAPER)).name(CC.GreenB + "Log #" + page).lore(lore).build())).setClickCallback((e) -> { + e.setCancelled(true); + this.timeStamp = !this.timeStamp; + this.drawItems(); + })); + } + } + } + + this.setItem(this.getSize() - 1, (new ClickableItemStack((new ItemBuilder(Material.ARROW)).name(CC.Green + "Previous Page").lore("", CC.Gray + "Click to view previous page!").build())).setClickCallback((event) -> { + event.setCancelled(true); + Bukkit.getScheduler().scheduleSyncDelayedTask(FactionsPlugin.instance, () -> (new FAuditMenu(this.player, this.faction)).open(this.player)); + })); + } + } +} diff --git a/src/main/java/com/massivecraft/factions/zcore/faudit/FLogManager.java b/src/main/java/com/massivecraft/factions/zcore/faudit/FLogManager.java new file mode 100644 index 00000000..ee075cf0 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/zcore/faudit/FLogManager.java @@ -0,0 +1,148 @@ +package com.massivecraft.factions.zcore.faudit; + +import com.google.common.reflect.TypeToken; +import com.massivecraft.factions.Faction; +import com.massivecraft.factions.Factions; +import com.massivecraft.factions.FactionsPlugin; +import com.massivecraft.factions.zcore.util.JSONUtils; +import org.bukkit.Bukkit; + +import java.io.File; +import java.lang.reflect.Type; +import java.util.Map; +import java.util.Timer; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +public class FLogManager { + private Map factionLogMap = new ConcurrentHashMap(); + private File logFile; + private Type logToken = (new TypeToken>() { + }).getType(); + private Map logTimers = new ConcurrentHashMap(); + private boolean saving = false; + + public FLogManager() { + } + + public void log(Faction faction, FLogType type, String... arguments) { + FactionLogs logs = factionLogMap.computeIfAbsent(faction.getId(), (n) -> new FactionLogs()); + logs.log(type, arguments); + } + + public void loadLogs(FactionsPlugin plugin) { + try { + logFile = new File(plugin.getDataFolder(), "factionLogs.json"); + if (!logFile.exists()) { + logFile.createNewFile(); + } + + factionLogMap = (Map) JSONUtils.fromJson(logFile, logToken); + if (factionLogMap == null) { + factionLogMap = new ConcurrentHashMap(); + } + + factionLogMap.forEach((factionId, factionLogs) -> { + + Faction faction = Factions.getInstance().getFactionById(factionId); + if (faction != null && faction.isNormal()) { + factionLogs.checkExpired(); + if (factionLogs.isEmpty()) { + factionLogMap.remove(factionId); + } + + } else { + Bukkit.getLogger().info("Removing dead faction logs for " + factionId + "!"); + factionLogMap.remove(factionId); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + + long delay = TimeUnit.SECONDS.toMillis(15L); + long sellDelay = TimeUnit.SECONDS.toMillis(30L); + Bukkit.getScheduler().scheduleSyncRepeatingTask(FactionsPlugin.instance, () -> { + if (saving) { + Bukkit.getLogger().info("Ignoring saveLogs scheduler due to saving == true!"); + } else { + logTimers.forEach((uuid, logTimer) -> { + if (logTimer != null && logTimer.getFactionId() != null) { + Faction faction = Factions.getInstance().getFactionById(logTimer.getFactionId()); + if (faction == null) { + logTimers.remove(uuid); + Bukkit.getLogger().info("Null faction for logs " + logTimer.getFactionId()); + } else { + if (logTimer.isEmpty()) { + logTimers.remove(uuid); + } + } + } else { + logTimers.remove(uuid); + } + }); + } + }, 20L, 400L); + } + + public void pushPendingLogs(LogTimer.TimerType type) { + Faction faction = null; + + for (Map.Entry uuidLogTimerEntry : getLogTimers().entrySet()) { + Map.Entry timer = uuidLogTimerEntry; + LogTimer logTimer = timer.getValue(); + if (faction == null) { + faction = Factions.getInstance().getFactionById(logTimer.getFactionId()); + } + + if (type != null) { + Map timers = (Map) logTimer.get(type); + if (timers != null && faction != null) { + logTimer.pushLogs(faction, type); + } + } else if (faction != null) { + Faction finalFaction = faction; + logTimer.keySet().forEach((timerType) -> logTimer.pushLogs(finalFaction, timerType)); + logTimer.clear(); + } + } + + if (type == null) { + getLogTimers().clear(); + } + + } + + public void saveLogs() { + if (saving) { + Bukkit.getLogger().info("Ignoring saveLogs due to saving==true!"); + } else { + saving = true; + + try { + pushPendingLogs(null); + } catch (Exception e) { + Bukkit.getLogger().info("error pushing pending logs: " + e.getMessage()); + e.printStackTrace(); + } + + try { + JSONUtils.saveJSONToFile(logFile, factionLogMap,logToken); + } catch (Exception e1) { + Bukkit.getLogger().info("ERRRO SAVING JSON LOGS: " + e1.getMessage()); + e1.printStackTrace(); + } + + saving = false; + } + } + + public Map getFactionLogMap() { + return factionLogMap; + } + + public Map getLogTimers() { + return logTimers; + } +} diff --git a/src/main/java/com/massivecraft/factions/zcore/faudit/FLogType.java b/src/main/java/com/massivecraft/factions/zcore/faudit/FLogType.java new file mode 100644 index 00000000..79ad9231 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/zcore/faudit/FLogType.java @@ -0,0 +1,49 @@ +package com.massivecraft.factions.zcore.faudit; + +import com.massivecraft.factions.util.XMaterial; +import org.bukkit.Material; + +public enum FLogType { + + INVITES("Roster Edits", XMaterial.WRITABLE_BOOK.parseMaterial(), "&e%s&7 &a%s&7 &e%s", 3), + BANS("Player Bans", XMaterial.ANVIL.parseMaterial(), "&e%s&7 &e%s&6 &e%s", 3), + CHUNK_CLAIMS("Claim Edits", XMaterial.WOODEN_AXE.parseMaterial(), "&e%s&7 %s&7 &e%s&7 near &e%s", 3), + PERM_EDIT_DEFAULTS("Default Perm Edits", XMaterial.WRITTEN_BOOK.parseMaterial(), "&e%s&7 %s&7 %s for &e%s", 4), + BANK_EDIT("/f money Edits", XMaterial.GOLD_INGOT.parseMaterial(), "&e%s&7 %s &e&l$&e%s", 3), + FCHEST_EDIT("/f chest Edits", XMaterial.CHEST.parseMaterial(), "&e%s&7 %s &f%s", 3), + RELATION_CHANGE("Relation Edits", XMaterial.GOLDEN_SWORD.parseMaterial(), "&e%s %s&e'd %s", 3), + FTAG_EDIT("/f tag Edits", XMaterial.NAME_TAG.parseMaterial(), "&e%s&7 set to &e'%s'", 2), + FDESC_EDIT("/f desc Edits", XMaterial.PAPER.parseMaterial(), "&e%s&7 set to &e'%s'", 2), + ROLE_PERM_EDIT("/f promote Edits", XMaterial.WRITTEN_BOOK.parseMaterial(), "&e%s&7&e %s &e%s &7to &e%s", 4), + SPAWNER_EDIT("Spawner Edits", XMaterial.SPAWNER.parseMaterial(), "&e%s&7 %s &e%s&7 %s", 4), + RANK_EDIT("Rank Edits", XMaterial.GOLDEN_HELMET.parseMaterial(), "&e%s&7 set &e%s&7 to %s", 3), + F_TNT("/f tnt Edits", XMaterial.TNT.parseMaterial(), "&e%s&7 %s &e%s", 3); + + private String displayName; + private Material displayMaterial; + private String msg; + private int requiredArgs; + + public String getDisplayName() { + return this.displayName; + } + + public Material getDisplayMaterial() { + return this.displayMaterial; + } + + public String getMsg() { + return this.msg; + } + + public int getRequiredArgs() { + return this.requiredArgs; + } + + FLogType(String displayName, Material displayMaterial, String msg, int requiredArgs) { + this.displayName = displayName; + this.displayMaterial = displayMaterial; + this.msg = msg; + this.requiredArgs = requiredArgs; + } +} diff --git a/src/main/java/com/massivecraft/factions/zcore/faudit/FactionLogs.java b/src/main/java/com/massivecraft/factions/zcore/faudit/FactionLogs.java new file mode 100644 index 00000000..02d3b881 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/zcore/faudit/FactionLogs.java @@ -0,0 +1,103 @@ +package com.massivecraft.factions.zcore.faudit; + +import com.google.common.collect.Lists; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; + +import java.text.SimpleDateFormat; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +public class FactionLogs { + private Map> mostRecentLogs = new ConcurrentHashMap(); + public static transient SimpleDateFormat format = new SimpleDateFormat("MM/dd hh:mmaa"); + private static transient int MAX_LOG_SIZE = 60; + + public FactionLogs() { + } + + public void log(FLogType type, String... arguments) { + if (type.getRequiredArgs() > arguments.length) { + Bukkit.getLogger().info("INVALID ARGUMENT COUNT MET: " + type.getRequiredArgs() + " REQUIRED: "); + Thread.dumpStack(); + } else { + LinkedList logs = this.mostRecentLogs.computeIfAbsent(type, (lists) -> new LinkedList()); + logs.add(new FactionLog(System.currentTimeMillis(), Lists.newArrayList(arguments))); + int maxLog = type == FLogType.F_TNT ? 200 : 60; + if (logs.size() > maxLog) { + logs.pop(); + } + + } + } + + public boolean isEmpty() { + return this.mostRecentLogs.isEmpty(); + } + + public void checkExpired() { + long duration = TimeUnit.DAYS.toMillis(7L); + List toRemove = Lists.newArrayList(); + mostRecentLogs.forEach((logType, logs) -> { + if (logs == null) { + toRemove.add(logType); + } else if (logType != FLogType.F_TNT) { + Iterator iter = logs.iterator(); + while (iter.hasNext()) { + try { + FactionLog log = (FactionLog) iter.next(); + if (log == null || log.isExpired(duration)) { + iter.remove(); + } + } catch (Exception e) { + Bukkit.getLogger().info("ERROR TRYING TO GET next FACTION LOG: " + e.getMessage()); + try { + iter.remove(); + } catch (Exception e1) { + e1.printStackTrace(); + } + } + } + if (logs.size() <= 0) + toRemove.add(logType); + } + }); + toRemove.forEach((rem) -> { + LinkedList linkedList = this.mostRecentLogs.remove(rem); + }); + } + + public Map> getMostRecentLogs() { + return this.mostRecentLogs; + } + + public class FactionLog { + private long t; + private List a; + + public FactionLog(long t, List a) { + this.t = t; + this.a = a; + } + + public boolean isExpired(long duration) { + return System.currentTimeMillis() - this.t >= duration; + } + + public String getLogLine(FLogType type, boolean timestamp) { + String[] args = this.a.toArray(new String[0]); + String timeFormat = ""; + if (timestamp) { + timeFormat = FactionLogs.format.format(this.t); + if (timeFormat.startsWith("0")) { + timeFormat = timeFormat.substring(1); + } + } + return String.format(ChatColor.translateAlternateColorCodes('&', type.getMsg()), (String[])args) + (timestamp ? ChatColor.GRAY + " - " + timeFormat : ""); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/massivecraft/factions/zcore/faudit/LogTimer.java b/src/main/java/com/massivecraft/factions/zcore/faudit/LogTimer.java new file mode 100644 index 00000000..e80891ab --- /dev/null +++ b/src/main/java/com/massivecraft/factions/zcore/faudit/LogTimer.java @@ -0,0 +1,123 @@ +package com.massivecraft.factions.zcore.faudit; + +import com.massivecraft.factions.Faction; +import com.massivecraft.factions.FactionsPlugin; +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.entity.EntityType; +import org.bukkit.material.MaterialData; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +public class LogTimer extends ConcurrentHashMap> { + private String factionId; + private String username; + + public LogTimer(String username, String factionId) { + this.username = username; + this.factionId = factionId; + } + + public Map getCurrentTimersOrCreate(LogTimer.TimerType type) { + return this.computeIfAbsent(type, (m) -> new ConcurrentHashMap()); + } + + public LogTimer.Timer attemptLog(LogTimer.TimerType type, LogTimer.TimerSubType subType, long increment) { + return this.getCurrentTimersOrCreate(type).computeIfAbsent(subType, (e) -> new Timer(System.currentTimeMillis(), 0L, null)).increment(increment); + } + + public void pushLogs(Faction faction, LogTimer.TimerType type) { + StringBuilder soldString = new StringBuilder(); + forEach((timerType, map) -> { + if (timerType == type) { + if (timerType == LogTimer.TimerType.SPAWNER_EDIT) { + map.forEach((subTimer, timer) -> { + Map entityCounts = new HashMap(); + Map currentCounts = (Map) timer.getExtraData(); + if (currentCounts != null) { + currentCounts.forEach((data, ints) -> { + EntityType types = EntityType.fromId(data.getData()); + if (types == null) { + Bukkit.getLogger().info("Unable to find EntityType for " + data.getData() + " for " + subTimer + " for fac " + this.factionId + "!"); + } else { + entityCounts.computeIfAbsent(types, (e) -> new AtomicInteger(0)).addAndGet(ints.get()); + } + }); + entityCounts.forEach((entityType, count) -> FactionsPlugin.instance.getFlogManager().log(faction, FLogType.SPAWNER_EDIT, this.username, subTimer == TimerSubType.SPAWNER_BREAK ? "broke" : "placed", count.get() + "x", StringUtils.capitaliseAllWords(entityType.name().toLowerCase().replace("_", " ")))); + } + }); + } + } + }); + this.remove(type); + } + + public String getFactionId() { + return this.factionId; + } + + public String getUsername() { + return this.username; + } + + public class Timer { + private long startTime; + private long count; + private Object extraData; + + LogTimer.Timer increment(long amount) { + this.count += amount; + return this; + } + + public boolean isReadyToLog(long expiration) { + return System.currentTimeMillis() - this.startTime >= expiration; + } + + public Timer(long startTime, long count, Object extraData) { + this.startTime = startTime; + this.count = count; + this.extraData = extraData; + } + + public long getStartTime() { + return this.startTime; + } + + public long getCount() { + return this.count; + } + + public Object getExtraData() { + return this.extraData; + } + + public void setStartTime(long startTime) { + this.startTime = startTime; + } + + public void setCount(long count) { + this.count = count; + } + + public void setExtraData(Object extraData) { + this.extraData = extraData; + } + } + + public enum TimerSubType { + SPAWNER_BREAK, + SPAWNER_PLACE; + TimerSubType() { + } + } + + public enum TimerType { + SPAWNER_EDIT; + TimerType() { + } + } +} diff --git a/src/main/java/com/massivecraft/factions/zcore/fperms/gui/PermissableActionFrame.java b/src/main/java/com/massivecraft/factions/zcore/fperms/gui/PermissableActionFrame.java index 9a32bd1d..d6a95a12 100644 --- a/src/main/java/com/massivecraft/factions/zcore/fperms/gui/PermissableActionFrame.java +++ b/src/main/java/com/massivecraft/factions/zcore/fperms/gui/PermissableActionFrame.java @@ -3,14 +3,17 @@ package com.massivecraft.factions.zcore.fperms.gui; import com.github.stefvanschie.inventoryframework.Gui; import com.github.stefvanschie.inventoryframework.GuiItem; import com.github.stefvanschie.inventoryframework.pane.PaginatedPane; +import com.massivecraft.factions.FLocation; import com.massivecraft.factions.FPlayer; import com.massivecraft.factions.Faction; import com.massivecraft.factions.FactionsPlugin; import com.massivecraft.factions.util.XMaterial; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.Access; import com.massivecraft.factions.zcore.fperms.Permissable; import com.massivecraft.factions.zcore.fperms.PermissableAction; import com.massivecraft.factions.zcore.util.TL; +import org.bukkit.ChatColor; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -47,10 +50,12 @@ public class PermissableActionFrame { case LEFT: access = Access.ALLOW; success = fplayer.getFaction().setPermission(perm, action, access); + FactionsPlugin.instance.logFactionEvent(fplayer.getFaction(), FLogType.PERM_EDIT_DEFAULTS,fplayer.getName(), ChatColor.GREEN.toString() + ChatColor.BOLD + "ALLOWED", action.getName(), perm.name()); break; case RIGHT: access = Access.DENY; success = fplayer.getFaction().setPermission(perm, action, access); + FactionsPlugin.instance.logFactionEvent(fplayer.getFaction(), FLogType.PERM_EDIT_DEFAULTS,fplayer.getName(), ChatColor.RED.toString() + ChatColor.BOLD + "DENIED", action.getName(), perm.name()); break; case MIDDLE: access = Access.UNDEFINED; diff --git a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFPlayer.java b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFPlayer.java index 1a1e1edc..7367431d 100644 --- a/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFPlayer.java +++ b/src/main/java/com/massivecraft/factions/zcore/persist/MemoryFPlayer.java @@ -17,8 +17,10 @@ import com.massivecraft.factions.struct.Relation; import com.massivecraft.factions.struct.Role; import com.massivecraft.factions.util.RelationUtil; import com.massivecraft.factions.util.WarmUpUtil; +import com.massivecraft.factions.zcore.faudit.FLogType; import com.massivecraft.factions.zcore.fperms.Access; import com.massivecraft.factions.zcore.fperms.PermissableAction; +import com.massivecraft.factions.zcore.util.CC; import com.massivecraft.factions.zcore.util.TL; import mkremins.fanciful.FancyMessage; import net.milkbowl.vault.economy.Economy; @@ -789,6 +791,7 @@ public abstract class MemoryFPlayer implements FPlayer { } this.resetFactionData(); + FactionsPlugin.instance.logFactionEvent(myFaction, FLogType.INVITES, this.getName(), CC.Red + "left", "the faction"); setFlying(false); if (myFaction.isNormal() && !perm && myFaction.getFPlayers().isEmpty()) { diff --git a/src/main/java/com/massivecraft/factions/zcore/util/CC.java b/src/main/java/com/massivecraft/factions/zcore/util/CC.java new file mode 100644 index 00000000..19ca2713 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/zcore/util/CC.java @@ -0,0 +1,92 @@ +package com.massivecraft.factions.zcore.util; + +import org.bukkit.ChatColor; + +public class CC { + public static String Black = ChatColor.BLACK.toString(); + public static String BlackB = ChatColor.BLACK + ChatColor.BOLD.toString(); + public static String BlackI = ChatColor.BLACK + ChatColor.ITALIC.toString();; + public static String BlackU = ChatColor.BLACK + ChatColor.UNDERLINE.toString(); + public static String DarkBlue = ChatColor.DARK_BLUE.toString(); + public static String DarkBlueB = ChatColor.DARK_BLUE + ChatColor.BOLD.toString(); + public static String DarkBlueI = ChatColor.DARK_BLUE + ChatColor.ITALIC.toString(); + public static String DarkBlueU = ChatColor.DARK_BLUE + ChatColor.UNDERLINE.toString(); + public static String DarkGreen = ChatColor.DARK_GREEN.toString(); + public static String DarkGreenB = ChatColor.DARK_GREEN + ChatColor.BOLD.toString(); + public static String DarkGreenI = ChatColor.DARK_GREEN + ChatColor.ITALIC.toString(); + public static String DarkGreenU = ChatColor.DARK_GREEN + ChatColor.UNDERLINE.toString(); + public static String DarkAqua = ChatColor.DARK_AQUA.toString(); + public static String DarkAquaB = ChatColor.DARK_AQUA + ChatColor.BOLD.toString(); + public static String DarkAquaI = ChatColor.DARK_AQUA + ChatColor.ITALIC.toString(); + public static String DarkAquaU = ChatColor.DARK_AQUA + ChatColor.UNDERLINE.toString(); + public static String DarkRed = ChatColor.DARK_RED.toString(); + public static String DarkRedB = ChatColor.DARK_RED + ChatColor.BOLD.toString(); + public static String DarkRedI = ChatColor.DARK_RED + ChatColor.ITALIC.toString(); + public static String DarkRedU = ChatColor.DARK_RED + ChatColor.UNDERLINE.toString(); + public static String DarkPurple = ChatColor.DARK_PURPLE.toString(); + public static String DarkPurpleB = ChatColor.DARK_PURPLE + ChatColor.BOLD.toString(); + public static String DarkPurpleI = ChatColor.DARK_PURPLE + ChatColor.ITALIC.toString(); + public static String DarkPurpleU = ChatColor.DARK_PURPLE + ChatColor.UNDERLINE.toString(); + public static String Gold = ChatColor.GOLD.toString(); + public static String GoldB = ChatColor.GOLD + ChatColor.BOLD.toString(); + public static String GoldI = ChatColor.GOLD + ChatColor.ITALIC.toString(); + public static String GoldU = ChatColor.GOLD + ChatColor.UNDERLINE.toString(); + public static String Gray = ChatColor.GRAY.toString(); + public static String GrayB = ChatColor.GRAY + ChatColor.BOLD.toString(); + public static String GrayI = ChatColor.GRAY + ChatColor.ITALIC.toString(); + public static String GrayU = ChatColor.GRAY + ChatColor.UNDERLINE.toString(); + public static String DarkGray = ChatColor.DARK_GRAY.toString(); + public static String DarkGrayB = ChatColor.DARK_GRAY + ChatColor.BOLD.toString(); + public static String DarkGrayI = ChatColor.DARK_GRAY + ChatColor.ITALIC.toString(); + public static String DarkGrayU = ChatColor.DARK_GRAY + ChatColor.UNDERLINE.toString(); + public static String Blue = ChatColor.BLUE.toString(); + public static String BlueB = ChatColor.BLUE + ChatColor.BOLD.toString(); + public static String BlueI = ChatColor.BLUE + ChatColor.ITALIC.toString(); + public static String BlueU = ChatColor.BLUE + ChatColor.UNDERLINE.toString(); + public static String Green = ChatColor.GREEN.toString(); + public static String GreenB = ChatColor.GREEN + ChatColor.BOLD.toString(); + public static String GreenI = ChatColor.GREEN + ChatColor.ITALIC.toString(); + public static String GreenU = ChatColor.GREEN + ChatColor.UNDERLINE.toString(); + public static String Aqua = ChatColor.AQUA.toString(); + public static String AquaB = ChatColor.AQUA + ChatColor.BOLD.toString(); + public static String AquaI = ChatColor.AQUA + ChatColor.ITALIC.toString(); + public static String AquaU = ChatColor.AQUA + ChatColor.UNDERLINE.toString(); + public static String Red = ChatColor.RED.toString(); + public static String RedB = ChatColor.RED + ChatColor.BOLD.toString(); + public static String RedI = ChatColor.RED + ChatColor.ITALIC.toString(); + public static String RedU = ChatColor.RED + ChatColor.UNDERLINE.toString(); + public static String LightPurple = ChatColor.LIGHT_PURPLE.toString(); + public static String LightPurpleB = ChatColor.LIGHT_PURPLE + ChatColor.BOLD.toString(); + public static String LightPurpleI = ChatColor.LIGHT_PURPLE + ChatColor.ITALIC.toString(); + public static String LightPurpleU = ChatColor.LIGHT_PURPLE + ChatColor.UNDERLINE.toString(); + public static String Yellow = ChatColor.YELLOW.toString(); + public static String YellowB = ChatColor.YELLOW + ChatColor.BOLD.toString(); + public static String YellowI = ChatColor.YELLOW + ChatColor.ITALIC.toString(); + public static String YellowU = ChatColor.YELLOW + ChatColor.UNDERLINE.toString(); + public static String White = ChatColor.WHITE.toString(); + public static String WhiteB = ChatColor.WHITE + ChatColor.BOLD.toString(); + public static String WhiteI = ChatColor.WHITE + ChatColor.ITALIC.toString(); + public static String WhiteU = ChatColor.WHITE + ChatColor.UNDERLINE.toString(); + public static String Bold = ChatColor.BOLD.toString(); + public static String Strike = ChatColor.STRIKETHROUGH.toString(); + public static String Underline = ChatColor.UNDERLINE.toString(); + public static String Magic = ChatColor.MAGIC.toString(); + public static String Italic = ChatColor.ITALIC.toString(); + public static String Reset = ChatColor.RESET.toString(); + public static String Go = GreenB + " " + Green; + public static String Wait = YellowB + " " + Yellow; + public static String Stop = RedB + " " + Red; + + public static String prefix(char color) { + return translate("&" + color + "&l &" + color); + } + + public static String translate(String string) { + return ChatColor.translateAlternateColorCodes('&', string); + } + + public static String strip(String string) { + return ChatColor.stripColor(string); + } +} + diff --git a/src/main/java/com/massivecraft/factions/zcore/util/ItemUtil.java b/src/main/java/com/massivecraft/factions/zcore/util/ItemUtil.java new file mode 100644 index 00000000..36596705 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/zcore/util/ItemUtil.java @@ -0,0 +1,48 @@ +package com.massivecraft.factions.zcore.util; + +import com.massivecraft.factions.util.XMaterial; +import org.bukkit.Material; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.SkullMeta; + +import java.util.HashMap; +import java.util.Map; + +public class ItemUtil { + private static Map cachedSkulls = new HashMap(); + + public ItemUtil() { + } + + public static int getItemCount(Inventory inventory) { + if (inventory == null) { + return 0; + } else { + int itemsFound = 0; + + for(int i = 0; i < inventory.getSize(); ++i) { + ItemStack item = inventory.getItem(i); + if (item != null && item.getType() != Material.AIR) { + ++itemsFound; + } + } + + return itemsFound; + } + } + + public static ItemStack createPlayerHead(String name) { + ItemStack skull = cachedSkulls.get(name); + if (skull != null) { + return skull.clone(); + } else { + skull = new ItemStack(XMaterial.PLAYER_HEAD.parseMaterial()); + SkullMeta sm = (SkullMeta)skull.getItemMeta(); + sm.setOwner(name); + skull.setItemMeta(sm); + cachedSkulls.put(name, skull.clone()); + return skull; + } + } +} diff --git a/src/main/java/com/massivecraft/factions/zcore/util/JSONUtils.java b/src/main/java/com/massivecraft/factions/zcore/util/JSONUtils.java new file mode 100644 index 00000000..645c2ff4 --- /dev/null +++ b/src/main/java/com/massivecraft/factions/zcore/util/JSONUtils.java @@ -0,0 +1,98 @@ +package com.massivecraft.factions.zcore.util; + +import com.google.common.reflect.TypeToken; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import org.bukkit.Bukkit; + +import java.io.*; +import java.lang.reflect.Type; + +public class JSONUtils { + public static Gson gson = (new GsonBuilder()).enableComplexMapKeySerialization().create(); + + public JSONUtils() { + } + + public static File getOrCreateFile(File parent, String string) throws IOException { + if (!parent.exists()) { + parent.mkdir(); + Bukkit.getLogger().info("Creating directory " + parent.getName()); + } + + File f = new File(parent, string); + if (!f.exists()) { + Bukkit.getLogger().info("Creating new file " + string + " due to it not existing!"); + f.createNewFile(); + } + return f; + } + + public static File getOrCreateFile(String fileName) throws IOException { + File f = new File(fileName); + if (!f.exists()) { + Bukkit.getLogger().info("Creating new file " + fileName + " due to it not existing!"); + f.createNewFile(); + } + return f; + } + + public static Object fromJson(String fileName, Object token) throws IOException { + File f = getOrCreateFile(fileName); + return fromJson(f, token); + } + + public static Object fromJson(File f, Object clazz) throws FileNotFoundException { + return gson.fromJson(new FileReader(f), getTypeFromObject(clazz)); + } + + public static Object fromJson(File f, Object clazz, Object defaultObj) throws FileNotFoundException { + Object retr = gson.fromJson(new FileReader(f), getTypeFromObject(clazz)); + return retr == null ? defaultObj : retr; + } + + public static Object fromJson(File f, Type token) throws FileNotFoundException { + return fromJson(f, token, gson); + } + + public static Object fromJson(File f, Type token, Gson gson) throws FileNotFoundException { + return gson.fromJson(new FileReader(f), token); + } + + public static String toJSON(Object object, Object token) { + return toJSON(object, token, gson); + } + + public static String toJSON(Object object, Object token, Gson gson) { + return gson.toJson(object, getTypeFromObject(token)); + } + + public static boolean saveJSONToFile(String fileName, Object toSave, Object token) throws IOException { + return saveJSONToFile(getOrCreateFile(fileName), toSave, token); + } + + public static boolean saveJSONToFile(File f, Object toSave, Object token, Gson gson) throws IOException { + String str = toJSON(toSave, token, gson); + FileWriter writer = new FileWriter(f); + writer.write(str); + writer.flush(); + writer.close(); + return true; + } + + public static boolean saveJSONToFile(File f, Object toSave, Object token) throws IOException { + try { + return saveJSONToFile(f, toSave, token, gson); + } catch (Throwable var4) { + throw var4; + } + } + + private static Type getTypeFromObject(Object object) { + return object instanceof Type ? (Type)object : getTypeFromClass(object.getClass()); + } + + private static Type getTypeFromClass(Class clazz) { + return TypeToken.of(clazz).getType(); + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index d5a0ede7..438b5d68 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1292,7 +1292,7 @@ fbanners: - SPEED:2 BannerHolo: '&c{Faction}''s War Banner' Placeable: - Warzone: true + Warzone: false Enemy: true #Title when moving between chunks