diff --git a/pom.xml b/pom.xml index 7d0246fa..54063f6f 100644 --- a/pom.xml +++ b/pom.xml @@ -64,6 +64,11 @@ me.clip placeholderapi + + + mineverse.Aust1n46.chat + MineverseChat + diff --git a/src/com/massivecraft/factions/Factions.java b/src/com/massivecraft/factions/Factions.java index e1826d3e..764c9ea1 100644 --- a/src/com/massivecraft/factions/Factions.java +++ b/src/com/massivecraft/factions/Factions.java @@ -63,6 +63,7 @@ import com.massivecraft.factions.integration.V18.IntegrationV18; import com.massivecraft.factions.integration.V19.IntegrationV19; import com.massivecraft.factions.integration.lwc.IntegrationLwc; import com.massivecraft.factions.integration.placeholderapi.IntegrationPlaceholderAPI; +import com.massivecraft.factions.integration.venturechat.IntegrationVentureChat; import com.massivecraft.factions.integration.worldguard.IntegrationWorldGuard; import com.massivecraft.factions.mixin.PowerMixin; import com.massivecraft.factions.task.TaskEconLandReward; @@ -180,6 +181,7 @@ public class Factions extends MassivePlugin { return MUtil.list( IntegrationPlaceholderAPI.class, + IntegrationVentureChat.class, IntegrationV18.class, IntegrationV19.class, IntegrationLwc.class, diff --git a/src/com/massivecraft/factions/engine/EngineChat.java b/src/com/massivecraft/factions/engine/EngineChat.java index dcb3ebf7..59d3baf4 100644 --- a/src/com/massivecraft/factions/engine/EngineChat.java +++ b/src/com/massivecraft/factions/engine/EngineChat.java @@ -1,8 +1,12 @@ package com.massivecraft.factions.engine; import com.massivecraft.factions.Factions; +import com.massivecraft.factions.Rel; +import com.massivecraft.factions.RelationParticipator; import com.massivecraft.factions.chat.ChatFormatter; +import com.massivecraft.factions.entity.Faction; import com.massivecraft.factions.entity.MConf; +import com.massivecraft.factions.entity.MPlayer; import com.massivecraft.massivecore.Engine; import com.massivecraft.massivecore.event.EventMassiveCorePlayerToRecipientChat; import com.massivecraft.massivecore.util.MUtil; @@ -15,6 +19,9 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.plugin.EventExecutor; +import java.util.Iterator; +import java.util.function.Predicate; + public class EngineChat extends Engine { // -------------------------------------------- // @@ -138,5 +145,35 @@ public class EngineChat extends Engine format = ChatFormatter.format(format, event.getSender(), event.getRecipient()); event.setFormat(format); } + + // -------------------------------------------- // + // FILTER CHAT CHANNEL + // -------------------------------------------- // + + public static Predicate getPredicateIsInFaction(RelationParticipator participator) + { + return player -> MPlayer.get(player).getRelationTo(participator).isAtLeast(Rel.FACTION); + } + + public static Predicate getPredicateIsAlly(RelationParticipator participator) + { + return player -> MPlayer.get(player).getFaction().getRelationTo(participator).isAtLeast(Rel.ALLY); + } + + public static void filterToPredicate(AsyncPlayerChatEvent event, Predicate predicate) + { + Player player = event.getPlayer(); + MPlayer mplayer = MPlayer.get(player); + Faction faction = mplayer.getFaction(); + + // Get and filter recipients + for (Iterator it = event.getRecipients().iterator(); it.hasNext();) + { + Player recipient = it.next(); + if (predicate.test(recipient)) continue; + + it.remove(); + } + } } diff --git a/src/com/massivecraft/factions/entity/MConf.java b/src/com/massivecraft/factions/entity/MConf.java index 1ec0c2c1..0f6a2909 100644 --- a/src/com/massivecraft/factions/entity/MConf.java +++ b/src/com/massivecraft/factions/entity/MConf.java @@ -553,7 +553,15 @@ public class MConf extends Entity // Enable the WorldGuard check per-world // Specify which worlds the WorldGuard Check can be used in public WorldExceptionSet worldguardCheckWorldsEnabled = new WorldExceptionSet(); - + + // -------------------------------------------- // + // INTEGRATION: VentureChat + // -------------------------------------------- // + + public String ventureChatFactionChannelName = "faction"; + public String ventureChatAllyChannelName = "ally"; + public boolean ventureChatAllowFactionchatBetweenFactionless = false; + // -------------------------------------------- // // INTEGRATION: ECONOMY // -------------------------------------------- // diff --git a/src/com/massivecraft/factions/integration/venturechat/EngineVentureChat.java b/src/com/massivecraft/factions/integration/venturechat/EngineVentureChat.java new file mode 100644 index 00000000..1d3f139c --- /dev/null +++ b/src/com/massivecraft/factions/integration/venturechat/EngineVentureChat.java @@ -0,0 +1,74 @@ +package com.massivecraft.factions.integration.venturechat; + +import com.massivecraft.factions.engine.EngineChat; +import com.massivecraft.factions.entity.Faction; +import com.massivecraft.factions.entity.MConf; +import com.massivecraft.factions.entity.MPlayer; +import com.massivecraft.massivecore.Engine; +import kangarko.chatcontrol.ChatControl; +import mineverse.Aust1n46.chat.api.MineverseChatAPI; +import mineverse.Aust1n46.chat.api.MineverseChatPlayer; +import mineverse.Aust1n46.chat.channel.ChatChannel; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +import java.util.function.Predicate; + +public class EngineVentureChat extends Engine +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static EngineVentureChat i = new EngineVentureChat(); + public static EngineVentureChat get() { return i; } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public void setActiveInner(boolean active) + { + + } + + // -------------------------------------------- // + // LISTENER + // -------------------------------------------- // + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void filterFaction(AsyncPlayerChatEvent event) + { + // Get player + Player player = event.getPlayer(); + MineverseChatPlayer chatPlayer = MineverseChatAPI.getMineverseChatPlayer(player); + ChatChannel channel = chatPlayer.getCurrentChannel(); + String channelName = channel.getName(); + + // If the channel is the Factions channel + boolean factionChat = channelName.equalsIgnoreCase(MConf.get().ventureChatFactionChannelName); + boolean allyChat = channelName.equalsIgnoreCase(MConf.get().ventureChatAllyChannelName); + if (!(factionChat || allyChat)) return; + + MPlayer mplayer = MPlayer.get(player); + Faction faction = mplayer.getFaction(); + + // Wilderness check + if ( ! MConf.get().ventureChatAllowFactionchatBetweenFactionless && faction.isNone()) + { + mplayer.msg("Factionless can't use faction chat."); + event.setCancelled(true); + } + + Predicate predicateChannel = factionChat ? EngineChat.getPredicateIsInFaction(faction) : EngineChat.getPredicateIsAlly(faction); + Predicate isSpy = recipient -> MineverseChatAPI.getMineverseChatPlayer(recipient).isSpy(); + Predicate predicate = isSpy.or(predicateChannel); + + EngineChat.filterToPredicate(event, predicate); + ChatControl + } + +} diff --git a/src/com/massivecraft/factions/integration/venturechat/IntegrationVentureChat.java b/src/com/massivecraft/factions/integration/venturechat/IntegrationVentureChat.java new file mode 100644 index 00000000..b3da2c2f --- /dev/null +++ b/src/com/massivecraft/factions/integration/venturechat/IntegrationVentureChat.java @@ -0,0 +1,29 @@ +package com.massivecraft.factions.integration.venturechat; + +import com.massivecraft.massivecore.Engine; +import com.massivecraft.massivecore.Integration; + +public class IntegrationVentureChat extends Integration +{ + // -------------------------------------------- // + // INSTANCE & CONSTRUCT + // -------------------------------------------- // + + private static IntegrationVentureChat i = new IntegrationVentureChat(); + public static IntegrationVentureChat get() { return i; } + private IntegrationVentureChat() + { + this.setPluginName("VentureChat"); + } + + // -------------------------------------------- // + // OVERRIDE + // -------------------------------------------- // + + @Override + public Engine getEngine() + { + return EngineVentureChat.get(); + } + +}