├── .gitignore ├── .settings └── .gitignore ├── LICENSE ├── README.md ├── TODO.txt ├── lib ├── Factions.jar └── MassiveCore.jar ├── pom.xml └── src ├── main ├── java │ └── mineverse │ │ └── Aust1n46 │ │ └── chat │ │ ├── ChatMessage.java │ │ ├── ClickAction.java │ │ ├── MineverseChat.java │ │ ├── VentureChatPlaceholders.java │ │ ├── alias │ │ └── Alias.java │ │ ├── api │ │ ├── MineverseChatAPI.java │ │ ├── MineverseChatPlayer.java │ │ ├── SynchronizedMineverseChatPlayer.java │ │ └── events │ │ │ ├── ChannelJoinEvent.java │ │ │ ├── MutePlayerEvent.java │ │ │ └── VentureChatEvent.java │ │ ├── channel │ │ ├── ChatChannel.java │ │ └── ChatChannelInfo.java │ │ ├── command │ │ ├── ChannelAlias.java │ │ ├── VentureCommandExecutor.java │ │ ├── chat │ │ │ ├── Broadcast.java │ │ │ ├── BungeeToggle.java │ │ │ ├── Channel.java │ │ │ ├── Channelinfo.java │ │ │ ├── Chatinfo.java │ │ │ ├── Chatreload.java │ │ │ ├── Chlist.java │ │ │ ├── Chwho.java │ │ │ ├── Clearchat.java │ │ │ ├── Commandblock.java │ │ │ ├── Commandspy.java │ │ │ ├── Config.java │ │ │ ├── Edit.java │ │ │ ├── Filter.java │ │ │ ├── Force.java │ │ │ ├── Forceall.java │ │ │ ├── Kickchannel.java │ │ │ ├── Kickchannelall.java │ │ │ ├── Leave.java │ │ │ ├── Listen.java │ │ │ ├── Me.java │ │ │ ├── Party.java │ │ │ ├── RangedSpy.java │ │ │ ├── Removemessage.java │ │ │ ├── Setchannel.java │ │ │ ├── Setchannelall.java │ │ │ ├── VentureChatGui.java │ │ │ └── Venturechat.java │ │ ├── message │ │ │ ├── Ignore.java │ │ │ ├── Message.java │ │ │ ├── MessageToggle.java │ │ │ ├── Notifications.java │ │ │ ├── Reply.java │ │ │ └── Spy.java │ │ └── mute │ │ │ ├── Mute.java │ │ │ ├── MuteContainer.java │ │ │ ├── Muteall.java │ │ │ ├── Unmute.java │ │ │ └── Unmuteall.java │ │ ├── database │ │ ├── Database.java │ │ ├── PlayerData.java │ │ ├── ProxyPlayerData.java │ │ └── TemporaryDataInstance.java │ │ ├── gui │ │ └── GuiSlot.java │ │ ├── json │ │ ├── JsonAttribute.java │ │ └── JsonFormat.java │ │ ├── listeners │ │ ├── ChatListener.java │ │ ├── CommandListener.java │ │ ├── LoginListener.java │ │ ├── PacketListenerLegacyChat.java │ │ └── SignListener.java │ │ ├── localization │ │ ├── InternalMessage.java │ │ ├── Localization.java │ │ └── LocalizedMessage.java │ │ ├── proxy │ │ ├── VentureChatBungee.java │ │ ├── VentureChatProxy.java │ │ ├── VentureChatProxyServer.java │ │ ├── VentureChatProxySource.java │ │ └── VentureChatVelocity.java │ │ ├── utilities │ │ ├── Format.java │ │ └── UUIDFetcher.java │ │ └── versions │ │ └── VersionHandler.java └── resources │ ├── Messages.yml │ ├── bungee.yml │ ├── bungeeconfig.yml │ ├── commands.yml │ ├── config.yml │ ├── example_config_always_up_to_date!.yml │ ├── plugin.yml │ ├── velocity-plugin.json │ └── velocityconfig.yml └── test └── java └── mineverse └── Aust1n46 └── chat ├── listeners └── LoginListenerTest.java └── utilities └── FormatTest.java /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | pom.xml.tag 3 | pom.xml.releaseBackup 4 | pom.xml.versionsBackup 5 | pom.xml.next 6 | release.properties 7 | dependency-reduced-pom.xml 8 | buildNumber.properties 9 | .mvn/timing.properties 10 | # https://github.com/takari/maven-wrapper#usage-without-binary-jar 11 | .mvn/wrapper/maven-wrapper.jar 12 | 13 | # IDE 14 | .idea/ 15 | /.classpath 16 | /.project 17 | -------------------------------------------------------------------------------- /.settings/.gitignore: -------------------------------------------------------------------------------- 1 | /org.eclipse.jdt.core.prefs 2 | /org.eclipse.core.resources.prefs 3 | /org.eclipse.m2e.core.prefs 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # README # 2 | 3 | Read before making any changes or pull requests! 4 | 5 | ### What is this repository for? 6 | 7 | VentureChat Spigot plugin Repo 8 | 9 | ### How do I get set up? 10 | 11 | Full setup and dependency guide is available here on SpigotMC: https://www.spigotmc.org/resources/venturechat.771/ 12 | 13 | In short, Install `Vault` (and a compatable permission system), `ProtocolLib`, and `PlaceholderAPI` (`Player` and `Vault` extensions optional). 14 | 15 | To build, simply run `mvn`. 16 | 17 | Requires Java 8. 18 | 19 | ### Contribution guidelines 20 | 21 | * Follow the existing style conventions. I used the default Eclipse formatting styleset for the majority of the project. 22 | * Follow general Java best practices and object oriented principles. There are examples of poor practices in this existing legacy codebase, but that doesn't mean new contributions should stoop to that level. 23 | * Include JavaDoc for your contribution. Same as stated above, most of this legacy codebase isn't documented, but that doesn't mean new contributions should also be undocumented. Especially important when multiple people are working on a project. 24 | * Include unit tests for stand alone methods. I'm not expecting full coverage for complex Spigot events, etc, but for formatting or other non Spigot related code, tests would be much appreciated. 25 | 26 | ### Who do I talk to? 27 | 28 | * I'd recommend discussing any change before making it to avoid wasting your time and my time. Especially for a major change or if it's your first time contributing. I am extremely responsive on my Spigot discussion board (above link). 29 | 30 | License: 31 | 32 | Copyright (C) {2020} {Austin Brolly} 33 | 34 | ``` 35 | This program is free software: you can redistribute it and/or modify 36 | it under the terms of the GNU General Public License as published by 37 | the Free Software Foundation, either version 3 of the License, or 38 | (at your option) any later version. 39 | 40 | This program is distributed in the hope that it will be useful, 41 | but WITHOUT ANY WARRANTY; without even the implied warranty of 42 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 43 | GNU General Public License for more details. 44 | 45 | You should have received a copy of the GNU General Public License 46 | along with this program. If not, see . 47 | ``` 48 | -------------------------------------------------------------------------------- /TODO.txt: -------------------------------------------------------------------------------- 1 | Outdated###Add per color and format code permissions 2 | Done###Add separate hex color permission 3 | Done###Add easy hex format to placeholders and prefixes 4 | Done###Potentially allow color format '&#ffffff' 5 | Done###Auto remove spy and commandspy flags when permissions are removed 6 | 7 | Done###Add PlaceholderAPI placeholders to /message 8 | Done###Make spying not show your own messages 9 | Done###Add tab completion across bungee 10 | 11 | Done###Commit towny changes 12 | Done###Add permission check for ranged spy 13 | 14 | Done###Overhaul player data system 15 | Done###Use more efficient data structures 16 | 17 | Done###Check error on player leaving mcp = null??? 18 | 19 | Done###Check null player data on reload config. Create new MCP data profile if MCP == null because of failed load attempt of player data file. 20 | 21 | Done###Fix and update timed muting system 22 | Done###Overhaul timed mute system 23 | Done###Add reason message to mute 24 | Done###Add tab completion for channels to mute command 25 | Done###Overhaul muting over bungee 26 | 27 | Done###Fix sync delay issue. Buffer the call or something else. 28 | 29 | Done###Look into change username not working with nickname 30 | 31 | Done###Update usage of Spigot.broadcastToServer (doesn't support URL's) 32 | 33 | Done###Add configurable message chime/sound. 34 | 35 | Done###Add override permission for commandspy. 36 | Done###Add override permission for spy over Bungee. 37 | 38 | Done###Fix SSL certificate warnings in MySQL database. 39 | 40 | Done###Add multiple color code support to GUI icon 41 | Done###Add hex color support to message remover configuration 42 | 43 | Done###Fix /chatreload 44 | 45 | Done###Add check for missing default channel 46 | Done###Add custom JSON hovers to any placeholder 47 | 48 | Done###Expand placeholder matching regex in convertToJson method 49 | 50 | 51 | 52 | OnHold###Add partial name/nickname compatibility for private messaging 53 | Add JSON to private messaging 54 | Add toggle support for bungee messaging 55 | Add configuration for /reply to be either last player who sent you a message or last player you messaged 56 | Add configuration for spying on private conversation join/leave 57 | Possible???Make player name matching not case sensitive for private messaging 58 | Add vanish support for BungeeCord private messaging. 59 | Add partial name recognition for messaging 60 | 61 | Add chime on name mention in chat 62 | 63 | Add localization for /setnickname command 64 | Add localization for /channelinfo command 65 | 66 | Look into SQL database losing connection 67 | 68 | Update out dated party system 69 | 70 | Send message to channel from console 71 | 72 | Add config option to disable chat logging in the console 73 | 74 | Make filters not case insensitive 75 | Update filter system 76 | Add option to disable filters without having to remove them all 77 | 78 | Add GUI for /channel to join channels 79 | Add configurable channel icon block/item 80 | 81 | Add flag for "always_joined" channel 82 | Rework flag "autojoin" to only join on player's first ever login to the server 83 | 84 | Make message remover work with Spigot API Chat 85 | 86 | Add spy command for Towny and Factions channels 87 | Add alliance channel for Towny 88 | 89 | Add support for Velocity proxy 90 | 91 | Add hover for channels to show who is received it. 92 | 93 | Command blacklist for commandspy 94 | 95 | Enhanced antispam/anticaps 96 | 97 | Make moderation GUI button work on messages from Bungee from players that have never played on receiving server 98 | 99 | Make message remover admin hover not show GUI icon 100 | Add message remover support back to 1.7 101 | 102 | Add list to disable commands in the config. 103 | 104 | Add toggle for moderation gui 105 | 106 | Add cost to chat in a channel through Vault? 107 | 108 | Add clans channel from SimpleClans 109 | 110 | Look into changing Bukkit chat event to not be cancelled. 111 | 112 | Expand on EssentialsDiscord integration to allow for custom MessageTypes for each channel 113 | -------------------------------------------------------------------------------- /lib/Factions.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aust1n46/VentureChat/d964918a7b5a4777f1ab406ec333cdff02965f53/lib/Factions.jar -------------------------------------------------------------------------------- /lib/MassiveCore.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aust1n46/VentureChat/d964918a7b5a4777f1ab406ec333cdff02965f53/lib/MassiveCore.jar -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/ChatMessage.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat; 2 | 3 | import com.comphenix.protocol.wrappers.WrappedChatComponent; 4 | 5 | //This class is used to create ChatMessage objects, which are used to store information about previous text components 6 | //that were sent to the player. This is a main component in making the message remover work. 7 | public class ChatMessage { 8 | private WrappedChatComponent component; 9 | private String message; 10 | private String coloredMessage; 11 | private int hash; 12 | 13 | public ChatMessage(WrappedChatComponent component, String message, String coloredMessage, int hash) { 14 | this.component = component; 15 | this.message = message; 16 | this.coloredMessage = coloredMessage; 17 | this.hash = hash; 18 | } 19 | 20 | public WrappedChatComponent getComponent() { 21 | return this.component; 22 | } 23 | 24 | public void setComponent(WrappedChatComponent component) { 25 | this.component = component; 26 | } 27 | 28 | public String getMessage() { 29 | return this.message; 30 | } 31 | 32 | public String getColoredMessage() { 33 | return this.coloredMessage; 34 | } 35 | 36 | public int getHash() { 37 | return this.hash; 38 | } 39 | 40 | public void setHash(int hash) { 41 | this.hash = hash; 42 | } 43 | } -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/ClickAction.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat; 2 | 3 | public enum ClickAction { 4 | SUGGEST_COMMAND, RUN_COMMAND, OPEN_URL, NONE; 5 | 6 | private final String jsonValue; 7 | 8 | ClickAction() { 9 | jsonValue = name().toLowerCase(); 10 | } 11 | 12 | @Override 13 | public String toString() { 14 | return jsonValue; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/VentureChatPlaceholders.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | import me.clip.placeholderapi.PlaceholderAPIPlugin; 6 | import me.clip.placeholderapi.expansion.PlaceholderExpansion; 7 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 8 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 9 | import mineverse.Aust1n46.chat.channel.ChatChannel; 10 | 11 | public class VentureChatPlaceholders extends PlaceholderExpansion { 12 | @Override 13 | public String onPlaceholderRequest(Player p, String identifier) { 14 | if (p == null) { 15 | return null; 16 | } 17 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer(p); 18 | if (mcp == null) { 19 | return ""; 20 | } 21 | if (identifier.equalsIgnoreCase("nickname")) { 22 | return mcp.hasNickname() ? mcp.getNickname() : mcp.getName(); 23 | } 24 | if (identifier.equalsIgnoreCase("something_else_you_think_of")) { 25 | return "value for that identifier *"; 26 | } 27 | if (identifier.startsWith("channel_")) { 28 | ChatChannel currentChannel = mcp.isQuickChat() ? mcp.getQuickChannel() : mcp.getCurrentChannel(); 29 | if (currentChannel == null) { 30 | return ""; 31 | } 32 | switch (identifier) { 33 | case "channel_name": 34 | return currentChannel.getName(); 35 | case "channel_alias": 36 | return currentChannel.getAlias(); 37 | case "channel_color": 38 | return currentChannel.getColor(); 39 | case "channel_chatcolor": 40 | return currentChannel.getChatColor(); 41 | case "channel_is_bungee": 42 | return currentChannel.getBungee() ? PlaceholderAPIPlugin.booleanTrue() : PlaceholderAPIPlugin.booleanFalse(); 43 | case "channel_cooldown": 44 | return currentChannel.getCooldown() + ""; 45 | case "channel_distance": 46 | return currentChannel.getDistance() + ""; 47 | case "channel_prefix": 48 | return currentChannel.getPrefix(); 49 | } 50 | } 51 | return null; 52 | } 53 | 54 | @Override 55 | public boolean persist() { 56 | return true; 57 | } 58 | 59 | @Override 60 | public boolean canRegister() { 61 | return true; 62 | } 63 | 64 | @Override 65 | public String getAuthor() { 66 | return "Aust1n46"; 67 | } 68 | 69 | @Override 70 | public String getIdentifier() { 71 | return "venturechat"; 72 | } 73 | 74 | @Override 75 | public String getVersion() { 76 | return MineverseChat.getInstance().getDescription().getVersion(); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/alias/Alias.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.alias; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.bukkit.configuration.ConfigurationSection; 7 | 8 | import mineverse.Aust1n46.chat.MineverseChat; 9 | 10 | public class Alias { 11 | private static MineverseChat plugin = MineverseChat.getInstance(); 12 | private static List aliases; 13 | 14 | private String name; 15 | private int arguments; 16 | private List components; 17 | private String permission; 18 | 19 | public Alias(String name, int arguments, List components, String permission) { 20 | this.name = name; 21 | this.arguments = arguments; 22 | this.components = components; 23 | this.permission = "venturechat." + permission; 24 | } 25 | 26 | public static void initialize() { 27 | aliases = new ArrayList(); 28 | ConfigurationSection cs = plugin.getConfig().getConfigurationSection("alias"); 29 | for (String key : cs.getKeys(false)) { 30 | String name = key; 31 | int arguments = cs.getInt(key + ".arguments", 0); 32 | List components = cs.getStringList(key + ".components"); 33 | String permissions = cs.getString(key + ".permissions", "None"); 34 | aliases.add(new Alias(name, arguments, components, permissions)); 35 | } 36 | } 37 | 38 | public static List getAliases() { 39 | return aliases; 40 | } 41 | 42 | public String getName() { 43 | return name; 44 | } 45 | 46 | public int getArguments() { 47 | return arguments; 48 | } 49 | 50 | public List getComponents() { 51 | return components; 52 | } 53 | 54 | public String getPermission() { 55 | return permission; 56 | } 57 | 58 | public boolean hasPermission() { 59 | return !permission.equalsIgnoreCase("venturechat.none"); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/api/MineverseChatAPI.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.api; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collection; 5 | import java.util.HashMap; 6 | import java.util.List; 7 | import java.util.UUID; 8 | 9 | import org.bukkit.entity.Player; 10 | 11 | import mineverse.Aust1n46.chat.MineverseChat; 12 | 13 | /** 14 | * API class for looking up wrapped {@link MineverseChatPlayer} objects from 15 | * {@link Player}, {@link UUID}, or {@link String} user names. 16 | * 17 | * @author Aust1n46 18 | */ 19 | public final class MineverseChatAPI { 20 | private static HashMap playerMap = new HashMap(); 21 | private static HashMap namesMap = new HashMap(); 22 | private static HashMap onlinePlayerMap = new HashMap(); 23 | private static List networkPlayerNames = new ArrayList(); 24 | 25 | private static HashMap proxyPlayerMap = new HashMap(); 26 | 27 | public static List getNetworkPlayerNames() { 28 | return networkPlayerNames; 29 | } 30 | 31 | public static void clearNetworkPlayerNames() { 32 | networkPlayerNames.clear(); 33 | } 34 | 35 | public static void addNetworkPlayerName(String name) { 36 | networkPlayerNames.add(name); 37 | } 38 | 39 | public static void addSynchronizedMineverseChatPlayerToMap(SynchronizedMineverseChatPlayer smcp) { 40 | proxyPlayerMap.put(smcp.getUUID(), smcp); 41 | } 42 | 43 | // @Deprecated 44 | // public static void clearBungeePlayerMap() { 45 | // clearProxyPlayerMap(); 46 | // } 47 | 48 | public static void clearProxyPlayerMap() { 49 | proxyPlayerMap.clear(); 50 | } 51 | 52 | public static Collection getSynchronizedMineverseChatPlayers() { 53 | return proxyPlayerMap.values(); 54 | } 55 | 56 | public static void addNameToMap(MineverseChatPlayer mcp) { 57 | namesMap.put(mcp.getName(), mcp.getUUID()); 58 | } 59 | 60 | public static void removeNameFromMap(String name) { 61 | namesMap.remove(name); 62 | } 63 | 64 | public static void clearNameMap() { 65 | namesMap.clear(); 66 | } 67 | 68 | @SuppressWarnings("deprecation") 69 | public static void addMineverseChatPlayerToMap(MineverseChatPlayer mcp) { 70 | playerMap.put(mcp.getUUID(), mcp); 71 | MineverseChat.players.add(mcp); 72 | } 73 | 74 | @SuppressWarnings("deprecation") 75 | public static void clearMineverseChatPlayerMap() { 76 | playerMap.clear(); 77 | MineverseChat.players.clear(); 78 | } 79 | 80 | public static Collection getMineverseChatPlayers() { 81 | return playerMap.values(); 82 | } 83 | 84 | @SuppressWarnings("deprecation") 85 | public static void addMineverseChatOnlinePlayerToMap(MineverseChatPlayer mcp) { 86 | onlinePlayerMap.put(mcp.getUUID(), mcp); 87 | MineverseChat.onlinePlayers.add(mcp); 88 | } 89 | 90 | @SuppressWarnings("deprecation") 91 | public static void removeMineverseChatOnlinePlayerToMap(MineverseChatPlayer mcp) { 92 | onlinePlayerMap.remove(mcp.getUUID()); 93 | MineverseChat.onlinePlayers.remove(mcp); 94 | } 95 | 96 | @SuppressWarnings("deprecation") 97 | public static void clearOnlineMineverseChatPlayerMap() { 98 | onlinePlayerMap.clear(); 99 | MineverseChat.onlinePlayers.clear(); 100 | } 101 | 102 | public static Collection getOnlineMineverseChatPlayers() { 103 | return onlinePlayerMap.values(); 104 | } 105 | 106 | /** 107 | * Get a MineverseChatPlayer wrapper from a Bukkit Player instance. 108 | * 109 | * @param player {@link Player} object. 110 | * @return {@link MineverseChatPlayer} 111 | */ 112 | public static MineverseChatPlayer getMineverseChatPlayer(Player player) { 113 | return getMineverseChatPlayer(player.getUniqueId()); 114 | } 115 | 116 | /** 117 | * Get a MineverseChatPlayer wrapper from a UUID. 118 | * 119 | * @param uuid {@link UUID}. 120 | * @return {@link MineverseChatPlayer} 121 | */ 122 | public static MineverseChatPlayer getMineverseChatPlayer(UUID uuid) { 123 | return playerMap.get(uuid); 124 | } 125 | 126 | /** 127 | * Get a MineverseChatPlayer wrapper from a user name. 128 | * 129 | * @param name {@link String}. 130 | * @return {@link MineverseChatPlayer} 131 | */ 132 | public static MineverseChatPlayer getMineverseChatPlayer(String name) { 133 | return getMineverseChatPlayer(namesMap.get(name)); 134 | } 135 | 136 | /** 137 | * Get a MineverseChatPlayer wrapper from a Bukkit Player instance. Only checks 138 | * current online players. Much more efficient! 139 | * 140 | * @param player {@link Player} object. 141 | * @return {@link MineverseChatPlayer} 142 | */ 143 | public static MineverseChatPlayer getOnlineMineverseChatPlayer(Player player) { 144 | return getOnlineMineverseChatPlayer(player.getUniqueId()); 145 | } 146 | 147 | /** 148 | * Get a MineverseChatPlayer wrapper from a UUID. Only checks current online 149 | * players. Much more efficient! 150 | * 151 | * @param uuid {@link UUID}. 152 | * @return {@link MineverseChatPlayer} 153 | */ 154 | public static MineverseChatPlayer getOnlineMineverseChatPlayer(UUID uuid) { 155 | return onlinePlayerMap.get(uuid); 156 | } 157 | 158 | /** 159 | * Get a MineverseChatPlayer wrapper from a user name. Only checks current 160 | * online players. Much more efficient! 161 | * 162 | * @param name {@link String}. 163 | * @return {@link MineverseChatPlayer} 164 | */ 165 | public static MineverseChatPlayer getOnlineMineverseChatPlayer(String name) { 166 | return getOnlineMineverseChatPlayer(namesMap.get(name)); 167 | } 168 | 169 | /** 170 | * Get a SynchronizedMineverseChatPlayer from a UUID. 171 | * 172 | * @param uuid {@link UUID} 173 | * @return {@link SynchronizedMineverseChatPlayer} 174 | */ 175 | public static SynchronizedMineverseChatPlayer getSynchronizedMineverseChatPlayer(UUID uuid) { 176 | return proxyPlayerMap.get(uuid); 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/api/SynchronizedMineverseChatPlayer.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.api; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collection; 5 | import java.util.HashMap; 6 | import java.util.HashSet; 7 | import java.util.List; 8 | import java.util.Set; 9 | import java.util.UUID; 10 | 11 | import mineverse.Aust1n46.chat.command.mute.MuteContainer; 12 | 13 | public class SynchronizedMineverseChatPlayer { 14 | private UUID uuid; 15 | private Set listening; 16 | private HashMap mutes; 17 | private Set ignores; 18 | private int messagePackets; 19 | private List messageData = new ArrayList(); 20 | private boolean spy; 21 | private boolean messageToggle; 22 | 23 | public SynchronizedMineverseChatPlayer(UUID uuid, Set listening, HashMap mutes, Set ignores, boolean spy, boolean messageToggle) { 24 | this.uuid = uuid; 25 | this.listening = listening; 26 | this.mutes = mutes; 27 | this.ignores = ignores; 28 | this.spy = spy; 29 | this.messageToggle = messageToggle; 30 | } 31 | 32 | public SynchronizedMineverseChatPlayer(UUID uuid) { 33 | this.uuid = uuid; 34 | listening = new HashSet(); 35 | mutes = new HashMap(); 36 | ignores = new HashSet(); 37 | spy = false; 38 | messageToggle = true; 39 | } 40 | 41 | public List getMessageData() { 42 | return this.messageData; 43 | } 44 | 45 | public void addData(String s) { 46 | this.messageData.add(s); 47 | } 48 | 49 | public void clearMessageData() { 50 | this.messageData.clear(); 51 | } 52 | 53 | public int getMessagePackets() { 54 | return this.messagePackets; 55 | } 56 | 57 | public void incrementMessagePackets() { 58 | this.messagePackets++; 59 | } 60 | 61 | public void clearMessagePackets() { 62 | this.messagePackets = 0; 63 | } 64 | 65 | public void addIgnore(SynchronizedMineverseChatPlayer smcp) { 66 | this.ignores.add(smcp.getUUID()); 67 | } 68 | 69 | public void removeIgnore(SynchronizedMineverseChatPlayer smcp) { 70 | this.ignores.remove(smcp.getUUID()); 71 | } 72 | 73 | public Set getIgnores() { 74 | return this.ignores; 75 | } 76 | 77 | public void addMute(String channel, long time, String reason) { 78 | mutes.put(channel, new MuteContainer(channel, time, reason)); 79 | } 80 | 81 | public void clearMutes() { 82 | this.mutes.clear(); 83 | } 84 | 85 | public Collection getMutes() { 86 | return this.mutes.values(); 87 | } 88 | 89 | public void addListening(String channel) { 90 | this.listening.add(channel); 91 | } 92 | 93 | public void removeListening(String channel) { 94 | this.listening.remove(channel); 95 | } 96 | 97 | public Set getListening() { 98 | return this.listening; 99 | } 100 | 101 | public UUID getUUID() { 102 | return this.uuid; 103 | } 104 | 105 | public boolean isSpy() { 106 | return this.spy; 107 | } 108 | 109 | public void setSpy(boolean spy) { 110 | this.spy = spy; 111 | } 112 | 113 | public boolean getMessageToggle() { 114 | return this.messageToggle; 115 | } 116 | 117 | public void setMessageToggle(boolean messageToggle) { 118 | this.messageToggle = messageToggle; 119 | } 120 | } -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/api/events/ChannelJoinEvent.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.api.events; 2 | 3 | import mineverse.Aust1n46.chat.channel.ChatChannel; 4 | 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.event.Cancellable; 7 | import org.bukkit.event.Event; 8 | import org.bukkit.event.HandlerList; 9 | 10 | /** 11 | * Event called when a player attempts to join a valid channel 12 | */ 13 | public class ChannelJoinEvent extends Event implements Cancellable { 14 | private static final HandlerList handlers = new HandlerList(); 15 | private boolean cancelled; 16 | private Player player; 17 | private ChatChannel channel; 18 | private String message; 19 | 20 | public ChannelJoinEvent(Player player, ChatChannel channel, String message) { 21 | this.player = player; 22 | this.channel = channel; 23 | this.message = message; 24 | this.cancelled = false; 25 | } 26 | 27 | @Override 28 | public HandlerList getHandlers() { 29 | return handlers; 30 | } 31 | 32 | public static HandlerList getHandlerList() { 33 | return handlers; 34 | } 35 | 36 | @Override 37 | public boolean isCancelled() { 38 | return this.cancelled; 39 | } 40 | 41 | @Override 42 | public void setCancelled(boolean cancel) { 43 | this.cancelled = cancel; 44 | } 45 | 46 | public Player getPlayer() { 47 | return this.player; 48 | } 49 | 50 | public void setChannel(ChatChannel channel) { 51 | this.channel = channel; 52 | } 53 | 54 | public ChatChannel getChannel() { 55 | return this.channel; 56 | } 57 | 58 | public String getMessage() { 59 | return this.message; 60 | } 61 | 62 | public void setMessage(String message) { 63 | this.message = message; 64 | } 65 | } -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/api/events/MutePlayerEvent.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.api.events; 2 | 3 | import mineverse.Aust1n46.chat.channel.ChatChannel; 4 | 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.event.Cancellable; 7 | import org.bukkit.event.Event; 8 | import org.bukkit.event.HandlerList; 9 | 10 | //This class is a custom event that is part of the plugins API. It is called when a player executes the mute command. 11 | public class MutePlayerEvent extends Event implements Cancellable { //unimplemented 12 | private static final HandlerList handlers = new HandlerList(); 13 | private boolean cancelled; 14 | private Player player; 15 | private ChatChannel channel; 16 | private int time; 17 | 18 | public MutePlayerEvent(Player player, ChatChannel channel, int time) { 19 | this.player = player; 20 | this.channel = channel; 21 | this.time = time; 22 | this.cancelled = false; 23 | } 24 | 25 | @Override 26 | public HandlerList getHandlers() { 27 | return handlers; 28 | } 29 | 30 | public static HandlerList getHandlerList() { 31 | return handlers; 32 | } 33 | 34 | @Override 35 | public boolean isCancelled() { 36 | return this.cancelled; 37 | } 38 | 39 | @Override 40 | public void setCancelled(boolean cancel) { 41 | this.cancelled = cancel; 42 | } 43 | 44 | public Player getPlayer() { 45 | return this.player; 46 | } 47 | 48 | public void setChannel(ChatChannel channel) { 49 | this.channel = channel; 50 | } 51 | 52 | public ChatChannel getChannel() { 53 | return this.channel; 54 | } 55 | 56 | public int getTime() { 57 | return this.time; 58 | } 59 | 60 | public void setTime(int time) { 61 | this.time = time; 62 | } 63 | } -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/api/events/VentureChatEvent.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.api.events; 2 | 3 | import java.util.Set; 4 | 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.event.Event; 7 | import org.bukkit.event.HandlerList; 8 | 9 | import mineverse.Aust1n46.chat.MineverseChat; 10 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 11 | import mineverse.Aust1n46.chat.channel.ChatChannel; 12 | 13 | /** 14 | * Event called when a message has been sent to a channel. 15 | * This event can not be cancelled. 16 | * 17 | * @author Aust1n46 18 | */ 19 | public class VentureChatEvent extends Event { 20 | private static final HandlerList handlers = new HandlerList(); 21 | private final MineverseChatPlayer mcp; 22 | private final String username; 23 | private final String nickname; 24 | private final String playerPrimaryGroup; 25 | private final ChatChannel channel; 26 | private final Set recipients; 27 | private final int recipientCount; //For not counting vanished players 28 | private final String format; 29 | private final String chat; 30 | private final String globalJSON; 31 | private final int hash; 32 | private final boolean bungee; 33 | 34 | public VentureChatEvent(MineverseChatPlayer mcp, String username, String nickname, String playerPrimaryGroup, ChatChannel channel, Set recipients, int recipientCount, String format, String chat, String globalJSON, int hash, boolean bungee) { 35 | super(MineverseChat.ASYNC); 36 | this.mcp = mcp; 37 | this.username = username; 38 | this.nickname = nickname; 39 | this.playerPrimaryGroup = playerPrimaryGroup; 40 | this.channel = channel; 41 | this.recipients = recipients; 42 | this.recipientCount = recipientCount; 43 | this.format = format; 44 | this.chat = chat; 45 | this.globalJSON = globalJSON; 46 | this.hash = hash; 47 | this.bungee = bungee; 48 | } 49 | 50 | public MineverseChatPlayer getMineverseChatPlayer() { 51 | return this.mcp; 52 | } 53 | 54 | public String getUsername() { 55 | return this.username; 56 | } 57 | 58 | public String getNickname() { 59 | return this.nickname; 60 | } 61 | 62 | public String getPlayerPrimaryGroup() { 63 | return this.playerPrimaryGroup; 64 | } 65 | 66 | public ChatChannel getChannel() { 67 | return this.channel; 68 | } 69 | 70 | public Set getRecipients() { 71 | return this.recipients; 72 | } 73 | 74 | //Could be lower than the total number of recipients because vanished players are not counted 75 | public int getRecipientCount() { 76 | return this.recipientCount; 77 | } 78 | 79 | public String getFormat() { 80 | return this.format; 81 | } 82 | 83 | public String getChat() { 84 | return this.chat; 85 | } 86 | 87 | public String getConsoleChat() { 88 | return this.format + this.chat; 89 | } 90 | 91 | public String getGlobalJSON() { 92 | return this.globalJSON; 93 | } 94 | 95 | public int getHash() { 96 | return this.hash; 97 | } 98 | 99 | public boolean isBungee() { 100 | return this.bungee; 101 | } 102 | 103 | @Override 104 | public HandlerList getHandlers() { 105 | return handlers; 106 | } 107 | 108 | public static HandlerList getHandlerList() { 109 | return handlers; 110 | } 111 | } -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/channel/ChatChannelInfo.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.channel; 2 | 3 | import mineverse.Aust1n46.chat.utilities.Format; 4 | 5 | public class ChatChannelInfo { 6 | // DiscordSRV backwards compatibility 7 | @Deprecated 8 | public String FilterChat(String msg) { 9 | return Format.FilterChat(msg); 10 | } 11 | 12 | // DiscordSRV backwards compatibility 13 | @Deprecated 14 | public ChatChannel getChannelInfo(String channel) { 15 | return ChatChannel.getChannel(channel); 16 | } 17 | } -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/ChannelAlias.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command; 2 | 3 | import org.bukkit.command.Command; 4 | import org.bukkit.command.CommandSender; 5 | import org.bukkit.entity.Player; 6 | 7 | import mineverse.Aust1n46.chat.MineverseChat; 8 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 9 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 10 | import mineverse.Aust1n46.chat.channel.ChatChannel; 11 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 12 | 13 | public class ChannelAlias extends Command { 14 | private MineverseChat plugin = MineverseChat.getInstance(); 15 | 16 | public ChannelAlias() { 17 | super("channelalias"); 18 | } 19 | 20 | @Override 21 | public boolean execute(final CommandSender sender, final String commandLabel, final String[] args) { 22 | if (!(sender instanceof Player)) { 23 | plugin.getServer().getConsoleSender().sendMessage(LocalizedMessage.COMMAND_MUST_BE_RUN_BY_PLAYER.toString()); 24 | return true; 25 | } 26 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); 27 | for (ChatChannel channel : ChatChannel.getChatChannels()) { 28 | if (commandLabel.toLowerCase().equals(channel.getAlias())) { 29 | if (args.length == 0) { 30 | mcp.getPlayer() 31 | .sendMessage(LocalizedMessage.SET_CHANNEL.toString().replace("{channel_color}", channel.getColor() + "").replace("{channel_name}", channel.getName())); 32 | if (mcp.hasConversation()) { 33 | for (MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { 34 | if (p.isSpy()) { 35 | p.getPlayer().sendMessage(LocalizedMessage.EXIT_PRIVATE_CONVERSATION_SPY.toString().replace("{player_sender}", mcp.getName()) 36 | .replace("{player_receiver}", MineverseChatAPI.getMineverseChatPlayer(mcp.getConversation()).getName())); 37 | } 38 | } 39 | mcp.getPlayer().sendMessage(LocalizedMessage.EXIT_PRIVATE_CONVERSATION.toString().replace("{player_receiver}", 40 | MineverseChatAPI.getMineverseChatPlayer(mcp.getConversation()).getName())); 41 | mcp.setConversation(null); 42 | } 43 | mcp.addListening(channel.getName()); 44 | mcp.setCurrentChannel(channel); 45 | if (channel.getBungee()) { 46 | MineverseChat.synchronize(mcp, true); 47 | } 48 | return true; 49 | } else { 50 | mcp.setQuickChat(true); 51 | mcp.setQuickChannel(channel); 52 | mcp.addListening(channel.getName()); 53 | if (channel.getBungee()) { 54 | MineverseChat.synchronize(mcp, true); 55 | } 56 | String msg = ""; 57 | for (int x = 0; x < args.length; x++) { 58 | if (args[x].length() > 0) 59 | msg += " " + args[x]; 60 | } 61 | mcp.getPlayer().chat(msg); 62 | return true; 63 | } 64 | } 65 | } 66 | return true; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Broadcast.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.ChatColor; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandSender; 6 | import org.bukkit.configuration.ConfigurationSection; 7 | 8 | import mineverse.Aust1n46.chat.MineverseChat; 9 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 10 | import mineverse.Aust1n46.chat.utilities.Format; 11 | 12 | public class Broadcast extends Command { 13 | private MineverseChat plugin = MineverseChat.getInstance(); 14 | 15 | public Broadcast() { 16 | super("broadcast"); 17 | } 18 | 19 | @Override 20 | public boolean execute(CommandSender sender, String command, String[] args) { 21 | ConfigurationSection bs = plugin.getConfig().getConfigurationSection("broadcast"); 22 | String broadcastColor = bs.getString("color", "white"); 23 | String broadcastPermissions = bs.getString("permissions", "None"); 24 | String broadcastDisplayTag = Format.FormatStringAll(bs.getString("displaytag", "[Broadcast]")); 25 | if (broadcastPermissions.equalsIgnoreCase("None") || sender.hasPermission(broadcastPermissions)) { 26 | if (args.length > 0) { 27 | String bc = ""; 28 | for (int x = 0; x < args.length; x++) { 29 | if (args[x].length() > 0) 30 | bc += args[x] + " "; 31 | } 32 | bc = Format.FormatStringAll(bc); 33 | Format.broadcastToServer(broadcastDisplayTag + ChatColor.valueOf(broadcastColor.toUpperCase()) + " " + bc); 34 | return true; 35 | } else { 36 | sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/broadcast").replace("{args}", "[msg]")); 37 | return true; 38 | } 39 | } else { 40 | sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 41 | return true; 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/BungeeToggle.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandSender; 6 | import org.bukkit.entity.Player; 7 | 8 | import mineverse.Aust1n46.chat.MineverseChat; 9 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 10 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 11 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 12 | 13 | public class BungeeToggle extends Command { 14 | public BungeeToggle() { 15 | super("bungeetoggle"); 16 | } 17 | 18 | @Override 19 | public boolean execute(CommandSender sender, String command, String[] args) { 20 | if (!(sender instanceof Player)) { 21 | Bukkit.getServer().getConsoleSender().sendMessage(LocalizedMessage.COMMAND_MUST_BE_RUN_BY_PLAYER.toString()); 22 | return true; 23 | } 24 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); 25 | if (mcp.getPlayer().hasPermission("venturechat.bungeetoggle")) { 26 | if (!mcp.getBungeeToggle()) { 27 | mcp.setBungeeToggle(true); 28 | mcp.getPlayer().sendMessage(LocalizedMessage.BUNGEE_TOGGLE_ON.toString()); 29 | MineverseChat.synchronize(mcp, true); 30 | return true; 31 | } 32 | mcp.setBungeeToggle(false); 33 | mcp.getPlayer().sendMessage(LocalizedMessage.BUNGEE_TOGGLE_OFF.toString()); 34 | MineverseChat.synchronize(mcp, true); 35 | return true; 36 | } 37 | mcp.getPlayer().sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 38 | return true; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Channel.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandSender; 6 | import org.bukkit.entity.Player; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.EventPriority; 9 | import org.bukkit.event.Listener; 10 | 11 | import mineverse.Aust1n46.chat.MineverseChat; 12 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 13 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 14 | import mineverse.Aust1n46.chat.api.events.ChannelJoinEvent; 15 | import mineverse.Aust1n46.chat.channel.ChatChannel; 16 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 17 | 18 | public class Channel extends Command implements Listener { 19 | public Channel() { 20 | super("channel"); 21 | } 22 | 23 | @Override 24 | public boolean execute(CommandSender sender, String command, String[] args) { 25 | if (!(sender instanceof Player)) { 26 | Bukkit.getServer().getConsoleSender().sendMessage(LocalizedMessage.COMMAND_MUST_BE_RUN_BY_PLAYER.toString()); 27 | return true; 28 | } 29 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); 30 | if (args.length > 0) { 31 | if (!ChatChannel.isChannel(args[0])) { 32 | mcp.getPlayer().sendMessage(LocalizedMessage.INVALID_CHANNEL.toString().replace("{args}", args[0])); 33 | return true; 34 | } 35 | ChatChannel channel = ChatChannel.getChannel(args[0]); 36 | Bukkit.getServer().getPluginManager().callEvent(new ChannelJoinEvent(mcp.getPlayer(), channel, 37 | LocalizedMessage.SET_CHANNEL.toString().replace("{channel_color}", channel.getColor() + "").replace("{channel_name}", channel.getName()))); 38 | return true; 39 | } 40 | mcp.getPlayer().sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/channel").replace("{args}", "[channel]")); 41 | return true; 42 | } 43 | 44 | @EventHandler(priority = EventPriority.MONITOR) 45 | public void onChannelJoin(ChannelJoinEvent event) { 46 | if (event.isCancelled()) 47 | return; 48 | ChatChannel channel = event.getChannel(); 49 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer(event.getPlayer()); 50 | if (channel.hasPermission()) { 51 | if (!mcp.getPlayer().hasPermission(channel.getPermission())) { 52 | mcp.removeListening(channel.getName()); 53 | mcp.getPlayer().sendMessage(LocalizedMessage.CHANNEL_NO_PERMISSION.toString()); 54 | return; 55 | } 56 | } 57 | if (mcp.hasConversation()) { 58 | for (MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { 59 | if (p.isSpy()) { 60 | p.getPlayer().sendMessage(LocalizedMessage.EXIT_PRIVATE_CONVERSATION_SPY.toString().replace("{player_sender}", mcp.getName()).replace("{player_receiver}", 61 | MineverseChatAPI.getMineverseChatPlayer(mcp.getConversation()).getName())); 62 | } 63 | } 64 | mcp.getPlayer().sendMessage( 65 | LocalizedMessage.EXIT_PRIVATE_CONVERSATION.toString().replace("{player_receiver}", MineverseChatAPI.getMineverseChatPlayer(mcp.getConversation()).getName())); 66 | mcp.setConversation(null); 67 | } 68 | mcp.addListening(channel.getName()); 69 | mcp.setCurrentChannel(channel); 70 | mcp.getPlayer().sendMessage(event.getMessage()); 71 | if (channel.getBungee()) { 72 | MineverseChat.synchronize(mcp, true); 73 | } 74 | return; 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Channelinfo.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.ChatColor; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandSender; 6 | 7 | import mineverse.Aust1n46.chat.channel.ChatChannel; 8 | import mineverse.Aust1n46.chat.utilities.Format; 9 | 10 | public class Channelinfo extends Command { 11 | public Channelinfo() { 12 | super("channelinfo"); 13 | } 14 | 15 | @Override 16 | public boolean execute(CommandSender sender, String command, String[] args) { 17 | if (sender.hasPermission("venturechat.channelinfo")) { 18 | if (args.length < 1) { 19 | sender.sendMessage(ChatColor.RED + "Invalid command: /channelinfo [channel]"); 20 | return true; 21 | } 22 | ChatChannel chname = ChatChannel.getChannel(args[0]); 23 | if (chname == null) { 24 | sender.sendMessage(ChatColor.RED + "Invalid channel: " + args[0]); 25 | return true; 26 | } 27 | if (chname.hasPermission()) { 28 | if (!sender.hasPermission(chname.getPermission())) { 29 | sender.sendMessage(ChatColor.RED + "You do not have permission to look at this channel."); 30 | return true; 31 | } 32 | } 33 | sender.sendMessage(ChatColor.GOLD + "Channel: " + chname.getColor() + chname.getName()); 34 | sender.sendMessage(ChatColor.GOLD + "Alias: " + chname.getColor() + chname.getAlias()); 35 | sender.sendMessage(ChatColor.GOLD + "Color: " + chname.getColor() + chname.getColorRaw()); 36 | sender.sendMessage(ChatColor.GOLD + "ChatColor: " + (chname.getChatColor().equalsIgnoreCase("None") ? Format.DEFAULT_COLOR_CODE : chname.getChatColor()) 37 | + chname.getChatColorRaw()); 38 | if (chname.hasPermission()) { 39 | sender.sendMessage(ChatColor.GOLD + "Permission: " + chname.getColor() + chname.getPermission()); 40 | } else { 41 | sender.sendMessage(ChatColor.GOLD + "Permission: " + chname.getColor() + "None"); 42 | } 43 | if (chname.hasSpeakPermission()) { 44 | sender.sendMessage(ChatColor.GOLD + "Speak Permission: " + chname.getColor() + chname.getSpeakPermission()); 45 | } else { 46 | sender.sendMessage(ChatColor.GOLD + "Speak Permission: " + chname.getColor() + "None"); 47 | } 48 | sender.sendMessage(ChatColor.GOLD + "Autojoin: " + chname.getColor() + chname.getAutojoin()); 49 | sender.sendMessage(ChatColor.GOLD + "Default: " + chname.getColor() + chname.hasDistance()); 50 | if (!chname.hasDistance() || chname.getBungee()) { 51 | sender.sendMessage(ChatColor.GOLD + "Distance: " + ChatColor.RED + "N/A"); 52 | } else { 53 | sender.sendMessage(ChatColor.GOLD + "Distance: " + chname.getColor() + chname.getDistance()); 54 | } 55 | if (!chname.hasCooldown()) { 56 | sender.sendMessage(ChatColor.GOLD + "Cooldown: " + ChatColor.RED + "N/A"); 57 | } else { 58 | sender.sendMessage(ChatColor.GOLD + "Cooldown: " + chname.getColor() + chname.getCooldown()); 59 | } 60 | sender.sendMessage(ChatColor.GOLD + "Bungeecord: " + chname.getColor() + chname.getBungee()); 61 | sender.sendMessage(ChatColor.GOLD + "Format: " + chname.getColor() + chname.getFormat()); 62 | return true; 63 | } else { 64 | sender.sendMessage(ChatColor.RED + "You do not have permission for this command."); 65 | return true; 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Chatinfo.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.ChatColor; 5 | import org.bukkit.command.Command; 6 | import org.bukkit.command.CommandSender; 7 | import org.bukkit.entity.Player; 8 | 9 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 10 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 11 | import mineverse.Aust1n46.chat.channel.ChatChannel; 12 | import mineverse.Aust1n46.chat.command.mute.MuteContainer; 13 | 14 | public class Chatinfo extends Command { 15 | public Chatinfo() { 16 | super("chatinfo"); 17 | } 18 | 19 | @Override 20 | public boolean execute(CommandSender sender, String command, String[] args) { 21 | if (sender.hasPermission("venturechat.chatinfo")) { 22 | if (args.length == 0) { 23 | if (!(sender instanceof Player)) { 24 | Bukkit.getServer().getConsoleSender().sendMessage(ChatColor.RED + "This command must be run by a player; use /ci [name]"); 25 | return true; 26 | } 27 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); 28 | String listen = ""; 29 | String mute = ""; 30 | String blockedcommands = ""; 31 | if (args.length < 1) { 32 | mcp.getPlayer().sendMessage(ChatColor.GOLD + "Player: " + ChatColor.GREEN + mcp.getName()); 33 | for (String c : mcp.getListening()) { 34 | ChatChannel channel = ChatChannel.getChannel(c); 35 | listen += channel.getColor() + channel.getName() + " "; 36 | } 37 | for (MuteContainer muteContainer : mcp.getMutes()) { 38 | ChatChannel channel = ChatChannel.getChannel(muteContainer.getChannel()); 39 | mute += channel.getColor() + channel.getName() + " "; 40 | } 41 | for (String bc : mcp.getBlockedCommands()) { 42 | blockedcommands += bc + " "; 43 | } 44 | mcp.getPlayer().sendMessage(ChatColor.GOLD + "Listening: " + listen); 45 | if (mute.length() > 0) { 46 | mcp.getPlayer().sendMessage(ChatColor.GOLD + "Mutes: " + mute); 47 | } else { 48 | mcp.getPlayer().sendMessage(ChatColor.GOLD + "Mutes: " + ChatColor.RED + "N/A"); 49 | } 50 | if (blockedcommands.length() > 0) { 51 | mcp.getPlayer().sendMessage(ChatColor.GOLD + "Blocked Commands: " + ChatColor.RED + blockedcommands); 52 | } else { 53 | mcp.getPlayer().sendMessage(ChatColor.GOLD + "Blocked Commands: " + ChatColor.RED + "N/A"); 54 | } 55 | if (mcp.hasConversation()) { 56 | mcp.getPlayer().sendMessage( 57 | ChatColor.GOLD + "Private conversation: " + ChatColor.GREEN + MineverseChatAPI.getMineverseChatPlayer(mcp.getConversation()).getName()); 58 | } else { 59 | mcp.getPlayer().sendMessage(ChatColor.GOLD + "Private conversation: " + ChatColor.RED + "N/A"); 60 | } 61 | if (mcp.isSpy()) { 62 | mcp.getPlayer().sendMessage(ChatColor.GOLD + "Spy: " + ChatColor.GREEN + "true"); 63 | } else { 64 | mcp.getPlayer().sendMessage(ChatColor.GOLD + "Spy: " + ChatColor.RED + "false"); 65 | } 66 | if (mcp.hasCommandSpy()) { 67 | mcp.getPlayer().sendMessage(ChatColor.GOLD + "Command spy: " + ChatColor.GREEN + "true"); 68 | } else { 69 | mcp.getPlayer().sendMessage(ChatColor.GOLD + "Command spy: " + ChatColor.RED + "false"); 70 | } 71 | if (mcp.hasFilter()) { 72 | mcp.getPlayer().sendMessage(ChatColor.GOLD + "Filter: " + ChatColor.GREEN + "true"); 73 | } else { 74 | mcp.getPlayer().sendMessage(ChatColor.GOLD + "Filter: " + ChatColor.RED + "false"); 75 | } 76 | return true; 77 | } 78 | } 79 | if (sender.hasPermission("venturechat.chatinfo.others")) { 80 | String listen = ""; 81 | String mute = ""; 82 | String blockedcommands = ""; 83 | MineverseChatPlayer p = MineverseChatAPI.getMineverseChatPlayer(args[0]); 84 | if (p == null) { 85 | sender.sendMessage(ChatColor.RED + "Player: " + ChatColor.GOLD + args[0] + ChatColor.RED + " is not online."); 86 | return true; 87 | } 88 | sender.sendMessage(ChatColor.GOLD + "Player: " + ChatColor.GREEN + p.getName()); 89 | for (String c : p.getListening()) { 90 | ChatChannel channel = ChatChannel.getChannel(c); 91 | listen += channel.getColor() + channel.getName() + " "; 92 | } 93 | for (MuteContainer muteContainer : p.getMutes()) { 94 | ChatChannel channel = ChatChannel.getChannel(muteContainer.getChannel()); 95 | mute += channel.getColor() + channel.getName() + " "; 96 | } 97 | for (String bc : p.getBlockedCommands()) { 98 | blockedcommands += bc + " "; 99 | } 100 | sender.sendMessage(ChatColor.GOLD + "Listening: " + listen); 101 | if (mute.length() > 0) { 102 | sender.sendMessage(ChatColor.GOLD + "Mutes: " + mute); 103 | } else { 104 | sender.sendMessage(ChatColor.GOLD + "Mutes: " + ChatColor.RED + "N/A"); 105 | } 106 | if (blockedcommands.length() > 0) { 107 | sender.sendMessage(ChatColor.GOLD + "Blocked Commands: " + ChatColor.RED + blockedcommands); 108 | } else { 109 | sender.sendMessage(ChatColor.GOLD + "Blocked Commands: " + ChatColor.RED + "N/A"); 110 | } 111 | if (p.hasConversation()) { 112 | sender.sendMessage(ChatColor.GOLD + "Private conversation: " + ChatColor.GREEN + MineverseChatAPI.getMineverseChatPlayer(p.getConversation()).getName()); 113 | } else { 114 | sender.sendMessage(ChatColor.GOLD + "Private conversation: " + ChatColor.RED + "N/A"); 115 | } 116 | if (p.isSpy()) { 117 | sender.sendMessage(ChatColor.GOLD + "Spy: " + ChatColor.GREEN + "true"); 118 | } else { 119 | sender.sendMessage(ChatColor.GOLD + "Spy: " + ChatColor.RED + "false"); 120 | } 121 | if (p.hasCommandSpy()) { 122 | sender.sendMessage(ChatColor.GOLD + "Command spy: " + ChatColor.GREEN + "true"); 123 | } else { 124 | sender.sendMessage(ChatColor.GOLD + "Command spy: " + ChatColor.RED + "false"); 125 | } 126 | if (p.hasFilter()) { 127 | sender.sendMessage(ChatColor.GOLD + "Filter: " + ChatColor.GREEN + "true"); 128 | } else { 129 | sender.sendMessage(ChatColor.GOLD + "Filter: " + ChatColor.RED + "false"); 130 | } 131 | return true; 132 | } else { 133 | sender.sendMessage(ChatColor.RED + "You do not have permission to check the chat info of others."); 134 | } 135 | return true; 136 | } else { 137 | sender.sendMessage(ChatColor.RED + "You do not have permission for this command."); 138 | return true; 139 | } 140 | } 141 | } 142 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Chatreload.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import java.util.UUID; 4 | 5 | import org.bukkit.Bukkit; 6 | import org.bukkit.command.Command; 7 | import org.bukkit.command.CommandSender; 8 | import org.bukkit.entity.Player; 9 | 10 | import mineverse.Aust1n46.chat.MineverseChat; 11 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 12 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 13 | import mineverse.Aust1n46.chat.database.PlayerData; 14 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 15 | import mineverse.Aust1n46.chat.utilities.Format; 16 | 17 | public class Chatreload extends Command { 18 | private MineverseChat plugin = MineverseChat.getInstance(); 19 | 20 | public Chatreload() { 21 | super("chatreload"); 22 | } 23 | 24 | @Override 25 | public boolean execute(CommandSender sender, String command, String[] args) { 26 | if (sender.hasPermission("venturechat.reload")) { 27 | PlayerData.savePlayerData(); 28 | MineverseChatAPI.clearMineverseChatPlayerMap(); 29 | MineverseChatAPI.clearNameMap(); 30 | MineverseChatAPI.clearOnlineMineverseChatPlayerMap(); 31 | 32 | plugin.reloadConfig(); 33 | MineverseChat.initializeConfigReaders(); 34 | 35 | PlayerData.loadLegacyPlayerData(); 36 | PlayerData.loadPlayerData(); 37 | for (Player p : plugin.getServer().getOnlinePlayers()) { 38 | MineverseChatPlayer mcp = MineverseChatAPI.getMineverseChatPlayer(p); 39 | if (mcp == null) { 40 | Bukkit.getConsoleSender() 41 | .sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - Could not find player data post reload for currently online player: " + p.getName())); 42 | Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - There could be an issue with your player data saving.")); 43 | String name = p.getName(); 44 | UUID uuid = p.getUniqueId(); 45 | mcp = new MineverseChatPlayer(uuid, name); 46 | } 47 | mcp.setOnline(true); 48 | mcp.setHasPlayed(false); 49 | mcp.setJsonFormat(); 50 | MineverseChatAPI.addMineverseChatOnlinePlayerToMap(mcp); 51 | MineverseChatAPI.addNameToMap(mcp); 52 | } 53 | 54 | Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Config reloaded")); 55 | for (MineverseChatPlayer player : MineverseChatAPI.getOnlineMineverseChatPlayers()) { 56 | if (player.getPlayer().hasPermission("venturechat.reload")) { 57 | player.getPlayer().sendMessage(LocalizedMessage.CONFIG_RELOADED.toString()); 58 | } 59 | } 60 | return true; 61 | } 62 | sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 63 | return true; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Chlist.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.command.Command; 4 | import org.bukkit.command.CommandSender; 5 | 6 | import mineverse.Aust1n46.chat.channel.ChatChannel; 7 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 8 | 9 | public class Chlist extends Command { 10 | public Chlist() { 11 | super("chlist"); 12 | } 13 | 14 | @Override 15 | public boolean execute(CommandSender sender, String command, String[] args) { 16 | sender.sendMessage(LocalizedMessage.CHANNEL_LIST_HEADER.toString()); 17 | for (ChatChannel chname : ChatChannel.getChatChannels()) { 18 | if (chname.hasPermission()) { 19 | if (sender.hasPermission(chname.getPermission())) { 20 | sender.sendMessage(LocalizedMessage.CHANNEL_LIST_WITH_PERMISSIONS.toString().replace("{channel_color}", (chname.getColor()).toString()) 21 | .replace("{channel_name}", chname.getName()).replace("{channel_alias}", chname.getAlias())); 22 | } 23 | } else { 24 | sender.sendMessage(LocalizedMessage.CHANNEL_LIST.toString().replace("{channel_color}", chname.getColor().toString()).replace("{channel_name}", chname.getName()) 25 | .replace("{channel_alias}", chname.getAlias())); 26 | } 27 | } 28 | return true; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Chwho.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import static mineverse.Aust1n46.chat.MineverseChat.LINE_LENGTH; 4 | 5 | import java.io.ByteArrayOutputStream; 6 | import java.io.DataOutputStream; 7 | 8 | import org.bukkit.ChatColor; 9 | import org.bukkit.Location; 10 | import org.bukkit.command.Command; 11 | import org.bukkit.command.CommandSender; 12 | import org.bukkit.entity.Player; 13 | import org.bukkit.plugin.PluginManager; 14 | 15 | import com.massivecraft.factions.entity.MPlayer; 16 | import com.palmergames.bukkit.towny.TownyUniverse; 17 | import com.palmergames.bukkit.towny.object.Resident; 18 | 19 | import mineverse.Aust1n46.chat.MineverseChat; 20 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 21 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 22 | import mineverse.Aust1n46.chat.channel.ChatChannel; 23 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 24 | 25 | public class Chwho extends Command { 26 | private MineverseChat plugin = MineverseChat.getInstance(); 27 | 28 | public Chwho() { 29 | super("chwho"); 30 | } 31 | 32 | @Override 33 | public boolean execute(CommandSender sender, String command, String[] args) { 34 | String playerlist = ""; 35 | if (sender.hasPermission("venturechat.chwho")) { 36 | if (args.length > 0) { 37 | ChatChannel channel = ChatChannel.getChannel(args[0]); 38 | if (channel != null) { 39 | if (channel.hasPermission()) { 40 | if (!sender.hasPermission(channel.getPermission())) { 41 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer(((Player) sender)); 42 | mcp.removeListening(channel.getName()); 43 | mcp.getPlayer().sendMessage(LocalizedMessage.CHANNEL_NO_PERMISSION_VIEW.toString()); 44 | return true; 45 | } 46 | } 47 | 48 | if (channel.getBungee() && sender instanceof Player) { 49 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); 50 | ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); 51 | DataOutputStream out = new DataOutputStream(byteOutStream); 52 | try { 53 | out.writeUTF("Chwho"); 54 | out.writeUTF("Get"); 55 | out.writeUTF(mcp.getUUID().toString()); 56 | out.writeUTF(channel.getName()); 57 | mcp.getPlayer().sendPluginMessage(plugin, MineverseChat.PLUGIN_MESSAGING_CHANNEL, byteOutStream.toByteArray()); 58 | out.close(); 59 | } catch (Exception e) { 60 | e.printStackTrace(); 61 | } 62 | return true; 63 | } 64 | 65 | PluginManager pluginManager = plugin.getServer().getPluginManager(); 66 | long linecount = LINE_LENGTH; 67 | for (MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { 68 | if (p.getListening().contains(channel.getName())) { 69 | if (sender instanceof Player) { 70 | if (!((Player) sender).canSee(p.getPlayer())) { 71 | continue; 72 | } 73 | } 74 | if (channel.hasDistance() && sender instanceof Player) { 75 | if (!this.isPlayerWithinDistance((Player) sender, p.getPlayer(), channel.getDistance())) { 76 | continue; 77 | } 78 | } 79 | if (plugin.getConfig().getBoolean("enable_towny_channel") && pluginManager.isPluginEnabled("Towny") && sender instanceof Player) { 80 | try { 81 | TownyUniverse towny = TownyUniverse.getInstance(); 82 | if (channel.getName().equalsIgnoreCase("Town")) { 83 | Resident r = towny.getResident(p.getName()); 84 | Resident pp = towny.getResident(((Player) sender).getName()); 85 | if (!pp.hasTown()) { 86 | if (playerlist.length() + p.getName().length() > linecount) { 87 | playerlist += "\n"; 88 | linecount = linecount + LINE_LENGTH; 89 | } 90 | if (!p.isMuted(channel.getName())) { 91 | playerlist += ChatColor.WHITE + p.getName(); 92 | } else { 93 | playerlist += ChatColor.RED + p.getName(); 94 | } 95 | playerlist += ChatColor.WHITE + ", "; 96 | break; 97 | } else if (!r.hasTown()) { 98 | continue; 99 | } else if (!(r.getTown().getName().equals(pp.getTown().getName()))) { 100 | continue; 101 | } 102 | } 103 | if (channel.getName().equalsIgnoreCase("Nation")) { 104 | Resident r = towny.getResident(p.getName()); 105 | Resident pp = towny.getResident(((Player) sender).getName()); 106 | if (!pp.hasNation()) { 107 | if (playerlist.length() + p.getName().length() > linecount) { 108 | playerlist += "\n"; 109 | linecount = linecount + LINE_LENGTH; 110 | } 111 | if (!p.isMuted(channel.getName())) { 112 | playerlist += ChatColor.WHITE + p.getName(); 113 | } else { 114 | playerlist += ChatColor.RED + p.getName(); 115 | } 116 | playerlist += ChatColor.WHITE + ", "; 117 | break; 118 | } else if (!r.hasNation()) { 119 | continue; 120 | } else if (!(r.getTown().getNation().getName().equals(pp.getTown().getNation().getName()))) { 121 | continue; 122 | } 123 | } 124 | } catch (Exception ex) { 125 | ex.printStackTrace(); 126 | } 127 | } 128 | if (plugin.getConfig().getBoolean("enable_factions_channel") && pluginManager.isPluginEnabled("Factions") && sender instanceof Player) { 129 | try { 130 | if (channel.getName().equalsIgnoreCase("Faction")) { 131 | MPlayer mplayer = MPlayer.get(p.getPlayer()); 132 | MPlayer mplayerp = MPlayer.get((Player) sender); 133 | if (!mplayerp.hasFaction()) { 134 | if (playerlist.length() + p.getName().length() > linecount) { 135 | playerlist += "\n"; 136 | linecount = linecount + LINE_LENGTH; 137 | } 138 | if (!p.isMuted(channel.getName())) { 139 | playerlist += ChatColor.WHITE + p.getName(); 140 | } else { 141 | playerlist += ChatColor.RED + p.getName(); 142 | } 143 | playerlist += ChatColor.WHITE + ", "; 144 | break; 145 | } else if (!mplayerp.hasFaction()) { 146 | continue; 147 | } else if (!(mplayer.getFactionName().equals(mplayerp.getFactionName()))) { 148 | continue; 149 | } 150 | } 151 | } catch (Exception ex) { 152 | ex.printStackTrace(); 153 | } 154 | } 155 | if (playerlist.length() + p.getName().length() > linecount) { 156 | playerlist += "\n"; 157 | linecount = linecount + LINE_LENGTH; 158 | } 159 | if (!p.isMuted(channel.getName())) { 160 | playerlist += ChatColor.WHITE + p.getName(); 161 | } else { 162 | playerlist += ChatColor.RED + p.getName(); 163 | } 164 | playerlist += ChatColor.WHITE + ", "; 165 | } 166 | } 167 | if (playerlist.length() > 2) { 168 | playerlist = playerlist.substring(0, playerlist.length() - 2); 169 | } 170 | sender.sendMessage(LocalizedMessage.CHANNEL_PLAYER_LIST_HEADER.toString().replace("{channel_color}", (channel.getColor()).toString()).replace("{channel_name}", 171 | channel.getName())); 172 | sender.sendMessage(playerlist); 173 | return true; 174 | } else { 175 | sender.sendMessage(LocalizedMessage.INVALID_CHANNEL.toString().replace("{args}", args[0])); 176 | return true; 177 | } 178 | } else { 179 | sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/chwho").replace("{args}", "[channel]")); 180 | return true; 181 | } 182 | } else { 183 | sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 184 | return true; 185 | } 186 | } 187 | 188 | private boolean isPlayerWithinDistance(Player p1, Player p2, double Distance) { 189 | Double chDistance = Distance; 190 | Location locreceip; 191 | Location locsender = p1.getLocation(); 192 | Location diff; 193 | if (chDistance > (double) 0) { 194 | locreceip = p2.getLocation(); 195 | if (locreceip.getWorld() == p1.getWorld()) { 196 | diff = locreceip.subtract(locsender); 197 | if (Math.abs(diff.getX()) > chDistance || Math.abs(diff.getZ()) > chDistance || Math.abs(diff.getY()) > chDistance) { 198 | return false; 199 | } 200 | } else { 201 | return false; 202 | } 203 | } 204 | return true; 205 | } 206 | } 207 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Clearchat.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.command.Command; 4 | import org.bukkit.command.CommandSender; 5 | 6 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 7 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 8 | import mineverse.Aust1n46.chat.localization.InternalMessage; 9 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 10 | 11 | public class Clearchat extends Command { 12 | public Clearchat() { 13 | super("clearchat"); 14 | } 15 | 16 | @Override 17 | public boolean execute(CommandSender sender, String command, String[] args) { 18 | if (sender.hasPermission("venturechat.clearchat")) { 19 | for (MineverseChatPlayer player : MineverseChatAPI.getOnlineMineverseChatPlayers()) { 20 | if (!player.getPlayer().hasPermission("venturechat.clearchat.bypass")) { 21 | for (int a = 1; a <= 20; a++) 22 | player.getPlayer().sendMessage(InternalMessage.EMPTY_STRING.toString()); 23 | player.getPlayer().sendMessage(LocalizedMessage.CLEAR_CHAT_SERVER.toString()); 24 | } 25 | } 26 | sender.sendMessage(LocalizedMessage.CLEAR_CHAT_SENDER.toString()); 27 | return true; 28 | } 29 | sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 30 | return true; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Commandblock.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import java.util.List; 4 | 5 | import org.bukkit.command.Command; 6 | import org.bukkit.command.CommandSender; 7 | 8 | import mineverse.Aust1n46.chat.MineverseChat; 9 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 10 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 11 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 12 | 13 | public class Commandblock extends Command { 14 | private MineverseChat plugin = MineverseChat.getInstance(); 15 | 16 | public Commandblock() { 17 | super("commandblock"); 18 | } 19 | 20 | @Override 21 | public boolean execute(CommandSender sender, String command, String[] args) { 22 | if (sender.hasPermission("venturechat.commandblock")) { 23 | if (args.length > 1) { 24 | MineverseChatPlayer player = MineverseChatAPI.getOnlineMineverseChatPlayer(args[0]); 25 | if (player == null) { 26 | sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString().replace("{args}", args[0])); 27 | return true; 28 | } 29 | boolean match = false; 30 | for (String cb : (List) plugin.getConfig().getStringList("blockablecommands")) 31 | if (args[1].equals("/" + cb)) 32 | match = true; 33 | if (match || player.isBlockedCommand(args[1])) { 34 | if (!player.isBlockedCommand(args[1])) { 35 | player.addBlockedCommand(args[1]); 36 | player.getPlayer().sendMessage(LocalizedMessage.BLOCK_COMMAND_PLAYER.toString().replace("{command}", args[1])); 37 | sender.sendMessage(LocalizedMessage.BLOCK_COMMAND_SENDER.toString().replace("{player}", player.getName()).replace("{command}", args[1])); 38 | return true; 39 | } 40 | player.removeBlockedCommand(args[1]); 41 | player.getPlayer().sendMessage(LocalizedMessage.UNBLOCK_COMMAND_PLAYER.toString().replace("{command}", args[1])); 42 | sender.sendMessage(LocalizedMessage.UNBLOCK_COMMAND_SENDER.toString().replace("{player}", player.getName()).replace("{command}", args[1])); 43 | return true; 44 | } 45 | sender.sendMessage(LocalizedMessage.COMMAND_NOT_BLOCKABLE.toString()); 46 | return true; 47 | } 48 | sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/commandblock").replace("{args}", "[player] [command]")); 49 | return true; 50 | } 51 | sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 52 | return true; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Commandspy.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandSender; 6 | import org.bukkit.entity.Player; 7 | 8 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 9 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 10 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 11 | 12 | public class Commandspy extends Command { 13 | public Commandspy() { 14 | super("commandspy"); 15 | } 16 | 17 | @Override 18 | public boolean execute(CommandSender sender, String command, String[] args) { 19 | if (!(sender instanceof Player)) { 20 | Bukkit.getServer().getConsoleSender().sendMessage(LocalizedMessage.COMMAND_MUST_BE_RUN_BY_PLAYER.toString()); 21 | return true; 22 | } 23 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); 24 | if (mcp.getPlayer().hasPermission("venturechat.commandspy")) { 25 | if (!mcp.hasCommandSpy()) { 26 | mcp.setCommandSpy(true); 27 | mcp.getPlayer().sendMessage(LocalizedMessage.COMMANDSPY_ON.toString()); 28 | return true; 29 | } 30 | mcp.setCommandSpy(false); 31 | mcp.getPlayer().sendMessage(LocalizedMessage.COMMANDSPY_OFF.toString()); 32 | return true; 33 | } 34 | mcp.getPlayer().sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 35 | return true; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Edit.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import java.util.ArrayList; 4 | import java.util.HashMap; 5 | import java.util.List; 6 | import java.util.Map; 7 | 8 | import org.bukkit.command.Command; 9 | import org.bukkit.command.CommandSender; 10 | import org.bukkit.entity.Player; 11 | import org.bukkit.scheduler.BukkitRunnable; 12 | 13 | import com.comphenix.protocol.events.PacketContainer; 14 | import com.comphenix.protocol.wrappers.WrappedChatComponent; 15 | 16 | import mineverse.Aust1n46.chat.ChatMessage; 17 | import mineverse.Aust1n46.chat.MineverseChat; 18 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 19 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 20 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 21 | import mineverse.Aust1n46.chat.utilities.Format; 22 | 23 | public class Edit extends Command { 24 | private PacketContainer emptyLinePacketContainer = Format.createPacketPlayOutChat("{\"extra\":[\" \"],\"text\":\"\"}"); 25 | private MineverseChat plugin = MineverseChat.getInstance(); 26 | private WrappedChatComponent messageDeletedComponentPlayer; 27 | 28 | public Edit() { 29 | super("edit"); 30 | } 31 | 32 | @Override 33 | @SuppressWarnings({ "unchecked", "rawtypes" }) 34 | public boolean execute(CommandSender sender, String command, String[] args) { 35 | if (args.length == 0) { 36 | sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/edit").replace("{args}", "[hashcode]")); 37 | return true; 38 | } 39 | final int hash; 40 | try { 41 | hash = Integer.parseInt(args[0]); 42 | } catch (Exception e) { 43 | sender.sendMessage(LocalizedMessage.INVALID_HASH.toString()); 44 | return true; 45 | } 46 | new BukkitRunnable() { 47 | public void run() { 48 | final Map> packets = new HashMap(); 49 | for (MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { 50 | List messages = p.getMessages(); 51 | List playerPackets = new ArrayList(); 52 | boolean resend = false; 53 | for (int fill = 0; fill < 100 - messages.size(); fill++) { 54 | playerPackets.add(Edit.this.emptyLinePacketContainer); 55 | } 56 | for (ChatMessage message : messages) { 57 | if (message.getHash() == hash) { 58 | WrappedChatComponent removedComponent = p.getPlayer().hasPermission("venturechat.message.bypass") 59 | ? Edit.this.getMessageDeletedChatComponentAdmin(message) 60 | : Edit.this.getMessageDeletedChatComponentPlayer(); 61 | message.setComponent(removedComponent); 62 | message.setHash(-1); 63 | playerPackets.add(Format.createPacketPlayOutChat(removedComponent)); 64 | resend = true; 65 | continue; 66 | } 67 | if (message.getMessage().contains(Format.FormatStringAll(plugin.getConfig().getString("messageremovericon")))) { 68 | String submessage = message.getMessage().substring(0, message.getMessage().length() - plugin.getConfig().getString("messageremovericon").length() - 1) 69 | .replaceAll("(�([a-z0-9]))", ""); 70 | if (submessage.hashCode() == hash) { 71 | WrappedChatComponent removedComponent = p.getPlayer().hasPermission("venturechat.message.bypass") 72 | ? Edit.this.getMessageDeletedChatComponentAdmin(message) 73 | : Edit.this.getMessageDeletedChatComponentPlayer(); 74 | message.setComponent(removedComponent); 75 | message.setHash(-1); 76 | playerPackets.add(Format.createPacketPlayOutChat(removedComponent)); 77 | resend = true; 78 | continue; 79 | } 80 | } 81 | playerPackets.add(Format.createPacketPlayOutChat(message.getComponent())); 82 | } 83 | if (resend) { 84 | packets.put(p.getPlayer(), playerPackets); 85 | } 86 | } 87 | new BukkitRunnable() { 88 | public void run() { 89 | for (Player p : packets.keySet()) { 90 | List pPackets = packets.get(p); 91 | for (PacketContainer c : pPackets) { 92 | Format.sendPacketPlayOutChat(p, c); 93 | } 94 | } 95 | } 96 | }.runTask(plugin); 97 | } 98 | }.runTaskAsynchronously(plugin); 99 | return true; 100 | } 101 | 102 | public WrappedChatComponent getMessageDeletedChatComponentPlayer() { 103 | if (this.messageDeletedComponentPlayer == null) { 104 | this.messageDeletedComponentPlayer = WrappedChatComponent.fromJson( 105 | "{\"text\":\"\",\"extra\":[{\"text\":\"\",\"color\":\"red\",\"italic\":\"true\",\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[{\"text\":\"" 106 | + Format.FormatStringAll(plugin.getConfig().getString("messageremoverpermissions")) + "\"}]}}}]}"); 107 | } 108 | return this.messageDeletedComponentPlayer; 109 | } 110 | 111 | public WrappedChatComponent getMessageDeletedChatComponentAdmin(ChatMessage message) { 112 | String oMessage = message.getComponent().getJson().substring(1, message.getComponent().getJson().length() - 11); 113 | if (message.getMessage().contains(Format.FormatStringAll(plugin.getConfig().getString("messageremovericon")))) { 114 | oMessage = oMessage.substring(0, oMessage.length() - plugin.getConfig().getString("messageremovericon").length() - 4) + "\"}]"; 115 | } 116 | return WrappedChatComponent.fromJson( 117 | Format.FormatStringAll("{\"text\":\"\",\"extra\":[{\"text\":\"&c&o\",\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"&7Message: \"," 118 | + oMessage + "}}}]}")); 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Filter.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandSender; 6 | import org.bukkit.entity.Player; 7 | 8 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 9 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 10 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 11 | 12 | public class Filter extends Command { 13 | public Filter() { 14 | super("filter"); 15 | } 16 | 17 | @Override 18 | public boolean execute(CommandSender sender, String command, String[] args) { 19 | if (!(sender instanceof Player)) { 20 | Bukkit.getServer().getConsoleSender().sendMessage(LocalizedMessage.COMMAND_MUST_BE_RUN_BY_PLAYER.toString()); 21 | return true; 22 | } 23 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); 24 | if (mcp.getPlayer().hasPermission("venturechat.ignorefilter")) { 25 | if (!mcp.hasFilter()) { 26 | mcp.setFilter(true); 27 | mcp.getPlayer().sendMessage(LocalizedMessage.FILTER_ON.toString()); 28 | return true; 29 | } 30 | mcp.setFilter(false); 31 | mcp.getPlayer().sendMessage(LocalizedMessage.FILTER_OFF.toString()); 32 | return true; 33 | } 34 | mcp.getPlayer().sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 35 | return true; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Force.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.command.Command; 4 | import org.bukkit.command.CommandSender; 5 | 6 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 7 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 8 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 9 | 10 | public class Force extends Command { 11 | public Force() { 12 | super("force"); 13 | } 14 | 15 | @Override 16 | public boolean execute(CommandSender sender, String command, String[] args) { 17 | if (sender.hasPermission("venturechat.force")) { 18 | if (args.length < 2) { 19 | sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/force").replace("{args}", "[player] [message]")); 20 | return true; 21 | } 22 | MineverseChatPlayer player = MineverseChatAPI.getOnlineMineverseChatPlayer(args[0]); 23 | if (player == null) { 24 | sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString().replace("{args}", args[0])); 25 | return true; 26 | } 27 | String forcemsg = ""; 28 | for (int x = 1; x < args.length; x++) 29 | if (args[x].length() > 0) 30 | forcemsg += args[x] + " "; 31 | sender.sendMessage(LocalizedMessage.FORCE_PLAYER.toString().replace("{player}", player.getName()).replace("{message}", forcemsg)); 32 | player.getPlayer().chat(forcemsg); 33 | return true; 34 | } 35 | sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 36 | return true; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Forceall.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.command.Command; 4 | import org.bukkit.command.CommandSender; 5 | 6 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 7 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 8 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 9 | 10 | public class Forceall extends Command { 11 | public Forceall() { 12 | super("forceall"); 13 | } 14 | 15 | @Override 16 | public boolean execute(CommandSender sender, String command, String[] args) { 17 | if (sender.hasPermission("venturechat.forceall")) { 18 | if (args.length < 1) { 19 | sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/forceall").replace("{args}", "[message]")); 20 | return true; 21 | } 22 | String forcemsg = ""; 23 | for (int x = 0; x < args.length; x++) { 24 | if (args[x].length() > 0) { 25 | forcemsg += args[x] + " "; 26 | } 27 | } 28 | sender.sendMessage(LocalizedMessage.FORCE_ALL.toString().replace("{message}", forcemsg)); 29 | for (MineverseChatPlayer player : MineverseChatAPI.getOnlineMineverseChatPlayers()) { 30 | player.getPlayer().chat(forcemsg); 31 | } 32 | return true; 33 | } 34 | sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 35 | return true; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Kickchannel.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.ChatColor; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandSender; 6 | 7 | import mineverse.Aust1n46.chat.MineverseChat; 8 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 9 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 10 | import mineverse.Aust1n46.chat.channel.ChatChannel; 11 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 12 | 13 | public class Kickchannel extends Command { 14 | public Kickchannel() { 15 | super("kickchannel"); 16 | } 17 | 18 | @Override 19 | public boolean execute(CommandSender sender, String command, String[] args) { 20 | if (sender.hasPermission("venturechat.kickchannel")) { 21 | if (args.length < 2) { 22 | sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/kickchannel").replace("{args}", "[player] [channel]")); 23 | return true; 24 | } 25 | MineverseChatPlayer player = MineverseChatAPI.getMineverseChatPlayer(args[0]); 26 | if (player == null) { 27 | sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString().replace("{args}", args[0])); 28 | return true; 29 | } 30 | ChatChannel channel = ChatChannel.getChannel(args[1]); 31 | if (channel == null) { 32 | sender.sendMessage(LocalizedMessage.INVALID_CHANNEL.toString().replace("{args}", args[1])); 33 | return true; 34 | } 35 | sender.sendMessage(LocalizedMessage.KICK_CHANNEL.toString().replace("{player}", args[0]).replace("{channel_color}", channel.getColor() + "").replace("{channel_name}", 36 | channel.getName())); 37 | player.removeListening(channel.getName()); 38 | if (player.isOnline()) { 39 | player.getPlayer() 40 | .sendMessage(LocalizedMessage.LEAVE_CHANNEL.toString().replace("{channel_color}", channel.getColor() + "").replace("{channel_name}", channel.getName())); 41 | } else { 42 | player.setModified(true); 43 | } 44 | boolean isThereABungeeChannel = channel.getBungee(); 45 | if (player.getListening().size() == 0) { 46 | player.addListening(ChatChannel.getDefaultChannel().getName()); 47 | player.setCurrentChannel(ChatChannel.getDefaultChannel()); 48 | if (ChatChannel.getDefaultChannel().getBungee()) { 49 | isThereABungeeChannel = true; 50 | } 51 | if (player.isOnline()) { 52 | player.getPlayer().sendMessage(LocalizedMessage.MUST_LISTEN_ONE_CHANNEL.toString()); 53 | player.getPlayer() 54 | .sendMessage(LocalizedMessage.SET_CHANNEL.toString().replace("{channel_color}", ChatColor.valueOf(ChatChannel.getDefaultColor().toUpperCase()) + "") 55 | .replace("{channel_name}", ChatChannel.getDefaultChannel().getName())); 56 | } else 57 | player.setModified(true); 58 | } 59 | if (isThereABungeeChannel) { 60 | MineverseChat.synchronize(player, true); 61 | } 62 | return true; 63 | } 64 | sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 65 | return true; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Kickchannelall.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.ChatColor; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandSender; 6 | 7 | import mineverse.Aust1n46.chat.MineverseChat; 8 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 9 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 10 | import mineverse.Aust1n46.chat.channel.ChatChannel; 11 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 12 | 13 | public class Kickchannelall extends Command { 14 | public Kickchannelall() { 15 | super("kickchannelall"); 16 | } 17 | 18 | @Override 19 | public boolean execute(CommandSender sender, String command, String[] args) { 20 | if (sender.hasPermission("venturechat.kickchannelall")) { 21 | if (args.length < 1) { 22 | sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/kickchannelall").replace("{args}", "[player]")); 23 | return true; 24 | } 25 | MineverseChatPlayer player = MineverseChatAPI.getMineverseChatPlayer(args[0]); 26 | if (player == null) { 27 | sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString().replace("{args}", args[0])); 28 | return true; 29 | } 30 | boolean isThereABungeeChannel = false; 31 | for (String channel : player.getListening()) { 32 | if (ChatChannel.isChannel(channel)) { 33 | ChatChannel chatChannelObj = ChatChannel.getChannel(channel); 34 | if (chatChannelObj.getBungee()) { 35 | isThereABungeeChannel = true; 36 | } 37 | } 38 | } 39 | player.clearListening(); 40 | sender.sendMessage(LocalizedMessage.KICK_CHANNEL_ALL_SENDER.toString().replace("{player}", player.getName())); 41 | player.addListening(ChatChannel.getDefaultChannel().getName()); 42 | player.setCurrentChannel(ChatChannel.getDefaultChannel()); 43 | if (ChatChannel.getDefaultChannel().getBungee()) { 44 | isThereABungeeChannel = true; 45 | } 46 | if (isThereABungeeChannel) { 47 | MineverseChat.synchronize(player, true); 48 | } 49 | if (player.isOnline()) { 50 | player.getPlayer().sendMessage(LocalizedMessage.KICK_CHANNEL_ALL_PLAYER.toString()); 51 | player.getPlayer().sendMessage(LocalizedMessage.MUST_LISTEN_ONE_CHANNEL.toString()); 52 | player.getPlayer() 53 | .sendMessage(LocalizedMessage.SET_CHANNEL.toString().replace("{channel_color}", ChatColor.valueOf(ChatChannel.getDefaultColor().toUpperCase()) + "") 54 | .replace("{channel_name}", ChatChannel.getDefaultChannel().getName())); 55 | } else { 56 | player.setModified(true); 57 | } 58 | return true; 59 | } 60 | sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 61 | return true; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Leave.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.ChatColor; 5 | import org.bukkit.command.Command; 6 | import org.bukkit.command.CommandSender; 7 | import org.bukkit.entity.Player; 8 | 9 | import mineverse.Aust1n46.chat.MineverseChat; 10 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 11 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 12 | import mineverse.Aust1n46.chat.channel.ChatChannel; 13 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 14 | 15 | public class Leave extends Command { 16 | public Leave() { 17 | super("leave"); 18 | } 19 | 20 | @Override 21 | public boolean execute(CommandSender sender, String command, String[] args) { 22 | if (!(sender instanceof Player)) { 23 | Bukkit.getServer().getConsoleSender().sendMessage(LocalizedMessage.COMMAND_MUST_BE_RUN_BY_PLAYER.toString()); 24 | return true; 25 | } 26 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); 27 | if (args.length > 0) { 28 | ChatChannel channel = ChatChannel.getChannel(args[0]); 29 | if (channel == null) { 30 | mcp.getPlayer().sendMessage(LocalizedMessage.INVALID_CHANNEL.toString().replace("{args}", args[0])); 31 | return true; 32 | } 33 | mcp.removeListening(channel.getName()); 34 | mcp.getPlayer().sendMessage(LocalizedMessage.LEAVE_CHANNEL.toString().replace("{channel_color}", channel.getColor() + "").replace("{channel_name}", channel.getName())); 35 | boolean isThereABungeeChannel = channel.getBungee(); 36 | if (mcp.getListening().size() == 0) { 37 | mcp.addListening(ChatChannel.getDefaultChannel().getName()); 38 | mcp.setCurrentChannel(ChatChannel.getDefaultChannel()); 39 | if (ChatChannel.getDefaultChannel().getBungee()) { 40 | isThereABungeeChannel = true; 41 | } 42 | mcp.getPlayer().sendMessage(LocalizedMessage.MUST_LISTEN_ONE_CHANNEL.toString()); 43 | mcp.getPlayer().sendMessage(LocalizedMessage.SET_CHANNEL.toString().replace("{channel_color}", ChatColor.valueOf(ChatChannel.getDefaultColor().toUpperCase()) + "") 44 | .replace("{channel_name}", ChatChannel.getDefaultChannel().getName())); 45 | } 46 | if (isThereABungeeChannel) { 47 | MineverseChat.synchronize(mcp, true); 48 | } 49 | return true; 50 | } 51 | mcp.getPlayer().sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/leave").replace("{args}", "[channel]")); 52 | return true; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Listen.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandSender; 6 | import org.bukkit.entity.Player; 7 | 8 | import mineverse.Aust1n46.chat.MineverseChat; 9 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 10 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 11 | import mineverse.Aust1n46.chat.channel.ChatChannel; 12 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 13 | 14 | public class Listen extends Command { 15 | public Listen() { 16 | super("listen"); 17 | } 18 | 19 | @Override 20 | public boolean execute(CommandSender sender, String command, String[] args) { 21 | if (!(sender instanceof Player)) { 22 | Bukkit.getServer().getConsoleSender().sendMessage(LocalizedMessage.COMMAND_MUST_BE_RUN_BY_PLAYER.toString()); 23 | return true; 24 | } 25 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); 26 | if (args.length > 0) { 27 | ChatChannel channel = ChatChannel.getChannel(args[0]); 28 | if (channel == null) { 29 | mcp.getPlayer().sendMessage(LocalizedMessage.INVALID_CHANNEL.toString().replace("{args}", args[0])); 30 | return true; 31 | } 32 | if (channel.hasPermission()) { 33 | if (!mcp.getPlayer().hasPermission(channel.getPermission())) { 34 | mcp.removeListening(channel.getName()); 35 | mcp.getPlayer().sendMessage(LocalizedMessage.CHANNEL_NO_PERMISSION.toString()); 36 | return true; 37 | } 38 | } 39 | mcp.addListening(channel.getName()); 40 | mcp.getPlayer() 41 | .sendMessage(LocalizedMessage.LISTEN_CHANNEL.toString().replace("{channel_color}", channel.getColor() + "").replace("{channel_name}", channel.getName())); 42 | if (channel.getBungee()) { 43 | MineverseChat.synchronize(mcp, true); 44 | } 45 | return true; 46 | } 47 | mcp.getPlayer().sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/listen").replace("{args}", "[channel]")); 48 | return true; 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Me.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.command.Command; 4 | import org.bukkit.command.CommandSender; 5 | import org.bukkit.entity.Player; 6 | 7 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 8 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 9 | import mineverse.Aust1n46.chat.utilities.Format; 10 | 11 | public class Me extends Command { 12 | public Me() { 13 | super("me"); 14 | } 15 | 16 | @Override 17 | public boolean execute(CommandSender sender, String command, String[] args) { 18 | if (sender.hasPermission("venturechat.me")) { 19 | if (args.length > 0) { 20 | String msg = ""; 21 | for (int x = 0; x < args.length; x++) 22 | if (args[x].length() > 0) 23 | msg += " " + args[x]; 24 | if (sender instanceof Player && MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender).hasFilter()) { 25 | msg = Format.FilterChat(msg); 26 | } 27 | if (sender.hasPermission("venturechat.color.legacy")) { 28 | msg = Format.FormatStringLegacyColor(msg); 29 | } 30 | if (sender.hasPermission("venturechat.color")) 31 | msg = Format.FormatStringColor(msg); 32 | if (sender.hasPermission("venturechat.format")) 33 | msg = Format.FormatString(msg); 34 | if (sender instanceof Player) { 35 | Player p = (Player) sender; 36 | Format.broadcastToServer("* " + p.getDisplayName() + msg); 37 | return true; 38 | } 39 | Format.broadcastToServer("* " + sender.getName() + msg); 40 | return true; 41 | } 42 | sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/me").replace("{args}", "[message]")); 43 | return true; 44 | } 45 | sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 46 | return true; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/RangedSpy.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandSender; 6 | import org.bukkit.entity.Player; 7 | 8 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 9 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 10 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 11 | 12 | public class RangedSpy extends Command { 13 | public RangedSpy() { 14 | super("rangedspy"); 15 | } 16 | 17 | @Override 18 | public boolean execute(CommandSender sender, String command, String[] args) { 19 | if (!(sender instanceof Player)) { 20 | Bukkit.getServer().getConsoleSender().sendMessage(LocalizedMessage.COMMAND_MUST_BE_RUN_BY_PLAYER.toString()); 21 | return true; 22 | } 23 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); 24 | if (mcp.getPlayer().hasPermission("venturechat.rangedspy")) { 25 | if (!mcp.getRangedSpy()) { 26 | mcp.setRangedSpy(true); 27 | mcp.getPlayer().sendMessage(LocalizedMessage.RANGED_SPY_ON.toString()); 28 | return true; 29 | } 30 | mcp.setRangedSpy(false); 31 | mcp.getPlayer().sendMessage(LocalizedMessage.RANGED_SPY_OFF.toString()); 32 | return true; 33 | } 34 | mcp.getPlayer().sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 35 | return true; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Removemessage.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import java.io.ByteArrayOutputStream; 4 | import java.io.DataOutputStream; 5 | import java.util.ArrayList; 6 | import java.util.HashMap; 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | import org.bukkit.ChatColor; 11 | import org.bukkit.command.Command; 12 | import org.bukkit.command.CommandSender; 13 | import org.bukkit.entity.Player; 14 | import org.bukkit.scheduler.BukkitRunnable; 15 | 16 | import com.comphenix.protocol.events.PacketContainer; 17 | import com.comphenix.protocol.wrappers.WrappedChatComponent; 18 | 19 | import mineverse.Aust1n46.chat.ChatMessage; 20 | import mineverse.Aust1n46.chat.MineverseChat; 21 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 22 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 23 | import mineverse.Aust1n46.chat.channel.ChatChannel; 24 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 25 | import mineverse.Aust1n46.chat.utilities.Format; 26 | 27 | public class Removemessage extends Command { 28 | private MineverseChat plugin = MineverseChat.getInstance(); 29 | private PacketContainer emptyLinePacketContainer = Format.createPacketPlayOutChat("{\"extra\":[\" \"],\"text\":\"\"}"); 30 | private WrappedChatComponent messageDeletedComponentPlayer = WrappedChatComponent.fromJson( 31 | "{\"text\":\"\",\"extra\":[{\"text\":\"\",\"extra\":[" + Format.convertToJsonColors(Format.FormatStringAll(plugin.getConfig().getString("messageremovertext"))) 32 | + "],\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[" 33 | + Format.convertToJsonColors(Format.FormatStringAll(plugin.getConfig().getString("messageremoverpermissions"))) + "]}}}]}"); 34 | 35 | public Removemessage() { 36 | super("removemessage"); 37 | } 38 | 39 | @Override 40 | @SuppressWarnings({ "unchecked", "rawtypes" }) 41 | public boolean execute(CommandSender sender, String command, String[] args) { 42 | if (args.length == 0) { 43 | sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/removemessage").replace("{args}", "[hashcode] {channel}")); 44 | return true; 45 | } 46 | final int hash; 47 | try { 48 | hash = Integer.parseInt(args[0]); 49 | } catch (Exception e) { 50 | sender.sendMessage(LocalizedMessage.INVALID_HASH.toString()); 51 | return true; 52 | } 53 | if (args.length > 1 && ChatChannel.isChannel(args[1]) && ChatChannel.getChannel(args[1]).getBungee() && sender instanceof Player) { 54 | ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); 55 | DataOutputStream out = new DataOutputStream(byteOutStream); 56 | try { 57 | out.writeUTF("RemoveMessage"); 58 | out.writeUTF(String.valueOf(hash)); 59 | ((Player) sender).sendPluginMessage(plugin, MineverseChat.PLUGIN_MESSAGING_CHANNEL, byteOutStream.toByteArray()); 60 | out.close(); 61 | } catch (Exception e) { 62 | e.printStackTrace(); 63 | } 64 | return true; 65 | } else { 66 | new BukkitRunnable() { 67 | public void run() { 68 | final Map> packets = new HashMap(); 69 | for (MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { 70 | List messages = p.getMessages(); 71 | List playerPackets = new ArrayList(); 72 | boolean resend = false; 73 | for (int fill = 0; fill < 100 - messages.size(); fill++) { 74 | playerPackets.add(Removemessage.this.emptyLinePacketContainer); 75 | } 76 | for (ChatMessage message : messages) { 77 | if (message.getHash() == hash) { 78 | WrappedChatComponent removedComponent = p.getPlayer().hasPermission("venturechat.message.bypass") 79 | ? Removemessage.this.getMessageDeletedChatComponentAdmin(message) 80 | : Removemessage.this.getMessageDeletedChatComponentPlayer(); 81 | message.setComponent(removedComponent); 82 | message.setHash(-1); 83 | playerPackets.add(Format.createPacketPlayOutChat(removedComponent)); 84 | resend = true; 85 | continue; 86 | } 87 | if (message.getMessage().contains(ChatColor.stripColor(Format.FormatStringAll(plugin.getConfig().getString("guiicon"))))) { 88 | String submessage = message.getMessage().substring(0, 89 | message.getMessage().length() - ChatColor.stripColor(Format.FormatStringAll(plugin.getConfig().getString("guiicon"))).length()); 90 | if (submessage.hashCode() == hash) { 91 | WrappedChatComponent removedComponent = p.getPlayer().hasPermission("venturechat.message.bypass") 92 | ? Removemessage.this.getMessageDeletedChatComponentAdmin(message) 93 | : Removemessage.this.getMessageDeletedChatComponentPlayer(); 94 | message.setComponent(removedComponent); 95 | message.setHash(-1); 96 | playerPackets.add(Format.createPacketPlayOutChat(removedComponent)); 97 | resend = true; 98 | continue; 99 | } 100 | } 101 | playerPackets.add(Format.createPacketPlayOutChat(message.getComponent())); 102 | 103 | } 104 | if (resend) { 105 | packets.put(p.getPlayer(), playerPackets); 106 | } 107 | } 108 | new BukkitRunnable() { 109 | public void run() { 110 | for (Player p : packets.keySet()) { 111 | List pPackets = packets.get(p); 112 | for (PacketContainer c : pPackets) { 113 | Format.sendPacketPlayOutChat(p, c); 114 | } 115 | } 116 | } 117 | }.runTask(plugin); 118 | } 119 | }.runTaskAsynchronously(plugin); 120 | return true; 121 | } 122 | } 123 | 124 | public WrappedChatComponent getMessageDeletedChatComponentPlayer() { 125 | return this.messageDeletedComponentPlayer; 126 | } 127 | 128 | public WrappedChatComponent getMessageDeletedChatComponentAdmin(ChatMessage message) { 129 | return WrappedChatComponent.fromJson( 130 | "[{\"text\":\"\",\"extra\":[{\"text\":\"\",\"extra\":[" + Format.convertToJsonColors(Format.FormatStringAll(plugin.getConfig().getString("messageremovertext"))) 131 | + "],\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\"," + message.getColoredMessage() + "}}}]}]"); 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Setchannel.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.command.Command; 4 | import org.bukkit.command.CommandSender; 5 | 6 | import mineverse.Aust1n46.chat.MineverseChat; 7 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 8 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 9 | import mineverse.Aust1n46.chat.channel.ChatChannel; 10 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 11 | 12 | public class Setchannel extends Command { 13 | public Setchannel() { 14 | super("setchannel"); 15 | } 16 | 17 | @Override 18 | public boolean execute(CommandSender sender, String command, String[] args) { 19 | if (sender.hasPermission("venturechat.setchannel")) { 20 | if (args.length < 2) { 21 | sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/setchannel").replace("{args}", "[player] [channel]")); 22 | return true; 23 | } 24 | MineverseChatPlayer player = MineverseChatAPI.getMineverseChatPlayer(args[0]); 25 | if (player == null) { 26 | sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString().replace("{args}", args[0])); 27 | return true; 28 | } 29 | ChatChannel channel = ChatChannel.getChannel(args[1]); 30 | if (channel == null) { 31 | sender.sendMessage(LocalizedMessage.INVALID_CHANNEL.toString().replace("{args}", args[1])); 32 | return true; 33 | } 34 | if (channel.hasPermission()) { 35 | if (!player.isOnline()) { 36 | sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE_NO_PERMISSIONS_CHECK.toString()); 37 | return true; 38 | } 39 | if (!player.getPlayer().hasPermission(channel.getPermission())) { 40 | player.removeListening(channel.getName()); 41 | sender.sendMessage(LocalizedMessage.SET_CHANNEL_PLAYER_CHANNEL_NO_PERMISSION.toString().replace("{player}", player.getName()) 42 | .replace("{channel_color}", channel.getColor() + "").replace("{channel_name}", channel.getName())); 43 | return true; 44 | } 45 | } 46 | player.addListening(channel.getName()); 47 | player.setCurrentChannel(channel); 48 | sender.sendMessage(LocalizedMessage.SET_CHANNEL_SENDER.toString().replace("{player}", player.getName()).replace("{channel_color}", channel.getColor() + "") 49 | .replace("{channel_name}", channel.getName())); 50 | if (player.hasConversation()) { 51 | for (MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { 52 | if (p.isSpy()) { 53 | p.getPlayer().sendMessage(LocalizedMessage.EXIT_PRIVATE_CONVERSATION_SPY.toString().replace("{player_sender}", player.getName()) 54 | .replace("{player_receiver}", MineverseChatAPI.getMineverseChatPlayer(player.getConversation()).getName())); 55 | } 56 | } 57 | if (player.isOnline()) 58 | player.getPlayer().sendMessage(LocalizedMessage.EXIT_PRIVATE_CONVERSATION.toString().replace("{player_receiver}", 59 | MineverseChatAPI.getMineverseChatPlayer(player.getConversation()).getName())); 60 | else 61 | player.setModified(true); 62 | player.setConversation(null); 63 | } 64 | if (player.isOnline()) 65 | player.getPlayer() 66 | .sendMessage(LocalizedMessage.SET_CHANNEL.toString().replace("{channel_color}", channel.getColor() + "").replace("{channel_name}", channel.getName())); 67 | else { 68 | player.setModified(true); 69 | } 70 | if (channel.getBungee()) { 71 | MineverseChat.synchronize(player, true); 72 | } 73 | return true; 74 | } 75 | sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 76 | return true; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Setchannelall.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.command.Command; 4 | import org.bukkit.command.CommandSender; 5 | 6 | import mineverse.Aust1n46.chat.MineverseChat; 7 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 8 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 9 | import mineverse.Aust1n46.chat.channel.ChatChannel; 10 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 11 | 12 | public class Setchannelall extends Command { 13 | public Setchannelall() { 14 | super("setchannelall"); 15 | } 16 | 17 | @Override 18 | public boolean execute(CommandSender sender, String command, String[] args) { 19 | if (sender.hasPermission("venturechat.setchannelall")) { 20 | if (args.length < 1) { 21 | sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/setchannelall").replace("{args}", "[player]")); 22 | return true; 23 | } 24 | MineverseChatPlayer player = MineverseChatAPI.getMineverseChatPlayer(args[0]); 25 | if (player == null) { 26 | sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString().replace("{args}", args[0])); 27 | return true; 28 | } 29 | boolean isThereABungeeChannel = false; 30 | for (ChatChannel channel : ChatChannel.getChatChannels()) { 31 | if (channel.hasPermission()) { 32 | if (!player.isOnline()) { 33 | sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE_NO_PERMISSIONS_CHECK.toString()); 34 | return true; 35 | } 36 | if (!player.getPlayer().hasPermission(channel.getPermission())) { 37 | player.removeListening(channel.getName()); 38 | } else { 39 | player.addListening(channel.getName()); 40 | } 41 | } else { 42 | player.addListening(channel.getName()); 43 | } 44 | if (channel.getBungee()) { 45 | isThereABungeeChannel = true; 46 | } 47 | } 48 | sender.sendMessage(LocalizedMessage.SET_CHANNEL_ALL_SENDER.toString().replace("{player}", player.getName())); 49 | if (player.isOnline()) 50 | player.getPlayer().sendMessage(LocalizedMessage.SET_CHANNEL_ALL_PLAYER.toString()); 51 | else 52 | player.setModified(true); 53 | if (isThereABungeeChannel) { 54 | MineverseChat.synchronize(player, true); 55 | } 56 | return true; 57 | } 58 | sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 59 | return true; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/VentureChatGui.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.bukkit.Bukkit; 7 | import org.bukkit.ChatColor; 8 | import org.bukkit.Material; 9 | import org.bukkit.command.Command; 10 | import org.bukkit.command.CommandSender; 11 | import org.bukkit.entity.Player; 12 | import org.bukkit.inventory.Inventory; 13 | import org.bukkit.inventory.ItemStack; 14 | import org.bukkit.inventory.meta.ItemMeta; 15 | import org.bukkit.inventory.meta.SkullMeta; 16 | 17 | import me.clip.placeholderapi.PlaceholderAPI; 18 | import mineverse.Aust1n46.chat.MineverseChat; 19 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 20 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 21 | import mineverse.Aust1n46.chat.channel.ChatChannel; 22 | import mineverse.Aust1n46.chat.gui.GuiSlot; 23 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 24 | import mineverse.Aust1n46.chat.utilities.Format; 25 | import mineverse.Aust1n46.chat.versions.VersionHandler; 26 | 27 | public class VentureChatGui extends Command { 28 | private MineverseChat plugin = MineverseChat.getInstance(); 29 | 30 | public VentureChatGui() { 31 | super("venturechatgui"); 32 | } 33 | 34 | @Override 35 | public boolean execute(CommandSender sender, String command, String[] args) { 36 | if (!(sender instanceof Player)) { 37 | Bukkit.getServer().getConsoleSender().sendMessage(LocalizedMessage.COMMAND_MUST_BE_RUN_BY_PLAYER.toString()); 38 | return true; 39 | } 40 | if (args.length < 3) { 41 | sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/venturechatgui").replace("{args}", "[player] [channel] [hashcode]")); 42 | return true; 43 | } 44 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); 45 | if (mcp.getPlayer().hasPermission("venturechat.gui")) { 46 | MineverseChatPlayer target = MineverseChatAPI.getMineverseChatPlayer(args[0]); 47 | if (target == null && !args[0].equals("Discord")) { 48 | mcp.getPlayer().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString().replace("{args}", args[0])); 49 | return true; 50 | } 51 | if (ChatChannel.isChannel(args[1])) { 52 | ChatChannel channel = ChatChannel.getChannel(args[1]); 53 | final int hash; 54 | try { 55 | hash = Integer.parseInt(args[2]); 56 | } catch (Exception e) { 57 | sender.sendMessage(LocalizedMessage.INVALID_HASH.toString()); 58 | return true; 59 | } 60 | if (args[0].equals("Discord")) { 61 | this.openInventoryDiscord(mcp, channel, hash); 62 | return true; 63 | } 64 | this.openInventory(mcp, target, channel, hash); 65 | return true; 66 | } 67 | mcp.getPlayer().sendMessage(LocalizedMessage.INVALID_CHANNEL.toString().replace("{args}", args[1])); 68 | return true; 69 | } 70 | mcp.getPlayer().sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 71 | return true; 72 | } 73 | 74 | @SuppressWarnings("deprecation") 75 | private void openInventory(MineverseChatPlayer mcp, MineverseChatPlayer target, ChatChannel channel, int hash) { 76 | Inventory inv = Bukkit.createInventory(null, this.getSlots(), "VentureChat: " + target.getName() + " GUI"); 77 | ItemStack close = null; 78 | ItemStack skull = null; 79 | if (VersionHandler.is1_7()) { 80 | close = new ItemStack(Material.BEDROCK); 81 | } else { 82 | close = new ItemStack(Material.BARRIER); 83 | } 84 | 85 | if (VersionHandler.is1_7() || VersionHandler.is1_8() || VersionHandler.is1_9() || VersionHandler.is1_10() || VersionHandler.is1_11() || VersionHandler.is1_12()) { 86 | skull = new ItemStack(Material.getMaterial("SKULL_ITEM")); 87 | } else { 88 | skull = new ItemStack(Material.PLAYER_HEAD); 89 | } 90 | 91 | ItemMeta closeMeta = close.getItemMeta(); 92 | closeMeta.setDisplayName(ChatColor.RED + "" + ChatColor.ITALIC + "Close GUI"); 93 | close.setItemMeta(closeMeta); 94 | 95 | SkullMeta skullMeta = (SkullMeta) skull.getItemMeta(); 96 | skullMeta.setOwner(target.getName()); 97 | skullMeta.setDisplayName(ChatColor.AQUA + target.getName()); 98 | List skullLore = new ArrayList(); 99 | skullLore.add(ChatColor.GRAY + "Channel: " + channel.getColor() + channel.getName()); 100 | skullLore.add(ChatColor.GRAY + "Hash: " + channel.getColor() + hash); 101 | skullMeta.setLore(skullLore); 102 | skull.setItemMeta(skullMeta); 103 | skull.setDurability((short) 3); 104 | inv.setItem(0, skull); 105 | 106 | for (GuiSlot g : GuiSlot.getGuiSlots()) { 107 | if (!g.hasPermission() || mcp.getPlayer().hasPermission(g.getPermission())) { 108 | if (this.checkSlot(g.getSlot())) { 109 | MineverseChat.getInstance().getServer().getConsoleSender() 110 | .sendMessage(Format.FormatStringAll("&cGUI: " + g.getName() + " has invalid slot: " + g.getSlot() + "!")); 111 | continue; 112 | } 113 | ItemStack gStack = new ItemStack(g.getIcon()); 114 | gStack.setDurability((short) g.getDurability()); 115 | ItemMeta gMeta = gStack.getItemMeta(); 116 | String displayName = g.getText().replace("{player_name}", target.getName()).replace("{channel}", channel.getName()).replace("{hash}", hash + ""); 117 | if (target.isOnline()) { 118 | displayName = PlaceholderAPI.setBracketPlaceholders(target.getPlayer(), displayName); 119 | } 120 | gMeta.setDisplayName(Format.FormatStringAll(displayName)); 121 | List gLore = new ArrayList(); 122 | gMeta.setLore(gLore); 123 | gStack.setItemMeta(gMeta); 124 | inv.setItem(g.getSlot(), gStack); 125 | } 126 | } 127 | 128 | inv.setItem(8, close); 129 | mcp.getPlayer().openInventory(inv); 130 | } 131 | 132 | @SuppressWarnings("deprecation") 133 | private void openInventoryDiscord(MineverseChatPlayer mcp, ChatChannel channel, int hash) { 134 | Inventory inv = Bukkit.createInventory(null, this.getSlots(), "VentureChat: Discord_Message GUI"); 135 | ItemStack close = null; 136 | ItemStack skull = null; 137 | if (VersionHandler.is1_7()) { 138 | close = new ItemStack(Material.BEDROCK); 139 | } else { 140 | close = new ItemStack(Material.BARRIER); 141 | } 142 | 143 | if (VersionHandler.is1_7() || VersionHandler.is1_8() || VersionHandler.is1_9() || VersionHandler.is1_10() || VersionHandler.is1_11() || VersionHandler.is1_12()) { 144 | skull = new ItemStack(Material.getMaterial("SKULL_ITEM")); 145 | } else { 146 | skull = new ItemStack(Material.PLAYER_HEAD); 147 | } 148 | 149 | ItemMeta closeMeta = close.getItemMeta(); 150 | closeMeta.setDisplayName("�oClose GUI"); 151 | close.setItemMeta(closeMeta); 152 | 153 | SkullMeta skullMeta = (SkullMeta) skull.getItemMeta(); 154 | skullMeta.setOwner("Scarsz"); 155 | skullMeta.setDisplayName("�bDiscord_Message"); 156 | List skullLore = new ArrayList(); 157 | skullLore.add("�7Channel: " + channel.getColor() + channel.getName()); 158 | skullLore.add("�7Hash: " + channel.getColor() + hash); 159 | skullMeta.setLore(skullLore); 160 | skull.setItemMeta(skullMeta); 161 | skull.setDurability((short) 3); 162 | inv.setItem(0, skull); 163 | 164 | for (GuiSlot g : GuiSlot.getGuiSlots()) { 165 | if (!g.hasPermission() || mcp.getPlayer().hasPermission(g.getPermission())) { 166 | if (this.checkSlot(g.getSlot())) { 167 | MineverseChat.getInstance().getServer().getConsoleSender() 168 | .sendMessage(Format.FormatStringAll("&cGUI: " + g.getName() + " has invalid slot: " + g.getSlot() + "!")); 169 | continue; 170 | } 171 | ItemStack gStack = new ItemStack(g.getIcon()); 172 | gStack.setDurability((short) g.getDurability()); 173 | ItemMeta gMeta = gStack.getItemMeta(); 174 | String displayName = g.getText().replace("{player_name}", "Discord_Message").replace("{channel}", channel.getName()).replace("{hash}", hash + ""); 175 | gMeta.setDisplayName(Format.FormatStringAll(displayName)); 176 | List gLore = new ArrayList(); 177 | gMeta.setLore(gLore); 178 | gStack.setItemMeta(gMeta); 179 | inv.setItem(g.getSlot(), gStack); 180 | } 181 | } 182 | 183 | inv.setItem(8, close); 184 | mcp.getPlayer().openInventory(inv); 185 | } 186 | 187 | private boolean checkSlot(int slot) { 188 | return slot == 0 || slot == 8; 189 | } 190 | 191 | private int getSlots() { 192 | int rows = plugin.getConfig().getInt("guirows", 1); 193 | if (rows == 2) 194 | return 18; 195 | if (rows == 3) 196 | return 27; 197 | if (rows == 4) 198 | return 36; 199 | if (rows == 5) 200 | return 45; 201 | if (rows == 6) 202 | return 54; 203 | return 9; 204 | } 205 | } 206 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/chat/Venturechat.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.chat; 2 | 3 | import org.bukkit.command.Command; 4 | //import org.bukkit.ChatColor; 5 | import org.bukkit.command.CommandSender; 6 | //import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; 7 | //import org.bukkit.entity.Player; 8 | 9 | import mineverse.Aust1n46.chat.MineverseChat; 10 | import mineverse.Aust1n46.chat.localization.InternalMessage; 11 | //import net.md_5.bungee.api.chat.ClickEvent; 12 | //import net.md_5.bungee.api.chat.ComponentBuilder; 13 | //import net.md_5.bungee.api.chat.HoverEvent; 14 | //import net.md_5.bungee.api.chat.TextComponent; 15 | //import net.minecraft.server.v1_15_R1.IChatBaseComponent; 16 | //import net.minecraft.server.v1_15_R1.PacketPlayOutChat; 17 | 18 | public class Venturechat extends Command { 19 | private MineverseChat plugin = MineverseChat.getInstance(); 20 | 21 | public Venturechat() { 22 | super("venturechat"); 23 | } 24 | 25 | @Override 26 | public boolean execute(CommandSender sender, String command, String[] args) { 27 | sender.sendMessage(InternalMessage.VENTURECHAT_VERSION.toString() 28 | .replace("{version}", plugin.getDescription().getVersion())); 29 | sender.sendMessage(InternalMessage.VENTURECHAT_AUTHOR.toString()); 30 | return true; 31 | // if (sender instanceof Player && plugin.getConfig().getString("loglevel", "info").equals("debug")) { 32 | // Player player = (Player) sender; 33 | // String title = ChatColor.GOLD + " | " + ChatColor.BLUE.toString() + ChatColor.BOLD + "SpigotAPI chat message" + ChatColor.RESET + ChatColor.GOLD + " | "; 34 | // String spaces = " "; 35 | // TextComponent tcSpaces = new TextComponent(spaces); 36 | // TextComponent message = new TextComponent(title); 37 | // message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Click here to rank up!").create())); 38 | // message.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "Sample SpigotAPI Click Event")); 39 | // tcSpaces.addExtra(message); 40 | // player.spigot().sendMessage(tcSpaces); 41 | // 42 | //// sendActionBar(player, "NMS ActionBar message"); 43 | // } 44 | } 45 | 46 | // public static void sendActionBar(Player player, String message) { 47 | // message= message.replaceAll("%player%", player.getDisplayName()); 48 | // message = ChatColor.translateAlternateColorCodes('&', message); 49 | // CraftPlayer p = (CraftPlayer) player; 50 | // IChatBaseComponent cbc = IChatBaseComponent.ChatSerializer.a("{\"text\": \"" + message + "\"}"); 51 | // PacketPlayOutChat ppoc = new PacketPlayOutChat(cbc); 52 | // try { 53 | // MineverseChat.posField.set(ppoc, MineverseChat.chatMessageType.getEnumConstants()[2]); 54 | // } 55 | // catch (Exception e) { 56 | // e.printStackTrace(); 57 | // } 58 | // p.getHandle().playerConnection.sendPacket(ppoc); 59 | // } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/message/Ignore.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.message; 2 | 3 | import java.io.ByteArrayOutputStream; 4 | import java.io.DataOutputStream; 5 | import java.util.ArrayList; 6 | import java.util.Collections; 7 | import java.util.List; 8 | import java.util.UUID; 9 | 10 | import org.bukkit.ChatColor; 11 | import org.bukkit.command.Command; 12 | import org.bukkit.command.CommandSender; 13 | import org.bukkit.entity.Player; 14 | import org.bukkit.util.StringUtil; 15 | 16 | import mineverse.Aust1n46.chat.MineverseChat; 17 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 18 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 19 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 20 | 21 | public class Ignore extends Command { 22 | public Ignore() { 23 | super("ignore"); 24 | } 25 | 26 | private MineverseChat plugin = MineverseChat.getInstance(); 27 | 28 | @Override 29 | public boolean execute(CommandSender sender, String command, String[] args) { 30 | if (!(sender instanceof Player)) { 31 | plugin.getServer().getConsoleSender().sendMessage(LocalizedMessage.COMMAND_MUST_BE_RUN_BY_PLAYER.toString()); 32 | return true; 33 | } 34 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); 35 | if (args.length == 0) { 36 | mcp.getPlayer().sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS_IGNORE.toString()); 37 | return true; 38 | } 39 | if (args[0].equalsIgnoreCase("list")) { 40 | String ignoreList = ""; 41 | for (UUID ignore : mcp.getIgnores()) { 42 | MineverseChatPlayer i = MineverseChatAPI.getMineverseChatPlayer(ignore); 43 | String iName = ignore.toString(); 44 | if (i != null) { 45 | iName = i.getName(); 46 | } 47 | ignoreList += ChatColor.RED + iName + ChatColor.WHITE + ", "; 48 | } 49 | mcp.getPlayer().sendMessage(LocalizedMessage.IGNORE_LIST_HEADER.toString()); 50 | if (ignoreList.length() > 0) { 51 | mcp.getPlayer().sendMessage(ignoreList.substring(0, ignoreList.length() - 2)); 52 | } 53 | return true; 54 | } 55 | if (mcp.getName().equalsIgnoreCase(args[0])) { 56 | mcp.getPlayer().sendMessage(LocalizedMessage.IGNORE_YOURSELF.toString()); 57 | return true; 58 | } 59 | if (plugin.getConfig().getBoolean("bungeecordmessaging", true)) { 60 | ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); 61 | DataOutputStream out = new DataOutputStream(byteOutStream); 62 | try { 63 | out.writeUTF("Ignore"); 64 | out.writeUTF("Send"); 65 | out.writeUTF(args[0]); 66 | out.writeUTF(mcp.getUUID().toString()); 67 | mcp.getPlayer().sendPluginMessage(plugin, MineverseChat.PLUGIN_MESSAGING_CHANNEL, byteOutStream.toByteArray()); 68 | out.close(); 69 | } catch (Exception e) { 70 | e.printStackTrace(); 71 | } 72 | return true; 73 | } 74 | 75 | MineverseChatPlayer player = MineverseChatAPI.getOnlineMineverseChatPlayer(args[0]); 76 | if (player == null) { 77 | mcp.getPlayer().sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString().replace("{args}", args[0])); 78 | return true; 79 | } 80 | if (mcp.getIgnores().contains(player.getUUID())) { 81 | mcp.getPlayer().sendMessage(LocalizedMessage.IGNORE_PLAYER_OFF.toString().replace("{player}", player.getName())); 82 | mcp.removeIgnore(player.getUUID()); 83 | MineverseChat.synchronize(mcp, true); 84 | return true; 85 | } 86 | if (player.getPlayer().hasPermission("venturechat.ignore.bypass")) { 87 | mcp.getPlayer().sendMessage(LocalizedMessage.IGNORE_PLAYER_CANT.toString().replace("{player}", player.getName())); 88 | return true; 89 | } 90 | mcp.getPlayer().sendMessage(LocalizedMessage.IGNORE_PLAYER_ON.toString().replace("{player}", player.getName())); 91 | mcp.addIgnore(player.getUUID()); 92 | MineverseChat.synchronize(mcp, true); 93 | return true; 94 | } 95 | 96 | @Override 97 | public List tabComplete(CommandSender sender, String label, String[] args) { 98 | if (plugin.getConfig().getBoolean("bungeecordmessaging", true)) { 99 | List completions = new ArrayList<>(); 100 | StringUtil.copyPartialMatches(args[args.length - 1], MineverseChatAPI.getNetworkPlayerNames(), completions); 101 | Collections.sort(completions); 102 | return completions; 103 | } 104 | return super.tabComplete(sender, label, args); 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/message/MessageToggle.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.message; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandSender; 6 | import org.bukkit.entity.Player; 7 | 8 | import mineverse.Aust1n46.chat.MineverseChat; 9 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 10 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 11 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 12 | 13 | public class MessageToggle extends Command { 14 | public MessageToggle() { 15 | super("messagetoggle"); 16 | } 17 | 18 | @Override 19 | public boolean execute(CommandSender sender, String command, String[] args) { 20 | if (!(sender instanceof Player)) { 21 | Bukkit.getServer().getConsoleSender().sendMessage(LocalizedMessage.COMMAND_MUST_BE_RUN_BY_PLAYER.toString()); 22 | return true; 23 | } 24 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); 25 | if (mcp.getPlayer().hasPermission("venturechat.messagetoggle")) { 26 | if (!mcp.getMessageToggle()) { 27 | mcp.setMessageToggle(true); 28 | mcp.getPlayer().sendMessage(LocalizedMessage.MESSAGE_TOGGLE_ON.toString()); 29 | MineverseChat.synchronize(mcp, true); 30 | return true; 31 | } 32 | mcp.setMessageToggle(false); 33 | mcp.getPlayer().sendMessage(LocalizedMessage.MESSAGE_TOGGLE_OFF.toString()); 34 | MineverseChat.synchronize(mcp, true); 35 | return true; 36 | } 37 | mcp.getPlayer().sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 38 | return true; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/message/Notifications.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.message; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandSender; 6 | import org.bukkit.entity.Player; 7 | 8 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 9 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 10 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 11 | 12 | public class Notifications extends Command { 13 | public Notifications() { 14 | super("notifications"); 15 | } 16 | 17 | @Override 18 | public boolean execute(CommandSender sender, String command, String[] args) { 19 | if (!(sender instanceof Player)) { 20 | Bukkit.getServer().getConsoleSender().sendMessage(LocalizedMessage.COMMAND_MUST_BE_RUN_BY_PLAYER.toString()); 21 | return true; 22 | } 23 | 24 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); 25 | if (!mcp.hasNotifications()) { 26 | mcp.setNotifications(true); 27 | mcp.getPlayer().sendMessage(LocalizedMessage.NOTIFICATIONS_ON.toString()); 28 | return true; 29 | } 30 | mcp.setNotifications(false); 31 | mcp.getPlayer().sendMessage(LocalizedMessage.NOTIFICATIONS_OFF.toString()); 32 | return true; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/message/Reply.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.message; 2 | 3 | import java.io.ByteArrayOutputStream; 4 | import java.io.DataOutputStream; 5 | 6 | import org.bukkit.command.Command; 7 | import org.bukkit.command.CommandSender; 8 | import org.bukkit.entity.Player; 9 | 10 | import me.clip.placeholderapi.PlaceholderAPI; 11 | import mineverse.Aust1n46.chat.MineverseChat; 12 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 13 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 14 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 15 | import mineverse.Aust1n46.chat.utilities.Format; 16 | 17 | public class Reply extends Command { 18 | private MineverseChat plugin = MineverseChat.getInstance(); 19 | 20 | public Reply() { 21 | super("reply"); 22 | } 23 | 24 | @Override 25 | public boolean execute(CommandSender sender, String command, String[] args) { 26 | if (!(sender instanceof Player)) { 27 | plugin.getServer().getConsoleSender().sendMessage(LocalizedMessage.COMMAND_MUST_BE_RUN_BY_PLAYER.toString()); 28 | return true; 29 | } 30 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); 31 | if (args.length > 0) { 32 | if (mcp.hasReplyPlayer()) { 33 | if (plugin.getConfig().getBoolean("bungeecordmessaging", true)) { 34 | sendBungeeCordReply(mcp, args); 35 | return true; 36 | } 37 | 38 | MineverseChatPlayer player = MineverseChatAPI.getOnlineMineverseChatPlayer(mcp.getReplyPlayer()); 39 | if (player == null) { 40 | mcp.getPlayer().sendMessage(LocalizedMessage.NO_PLAYER_TO_REPLY_TO.toString()); 41 | return true; 42 | } 43 | if (!mcp.getPlayer().canSee(player.getPlayer())) { 44 | mcp.getPlayer().sendMessage(LocalizedMessage.NO_PLAYER_TO_REPLY_TO.toString()); 45 | return true; 46 | } 47 | if (player.getIgnores().contains(mcp.getUUID())) { 48 | mcp.getPlayer().sendMessage(LocalizedMessage.IGNORING_MESSAGE.toString().replace("{player}", player.getName())); 49 | return true; 50 | } 51 | if (!player.getMessageToggle()) { 52 | mcp.getPlayer().sendMessage(LocalizedMessage.BLOCKING_MESSAGE.toString().replace("{player}", player.getName())); 53 | return true; 54 | } 55 | String msg = ""; 56 | String echo = ""; 57 | String send = ""; 58 | String spy = ""; 59 | if (args.length > 0) { 60 | for (int r = 0; r < args.length; r++) 61 | msg += " " + args[r]; 62 | if (mcp.hasFilter()) { 63 | msg = Format.FilterChat(msg); 64 | } 65 | if (mcp.getPlayer().hasPermission("venturechat.color.legacy")) { 66 | msg = Format.FormatStringLegacyColor(msg); 67 | } 68 | if (mcp.getPlayer().hasPermission("venturechat.color")) { 69 | msg = Format.FormatStringColor(msg); 70 | } 71 | if (mcp.getPlayer().hasPermission("venturechat.format")) { 72 | msg = Format.FormatString(msg); 73 | } 74 | 75 | send = Format 76 | .FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("replyformatfrom").replaceAll("sender_", ""))); 77 | echo = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("replyformatto").replaceAll("sender_", ""))); 78 | spy = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("replyformatspy").replaceAll("sender_", ""))); 79 | 80 | send = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(player.getPlayer(), send.replaceAll("receiver_", ""))) + msg; 81 | echo = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(player.getPlayer(), echo.replaceAll("receiver_", ""))) + msg; 82 | spy = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(player.getPlayer(), spy.replaceAll("receiver_", ""))) + msg; 83 | 84 | if (!mcp.getPlayer().hasPermission("venturechat.spy.override")) { 85 | for (MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { 86 | if (p.getName().equals(mcp.getName()) || p.getName().equals(player.getName())) { 87 | continue; 88 | } 89 | if (p.isSpy()) { 90 | p.getPlayer().sendMessage(spy); 91 | } 92 | } 93 | } 94 | player.getPlayer().sendMessage(send); 95 | mcp.getPlayer().sendMessage(echo); 96 | if (player.hasNotifications()) { 97 | Format.playMessageSound(player); 98 | } 99 | player.setReplyPlayer(mcp.getUUID()); 100 | return true; 101 | } 102 | } 103 | mcp.getPlayer().sendMessage(LocalizedMessage.NO_PLAYER_TO_REPLY_TO.toString()); 104 | return true; 105 | } 106 | mcp.getPlayer().sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/reply").replace("{args}", "[message]")); 107 | return true; 108 | } 109 | 110 | private void sendBungeeCordReply(MineverseChatPlayer mcp, String[] args) { 111 | ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); 112 | DataOutputStream out = new DataOutputStream(byteOutStream); 113 | StringBuilder msgBuilder = new StringBuilder(); 114 | for (int r = 0; r < args.length; r++) { 115 | msgBuilder.append(" " + args[r]); 116 | } 117 | String msg = msgBuilder.toString(); 118 | if (mcp.hasFilter()) { 119 | msg = Format.FilterChat(msg); 120 | } 121 | if (mcp.getPlayer().hasPermission("venturechat.color.legacy")) { 122 | msg = Format.FormatStringLegacyColor(msg); 123 | } 124 | if (mcp.getPlayer().hasPermission("venturechat.color")) { 125 | msg = Format.FormatStringColor(msg); 126 | } 127 | if (mcp.getPlayer().hasPermission("venturechat.format")) { 128 | msg = Format.FormatString(msg); 129 | } 130 | 131 | String send = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("replyformatfrom").replaceAll("sender_", ""))); 132 | String echo = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("replyformatto").replaceAll("sender_", ""))); 133 | String spy = "VentureChat:NoSpy"; 134 | if (!mcp.getPlayer().hasPermission("venturechat.spy.override")) { 135 | spy = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(mcp.getPlayer(), plugin.getConfig().getString("replyformatspy").replaceAll("sender_", ""))); 136 | } 137 | try { 138 | out.writeUTF("Message"); 139 | out.writeUTF("Send"); 140 | out.writeUTF(MineverseChatAPI.getMineverseChatPlayer(mcp.getReplyPlayer()).getName()); 141 | out.writeUTF(mcp.getUUID().toString()); 142 | out.writeUTF(mcp.getName()); 143 | out.writeUTF(send); 144 | out.writeUTF(echo); 145 | out.writeUTF(spy); 146 | out.writeUTF(msg); 147 | mcp.getPlayer().sendPluginMessage(plugin, MineverseChat.PLUGIN_MESSAGING_CHANNEL, byteOutStream.toByteArray()); 148 | out.close(); 149 | } catch (Exception e) { 150 | e.printStackTrace(); 151 | } 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/message/Spy.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.message; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandSender; 6 | import org.bukkit.entity.Player; 7 | 8 | import mineverse.Aust1n46.chat.MineverseChat; 9 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 10 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 11 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 12 | 13 | public class Spy extends Command { 14 | public Spy() { 15 | super("spy"); 16 | } 17 | 18 | @Override 19 | public boolean execute(CommandSender sender, String command, String[] args) { 20 | if (!(sender instanceof Player)) { 21 | Bukkit.getServer().getConsoleSender().sendMessage(LocalizedMessage.COMMAND_MUST_BE_RUN_BY_PLAYER.toString()); 22 | return true; 23 | } 24 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) sender); 25 | if (mcp.getPlayer().hasPermission("venturechat.spy")) { 26 | if (!mcp.isSpy()) { 27 | mcp.setSpy(true); 28 | mcp.getPlayer().sendMessage(LocalizedMessage.SPY_ON.toString()); 29 | MineverseChat.synchronize(mcp, true); 30 | return true; 31 | } 32 | mcp.setSpy(false); 33 | mcp.getPlayer().sendMessage(LocalizedMessage.SPY_OFF.toString()); 34 | MineverseChat.synchronize(mcp, true); 35 | return true; 36 | } 37 | mcp.getPlayer().sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 38 | return true; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/mute/MuteContainer.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.mute; 2 | 3 | public class MuteContainer { 4 | private String channel; 5 | private String reason; 6 | private long duration; 7 | 8 | public MuteContainer(String channel) { 9 | this(channel, 0, ""); 10 | } 11 | 12 | public MuteContainer(String channel, long duration) { 13 | this(channel, duration, ""); 14 | } 15 | 16 | public MuteContainer(String channel, String reason) { 17 | this(channel, 0, reason); 18 | } 19 | 20 | public MuteContainer(String channel, long duration, String reason) { 21 | this.channel = channel; 22 | this.reason = reason; 23 | this.duration = duration; 24 | } 25 | 26 | public String getChannel() { 27 | return channel; 28 | } 29 | 30 | public boolean hasReason() { 31 | return !reason.equals(""); 32 | } 33 | 34 | public String getReason() { 35 | return reason; 36 | } 37 | 38 | public boolean hasDuration() { 39 | return duration > 0; 40 | } 41 | 42 | public long getDuration() { 43 | return duration; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/mute/Muteall.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.mute; 2 | 3 | import org.bukkit.command.Command; 4 | import org.bukkit.command.CommandSender; 5 | 6 | import mineverse.Aust1n46.chat.MineverseChat; 7 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 8 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 9 | import mineverse.Aust1n46.chat.channel.ChatChannel; 10 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 11 | import mineverse.Aust1n46.chat.utilities.Format; 12 | 13 | public class Muteall extends Command { 14 | public Muteall() { 15 | super("muteall"); 16 | } 17 | 18 | @Override 19 | public boolean execute(CommandSender sender, String command, String[] args) { 20 | if (sender.hasPermission("venturechat.mute")) { 21 | if (args.length < 1) { 22 | sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/muteall").replace("{args}", "[player] {reason}")); 23 | return true; 24 | } 25 | MineverseChatPlayer player = MineverseChatAPI.getMineverseChatPlayer(args[0]); 26 | if (player == null || (!player.isOnline() && !sender.hasPermission("venturechat.mute.offline"))) { 27 | sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString().replace("{args}", args[0])); 28 | return true; 29 | } 30 | String reason = ""; 31 | if (args.length > 1) { 32 | StringBuilder reasonBuilder = new StringBuilder(); 33 | for (int a = 1; a < args.length; a++) { 34 | reasonBuilder.append(args[a] + " "); 35 | } 36 | reason = Format.FormatStringAll(reasonBuilder.toString().trim()); 37 | } 38 | if (reason.isEmpty()) { 39 | boolean bungee = false; 40 | for (ChatChannel channel : ChatChannel.getChatChannels()) { 41 | if (channel.isMutable()) { 42 | player.addMute(channel.getName()); 43 | if (channel.getBungee()) { 44 | bungee = true; 45 | } 46 | } 47 | } 48 | if (bungee) { 49 | MineverseChat.synchronize(player, true); 50 | } 51 | sender.sendMessage(LocalizedMessage.MUTE_PLAYER_ALL_SENDER.toString().replace("{player}", player.getName())); 52 | if (player.isOnline()) { 53 | player.getPlayer().sendMessage(LocalizedMessage.MUTE_PLAYER_ALL_PLAYER.toString()); 54 | } else 55 | player.setModified(true); 56 | return true; 57 | } else { 58 | boolean bungee = false; 59 | for (ChatChannel channel : ChatChannel.getChatChannels()) { 60 | if (channel.isMutable()) { 61 | player.addMute(channel.getName(), reason); 62 | if (channel.getBungee()) { 63 | bungee = true; 64 | } 65 | } 66 | } 67 | if (bungee) { 68 | MineverseChat.synchronize(player, true); 69 | } 70 | sender.sendMessage(LocalizedMessage.MUTE_PLAYER_ALL_SENDER_REASON.toString().replace("{player}", player.getName()).replace("{reason}", reason)); 71 | if (player.isOnline()) { 72 | player.getPlayer().sendMessage(LocalizedMessage.MUTE_PLAYER_ALL_PLAYER_REASON.toString().replace("{reason}", reason)); 73 | } else 74 | player.setModified(true); 75 | return true; 76 | } 77 | } else { 78 | sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 79 | return true; 80 | } 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/mute/Unmute.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.mute; 2 | 3 | import java.io.ByteArrayOutputStream; 4 | import java.io.DataOutputStream; 5 | import java.util.ArrayList; 6 | import java.util.Collections; 7 | import java.util.List; 8 | import java.util.stream.Collectors; 9 | 10 | import org.bukkit.command.Command; 11 | import org.bukkit.command.CommandSender; 12 | import org.bukkit.entity.Player; 13 | import org.bukkit.util.StringUtil; 14 | 15 | import mineverse.Aust1n46.chat.MineverseChat; 16 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 17 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 18 | import mineverse.Aust1n46.chat.channel.ChatChannel; 19 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 20 | 21 | public class Unmute extends Command { 22 | public Unmute() { 23 | super("unmute"); 24 | } 25 | 26 | @Override 27 | public boolean execute(CommandSender sender, String command, String[] args) { 28 | if (sender.hasPermission("venturechat.mute")) { 29 | if (args.length < 2) { 30 | sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/unmute").replace("{args}", "[channel] [player]")); 31 | return true; 32 | } 33 | if (ChatChannel.isChannel(args[0])) { 34 | ChatChannel channel = ChatChannel.getChannel(args[0]); 35 | if (channel.getBungee()) { 36 | sendBungeeCordUnmute(sender, args[1], channel); 37 | return true; 38 | } 39 | MineverseChatPlayer player = MineverseChatAPI.getMineverseChatPlayer(args[1]); 40 | if (player == null || (!player.isOnline() && !sender.hasPermission("venturechat.mute.offline"))) { 41 | sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString().replace("{args}", args[1])); 42 | return true; 43 | } 44 | if (!player.isMuted(channel.getName())) { 45 | sender.sendMessage(LocalizedMessage.PLAYER_NOT_MUTED.toString().replace("{player}", player.getName()).replace("{channel_color}", channel.getColor()) 46 | .replace("{channel_name}", channel.getName())); 47 | return true; 48 | } 49 | player.removeMute(channel.getName()); 50 | sender.sendMessage(LocalizedMessage.UNMUTE_PLAYER_SENDER.toString().replace("{player}", player.getName()).replace("{channel_color}", channel.getColor()) 51 | .replace("{channel_name}", channel.getName())); 52 | if (player.isOnline()) { 53 | player.getPlayer().sendMessage(LocalizedMessage.UNMUTE_PLAYER_PLAYER.toString().replace("{player}", player.getName()) 54 | .replace("{channel_color}", channel.getColor()).replace("{channel_name}", channel.getName())); 55 | } else { 56 | player.setModified(true); 57 | } 58 | return true; 59 | } 60 | sender.sendMessage(LocalizedMessage.INVALID_CHANNEL.toString().replace("{args}", args[0])); 61 | return true; 62 | } else { 63 | sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 64 | return true; 65 | } 66 | } 67 | 68 | @Override 69 | public List tabComplete(CommandSender sender, String label, String[] args) { 70 | List completions = new ArrayList<>(); 71 | if (args.length == 1) { 72 | StringUtil.copyPartialMatches(args[0], ChatChannel.getChatChannels().stream().map(ChatChannel::getName).collect(Collectors.toList()), completions); 73 | Collections.sort(completions); 74 | return completions; 75 | } 76 | if (args.length == 2) { 77 | if (ChatChannel.isChannel(args[0])) { 78 | ChatChannel chatChannelObj = ChatChannel.getChannel(args[0]); 79 | if (chatChannelObj.getBungee()) { 80 | StringUtil.copyPartialMatches(args[1], MineverseChatAPI.getNetworkPlayerNames(), completions); 81 | Collections.sort(completions); 82 | return completions; 83 | } 84 | StringUtil.copyPartialMatches(args[1], MineverseChatAPI.getOnlineMineverseChatPlayers().stream().filter(mcp -> mcp.isMuted(chatChannelObj.getName())) 85 | .map(MineverseChatPlayer::getName).collect(Collectors.toList()), completions); 86 | Collections.sort(completions); 87 | return completions; 88 | } 89 | } 90 | return Collections.emptyList(); 91 | } 92 | 93 | private void sendBungeeCordUnmute(CommandSender sender, String playerToUnmute, ChatChannel channel) { 94 | ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream(); 95 | DataOutputStream out = new DataOutputStream(byteOutStream); 96 | try { 97 | out.writeUTF("Unmute"); 98 | out.writeUTF("Send"); 99 | if (sender instanceof Player) { 100 | out.writeUTF(((Player) sender).getUniqueId().toString()); 101 | } else { 102 | out.writeUTF("VentureChat:Console"); 103 | } 104 | out.writeUTF(playerToUnmute); 105 | out.writeUTF(channel.getName()); 106 | MineverseChat.sendPluginMessage(byteOutStream); 107 | out.close(); 108 | } catch (Exception e) { 109 | e.printStackTrace(); 110 | } 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/command/mute/Unmuteall.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.command.mute; 2 | 3 | import org.bukkit.command.Command; 4 | import org.bukkit.command.CommandSender; 5 | 6 | import mineverse.Aust1n46.chat.MineverseChat; 7 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 8 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 9 | import mineverse.Aust1n46.chat.channel.ChatChannel; 10 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 11 | 12 | public class Unmuteall extends Command { 13 | public Unmuteall() { 14 | super("unmuteall"); 15 | } 16 | 17 | @Override 18 | public boolean execute(CommandSender sender, String command, String[] args) { 19 | if (sender.hasPermission("venturechat.mute")) { 20 | if (args.length < 1) { 21 | sender.sendMessage(LocalizedMessage.COMMAND_INVALID_ARGUMENTS.toString().replace("{command}", "/unmuteall").replace("{args}", "[player]")); 22 | return true; 23 | } 24 | MineverseChatPlayer player = MineverseChatAPI.getMineverseChatPlayer(args[0]); 25 | if (player == null || (!player.isOnline() && !sender.hasPermission("venturechat.mute.offline"))) { 26 | sender.sendMessage(LocalizedMessage.PLAYER_OFFLINE.toString().replace("{args}", args[0])); 27 | return true; 28 | } 29 | boolean bungee = false; 30 | for (ChatChannel channel : ChatChannel.getChatChannels()) { 31 | player.removeMute(channel.getName()); 32 | if (channel.getBungee()) { 33 | bungee = true; 34 | } 35 | } 36 | if (bungee) { 37 | MineverseChat.synchronize(player, true); 38 | } 39 | sender.sendMessage(LocalizedMessage.UNMUTE_PLAYER_ALL_SENDER.toString().replace("{player}", player.getName())); 40 | if (player.isOnline()) { 41 | player.getPlayer().sendMessage(LocalizedMessage.UNMUTE_PLAYER_ALL_PLAYER.toString()); 42 | } else 43 | player.setModified(true); 44 | return true; 45 | } else { 46 | sender.sendMessage(LocalizedMessage.COMMAND_NO_PERMISSION.toString()); 47 | return true; 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/database/Database.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.database; 2 | 3 | import java.sql.Connection; 4 | import java.sql.PreparedStatement; 5 | import java.sql.SQLException; 6 | import java.text.SimpleDateFormat; 7 | import java.util.Calendar; 8 | 9 | import org.bukkit.Bukkit; 10 | import org.bukkit.configuration.ConfigurationSection; 11 | 12 | import com.zaxxer.hikari.HikariConfig; 13 | import com.zaxxer.hikari.HikariDataSource; 14 | 15 | import mineverse.Aust1n46.chat.MineverseChat; 16 | import mineverse.Aust1n46.chat.utilities.Format; 17 | 18 | /** 19 | * Initializes and handles writing to the chat logging database. 20 | */ 21 | public class Database { 22 | private static HikariDataSource dataSource = null; 23 | 24 | public static void initializeMySQL() { 25 | try { 26 | ConfigurationSection mysqlConfig = MineverseChat.getInstance().getConfig().getConfigurationSection("mysql"); 27 | if (mysqlConfig.getBoolean("enabled", false)) { 28 | String host = mysqlConfig.getString("host"); 29 | int port = mysqlConfig.getInt("port"); 30 | String database = mysqlConfig.getString("database"); 31 | String user = mysqlConfig.getString("user"); 32 | String password = mysqlConfig.getString("password"); 33 | 34 | final HikariConfig config = new HikariConfig(); 35 | // config.setDriverClassName(org.postgresql.Driver.class.getName()); 36 | // final String jdbcUrl = String.format("jdbc:postgresql://%s:%d/%s", hostname, 37 | // port, database); 38 | final String jdbcUrl = String.format("jdbc:mysql://%s:%d/%s?autoReconnect=true&useSSL=false", host, 39 | port, database); 40 | config.setJdbcUrl(jdbcUrl); 41 | config.setUsername(user); 42 | config.setPassword(password); 43 | config.addDataSourceProperty("cachePrepStmts", "true"); 44 | config.addDataSourceProperty("prepStmtCacheSize", "250"); 45 | config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); 46 | dataSource = new HikariDataSource(config); 47 | final String SQL_CREATE_TABLE = "CREATE TABLE IF NOT EXISTS VentureChat " 48 | + "(ID SERIAL PRIMARY KEY, ChatTime TEXT, UUID TEXT, Name TEXT, " 49 | + "Server TEXT, Channel TEXT, Text TEXT, Type TEXT)"; 50 | final Connection conn = dataSource.getConnection(); 51 | final PreparedStatement statement = conn.prepareStatement(SQL_CREATE_TABLE); 52 | statement.executeUpdate(); 53 | } 54 | } catch (Exception exception) { 55 | Bukkit.getConsoleSender().sendMessage( 56 | Format.FormatStringAll("&8[&eVentureChat&8]&c - Database could not be loaded. Is it running?")); 57 | } 58 | } 59 | 60 | public static boolean isEnabled() { 61 | return dataSource != null; 62 | } 63 | 64 | public static void writeVentureChat(String uuid, String name, String server, String channel, String text, 65 | String type) { 66 | MineverseChat plugin = MineverseChat.getInstance(); 67 | Calendar currentDate = Calendar.getInstance(); 68 | SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 69 | String date = formatter.format(currentDate.getTime()); 70 | Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { 71 | try (final Connection conn = dataSource.getConnection(); 72 | final PreparedStatement statement = conn.prepareStatement( 73 | "INSERT INTO VentureChat " + "(ChatTime, UUID, Name, Server, Channel, Text, Type) " 74 | + "VALUES (?, ?, ?, ?, ?, ?, ?)")) { 75 | statement.setString(1, date); 76 | statement.setString(2, uuid); 77 | statement.setString(3, name); 78 | statement.setString(4, server); 79 | statement.setString(5, channel); 80 | statement.setString(6, text); 81 | statement.setString(7, type); 82 | statement.executeUpdate(); 83 | } catch (SQLException error) { 84 | error.printStackTrace(); 85 | } 86 | }); 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/database/TemporaryDataInstance.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.database; 2 | 3 | import java.util.HashMap; 4 | import java.util.UUID; 5 | 6 | public class TemporaryDataInstance { 7 | private int messagePackets; 8 | private final UUID uuid; 9 | 10 | private static final HashMap temporaryDataInstances = new HashMap(); 11 | 12 | private TemporaryDataInstance(UUID uuid) { 13 | this.uuid = uuid; 14 | } 15 | 16 | public static UUID createTemporaryDataInstance() { 17 | UUID uuid = UUID.randomUUID(); 18 | temporaryDataInstances.put(uuid, new TemporaryDataInstance(uuid)); 19 | return uuid; 20 | } 21 | 22 | public static TemporaryDataInstance getTemporaryDataInstance(UUID uuid) { 23 | return temporaryDataInstances.get(uuid); 24 | } 25 | 26 | public int getMessagePackets() { 27 | return this.messagePackets; 28 | } 29 | 30 | public void incrementMessagePackets() { 31 | this.messagePackets++; 32 | } 33 | 34 | public void destroyInstance() { 35 | temporaryDataInstances.remove(uuid); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/gui/GuiSlot.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.gui; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.bukkit.Material; 7 | import org.bukkit.configuration.ConfigurationSection; 8 | 9 | import mineverse.Aust1n46.chat.MineverseChat; 10 | 11 | public class GuiSlot { 12 | private static MineverseChat plugin = MineverseChat.getInstance(); 13 | private static List guiSlots; 14 | 15 | private String text; 16 | private String command; 17 | private String permission; 18 | private Material icon; 19 | private String name; 20 | private int durability; 21 | private int slot; 22 | 23 | public GuiSlot(String name, String icon, int durability, String text, String permission, String command, int slot) { 24 | this.name = name; 25 | this.text = text; 26 | this.command = command; 27 | this.permission = "venturechat." + permission; 28 | this.icon = Material.valueOf(icon.toUpperCase()); 29 | this.durability = durability; 30 | this.slot = slot; 31 | } 32 | 33 | public static void initialize() { 34 | guiSlots = new ArrayList(); 35 | ConfigurationSection cs = plugin.getConfig().getConfigurationSection("venturegui"); 36 | for (String key : cs.getKeys(false)) { 37 | String name = key; 38 | String icon = cs.getString(key + ".icon"); 39 | int durability = cs.getInt(key + ".durability"); 40 | String text = cs.getString(key + ".text"); 41 | String permission = cs.getString(key + ".permission"); 42 | String command = cs.getString(key + ".command"); 43 | int slot = cs.getInt(key + ".slot"); 44 | guiSlots.add(new GuiSlot(name, icon, durability, text, permission, command, slot)); 45 | } 46 | } 47 | 48 | public static List getGuiSlots() { 49 | return guiSlots; 50 | } 51 | 52 | public String getText() { 53 | return text; 54 | } 55 | 56 | public String getCommand() { 57 | return command; 58 | } 59 | 60 | public String getPermission() { 61 | return permission; 62 | } 63 | 64 | public Material getIcon() { 65 | return icon; 66 | } 67 | 68 | public int getDurability() { 69 | return durability; 70 | } 71 | 72 | public String getName() { 73 | return name; 74 | } 75 | 76 | public int getSlot() { 77 | return slot; 78 | } 79 | 80 | public boolean hasPermission() { 81 | return !permission.equalsIgnoreCase("venturechat.none"); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/json/JsonAttribute.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.json; 2 | 3 | import java.util.List; 4 | 5 | import mineverse.Aust1n46.chat.ClickAction; 6 | 7 | public class JsonAttribute { 8 | private String name; 9 | private List hoverText; 10 | private ClickAction clickAction; 11 | private String clickText; 12 | 13 | public JsonAttribute(String name, List hoverText, ClickAction clickAction, String clickText) { 14 | this.name = name; 15 | this.hoverText = hoverText; 16 | this.clickAction = clickAction; 17 | this.clickText = clickText; 18 | } 19 | 20 | public String getName() { 21 | return name; 22 | } 23 | 24 | public List getHoverText() { 25 | return hoverText; 26 | } 27 | 28 | public ClickAction getClickAction() { 29 | return clickAction; 30 | } 31 | 32 | public String getClickText() { 33 | return clickText; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/json/JsonFormat.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.json; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collection; 5 | import java.util.HashMap; 6 | import java.util.List; 7 | 8 | import org.bukkit.configuration.ConfigurationSection; 9 | 10 | import mineverse.Aust1n46.chat.ClickAction; 11 | import mineverse.Aust1n46.chat.MineverseChat; 12 | import mineverse.Aust1n46.chat.utilities.Format; 13 | 14 | public class JsonFormat { 15 | private static MineverseChat plugin = MineverseChat.getInstance(); 16 | private static HashMap jsonFormats; 17 | 18 | private List jsonAttributes; 19 | private int priority; 20 | private String name; 21 | 22 | public JsonFormat(String name, int priority, List jsonAttributes) { 23 | this.name = name; 24 | this.priority = priority; 25 | this.jsonAttributes = jsonAttributes; 26 | } 27 | 28 | public static void initialize() { 29 | jsonFormats = new HashMap(); 30 | ConfigurationSection jsonFormatSection = plugin.getConfig().getConfigurationSection("jsonformatting"); 31 | for (String jsonFormat : jsonFormatSection.getKeys(false)) { 32 | int priority = jsonFormatSection.getInt(jsonFormat + ".priority", 0); 33 | List jsonAttributes = new ArrayList<>(); 34 | ConfigurationSection jsonAttributeSection = jsonFormatSection.getConfigurationSection(jsonFormat + ".json_attributes"); 35 | if (jsonAttributeSection != null) { 36 | for (String attribute : jsonAttributeSection.getKeys(false)) { 37 | List hoverText = jsonAttributeSection.getStringList(attribute + ".hover_text"); 38 | String clickActionText = jsonAttributeSection.getString(attribute + ".click_action", "none"); 39 | try { 40 | ClickAction clickAction = ClickAction.valueOf(clickActionText.toUpperCase()); 41 | String clickText = jsonAttributeSection.getString(attribute + ".click_text", ""); 42 | jsonAttributes.add(new JsonAttribute(attribute, hoverText, clickAction, clickText)); 43 | } catch (IllegalArgumentException | NullPointerException exception) { 44 | plugin.getServer().getConsoleSender() 45 | .sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - Illegal click_action: " + clickActionText + " in jsonFormat: " + jsonFormat)); 46 | } 47 | } 48 | } 49 | jsonFormats.put(jsonFormat.toLowerCase(), new JsonFormat(jsonFormat, priority, jsonAttributes)); 50 | } 51 | } 52 | 53 | public static Collection getJsonFormats() { 54 | return jsonFormats.values(); 55 | } 56 | 57 | public static JsonFormat getJsonFormat(String name) { 58 | return jsonFormats.get(name.toLowerCase()); 59 | } 60 | 61 | public String getName() { 62 | return name; 63 | } 64 | 65 | public int getPriority() { 66 | return priority; 67 | } 68 | 69 | public List getJsonAttributes() { 70 | return jsonAttributes; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/listeners/CommandListener.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.listeners; 2 | 3 | import java.io.FileNotFoundException; 4 | 5 | import org.bukkit.Bukkit; 6 | import org.bukkit.ChatColor; 7 | import org.bukkit.Material; 8 | import org.bukkit.configuration.ConfigurationSection; 9 | import org.bukkit.entity.Player; 10 | import org.bukkit.event.EventHandler; 11 | import org.bukkit.event.EventPriority; 12 | import org.bukkit.event.Listener; 13 | import org.bukkit.event.inventory.InventoryClickEvent; 14 | import org.bukkit.event.player.PlayerCommandPreprocessEvent; 15 | import org.bukkit.event.server.ServerCommandEvent; 16 | import org.bukkit.inventory.ItemStack; 17 | import org.bukkit.inventory.meta.SkullMeta; 18 | 19 | import me.clip.placeholderapi.PlaceholderAPI; 20 | import mineverse.Aust1n46.chat.MineverseChat; 21 | import mineverse.Aust1n46.chat.alias.Alias; 22 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 23 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 24 | import mineverse.Aust1n46.chat.channel.ChatChannel; 25 | import mineverse.Aust1n46.chat.database.Database; 26 | import mineverse.Aust1n46.chat.gui.GuiSlot; 27 | import mineverse.Aust1n46.chat.localization.LocalizedMessage; 28 | import mineverse.Aust1n46.chat.utilities.Format; 29 | import mineverse.Aust1n46.chat.versions.VersionHandler; 30 | 31 | public class CommandListener implements Listener { 32 | private MineverseChat plugin = MineverseChat.getInstance(); 33 | 34 | @EventHandler 35 | public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) throws FileNotFoundException { 36 | if (event.getPlayer() == null) { 37 | Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - Event.getPlayer() returned null in PlayerCommandPreprocessEvent")); 38 | return; 39 | } 40 | ConfigurationSection cs = plugin.getConfig().getConfigurationSection("commandspy"); 41 | Boolean wec = cs.getBoolean("worldeditcommands", true); 42 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer(event.getPlayer()); 43 | if (!mcp.getPlayer().hasPermission("venturechat.commandspy.override")) { 44 | for (MineverseChatPlayer p : MineverseChatAPI.getOnlineMineverseChatPlayers()) { 45 | if (p.hasCommandSpy()) { 46 | if (wec) { 47 | p.getPlayer().sendMessage(Format.FormatStringAll(cs.getString("format").replace("{player}", mcp.getName()).replace("{command}", event.getMessage()))); 48 | } else { 49 | if (!(event.getMessage().toLowerCase().startsWith("//"))) { 50 | p.getPlayer().sendMessage(Format.FormatStringAll(cs.getString("format").replace("{player}", mcp.getName()).replace("{command}", event.getMessage()))); 51 | } else { 52 | if (!(event.getMessage().toLowerCase().startsWith("//"))) { 53 | p.getPlayer().sendMessage(ChatColor.GOLD + mcp.getName() + ": " + event.getMessage()); 54 | } 55 | } 56 | } 57 | } 58 | } 59 | } 60 | 61 | String[] blocked = event.getMessage().split(" "); 62 | if (mcp.getBlockedCommands().contains(blocked[0])) { 63 | mcp.getPlayer().sendMessage(LocalizedMessage.BLOCKED_COMMAND.toString().replace("{command}", event.getMessage())); 64 | event.setCancelled(true); 65 | return; 66 | } 67 | 68 | String message = event.getMessage(); 69 | 70 | if (Database.isEnabled()) { 71 | Database.writeVentureChat(mcp.getUUID().toString(), mcp.getName(), "Local", "Command_Component", event.getMessage().replace("'", "''"), "Command"); 72 | } 73 | 74 | for (Alias a : Alias.getAliases()) { 75 | if (message.toLowerCase().substring(1).split(" ")[0].equals(a.getName().toLowerCase())) { 76 | for (String s : a.getComponents()) { 77 | if (!mcp.getPlayer().hasPermission(a.getPermission()) && a.hasPermission()) { 78 | mcp.getPlayer().sendMessage(ChatColor.RED + "You do not have permission for this alias."); 79 | event.setCancelled(true); 80 | return; 81 | } 82 | int num = 1; 83 | if (message.length() < a.getName().length() + 2 || a.getArguments() == 0) 84 | num = 0; 85 | int arg = 0; 86 | if (message.substring(a.getName().length() + 1 + num).length() == 0) 87 | arg = 1; 88 | String[] args = message.substring(a.getName().length() + 1 + num).split(" "); 89 | String send = ""; 90 | if (args.length - arg < a.getArguments()) { 91 | String keyword = "arguments."; 92 | if (a.getArguments() == 1) 93 | keyword = "argument."; 94 | mcp.getPlayer().sendMessage(ChatColor.RED + "Invalid arguments for this alias, enter at least " + a.getArguments() + " " + keyword); 95 | event.setCancelled(true); 96 | return; 97 | } 98 | for (int b = 0; b < args.length; b++) { 99 | send += " " + args[b]; 100 | } 101 | if (send.length() > 0) 102 | send = send.substring(1); 103 | s = Format.FormatStringAll(s); 104 | if (mcp.getPlayer().hasPermission("venturechat.color.legacy")) { 105 | send = Format.FormatStringLegacyColor(send); 106 | } 107 | if (mcp.getPlayer().hasPermission("venturechat.color")) { 108 | send = Format.FormatStringColor(send); 109 | } 110 | if (mcp.getPlayer().hasPermission("venturechat.format")) { 111 | send = Format.FormatString(send); 112 | } 113 | if (s.startsWith("Command:")) { 114 | mcp.getPlayer().chat(s.substring(9).replace("$", send)); 115 | event.setCancelled(true); 116 | } 117 | if (s.startsWith("Message:")) { 118 | mcp.getPlayer().sendMessage(s.substring(9).replace("$", send)); 119 | event.setCancelled(true); 120 | } 121 | if (s.startsWith("Broadcast:")) { 122 | Format.broadcastToServer(s.substring(11).replace("$", send)); 123 | event.setCancelled(true); 124 | } 125 | } 126 | } 127 | } 128 | } 129 | 130 | // old 1.8 command map 131 | @EventHandler 132 | public void onServerCommand(ServerCommandEvent event) { 133 | if (Database.isEnabled()) { 134 | Database.writeVentureChat("N/A", "Console", "Local", "Command_Component", event.getCommand().replace("'", "''"), "Command"); 135 | } 136 | } 137 | 138 | @SuppressWarnings("deprecation") 139 | @EventHandler(priority = EventPriority.LOW) 140 | public void InventoryClick(InventoryClickEvent e) { 141 | ItemStack item = e.getCurrentItem(); 142 | if (item == null || !e.getView().getTitle().contains("VentureChat")) { 143 | return; 144 | } 145 | e.setCancelled(true); 146 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer((Player) e.getWhoClicked()); 147 | String playerName = e.getView().getTitle().replace(" GUI", "").replace("VentureChat: ", ""); 148 | MineverseChatPlayer target = MineverseChatAPI.getMineverseChatPlayer(playerName); 149 | ItemStack skull = e.getInventory().getItem(0); 150 | SkullMeta skullMeta = (SkullMeta) skull.getItemMeta(); 151 | ChatChannel channel = ChatChannel.getChannel(ChatColor.stripColor(skullMeta.getLore().get(0)).replace("Channel: ", "")); 152 | int hash = Integer.parseInt(ChatColor.stripColor(skullMeta.getLore().get(1).replace("Hash: ", ""))); 153 | if (VersionHandler.is1_7()) { 154 | if (item.getType() == Material.BEDROCK) { 155 | mcp.getPlayer().closeInventory(); 156 | } 157 | } else { 158 | if (item.getType() == Material.BARRIER) { 159 | mcp.getPlayer().closeInventory(); 160 | } 161 | } 162 | for (GuiSlot g : GuiSlot.getGuiSlots()) { 163 | if (g.getIcon() == item.getType() && g.getDurability() == item.getDurability() && g.getSlot() == e.getSlot()) { 164 | String command = g.getCommand().replace("{channel}", channel.getName()).replace("{hash}", hash + ""); 165 | if (target != null) { 166 | command = command.replace("{player_name}", target.getName()); 167 | if (target.isOnline()) { 168 | command = Format.FormatStringAll(PlaceholderAPI.setBracketPlaceholders(target.getPlayer(), command)); 169 | } 170 | } else { 171 | command = command.replace("{player_name}", "Discord_Message"); 172 | } 173 | mcp.getPlayer().chat(command); 174 | } 175 | } 176 | } 177 | } 178 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/listeners/LoginListener.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.listeners; 2 | 3 | import java.util.UUID; 4 | 5 | import org.bukkit.Bukkit; 6 | import org.bukkit.entity.Player; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.EventPriority; 9 | import org.bukkit.event.Listener; 10 | import org.bukkit.event.player.PlayerJoinEvent; 11 | import org.bukkit.event.player.PlayerQuitEvent; 12 | 13 | import mineverse.Aust1n46.chat.MineverseChat; 14 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 15 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 16 | import mineverse.Aust1n46.chat.channel.ChatChannel; 17 | import mineverse.Aust1n46.chat.database.PlayerData; 18 | import mineverse.Aust1n46.chat.utilities.Format; 19 | import mineverse.Aust1n46.chat.utilities.UUIDFetcher; 20 | 21 | /** 22 | * Manages player login and logout events. 23 | * 24 | * @author Aust1n46 25 | */ 26 | public class LoginListener implements Listener { 27 | private MineverseChat plugin = MineverseChat.getInstance(); 28 | 29 | @EventHandler(priority = EventPriority.LOW) 30 | public void onPlayerQuit(PlayerQuitEvent playerQuitEvent) { 31 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer(playerQuitEvent.getPlayer()); 32 | PlayerData.savePlayerData(mcp); 33 | mcp.clearMessages(); 34 | mcp.setOnline(false); 35 | MineverseChatAPI.removeMineverseChatOnlinePlayerToMap(mcp); 36 | } 37 | 38 | void handleNameChange(MineverseChatPlayer mcp, Player eventPlayerInstance) { 39 | Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Detected Name Change. Old Name:&c " + mcp.getName() + " &eNew Name:&c " + eventPlayerInstance.getName())); 40 | MineverseChatAPI.removeNameFromMap(mcp.getName()); 41 | mcp.setName(eventPlayerInstance.getName()); 42 | MineverseChatAPI.addNameToMap(mcp); 43 | } 44 | 45 | @EventHandler(priority = EventPriority.LOW) 46 | public void onPlayerJoin(PlayerJoinEvent event) throws Exception { 47 | MineverseChatPlayer mcp = MineverseChatAPI.getMineverseChatPlayer(event.getPlayer()); 48 | Player player = event.getPlayer(); 49 | String name = player.getName(); 50 | if(mcp == null) { 51 | UUID uuid = player.getUniqueId(); 52 | mcp = new MineverseChatPlayer(uuid, name); 53 | MineverseChatAPI.addMineverseChatPlayerToMap(mcp); 54 | MineverseChatAPI.addNameToMap(mcp); 55 | } 56 | UUIDFetcher.checkOfflineUUIDWarning(mcp.getUUID()); 57 | //check for name change 58 | if(!mcp.getName().equals(name)) { 59 | handleNameChange(mcp, event.getPlayer()); 60 | } 61 | mcp.setOnline(true); 62 | mcp.setHasPlayed(false); 63 | MineverseChatAPI.addMineverseChatOnlinePlayerToMap(mcp); 64 | mcp.setJsonFormat(); 65 | for(ChatChannel ch : ChatChannel.getAutojoinList()) { 66 | if(ch.hasPermission()) { 67 | if(mcp.getPlayer().hasPermission(ch.getPermission())) { 68 | mcp.addListening(ch.getName()); 69 | } 70 | } 71 | else { 72 | mcp.addListening(ch.getName()); 73 | } 74 | } 75 | 76 | if (MineverseChat.isConnectedToProxy()) { 77 | long delayInTicks = 20L; 78 | final MineverseChatPlayer sync = mcp; 79 | plugin.getServer().getScheduler().runTaskLaterAsynchronously(plugin, new Runnable() { 80 | public void run() { 81 | MineverseChat.synchronize(sync, false); 82 | } 83 | }, delayInTicks); 84 | } 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/listeners/PacketListenerLegacyChat.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.listeners; 2 | 3 | import mineverse.Aust1n46.chat.ChatMessage; 4 | import mineverse.Aust1n46.chat.MineverseChat; 5 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 6 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 7 | import mineverse.Aust1n46.chat.utilities.Format; 8 | import mineverse.Aust1n46.chat.versions.VersionHandler; 9 | 10 | import com.comphenix.protocol.PacketType; 11 | import com.comphenix.protocol.events.ListenerPriority; 12 | import com.comphenix.protocol.events.PacketAdapter; 13 | import com.comphenix.protocol.events.PacketContainer; 14 | import com.comphenix.protocol.events.PacketEvent; 15 | import com.comphenix.protocol.wrappers.WrappedChatComponent; 16 | 17 | public class PacketListenerLegacyChat extends PacketAdapter { 18 | public PacketListenerLegacyChat() { 19 | super(MineverseChat.getInstance(), ListenerPriority.MONITOR, new PacketType[] { PacketType.Play.Server.CHAT }); 20 | } 21 | 22 | @Override 23 | public void onPacketSending(PacketEvent event) { 24 | if(event.isCancelled()) { 25 | return; 26 | } 27 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer(event.getPlayer()); 28 | if(mcp == null) { 29 | return; 30 | } 31 | 32 | PacketContainer packet = event.getPacket(); 33 | WrappedChatComponent chat = packet.getChatComponents().read(0); 34 | if(chat == null) { 35 | return; 36 | } 37 | try { 38 | if(VersionHandler.is1_7()) { 39 | packet.getBooleans().getField(0).setAccessible(true); 40 | if(!((boolean) packet.getBooleans().getField(0).get(packet.getHandle()))) { 41 | return; 42 | } 43 | } 44 | else if(VersionHandler.is1_8() || VersionHandler.is1_9() || VersionHandler.is1_10() || VersionHandler.is1_11()) { 45 | packet.getBytes().getField(0).setAccessible(true); 46 | if(((Byte) packet.getBytes().getField(0).get(packet.getHandle())).intValue() > 1) { 47 | return; 48 | } 49 | } 50 | else { 51 | packet.getChatTypes().getField(0).setAccessible(true); 52 | if(packet.getChatTypes().getField(0).get(packet.getHandle()) == packet.getChatTypes().getField(0).getType().getEnumConstants()[2]) { 53 | return; 54 | } 55 | } 56 | } 57 | catch(Exception e) { 58 | e.printStackTrace(); 59 | } 60 | String message = Format.toPlainText(chat.getHandle(), chat.getHandleType()); 61 | String coloredMessage = Format.toColoredText(chat.getHandle(), chat.getHandleType()); 62 | if(message == null) { 63 | return; 64 | } 65 | int hash = message.hashCode(); 66 | mcp.addMessage(new ChatMessage(chat, message, coloredMessage, hash)); 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/listeners/SignListener.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.listeners; 2 | 3 | import org.bukkit.event.EventHandler; 4 | import org.bukkit.event.EventPriority; 5 | import org.bukkit.event.Listener; 6 | import org.bukkit.event.block.SignChangeEvent; 7 | 8 | import mineverse.Aust1n46.chat.MineverseChat; 9 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 10 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 11 | import mineverse.Aust1n46.chat.utilities.Format; 12 | 13 | //This class listens for text being added to signs, and it formats them to allow colors and formatting. 14 | public class SignListener implements Listener { 15 | MineverseChat plugin = MineverseChat.getInstance(); 16 | 17 | @EventHandler(priority = EventPriority.HIGH) 18 | public void onSignChange(SignChangeEvent event) { 19 | MineverseChatPlayer mcp = MineverseChatAPI.getOnlineMineverseChatPlayer(event.getPlayer()); 20 | for(int a = 0; a < event.getLines().length; a++) { 21 | String line = event.getLine(a); 22 | if(mcp.getPlayer().hasPermission("venturechat.color.legacy")) { 23 | line = Format.FormatStringLegacyColor(line); 24 | } 25 | if(mcp.getPlayer().hasPermission("venturechat.color")) { 26 | line = Format.FormatStringColor(line); 27 | } 28 | if(mcp.getPlayer().hasPermission("venturechat.format")) { 29 | line = Format.FormatString(line); 30 | } 31 | event.setLine(a, line); 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/localization/InternalMessage.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.localization; 2 | 3 | import mineverse.Aust1n46.chat.utilities.Format; 4 | 5 | /** 6 | * Messages internal to the plugin 7 | */ 8 | public enum InternalMessage { 9 | EMPTY_STRING(""), 10 | VENTURECHAT_AUTHOR("&6Written by Aust1n46"), 11 | VENTURECHAT_VERSION("&6VentureChat Version: {version}"); 12 | 13 | private final String message; 14 | 15 | InternalMessage(String message) { 16 | this.message = message; 17 | } 18 | 19 | @Override 20 | public String toString() { 21 | return Format.FormatStringAll(this.message); 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/localization/Localization.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.localization; 2 | 3 | import java.io.File; 4 | 5 | import mineverse.Aust1n46.chat.MineverseChat; 6 | import mineverse.Aust1n46.chat.utilities.Format; 7 | 8 | import org.bukkit.Bukkit; 9 | import org.bukkit.configuration.file.FileConfiguration; 10 | import org.bukkit.configuration.file.YamlConfiguration; 11 | 12 | //This class is used to create objects of localization for different languages. 13 | public class Localization { 14 | private static MineverseChat plugin = MineverseChat.getInstance(); 15 | private static FileConfiguration localization; 16 | 17 | private static final String VERSION = "2.22.4"; 18 | 19 | public static void initialize() { 20 | File localizationFile = new File(plugin.getDataFolder().getAbsolutePath(), "Messages.yml"); 21 | if(!localizationFile.isFile()) { 22 | plugin.saveResource("Messages.yml", true); 23 | } 24 | 25 | localization = YamlConfiguration.loadConfiguration(localizationFile); 26 | 27 | String fileVersion = localization.getString("Version", "null"); 28 | 29 | if(!fileVersion.equals(VERSION)) { 30 | Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&e - Version Change Detected! Saving Old Messages.yml and Generating Latest File")); 31 | localizationFile.renameTo(new File(plugin.getDataFolder().getAbsolutePath(), "Messages_Old_" + fileVersion + ".yml")); 32 | plugin.saveResource("Messages.yml", true); 33 | localization = YamlConfiguration.loadConfiguration(localizationFile); 34 | } 35 | } 36 | 37 | public static FileConfiguration getLocalization() { 38 | return localization; 39 | } 40 | } -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/localization/LocalizedMessage.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.localization; 2 | 3 | import mineverse.Aust1n46.chat.utilities.Format; 4 | 5 | /** 6 | * Messages configurable in Messages.yml file. 7 | */ 8 | public enum LocalizedMessage { 9 | BLOCK_COMMAND_PLAYER("BlockCommandPlayer"), 10 | BLOCK_COMMAND_SENDER("BlockCommandSender"), 11 | BLOCKED_COMMAND("BlockedCommand"), 12 | BLOCKING_MESSAGE("BlockingMessage"), 13 | BUNGEE_TOGGLE_OFF("BungeeToggleOff"), 14 | BUNGEE_TOGGLE_ON("BungeeToggleOn"), 15 | CLEAR_CHAT_SENDER("ClearChatSender"), 16 | CLEAR_CHAT_SERVER("ClearChatServer"), 17 | CHANNEL_CANNOT_MUTE("ChannelCannotMute"), 18 | CHANNEL_COOLDOWN("ChannelCooldown"), 19 | CHANNEL_LIST("ChannelList"), 20 | CHANNEL_LIST_HEADER("ChannelListHeader"), 21 | CHANNEL_LIST_WITH_PERMISSIONS("ChannelListWithPermissions"), 22 | CHANNEL_NO_PERMISSION("ChannelNoPermission"), 23 | CHANNEL_NO_PERMISSION_VIEW("ChannelNoPermissionView"), 24 | CHANNEL_NO_SPEAK_PERMISSIONS("ChannelNoSpeakPermissions"), 25 | CHANNEL_PLAYER_LIST_HEADER("ChannelPlayerListHeader"), 26 | CHANNEL_MUTED("ChannelMuted"), 27 | CHANNEL_MUTED_REASON("ChannelMutedReason"), 28 | CHANNEL_MUTED_TIMED("ChannelMutedTimed"), 29 | CHANNEL_MUTED_TIMED_REASON("ChannelMutedTimedReason"), 30 | COMMAND_INVALID_ARGUMENTS("CommandInvalidArguments"), 31 | COMMAND_INVALID_ARGUMENTS_IGNORE("CommandInvalidArgumentsIgnore"), 32 | COMMAND_MUST_BE_RUN_BY_PLAYER("CommandMustBeRunByPlayer"), 33 | COMMAND_NO_PERMISSION("CommandNoPermission"), 34 | COMMAND_NOT_BLOCKABLE("CommandNotBlockable"), 35 | COMMANDSPY_OFF("CommandSpyOff"), 36 | COMMANDSPY_ON("CommandSpyOn"), 37 | CONFIG_RELOADED("ConfigReloaded"), 38 | ENTER_PRIVATE_CONVERSATION("EnterPrivateConversation"), 39 | ENTER_PRIVATE_CONVERSATION_SPY("EnterPrivateConversationSpy"), 40 | EXIT_PRIVATE_CONVERSATION("ExitPrivateConversation"), 41 | EXIT_PRIVATE_CONVERSATION_SPY("ExitPrivateConversationSpy"), 42 | FILTER_OFF("FilterOff"), 43 | FILTER_ON("FilterOn"), 44 | FORCE_ALL("ForceAll"), 45 | FORCE_PLAYER("ForcePlayer"), 46 | IGNORE_LIST_HEADER("IgnoreListHeader"), 47 | IGNORE_PLAYER_CANT("IgnorePlayerCant"), 48 | IGNORE_PLAYER_OFF("IgnorePlayerOff"), 49 | IGNORE_PLAYER_ON("IgnorePlayerOn"), 50 | IGNORE_YOURSELF("IgnoreYourself"), 51 | IGNORING_MESSAGE("IgnoringMessage"), 52 | INVALID_CHANNEL("InvalidChannel"), 53 | INVALID_HASH("InvalidHash"), 54 | INVALID_TIME("InvalidTime"), 55 | KICK_CHANNEL("KickChannel"), 56 | KICK_CHANNEL_ALL_PLAYER("KickChannelAllPlayer"), 57 | KICK_CHANNEL_ALL_SENDER("KickChannelAllSender"), 58 | LEAVE_CHANNEL("LeaveChannel"), 59 | LISTEN_CHANNEL("ListenChannel"), 60 | MESSAGE_TOGGLE_OFF("MessageToggleOff"), 61 | MESSAGE_TOGGLE_ON("MessageToggleOn"), 62 | MUST_LISTEN_ONE_CHANNEL("MustListenOneChannel"), 63 | MUTE_PLAYER_ALL_PLAYER("MutePlayerAllPlayer"), 64 | MUTE_PLAYER_ALL_PLAYER_REASON("MutePlayerAllPlayerReason"), 65 | MUTE_PLAYER_ALL_SENDER("MutePlayerAllSender"), 66 | MUTE_PLAYER_ALL_SENDER_REASON("MutePlayerAllSenderReason"), 67 | MUTE_PLAYER_PLAYER("MutePlayerPlayer"), 68 | MUTE_PLAYER_PLAYER_TIME("MutePlayerPlayerTime"), 69 | MUTE_PLAYER_PLAYER_TIME_REASON("MutePlayerPlayerTimeReason"), 70 | MUTE_PLAYER_PLAYER_REASON("MutePlayerPlayerReason"), 71 | MUTE_PLAYER_SPAM("MutePlayerSpam"), 72 | MUTE_PLAYER_SPAM_TIME("MutePlayerSpamTime"), 73 | MUTE_PLAYER_SENDER("MutePlayerSender"), 74 | MUTE_PLAYER_SENDER_REASON("MutePlayerSenderReason"), 75 | MUTE_PLAYER_SENDER_TIME("MutePlayerSenderTime"), 76 | MUTE_PLAYER_SENDER_TIME_REASON("MutePlayerSenderTimeReason"), 77 | NO_PLAYER_TO_REPLY_TO("NoPlayerToReplyTo"), 78 | NOTIFICATIONS_OFF("NotificationsOff"), 79 | NOTIFICATIONS_ON("NotificationsOn"), 80 | PLAYER_ALREADY_MUTED("PlayerAlreadyMuted"), 81 | PLAYER_NOT_MUTED("PlayerNotMuted"), 82 | PLAYER_OFFLINE("PlayerOffline"), 83 | PLAYER_OFFLINE_NO_PERMISSIONS_CHECK("PlayerOfflineNoPermissionsCheck"), 84 | RANGED_SPY_OFF("RangedSpyOff"), 85 | RANGED_SPY_ON("RangedSpyOn"), 86 | SET_CHANNEL("SetChannel"), 87 | SET_CHANNEL_ALL_PLAYER("SetChannelAllPlayer"), 88 | SET_CHANNEL_ALL_SENDER("SetChannelAllSender"), 89 | SET_CHANNEL_PLAYER_CHANNEL_NO_PERMISSION("SetChannelPlayerChannelNoPermission"), 90 | SET_CHANNEL_SENDER("SetChannelSender"), 91 | SPAM_MUTE_REASON_TEXT("SpamMuteReasonText"), 92 | SPAM_WARNING("SpamWarning"), 93 | SPY_OFF("SpyOff"), 94 | SPY_ON("SpyOn"), 95 | UNBLOCK_COMMAND_PLAYER("UnblockCommandPlayer"), 96 | UNBLOCK_COMMAND_SENDER("UnblockCommandSender"), 97 | UNITS_DAY_PLURAL("UnitsDayPlural"), 98 | UNITS_DAY_SINGULAR("UnitsDaySingular"), 99 | UNITS_HOUR_PLURAL("UnitsHourPlural"), 100 | UNITS_HOUR_SINGULAR("UnitsHourSingular"), 101 | UNITS_MINUTE_PLURAL("UnitsMinutePlural"), 102 | UNITS_MINUTE_SINGULAR("UnitsMinuteSingular"), 103 | UNITS_SECOND_PLURAL("UnitsSecondPlural"), 104 | UNITS_SECOND_SINGULAR("UnitsSecondSingular"), 105 | UNMUTE_PLAYER_ALL_PLAYER("UnmutePlayerAllPlayer"), 106 | UNMUTE_PLAYER_ALL_SENDER("UnmutePlayerAllSender"), 107 | UNMUTE_PLAYER_PLAYER("UnmutePlayerPlayer"), 108 | UNMUTE_PLAYER_SENDER("UnmutePlayerSender"); 109 | 110 | private final String message; 111 | 112 | LocalizedMessage(String message) { 113 | this.message = message; 114 | } 115 | 116 | @Override 117 | public String toString() { 118 | return Format.FormatStringAll(Localization.getLocalization().getString(this.message)); 119 | } 120 | } 121 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/proxy/VentureChatBungee.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.proxy; 2 | 3 | import java.io.ByteArrayOutputStream; 4 | import java.io.DataOutputStream; 5 | import java.io.File; 6 | import java.nio.file.Files; 7 | import java.util.List; 8 | import java.util.stream.Collectors; 9 | 10 | import mineverse.Aust1n46.chat.database.ProxyPlayerData; 11 | import mineverse.Aust1n46.chat.utilities.Format; 12 | import mineverse.Aust1n46.chat.utilities.UUIDFetcher; 13 | import net.md_5.bungee.api.ProxyServer; 14 | import net.md_5.bungee.api.chat.TextComponent; 15 | import net.md_5.bungee.api.config.ServerInfo; 16 | import net.md_5.bungee.api.connection.ProxiedPlayer; 17 | import net.md_5.bungee.api.connection.Server; 18 | import net.md_5.bungee.api.event.PluginMessageEvent; 19 | import net.md_5.bungee.api.event.PostLoginEvent; 20 | import net.md_5.bungee.api.event.ServerDisconnectEvent; 21 | import net.md_5.bungee.api.event.ServerSwitchEvent; 22 | import net.md_5.bungee.api.plugin.Listener; 23 | import net.md_5.bungee.api.plugin.Plugin; 24 | import net.md_5.bungee.config.Configuration; 25 | import net.md_5.bungee.config.ConfigurationProvider; 26 | import net.md_5.bungee.config.YamlConfiguration; 27 | import net.md_5.bungee.event.EventHandler; 28 | 29 | /** 30 | * VentureChat Minecraft plugin for BungeeCord. 31 | * 32 | * @author Aust1n46 33 | */ 34 | public class VentureChatBungee extends Plugin implements Listener, VentureChatProxySource { 35 | private static Configuration bungeeConfig; 36 | private File bungeePlayerDataDirectory; 37 | 38 | @Override 39 | public void onEnable() { 40 | if(!getDataFolder().exists()) { 41 | getDataFolder().mkdir(); 42 | } 43 | File config = new File(getDataFolder(), "bungeeconfig.yml"); 44 | try { 45 | if(!config.exists()) { 46 | Files.copy(getResourceAsStream("bungeeconfig.yml"), config.toPath()); 47 | } 48 | bungeeConfig = ConfigurationProvider.getProvider(YamlConfiguration.class).load(new File(getDataFolder(), "bungeeconfig.yml")); 49 | } 50 | catch(Exception e) { 51 | e.printStackTrace(); 52 | } 53 | 54 | bungeePlayerDataDirectory = new File(getDataFolder().getAbsolutePath() + "/PlayerData"); 55 | ProxyPlayerData.loadLegacyBungeePlayerData(bungeePlayerDataDirectory, this); 56 | ProxyPlayerData.loadProxyPlayerData(bungeePlayerDataDirectory, this); 57 | 58 | this.getProxy().registerChannel(VentureChatProxy.PLUGIN_MESSAGING_CHANNEL_STRING); 59 | this.getProxy().getPluginManager().registerListener(this, this); 60 | } 61 | 62 | @Override 63 | public void onDisable() { 64 | ProxyPlayerData.saveProxyPlayerData(bungeePlayerDataDirectory, this); 65 | } 66 | 67 | @EventHandler 68 | public void onPlayerJoin(ServerSwitchEvent event) { 69 | updatePlayerNames(); 70 | } 71 | 72 | @EventHandler 73 | public void onPlayerLeave(ServerDisconnectEvent event) { 74 | updatePlayerNames(); 75 | } 76 | 77 | @EventHandler 78 | public void onPlayerJoinNetwork(PostLoginEvent event) { 79 | UUIDFetcher.checkOfflineUUIDWarningProxy(event.getPlayer().getUniqueId(), this); 80 | } 81 | 82 | private void updatePlayerNames() { 83 | try { 84 | ByteArrayOutputStream outstream = new ByteArrayOutputStream(); 85 | DataOutputStream out = new DataOutputStream(outstream); 86 | out.writeUTF("PlayerNames"); 87 | out.writeInt(getProxy().getPlayers().size()); 88 | for(ProxiedPlayer pp : getProxy().getPlayers()) { 89 | out.writeUTF(pp.getName()); 90 | } 91 | 92 | for(String send : getProxy().getServers().keySet()) { 93 | if(getProxy().getServers().get(send).getPlayers().size() > 0) { 94 | getProxy().getServers().get(send).sendData(VentureChatProxy.PLUGIN_MESSAGING_CHANNEL_STRING, outstream.toByteArray()); 95 | } 96 | } 97 | } 98 | catch(Exception e) { 99 | e.printStackTrace(); 100 | } 101 | } 102 | 103 | @EventHandler 104 | public void onPluginMessage(PluginMessageEvent event) { 105 | if(!event.getTag().equals(VentureChatProxy.PLUGIN_MESSAGING_CHANNEL_STRING) && !event.getTag().contains("viaversion:")) { 106 | return; 107 | } 108 | // Critical to prevent client from sending or receiving messages 109 | event.setCancelled(true); 110 | 111 | if(!(event.getSender() instanceof Server)) { 112 | return; 113 | } 114 | String serverName = ((Server) event.getSender()).getInfo().getName(); 115 | VentureChatProxy.onPluginMessage(event.getData(), serverName, this); 116 | } 117 | 118 | @Override 119 | public void sendPluginMessage(String serverName, byte[] data) { 120 | getProxy().getServers().get(serverName).sendData(VentureChatProxy.PLUGIN_MESSAGING_CHANNEL_STRING, data); 121 | } 122 | 123 | @Override 124 | public List getServers() { 125 | return getProxy().getServers().values().stream().map(bungeeServer -> new VentureChatProxyServer(bungeeServer.getName(), bungeeServer.getPlayers().isEmpty())).collect(Collectors.toList()); 126 | } 127 | 128 | @Override 129 | public VentureChatProxyServer getServer(String serverName) { 130 | ServerInfo server = (ServerInfo) getProxy().getServers().get(serverName); 131 | return new VentureChatProxyServer(serverName, server.getPlayers().isEmpty()); 132 | } 133 | 134 | @Override 135 | public void sendConsoleMessage(String message) { 136 | ProxyServer.getInstance().getConsole().sendMessage(TextComponent.fromLegacyText(Format.FormatStringAll(message))); 137 | } 138 | 139 | @Override 140 | public boolean isOfflineServerAcknowledgementSet() { 141 | return bungeeConfig.getBoolean("offline_server_acknowledgement"); 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/proxy/VentureChatProxyServer.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.proxy; 2 | 3 | public class VentureChatProxyServer { 4 | private String name; 5 | private boolean empty; 6 | 7 | public VentureChatProxyServer(String name, boolean empty) { 8 | this.name = name; 9 | this.empty = empty; 10 | } 11 | 12 | public boolean isEmpty() { 13 | return empty; 14 | } 15 | 16 | public String getName() { 17 | return name; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/proxy/VentureChatProxySource.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.proxy; 2 | 3 | import java.util.List; 4 | 5 | public interface VentureChatProxySource { 6 | public void sendPluginMessage(String serverName, byte[] data); 7 | 8 | public List getServers(); 9 | 10 | public VentureChatProxyServer getServer(String serverName); 11 | 12 | public void sendConsoleMessage(String message); 13 | 14 | public boolean isOfflineServerAcknowledgementSet(); 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/proxy/VentureChatVelocity.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.proxy; 2 | 3 | import java.io.ByteArrayOutputStream; 4 | import java.io.DataOutputStream; 5 | import java.io.File; 6 | import java.io.IOException; 7 | import java.nio.file.Files; 8 | import java.nio.file.Path; 9 | import java.util.List; 10 | import java.util.Optional; 11 | import java.util.concurrent.TimeUnit; 12 | import java.util.stream.Collectors; 13 | 14 | import org.slf4j.Logger; 15 | 16 | import com.google.inject.Inject; 17 | import com.velocitypowered.api.event.Subscribe; 18 | import com.velocitypowered.api.event.connection.DisconnectEvent; 19 | import com.velocitypowered.api.event.connection.PluginMessageEvent; 20 | import com.velocitypowered.api.event.connection.PluginMessageEvent.ForwardResult; 21 | import com.velocitypowered.api.event.player.ServerPostConnectEvent; 22 | import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; 23 | import com.velocitypowered.api.event.proxy.ProxyShutdownEvent; 24 | import com.velocitypowered.api.plugin.annotation.DataDirectory; 25 | import com.velocitypowered.api.proxy.Player; 26 | import com.velocitypowered.api.proxy.ProxyServer; 27 | import com.velocitypowered.api.proxy.ServerConnection; 28 | import com.velocitypowered.api.proxy.messages.ChannelIdentifier; 29 | import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; 30 | import com.velocitypowered.api.proxy.server.RegisteredServer; 31 | 32 | import mineverse.Aust1n46.chat.database.ProxyPlayerData; 33 | import mineverse.Aust1n46.chat.utilities.Format; 34 | import net.md_5.bungee.config.Configuration; 35 | import net.md_5.bungee.config.ConfigurationProvider; 36 | import net.md_5.bungee.config.YamlConfiguration; 37 | 38 | /** 39 | * VentureChat Minecraft plugin for Velocity. 40 | * 41 | * @author Aust1n46 42 | */ 43 | public class VentureChatVelocity implements VentureChatProxySource { 44 | private final ProxyServer proxyServer; 45 | private final ChannelIdentifier channelIdentifier = MinecraftChannelIdentifier.create(VentureChatProxy.PLUGIN_MESSAGING_CHANNEL_NAMESPACE, VentureChatProxy.PLUGIN_MESSAGING_CHANNEL_NAME); 46 | private final Logger logger; 47 | 48 | @Inject 49 | @DataDirectory 50 | private Path dataPath; 51 | private File velocityPlayerDataDirectory; 52 | 53 | private static Configuration velocityConfig; 54 | 55 | @Inject 56 | public VentureChatVelocity(ProxyServer server, Logger logger) { 57 | this.proxyServer = server; 58 | this.logger = logger; 59 | } 60 | 61 | public static Configuration getVelocityConfig() { 62 | return velocityConfig; 63 | } 64 | 65 | @Subscribe 66 | public void onInitialize(ProxyInitializeEvent event) { 67 | proxyServer.getChannelRegistrar().register(channelIdentifier); 68 | 69 | File dataFolder = dataPath.toFile(); 70 | if(!dataFolder.exists()) { 71 | dataFolder.mkdir(); 72 | } 73 | File config = new File(dataFolder, "velocityconfig.yml"); 74 | try { 75 | if(!config.exists()) { 76 | Files.copy(getClass().getClassLoader().getResourceAsStream("velocityconfig.yml"), config.toPath()); 77 | } 78 | velocityConfig = ConfigurationProvider.getProvider(YamlConfiguration.class).load(new File(dataFolder, "velocityconfig.yml")); 79 | } 80 | catch(Exception e) { 81 | e.printStackTrace(); 82 | } 83 | 84 | velocityPlayerDataDirectory = new File(dataPath.toAbsolutePath().toString() + "/PlayerData"); 85 | ProxyPlayerData.loadProxyPlayerData(velocityPlayerDataDirectory, this); 86 | } 87 | 88 | @Subscribe 89 | public void onShutdown(ProxyShutdownEvent event) { 90 | ProxyPlayerData.saveProxyPlayerData(velocityPlayerDataDirectory, this); 91 | } 92 | 93 | @Subscribe 94 | public void onPlayerJoin(ServerPostConnectEvent event) { 95 | updatePlayerNames(); 96 | } 97 | 98 | @Subscribe 99 | public void onPlayerQuit(DisconnectEvent event) { 100 | // Delay sending plugin message to make sure disconnecting player is truly disconnected. 101 | proxyServer.getScheduler().buildTask(this, () -> { 102 | updatePlayerNames(); 103 | }) 104 | .delay(1, TimeUnit.SECONDS) 105 | .schedule(); 106 | } 107 | 108 | private void updatePlayerNames() { 109 | try { 110 | ByteArrayOutputStream outstream = new ByteArrayOutputStream(); 111 | DataOutputStream out = new DataOutputStream(outstream); 112 | out.writeUTF("PlayerNames"); 113 | out.writeInt(proxyServer.getPlayerCount()); 114 | for(Player player : proxyServer.getAllPlayers()) { 115 | out.writeUTF(player.getUsername()); 116 | } 117 | getServers().forEach(send -> { 118 | if(!send.isEmpty()) { 119 | sendPluginMessage(send.getName(), outstream.toByteArray()); 120 | } 121 | }); 122 | } 123 | catch(IllegalStateException e) { 124 | sendConsoleMessage("Velocity being finicky with DisconnectEvent."); 125 | } 126 | catch (IOException e) { 127 | e.printStackTrace(); 128 | } 129 | } 130 | 131 | @Subscribe 132 | public void onPluginMessage(PluginMessageEvent event) { 133 | String channelIdentifierId = event.getIdentifier().getId(); 134 | if(!channelIdentifierId.equals(VentureChatProxy.PLUGIN_MESSAGING_CHANNEL_STRING) && !channelIdentifierId.contains("viaversion:")) { 135 | return; 136 | } 137 | // Critical to prevent client from sending or receiving messages 138 | event.setResult(ForwardResult.handled()); 139 | 140 | if(!(event.getSource() instanceof ServerConnection)) { 141 | return; 142 | } 143 | String serverName = ((ServerConnection) event.getSource()).getServerInfo().getName(); 144 | VentureChatProxy.onPluginMessage(event.getData(), serverName, this); 145 | } 146 | 147 | @Override 148 | public void sendPluginMessage(String serverName, byte[] data) { 149 | Optional server = proxyServer.getServer(serverName); 150 | if(server.isPresent()) { 151 | server.get().sendPluginMessage(channelIdentifier, data); 152 | } 153 | } 154 | 155 | @Override 156 | public List getServers() { 157 | return proxyServer.getAllServers().stream().map(velocityServer -> new VentureChatProxyServer(velocityServer.getServerInfo().getName(), velocityServer.getPlayersConnected().isEmpty())).collect(Collectors.toList()); 158 | } 159 | 160 | @Override 161 | public VentureChatProxyServer getServer(String serverName) { 162 | RegisteredServer server = proxyServer.getServer(serverName).get(); 163 | return new VentureChatProxyServer(serverName, server.getPlayersConnected().isEmpty()); 164 | } 165 | 166 | @Override 167 | public void sendConsoleMessage(String message) { 168 | logger.info(Format.stripColor(message)); 169 | } 170 | 171 | @Override 172 | public boolean isOfflineServerAcknowledgementSet() { 173 | return velocityConfig.getBoolean("offline_server_acknowledgement"); 174 | } 175 | } 176 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/utilities/UUIDFetcher.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.utilities; 2 | 3 | import java.io.InputStreamReader; 4 | import java.io.OutputStream; 5 | import java.net.HttpURLConnection; 6 | import java.net.URL; 7 | import java.nio.ByteBuffer; 8 | import java.util.Arrays; 9 | import java.util.HashMap; 10 | import java.util.List; 11 | import java.util.Map; 12 | import java.util.UUID; 13 | import java.util.concurrent.Callable; 14 | 15 | import org.bukkit.Bukkit; 16 | import org.json.simple.JSONArray; 17 | import org.json.simple.JSONObject; 18 | import org.json.simple.parser.JSONParser; 19 | 20 | import com.google.common.collect.ImmutableList; 21 | 22 | import mineverse.Aust1n46.chat.MineverseChat; 23 | import mineverse.Aust1n46.chat.proxy.VentureChatProxySource; 24 | 25 | public class UUIDFetcher implements Callable> { 26 | private static final double PROFILES_PER_REQUEST = 100; 27 | private static final String PROFILE_URL = "https://api.mojang.com/profiles/minecraft"; 28 | private final JSONParser jsonParser = new JSONParser(); 29 | private final List names; 30 | private final boolean rateLimiting; 31 | 32 | public UUIDFetcher(List names, boolean rateLimiting) { 33 | this.names = ImmutableList.copyOf(names); 34 | this.rateLimiting = rateLimiting; 35 | } 36 | 37 | public UUIDFetcher(List names) { 38 | this(names, true); 39 | } 40 | 41 | public Map call() throws Exception { 42 | Map uuidMap = new HashMap(); 43 | int requests = (int) Math.ceil(names.size() / PROFILES_PER_REQUEST); 44 | for(int i = 0; i < requests; i++) { 45 | HttpURLConnection connection = createConnection(); 46 | String body = JSONArray.toJSONString(names.subList(i * 100, Math.min((i + 1) * 100, names.size()))); 47 | writeBody(connection, body); 48 | JSONArray array = (JSONArray) jsonParser.parse(new InputStreamReader(connection.getInputStream())); 49 | for(Object profile : array) { 50 | JSONObject jsonProfile = (JSONObject) profile; 51 | String id = (String) jsonProfile.get("id"); 52 | String name = (String) jsonProfile.get("name"); 53 | UUID uuid = UUIDFetcher.getUUID(id); 54 | uuidMap.put(name, uuid); 55 | } 56 | if(rateLimiting && i != requests - 1) { 57 | Thread.sleep(100L); 58 | } 59 | } 60 | return uuidMap; 61 | } 62 | 63 | private static void writeBody(HttpURLConnection connection, String body) throws Exception { 64 | OutputStream stream = connection.getOutputStream(); 65 | stream.write(body.getBytes()); 66 | stream.flush(); 67 | stream.close(); 68 | } 69 | 70 | private static HttpURLConnection createConnection() throws Exception { 71 | URL url = new URL(PROFILE_URL); 72 | HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 73 | connection.setRequestMethod("POST"); 74 | connection.setRequestProperty("Content-Type", "application/json"); 75 | connection.setUseCaches(false); 76 | connection.setDoInput(true); 77 | connection.setDoOutput(true); 78 | return connection; 79 | } 80 | 81 | private static UUID getUUID(String id) { 82 | return UUID.fromString(id.substring(0, 8) + "-" + id.substring(8, 12) + "-" + id.substring(12, 16) + "-" + id.substring(16, 20) + "-" + id.substring(20, 32)); 83 | } 84 | 85 | public static byte[] toBytes(UUID uuid) { 86 | ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[16]); 87 | byteBuffer.putLong(uuid.getMostSignificantBits()); 88 | byteBuffer.putLong(uuid.getLeastSignificantBits()); 89 | return byteBuffer.array(); 90 | } 91 | 92 | public static UUID fromBytes(byte[] array) { 93 | if(array.length != 16) { 94 | throw new IllegalArgumentException("Illegal byte array length: " + array.length); 95 | } 96 | ByteBuffer byteBuffer = ByteBuffer.wrap(array); 97 | long mostSignificant = byteBuffer.getLong(); 98 | long leastSignificant = byteBuffer.getLong(); 99 | return new UUID(mostSignificant, leastSignificant); 100 | } 101 | 102 | public static UUID getUUIDOf(String name) throws Exception { 103 | return new UUIDFetcher(Arrays.asList(name)).call().get(name); 104 | } 105 | 106 | /** 107 | * Returns whether the passed UUID is a v3 UUID. Offline UUIDs are v3, online are v4. 108 | * 109 | * @param uuid the UUID to check 110 | * @return whether the UUID is a v3 UUID & thus is offline 111 | */ 112 | public static boolean uuidIsOffline(UUID uuid) { 113 | return uuid.version() == 3; 114 | } 115 | 116 | public static boolean shouldSkipOfflineUUID(UUID uuid) { 117 | return (uuidIsOffline(uuid) && !MineverseChat.getInstance().getConfig().getBoolean("offline_server_acknowledgement", false)); 118 | } 119 | 120 | public static boolean shouldSkipOfflineUUIDProxy(UUID uuid, VentureChatProxySource source) { 121 | return (uuidIsOffline(uuid) && !source.isOfflineServerAcknowledgementSet()); 122 | } 123 | 124 | public static void checkOfflineUUIDWarning(UUID uuid) { 125 | if(shouldSkipOfflineUUID(uuid)) { 126 | Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - Detected Offline UUID!")); 127 | Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - If you are using BungeeCord, make sure you have properly setup IP Forwarding.")); 128 | Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - https://www.spigotmc.org/wiki/bungeecord-ip-forwarding/")); 129 | Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - You can access this wiki page from the log file or just Google it.")); 130 | Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - If you're running a \"cracked\" server, player data might not be stored properly, and thus, you are on your own.")); 131 | Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - If you run your server in offline mode, you will probably lose your player data when switching to online mode!")); 132 | Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll("&8[&eVentureChat&8]&c - No player data will be saved in offline mode unless you set the \"cracked\" server acknowledgement in the config!")); 133 | return; 134 | } 135 | } 136 | 137 | public static void checkOfflineUUIDWarningProxy(UUID uuid, VentureChatProxySource source) { 138 | if(shouldSkipOfflineUUIDProxy(uuid, source)) { 139 | source.sendConsoleMessage("&8[&eVentureChat&8]&c - Detected Offline UUID!"); 140 | source.sendConsoleMessage("&8[&eVentureChat&8]&c - If you are using BungeeCord, make sure you have properly setup IP Forwarding."); 141 | source.sendConsoleMessage("&8[&eVentureChat&8]&c - https://www.spigotmc.org/wiki/bungeecord-ip-forwarding/"); 142 | source.sendConsoleMessage("&8[&eVentureChat&8]&c - You can access this wiki page from the log file or just Google it."); 143 | source.sendConsoleMessage("&8[&eVentureChat&8]&c - If you're running a \"cracked\" server, player data might not be stored properly, and thus, you are on your own."); 144 | source.sendConsoleMessage("&8[&eVentureChat&8]&c - If you run your server in offline mode, you will probably lose your player data when switching to online mode!"); 145 | source.sendConsoleMessage("&8[&eVentureChat&8]&c - No player data will be saved in offline mode unless you set the \"cracked\" server acknowledgement in the config!"); 146 | return; 147 | } 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /src/main/java/mineverse/Aust1n46/chat/versions/VersionHandler.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.versions; 2 | 3 | import com.comphenix.protocol.utility.MinecraftVersion; 4 | 5 | public final class VersionHandler { 6 | 7 | public static final MinecraftVersion SERVER_VERSION = MinecraftVersion.getCurrentVersion(); 8 | private static final MinecraftVersion MC1_19 = new MinecraftVersion(1, 19, 0); 9 | private static final MinecraftVersion MC1_19_1 = new MinecraftVersion(1, 19, 1); 10 | private static final MinecraftVersion MC1_20_4 = new MinecraftVersion(1, 20, 4); 11 | 12 | private VersionHandler() { 13 | } 14 | 15 | public static boolean is1_7() { 16 | return SERVER_VERSION.getMinor() == 7 && SERVER_VERSION.getMajor() == 1; 17 | } 18 | 19 | public static boolean is1_8() { 20 | return SERVER_VERSION.getMinor() == 8 && SERVER_VERSION.getMajor() == 1; 21 | } 22 | 23 | public static boolean is1_9() { 24 | return SERVER_VERSION.getMinor() == 9 && SERVER_VERSION.getMajor() == 1; 25 | } 26 | 27 | public static boolean is1_10() { 28 | return SERVER_VERSION.getMinor() == 10 && SERVER_VERSION.getMajor() == 1; 29 | } 30 | 31 | public static boolean is1_11() { 32 | return SERVER_VERSION.getMinor() == 11 && SERVER_VERSION.getMajor() == 1; 33 | } 34 | 35 | public static boolean is1_12() { 36 | return SERVER_VERSION.getMinor() == 12 && SERVER_VERSION.getMajor() == 1; 37 | } 38 | 39 | public static boolean is1_13() { 40 | return SERVER_VERSION.getMinor() == 13 && SERVER_VERSION.getMajor() == 1; 41 | } 42 | 43 | public static boolean is1_14() { 44 | return SERVER_VERSION.getBuild() != 4 && SERVER_VERSION.getMinor() == 14 && SERVER_VERSION.getMajor() == 1; 45 | } 46 | 47 | public static boolean is1_14_4() { 48 | return SERVER_VERSION.getBuild() == 4 && SERVER_VERSION.getMinor() == 14 && SERVER_VERSION.getMajor() == 1; 49 | } 50 | 51 | public static boolean is1_15() { 52 | return SERVER_VERSION.getMinor() == 15 && SERVER_VERSION.getMajor() == 1; 53 | } 54 | 55 | public static boolean is1_16() { 56 | return SERVER_VERSION.getMinor() == 16 && SERVER_VERSION.getMajor() == 1; 57 | } 58 | 59 | public static boolean is1_17() { 60 | return SERVER_VERSION.getMinor() == 17 && SERVER_VERSION.getMajor() == 1; 61 | } 62 | 63 | public static boolean is1_18() { 64 | return SERVER_VERSION.getMinor() == 18 && SERVER_VERSION.getMajor() == 1; 65 | } 66 | 67 | public static boolean is1_19() { 68 | return SERVER_VERSION.getBuild() == 0 && SERVER_VERSION.getMinor() == 19 && SERVER_VERSION.getMajor() == 1; 69 | } 70 | 71 | public static boolean isUnder_1_19() { 72 | return !SERVER_VERSION.isAtLeast(MC1_19); 73 | } 74 | 75 | public static boolean isAbove_1_19() { 76 | return SERVER_VERSION.isAtLeast(MC1_19_1); 77 | } 78 | 79 | public static boolean isAtLeast_1_20_4() { 80 | return SERVER_VERSION.isAtLeast(MC1_20_4); 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/main/resources/Messages.yml: -------------------------------------------------------------------------------- 1 | Version: 2.22.4 2 | BlockCommandPlayer: '&cYou have been blocked from entering command {command}.' 3 | BlockCommandSender: '&cBlocked player &6{player} &cfrom entering command {command}.' 4 | BlockedCommand: '&cYou are blocked from entering this command: {command}' 5 | BlockingMessage: '&6{player} is currently blocking messages.' 6 | BungeeToggleOff: '&6You are now blocking BungeeCord chat.' 7 | BungeeToggleOn: '&6You are now receiving BungeeCord chat.' 8 | ClearChatSender: '&aCleared the server chat.' 9 | ClearChatServer: '&aYour chat has been cleared.' 10 | ChannelCannotMute: '&cYou cannot mute players in this channel: {channel_color}{channel_name}' 11 | ChannelCooldown: '&c{cooldown} of cooldown remaining.' 12 | ChannelList: '{channel_color}{channel_name} : {channel_alias}' 13 | ChannelListHeader: '&6Channel List : Alias' 14 | ChannelListWithPermissions: '{channel_color}{channel_name} : {channel_alias} - Permission Required' 15 | ChannelNoPermission: '&cYou do not have permission for this channel.' 16 | ChannelNoPermissionView: '&cYou do not have permission to look at this channel.' 17 | ChannelNoSpeakPermissions: '&cYou do not have permission to speak in this channel.' 18 | ChannelPlayerListHeader: '&6Players in Channel: {channel_color}{channel_name}' 19 | ChannelMuted: '&cYou are muted in this channel: {channel_color}{channel_name}' 20 | ChannelMutedReason: '&cYou are muted in this channel: {channel_color}{channel_name} &4Reason:&c {reason}' 21 | ChannelMutedTimed: '&cYou are muted in this channel: {channel_color}{channel_name}&c for {time}' 22 | ChannelMutedTimedReason: '&cYou are muted in this channel: {channel_color}{channel_name}&c for {time} &4Reason:&c {reason}' 23 | CommandInvalidArguments: '&cInvalid command: {command} {args}' 24 | CommandInvalidArgumentsIgnore: '&cInvalid command: /ignore [player] or /ignore list' 25 | CommandMustBeRunByPlayer: '&cThis command must be run by a player.' 26 | CommandNoPermission: '&cYou do not have permission for this command.' 27 | CommandNotBlockable: '&cCommand is not blockable.' 28 | CommandSpyOff: '&6You are no longer spying on commands.' 29 | CommandSpyOn: '&6You are now spying on commands.' 30 | ConfigReloaded: '&6VentureChat config reloaded.' 31 | EnterPrivateConversation: 'You are now in private conversation with {player_receiver}.' 32 | EnterPrivateConversationSpy: '{player_sender} started a private conversation with {player_receiver}.' 33 | ExitPrivateConversation: 'You are no longer in private conversation with {player_receiver}.' 34 | ExitPrivateConversationSpy: '{player_sender} is no longer in a private conversation with {player_receiver}.' 35 | FilterOff: '&6You are now ignoring the filter.' 36 | FilterOn: '&6You are no longer ignoring the filter.' 37 | ForceAll: '&6Forcing all players to run: &c{message}' 38 | ForcePlayer: '&6Forcing player &c{player} &6to run: &c{message}' 39 | IgnoreListHeader: '&6You are currently ignoring these players:' 40 | IgnorePlayerCant: '&cYou cannot ignore player: &6{player}&c.' 41 | IgnorePlayerOff: '&6You are no longer ignoring player: &c{player}' 42 | IgnorePlayerOn: '&6You are now ignoring player: &c{player}' 43 | IgnoreYourself: '&cYou can not ignore yourself!' 44 | IgnoringMessage: '&6{player} is currently ignoring your messages.' 45 | InvalidChannel: '&cInvalid channel: {args}' 46 | InvalidHash: '&cInvalid hashcode.' 47 | InvalidTime: '&cInvalid time: {args}' 48 | KickChannel: '&6Kicked player &c{player} &6from channel: {channel_color}{channel_name}' 49 | KickChannelAllPlayer: '&cYou have been kicked from all channels.' 50 | KickChannelAllSender: '&6Kicked player &c{player} &6from all channels.' 51 | LeaveChannel: 'Leaving channel: {channel_color}[{channel_name}]' 52 | ListenChannel: 'Listening to Channel: {channel_color}[{channel_name}]' 53 | MessageToggleOff: '&6You are now blocking messages.' 54 | MessageToggleOn: '&6You are now receiving messages.' 55 | MustListenOneChannel: '&cYou need to be listening on at least one channel, setting you into the default channel.' 56 | MutePlayerAllPlayer: '&cYou have just been muted in all channels.' 57 | MutePlayerAllPlayerReason: '&cYou have just been muted in all channels. &4Reason:&c {reason}' 58 | MutePlayerAllSender: '&cMuted player &6{player} &cin all channels.' 59 | MutePlayerAllSenderReason: '&cMuted player &6{player} &cin all channels. &4Reason:&c {reason}' 60 | MutePlayerPlayer: '&cYou have just been muted in: {channel_color}{channel_name}' 61 | MutePlayerPlayerReason: '&cYou have just been muted in: {channel_color}{channel_name} &4Reason:&c {reason}' 62 | MutePlayerPlayerTime: '&cYou have just been muted in: {channel_color}{channel_name} &cfor {time}' 63 | MutePlayerPlayerTimeReason: '&cYou have just been muted in: {channel_color}{channel_name} &cfor {time} &4Reason:&c {reason}' 64 | MutePlayerSender: '&cMuted player &6{player} &cin: {channel_color}{channel_name}' 65 | MutePlayerSenderReason: '&cMuted player &6{player} &cin: {channel_color}{channel_name} &4Reason:&c {reason}' 66 | MutePlayerSenderTime: '&cMuted player &6{player} &cin: {channel_color}{channel_name} &cfor {time}' 67 | MutePlayerSenderTimeReason: '&cMuted player &6{player} &cin: {channel_color}{channel_name} &cfor {time} &4Reason:&c {reason}' 68 | NoPlayerToReplyTo: '&cYou do not have anyone to reply to.' 69 | NotificationsOff: '&aYou are no longer receiving notifications.' 70 | NotificationsOn: '&aYou are now receiving notifications.' 71 | PlayerAlreadyMuted: '&6{player} &cis already muted in channel: {channel_color}{channel_name}' 72 | PlayerNotMuted: '&6{player} &cis not muted in channel: {channel_color}{channel_name}' 73 | PlayerOffline: '&cPlayer: &6{args} &cis not online.' 74 | PlayerOfflineNoPermissionsCheck: '&cCan''t run permission check on offline player.' 75 | RangedSpyOff: '&6You are no longer spying on ranged channels.' 76 | RangedSpyOn: '&6You are now spying on ranged channels.' 77 | SetChannel: 'Channel Set: {channel_color}[{channel_name}]' 78 | SetChannelAllPlayer: '&cYou have been set into all channels.' 79 | SetChannelAllSender: '&6Set player &c{player} &6into all channels.' 80 | SetChannelPlayerChannelNoPermission: '&cThis player does not have permission for channel: {channel_color}{channel_name}' 81 | SetChannelSender: '&6Set player &c{player} &6into channel: {channel_color}{channel_name}' 82 | SpamMuteReasonText: 'Spamming' 83 | SpamWarning: '&cSlow down your chat! You''re halfway to being muted for spam!' 84 | SpyOff: '&6You are no longer spying.' 85 | SpyOn: '&6You are now spying.' 86 | UnblockCommandPlayer: '&cYou have been unblocked from entering command {command}.' 87 | UnblockCommandSender: '&cUnblocked player &6{player} &cfrom entering command {command}.' 88 | UnitsDayPlural: 'days' 89 | UnitsDaySingular: 'day' 90 | UnitsHourPlural: 'hours' 91 | UnitsHourSingular: 'hour' 92 | UnitsMinutePlural: 'minutes' 93 | UnitsMinuteSingular: 'minute' 94 | UnitsSecondPlural: 'seconds' 95 | UnitsSecondSingular: 'second' 96 | UnmutePlayerAllPlayer: '&cYou have just been unmuted in all channels.' 97 | UnmutePlayerAllSender: '&cUnmuted player &6{player} &cin all channels.' 98 | UnmutePlayerPlayer: '&cYou have just been unmuted in: {channel_color}{channel_name}' 99 | UnmutePlayerSender: '&cUnmuted player &6{player} &cin: {channel_color}{channel_name}' 100 | -------------------------------------------------------------------------------- /src/main/resources/bungee.yml: -------------------------------------------------------------------------------- 1 | name: VentureChat 2 | main: mineverse.Aust1n46.chat.proxy.VentureChatBungee 3 | version: ${project.version} 4 | author: Aust1n46 -------------------------------------------------------------------------------- /src/main/resources/bungeeconfig.yml: -------------------------------------------------------------------------------- 1 | #=============================================================== 2 | # MineverseChat Bungee Config = 3 | # Author: Aust1n46 = 4 | #=============================================================== 5 | 6 | # If you're running a "cracked" server, player data might not be stored properly, and thus, you are on your own. 7 | # If you run your server in offline mode, you might have to reset your player data when switching to online mode! 8 | # If you see this warning by accident and you are using BungeeCord, make sure you have properly setup IP Forwarding. 9 | # https://www.spigotmc.org/wiki/bungeecord-ip-forwarding/ 10 | # No player data will be saved in offline mode unless you set this acknowledgement to 'true' 11 | offline_server_acknowledgement: false -------------------------------------------------------------------------------- /src/main/resources/commands.yml: -------------------------------------------------------------------------------- 1 | Version: 3.3.0 2 | # Restart server after editing this file!!! 3 | # Restart server after editing this file!!! 4 | # Restart server after editing this file!!! 5 | commands: 6 | message: 7 | aliases: [vmessage,msg,tell,whisper,pm] 8 | enabled: true 9 | ignore: 10 | aliases: [vignore] 11 | enabled: true 12 | reply: 13 | aliases: [vreply,r] 14 | enabled: true 15 | spy: 16 | aliases: [vspy] 17 | enabled: true 18 | mute: 19 | aliases: [mp,vmute] 20 | enabled: true 21 | unmute: 22 | aliases: [ump,vunmute] 23 | enabled: true 24 | muteall: 25 | aliases: [mpa,vmuteall] 26 | enabled: true 27 | unmuteall: 28 | aliases: [umpa,vunmuteall] 29 | enabled: true 30 | channel: 31 | aliases: [ch,vchannel,join] 32 | enabled: true 33 | listen: 34 | aliases: [lis,vlisten] 35 | enabled: true 36 | leave: 37 | aliases: [lev,vleave] 38 | enabled: true 39 | chlist: 40 | aliases: [chl,vchlist] 41 | enabled: true 42 | chwho: 43 | aliases: [chw,vchwho] 44 | enabled: true 45 | setchannel: 46 | aliases: [sc,vsetchannel] 47 | enabled: true 48 | kickchannel: 49 | aliases: [kc,vkickchannel] 50 | enabled: true 51 | kickchannelall: 52 | aliases: [kca,vkickchannelall] 53 | enabled: true 54 | setchannelall: 55 | aliases: [sca,vsetchannelall] 56 | enabled: true 57 | force: 58 | aliases: [for,vforce] 59 | enabled: true 60 | forceall: 61 | aliases: [fora,vforceall] 62 | enabled: true 63 | chatreload: 64 | aliases: [cr,vchatreload] 65 | enabled: true 66 | commandspy: 67 | aliases: [comspy,vcommandspy] 68 | enabled: true 69 | chatinfo: 70 | aliases: [ci,vchatinfo] 71 | enabled: true 72 | channelinfo: 73 | aliases: [chi,vchannelinfo] 74 | enabled: true 75 | venturechat: 76 | aliases: [vc] 77 | enabled: true 78 | me: 79 | aliases: [vme] 80 | enabled: true 81 | filter: 82 | aliases: [fil,vfilter] 83 | enabled: true 84 | broadcast: 85 | aliases: [bc,vbroadcast] 86 | enabled: true 87 | commandblock: 88 | aliases: [cb,vcommandblock] 89 | enabled: true 90 | party: 91 | aliases: [p,chatparty,cp,vparty] 92 | enabled: true 93 | clearchat: 94 | aliases: [cc,vclearchat] 95 | enabled: true 96 | notifications: 97 | aliases: [notify,vnotify] 98 | enabled: true 99 | removemessage: 100 | aliases: [rm,vremovemessage] 101 | enabled: true 102 | rangedspy: 103 | aliases: [rspy,vrangedspy] 104 | enabled: true 105 | venturechatgui: 106 | aliases: [vchatgui] 107 | enabled: true 108 | messagetoggle: 109 | aliases: [mtoggle,vmessagetoggle] 110 | enabled: true 111 | bungeetoggle: 112 | aliases: [btoggle,vbungeetoggle] 113 | enabled: true 114 | config: 115 | aliases: [vconfig] 116 | enabled: false 117 | edit: 118 | aliases: [vedit] 119 | enabled: false 120 | -------------------------------------------------------------------------------- /src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | name: VentureChat 2 | version: ${project.version} 3 | api-version: 1.13 4 | main: mineverse.Aust1n46.chat.MineverseChat 5 | depend: [Vault, ProtocolLib, PlaceholderAPI] 6 | softdepend: [Towny, Factions, EssentialsDiscord] 7 | author: Aust1n46 8 | website: https://bitbucket.org/Aust1n46/venturechat/ 9 | description: #1 Channels Chat plugin! Spigot + Bungee. Supports PlaceholderAPI + JSON formatting. Moderation GUI! 10 | -------------------------------------------------------------------------------- /src/main/resources/velocity-plugin.json: -------------------------------------------------------------------------------- 1 | {"id":"venturechat","name":"VentureChat","version":"${project.version}","description":"#1 Channels Chat plugin! Spigot + Bungee. Supports PlaceholderAPI + JSON formatting. Moderation GUI!","authors":["Aust1n46"],"dependencies":[],"main":"mineverse.Aust1n46.chat.proxy.VentureChatVelocity"} -------------------------------------------------------------------------------- /src/main/resources/velocityconfig.yml: -------------------------------------------------------------------------------- 1 | #=============================================================== 2 | # MineverseChat Velocity Config = 3 | # Author: Aust1n46 = 4 | #=============================================================== 5 | 6 | # If you're running a "cracked" server, player data might not be stored properly, and thus, you are on your own. 7 | # If you run your server in offline mode, you might have to reset your player data when switching to online mode! 8 | # If you see this warning by accident and you are using Velocity, make sure you have properly setup IP Forwarding. 9 | # https://www.spigotmc.org/wiki/bungeecord-ip-forwarding/ 10 | # No player data will be saved in offline mode unless you set this acknowledgement to 'true' 11 | offline_server_acknowledgement: false -------------------------------------------------------------------------------- /src/test/java/mineverse/Aust1n46/chat/listeners/LoginListenerTest.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.listeners; 2 | 3 | import java.io.File; 4 | 5 | import org.bukkit.Bukkit; 6 | import org.bukkit.command.ConsoleCommandSender; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.event.player.PlayerQuitEvent; 9 | import org.junit.After; 10 | import org.junit.AfterClass; 11 | import org.junit.Before; 12 | import org.junit.BeforeClass; 13 | import org.junit.Test; 14 | import org.mockito.MockedStatic; 15 | import org.mockito.Mockito; 16 | 17 | import mineverse.Aust1n46.chat.MineverseChat; 18 | import mineverse.Aust1n46.chat.api.MineverseChatAPI; 19 | import mineverse.Aust1n46.chat.api.MineverseChatPlayer; 20 | import mineverse.Aust1n46.chat.database.PlayerData; 21 | 22 | /** 23 | * Tests {@link LoginListener}. 24 | */ 25 | public class LoginListenerTest { 26 | private static MockedStatic mockedMineverseChat; 27 | private static MockedStatic mockedBukkit; 28 | private static MockedStatic mockedPlayerData; 29 | private static MockedStatic mockedMineverseChatAPI; 30 | 31 | private static MineverseChat mockPlugin; 32 | private Player mockPlayer; 33 | private MineverseChatPlayer mockMCP; 34 | private ConsoleCommandSender mockConsoleSender; 35 | private LoginListener testLoginListener; 36 | private PlayerQuitEvent mockPlayerQuitEvent; 37 | private static File mockDataFile; 38 | 39 | @BeforeClass 40 | public static void init() { 41 | mockedMineverseChat = Mockito.mockStatic(MineverseChat.class); 42 | mockPlugin = Mockito.mock(MineverseChat.class); 43 | Mockito.when(MineverseChat.getInstance()).thenReturn(mockPlugin); 44 | mockedBukkit = Mockito.mockStatic(Bukkit.class); 45 | mockDataFile = Mockito.mock(File.class); 46 | Mockito.when(mockPlugin.getDataFolder()).thenReturn(mockDataFile); 47 | Mockito.when(mockDataFile.getAbsolutePath()).thenReturn(""); 48 | mockedPlayerData = Mockito.mockStatic(PlayerData.class); 49 | mockedMineverseChatAPI = Mockito.mockStatic(MineverseChatAPI.class); 50 | } 51 | 52 | @AfterClass 53 | public static void close() { 54 | mockedMineverseChat.close(); 55 | mockedBukkit.close(); 56 | mockedPlayerData.close(); 57 | mockedMineverseChatAPI.close(); 58 | } 59 | 60 | @Before 61 | public void setUp() { 62 | mockPlayer = Mockito.mock(Player.class); 63 | mockMCP = Mockito.mock(MineverseChatPlayer.class); 64 | mockConsoleSender = Mockito.mock(ConsoleCommandSender.class); 65 | mockPlayerQuitEvent = Mockito.mock(PlayerQuitEvent.class); 66 | Mockito.when(mockPlayerQuitEvent.getPlayer()).thenReturn(mockPlayer); 67 | Mockito.when(MineverseChatAPI.getMineverseChatPlayer(Mockito.any(Player.class))).thenReturn(mockMCP); 68 | Mockito.when(MineverseChatAPI.getOnlineMineverseChatPlayer(Mockito.any(Player.class))).thenReturn(mockMCP); 69 | Mockito.when(Bukkit.getConsoleSender()).thenReturn(mockConsoleSender); 70 | testLoginListener = new LoginListener(); 71 | } 72 | 73 | @After 74 | public void tearDown() { 75 | mockPlugin = null; 76 | } 77 | 78 | @Test 79 | public void testLoginWithNameChange() throws Exception { 80 | Mockito.when(mockPlayer.getName()).thenReturn("NewName"); 81 | Mockito.when(mockMCP.getName()).thenReturn("OldName"); 82 | testLoginListener.handleNameChange(mockMCP, mockPlayer); 83 | Mockito.verify(mockMCP, Mockito.times(1)).setName("NewName"); 84 | } 85 | 86 | @Test 87 | public void testPlayerQuit() { 88 | testLoginListener.onPlayerQuit(mockPlayerQuitEvent); 89 | Mockito.verify(mockMCP, Mockito.times(1)).clearMessages(); 90 | Mockito.verify(mockMCP, Mockito.times(1)).setOnline(false); 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /src/test/java/mineverse/Aust1n46/chat/utilities/FormatTest.java: -------------------------------------------------------------------------------- 1 | package mineverse.Aust1n46.chat.utilities; 2 | 3 | import static mineverse.Aust1n46.chat.utilities.Format.BUKKIT_COLOR_CODE_PREFIX; 4 | import static org.junit.Assert.assertEquals; 5 | import static org.junit.Assert.assertFalse; 6 | import static org.junit.Assert.assertTrue; 7 | 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | 11 | import org.bukkit.configuration.file.FileConfiguration; 12 | import org.junit.After; 13 | import org.junit.AfterClass; 14 | import org.junit.Before; 15 | import org.junit.BeforeClass; 16 | import org.junit.Test; 17 | import org.mockito.MockedStatic; 18 | import org.mockito.Mockito; 19 | 20 | import mineverse.Aust1n46.chat.MineverseChat; 21 | 22 | /** 23 | * Tests {@link Format}. 24 | */ 25 | public class FormatTest { 26 | private static MockedStatic mockedMineverseChat; 27 | 28 | private static MineverseChat mockPlugin; 29 | private FileConfiguration mockConfig; 30 | 31 | private List filters; 32 | 33 | @BeforeClass 34 | public static void init() { 35 | mockedMineverseChat = Mockito.mockStatic(MineverseChat.class); 36 | mockPlugin = Mockito.mock(MineverseChat.class); 37 | Mockito.when(MineverseChat.getInstance()).thenReturn(mockPlugin); 38 | } 39 | 40 | @AfterClass 41 | public static void close() { 42 | mockedMineverseChat.close(); 43 | } 44 | 45 | @Before 46 | public void setUp() { 47 | filters = new ArrayList(); 48 | filters.add("ass,donut"); 49 | 50 | mockConfig = Mockito.mock(FileConfiguration.class); 51 | Mockito.when(mockPlugin.getConfig()).thenReturn(mockConfig); 52 | Mockito.when(mockConfig.getStringList("filters")).thenReturn(filters); 53 | } 54 | 55 | @After 56 | public void tearDown() { 57 | filters = new ArrayList(); 58 | } 59 | 60 | @Test 61 | public void testGetLastCodeSingleColor() { 62 | String input = BUKKIT_COLOR_CODE_PREFIX + "cHello"; 63 | String expectedResult = BUKKIT_COLOR_CODE_PREFIX + "c"; 64 | 65 | String result = Format.getLastCode(input); 66 | 67 | assertEquals(expectedResult, result); 68 | } 69 | 70 | @Test 71 | public void testGetLastCodeColorAfterFormat() { 72 | String input = BUKKIT_COLOR_CODE_PREFIX + "o" + BUKKIT_COLOR_CODE_PREFIX + "cHello"; 73 | String expectedResult = BUKKIT_COLOR_CODE_PREFIX + "c"; 74 | 75 | String result = Format.getLastCode(input); 76 | 77 | assertEquals(expectedResult, result); 78 | } 79 | 80 | @Test 81 | public void testGetLastCodeColorBeforeFormat() { 82 | String input = BUKKIT_COLOR_CODE_PREFIX + "c" + BUKKIT_COLOR_CODE_PREFIX + "oHello"; 83 | String expectedResult = BUKKIT_COLOR_CODE_PREFIX + "c" + BUKKIT_COLOR_CODE_PREFIX + "o"; 84 | 85 | String result = Format.getLastCode(input); 86 | 87 | assertEquals(expectedResult, result); 88 | } 89 | 90 | @Test 91 | public void testFilterChat() { 92 | String test = "I am an ass"; 93 | String expectedResult = "I am an donut"; 94 | 95 | String result = Format.FilterChat(test); 96 | assertEquals(expectedResult, result); 97 | } 98 | 99 | @Test 100 | public void testIsValidColor() { 101 | String color = "red"; 102 | 103 | boolean result = Format.isValidColor(color); 104 | assertTrue(result); 105 | } 106 | 107 | @Test 108 | public void testIsInvalidColor() { 109 | String color = "randomString"; 110 | 111 | boolean result = Format.isValidColor(color); 112 | assertFalse(result); 113 | } 114 | 115 | @Test 116 | public void testIsValidHexColor() { 117 | String hexColor = "#ff00ff"; 118 | 119 | boolean result = Format.isValidHexColor(hexColor); 120 | assertTrue(result); 121 | } 122 | 123 | @Test 124 | public void testIsInvalidHexColor() { 125 | String hexColor = "#random"; 126 | 127 | boolean result = Format.isValidHexColor(hexColor); 128 | assertFalse(result); 129 | } 130 | 131 | @Test 132 | public void testConvertHexColorCodeToBukkitColorCode() { 133 | String hexColor = "#ff00ff"; 134 | String expectedResult = BUKKIT_COLOR_CODE_PREFIX + "x" + BUKKIT_COLOR_CODE_PREFIX + "f" 135 | + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "0" + BUKKIT_COLOR_CODE_PREFIX + "0" 136 | + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "f"; 137 | 138 | String result = Format.convertHexColorCodeToBukkitColorCode(hexColor); 139 | assertEquals(expectedResult, result); 140 | } 141 | 142 | @Test 143 | public void testConvertHexColorCodeStringToBukkitColorCodeString() { 144 | String input = "#ff00ffHello" + BUKKIT_COLOR_CODE_PREFIX + "cThere#00ff00Austin"; 145 | String expectedResult = BUKKIT_COLOR_CODE_PREFIX + "x" + BUKKIT_COLOR_CODE_PREFIX + "f" 146 | + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "0" + BUKKIT_COLOR_CODE_PREFIX + "0" 147 | + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "fHello" + BUKKIT_COLOR_CODE_PREFIX 148 | + "cThere" + BUKKIT_COLOR_CODE_PREFIX + "x" + BUKKIT_COLOR_CODE_PREFIX + "0" + BUKKIT_COLOR_CODE_PREFIX 149 | + "0" + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "f" + BUKKIT_COLOR_CODE_PREFIX + "0" 150 | + BUKKIT_COLOR_CODE_PREFIX + "0Austin"; 151 | 152 | String result = Format.convertHexColorCodeStringToBukkitColorCodeString(input); 153 | assertEquals(expectedResult, result); 154 | } 155 | 156 | @Test 157 | public void testFormatStringLegacyColor_NoColorCode() { 158 | String input = "Hello There Austin"; 159 | String expectedResult = "Hello There Austin"; 160 | 161 | String result = Format.FormatStringLegacyColor(input); 162 | assertEquals(expectedResult, result); 163 | } 164 | 165 | @Test 166 | public void testFormatStringLegacyColor_LegacyCodeOnly() { 167 | String input = "Hello &cThere Austin"; 168 | String expectedResult = "Hello " + BUKKIT_COLOR_CODE_PREFIX + "cThere Austin"; 169 | 170 | String result = Format.FormatStringLegacyColor(input); 171 | assertEquals(expectedResult, result); 172 | } 173 | 174 | @Test 175 | public void testFormatStringLegacyColor_SpigotHexCodeOnly() { 176 | String input = "&x&f&f&f&f&f&fHello There Austin"; 177 | String expectedResult = "&x&f&f&f&f&f&fHello There Austin"; 178 | 179 | String result = Format.FormatStringLegacyColor(input); 180 | assertEquals(expectedResult, result); 181 | } 182 | 183 | @Test 184 | public void testFormatStringLegacyColor_BothColorCodes() { 185 | String input = "&x&f&f&f&f&f&f&cHello There Austin"; 186 | String expectedResult = "&x&f&f&f&f&f&f" + BUKKIT_COLOR_CODE_PREFIX + "cHello There Austin"; 187 | 188 | String result = Format.FormatStringLegacyColor(input); 189 | assertEquals(expectedResult, result); 190 | } 191 | } 192 | --------------------------------------------------------------------------------