commit 49a29a74201a82422d5a2cdddbbb0efcb37df109 Author: thmsdy Date: Fri Jan 17 17:49:26 2020 -0600 Initial Commit diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..2e6518a --- /dev/null +++ b/.classpath @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..09e3bc9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/bin/ +/target/ diff --git a/.project b/.project new file mode 100644 index 0000000..25888f4 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + FPChatX + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..557567d --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding/src=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..e24b722 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,13 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..14b697b --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml new file mode 100644 index 0000000..d48e621 --- /dev/null +++ b/dependency-reduced-pom.xml @@ -0,0 +1,117 @@ + + + 4.0.0 + FPChatX + FPChatX + 1.0.0-BETA + + src/main/java + + + true + src/main/resources + + + + + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + UTF-8 + + + + maven-shade-plugin + 3.0.0 + + + package + + shade + + + + + 1.7 + + + org.apache.commons*:* + + + + + + + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + jitpack.io + https://jitpack.io + + + bungeecord-repo + https://oss.sonatype.org/content/repositories/snapshots + + + placeholderapi + http://repo.extendedclip.com/content/repositories/placeholderapi/ + + + + + org.spigotmc + spigot-api + 1.15.1-R0.1-SNAPSHOT + compile + + + org.bukkit + bukkit + 1.15.1-R0.1-SNAPSHOT + compile + + + net.md-5 + bungeecord-api + 1.15-SNAPSHOT + provided + + + bungeecord-config + net.md-5 + + + bungeecord-event + net.md-5 + + + bungeecord-protocol + net.md-5 + + + netty-transport-native-unix-common + io.netty + + + + + com.github.MilkBowl + VaultAPI + 1.7 + provided + + + me.clip + placeholderapi + 2.10.4 + provided + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..cba7862 --- /dev/null +++ b/pom.xml @@ -0,0 +1,105 @@ + + 4.0.0 + FPChatX + FPChatX + 1.0.0-BETA + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + jitpack.io + https://jitpack.io + + + bungeecord-repo + https://oss.sonatype.org/content/repositories/snapshots + + + placeholderapi + http://repo.extendedclip.com/content/repositories/placeholderapi/ + + + + src/main/java + + + src/main/resources + true + + + + + maven-compiler-plugin + 3.8.0 + + 1.8 + 1.8 + UTF-8 + + + + org.apache.maven.plugins + maven-shade-plugin + 3.0.0 + + 1.7 + + + org.apache.commons*:* + + + + + + + + package + + shade + + + + + + + + + org.apache.commons + commons-lang3 + 3.0 + + + org.spigotmc + spigot-api + 1.15.1-R0.1-SNAPSHOT + + + org.bukkit + bukkit + 1.15.1-R0.1-SNAPSHOT + + + net.md-5 + bungeecord-api + 1.15-SNAPSHOT + jar + provided + + + com.github.MilkBowl + VaultAPI + 1.7 + provided + + + me.clip + placeholderapi + 2.10.4 + provided + + + \ No newline at end of file diff --git a/src/main/java/com/fpghoti/fpchatx/FPChat.java b/src/main/java/com/fpghoti/fpchatx/FPChat.java new file mode 100644 index 0000000..8c81244 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/FPChat.java @@ -0,0 +1,242 @@ +package com.fpghoti.fpchatx; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.PluginManager; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; + +import com.fpghoti.fpchatx.badge.BadgeList; +import com.fpghoti.fpchatx.chat.ChatChannel; +import com.fpghoti.fpchatx.chat.ShoutChannel; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.command.commands.BadgeClearCommand; +import com.fpghoti.fpchatx.command.commands.BadgeEquipCommand; +import com.fpghoti.fpchatx.command.commands.BadgeListCommand; +import com.fpghoti.fpchatx.command.commands.BlacklistCommand; +import com.fpghoti.fpchatx.command.commands.DeleteCommand; +import com.fpghoti.fpchatx.command.commands.JoinCommand; +import com.fpghoti.fpchatx.command.commands.TalkCommand; +import com.fpghoti.fpchatx.command.commands.GiveBadgeCommand; +import com.fpghoti.fpchatx.command.commands.HelpCommand; +import com.fpghoti.fpchatx.command.commands.HushCommand; +import com.fpghoti.fpchatx.command.commands.IgnoreCommand; +import com.fpghoti.fpchatx.command.commands.IgnoreListCommand; +import com.fpghoti.fpchatx.command.commands.KickCommand; +import com.fpghoti.fpchatx.command.commands.LeaveCommand; +import com.fpghoti.fpchatx.command.commands.ChannelsCommand; +import com.fpghoti.fpchatx.command.commands.CreateCommand; +import com.fpghoti.fpchatx.command.commands.MessageCommand; +import com.fpghoti.fpchatx.command.commands.ReloadCommand; +import com.fpghoti.fpchatx.command.commands.ReplyCommand; +import com.fpghoti.fpchatx.command.commands.RevokeBadgeCommand; +import com.fpghoti.fpchatx.command.commands.ShoutCommand; +import com.fpghoti.fpchatx.command.commands.ShoutToggleCommand; +import com.fpghoti.fpchatx.command.commands.SpyCommand; +import com.fpghoti.fpchatx.command.commands.UnHushCommand; +import com.fpghoti.fpchatx.command.commands.UnignoreCommand; +import com.fpghoti.fpchatx.command.commands.WhoCommand; +import com.fpghoti.fpchatx.config.MainConfig; +import com.fpghoti.fpchatx.config.PlayerCache; +import com.fpghoti.fpchatx.listener.PlayerListener; +import com.fpghoti.fpchatx.mysql.MySQLConnection; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.VaultUtil; + +public class FPChat extends JavaPlugin { + + private static Logger log = Logger.getLogger("Minecraft"); + private static Logger chatLog = Logger.getLogger("FPChat"); + private MainConfig config; + private MySQLConnection sql; + private static FPChat plugin; + private int mysqlTimer = 1140; + private BukkitTask refresh = null; + private PlayerListener listener = null; + private PlayerCache cache; + + public void onEnable() { + plugin = this; + VaultUtil vault = new VaultUtil(this); + vault.setupChat(); + vault.setupEconomy(); + vault.setupPermissions(); + config = new MainConfig(this); + if(config.mySQLEnabled()) { + sql = new MySQLConnection(this); + sql.generate(); + startTimers(); + } + registerEvents(); + registerCommands(); + + PluginDescriptionFile desc = getDescription(); + + ChatChannel.loadChannels(); + ChatChannel.setShout(new ShoutChannel(this)); + ChatChannel.setDefault(config.getDefaultChannel()); + BadgeList.setupBadges(); + for(int i : BadgeList.badgelist.keySet()) { + BadgeList.badgelist.put(i, BadgeList.badgelist.get(i).replace("&", "§")); + } + cache = new PlayerCache(this); + for(Player bp : Bukkit.getOnlinePlayers()){ + FPlayer.getPlayer(bp); + } + log(Level.INFO, desc.getName() + " version " + desc.getVersion() + " enabled."); + } + + public void onDisable() { + for(FPlayer p : FPlayer.getPlayers()) { + p.cleanup(); + } + if(config.mySQLEnabled()) { + sql.disconnect(); + } + } + + public void reload() { + Commands.blockCommands(); + if(listener != null) { + listener.disable(); + } + if(refresh != null) { + refresh.cancel(); + } + + sql.disconnect(); + for(FPlayer p : FPlayer.getPlayers()) { + p.cleanup(); + } + BadgeList.purge(); + FPlayer.purge(); + config = new MainConfig(this); + if(config.mySQLEnabled()) { + sql = new MySQLConnection(this); + sql.generate(); + startTimers(); + } + ChatChannel.loadChannels(); + ChatChannel.setShout(new ShoutChannel(this)); + ChatChannel.setDefault(config.getDefaultChannel()); + BadgeList.setupBadges(); + for(int i : BadgeList.badgelist.keySet()) { + BadgeList.badgelist.put(i, BadgeList.badgelist.get(i).replace("&", "§")); + } + cache = new PlayerCache(this); + for(Player bp : Bukkit.getOnlinePlayers()){ + FPlayer.getPlayer(bp); + } + if(listener != null) { + listener.enable(); + } + Commands.allowCommands(); + log(Level.INFO, "FPChatX reloaded."); + } + + private void registerEvents() { + this.listener = new PlayerListener(); + PluginManager pm = getServer().getPluginManager(); + pm.registerEvents(listener, this); + } + + private void registerCommands() { + Commands.register(new ReloadCommand(this)); + Commands.register(new ShoutCommand(this)); + Commands.register(new ShoutToggleCommand(this)); + Commands.register(new MessageCommand(this)); + Commands.register(new ReplyCommand(this)); + Commands.register(new IgnoreCommand(this)); + Commands.register(new UnignoreCommand(this)); + Commands.register(new IgnoreListCommand(this)); + Commands.register(new BadgeListCommand(this)); + Commands.register(new BadgeEquipCommand(this)); + Commands.register(new BadgeClearCommand(this)); + Commands.register(new SpyCommand(this)); + Commands.register(new ChannelsCommand(this)); + Commands.register(new WhoCommand(this)); + Commands.register(new TalkCommand(this)); + Commands.register(new JoinCommand(this)); + Commands.register(new LeaveCommand(this));; + Commands.register(new CreateCommand(this)); + Commands.register(new DeleteCommand(this)); + Commands.register(new HushCommand(this)); + Commands.register(new UnHushCommand(this)); + Commands.register(new KickCommand(this)); + Commands.register(new BlacklistCommand(this)); + Commands.register(new HelpCommand(this)); + Commands.register(new RevokeBadgeCommand(this)); + Commands.register(new GiveBadgeCommand(this)); + + } + + public MainConfig getMainConfig() { + return this.config; + } + + public PlayerCache getPlayerCache() { + return this.cache; + } + + public MySQLConnection getMySQLConnection() { + return this.sql; + } + + public void log(Level level, String msg) { + log.log(level, "[FPChatX] " + msg.replaceAll("§[0-9A-FK-OR]", "")); + } + + + public void logChat(String msg) { + chatLog.info(msg.replaceAll("§[0-9A-FK-OR]", "")); + } + + public static FPChat getPlugin(){ + return plugin; + } + + public static String logo() { + return "" + ChatColor.DARK_RED + "[" + ChatColor.GREEN + ChatColor.BOLD + "FPChatX" + ChatColor.RESET + ChatColor.DARK_RED + "]" + ChatColor.RESET ; + + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + return Commands.performCommand(sender, command, label, args); + } + + + public void startTimers() { + refresh = new BukkitRunnable(){ + public void run() { + if(config.shoutCooldownEnabled()) { //shout cooldown + for(FPlayer p : FPlayer.getPlayers()) { + if(p != null) { + int time = p.getShoutCooldown(); + if(time > 0){ + p.setShoutCooldown(time - 1); + } + } + } + } + if(config.mySQLEnabled()){ // mysql auto reconnect + if(mysqlTimer >= 1200){ + sql.reconnect(); + mysqlTimer = 0; + }else{ + mysqlTimer++; + } + } + } + }.runTaskTimerAsynchronously(this, 1*20, 1*20); + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/badge/BadgeGetter.java b/src/main/java/com/fpghoti/fpchatx/badge/BadgeGetter.java new file mode 100644 index 0000000..16a327d --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/badge/BadgeGetter.java @@ -0,0 +1,49 @@ +package com.fpghoti.fpchatx.badge; + +import java.util.UUID; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.Util; + +public class BadgeGetter { + + public static Integer[] getBadges(FPlayer p){ + UUID id = p.getUniqueId(); + String uuid = id.toString(); + Integer badge1 = 0, badge2 = 0, badge3 = 0; + Util.connect(); + if(!FPChat.getPlugin().getMySQLConnection().itemExists("player_uuid", uuid, FPChat.getPlugin().getMainConfig().getChatFeatureTable())){ + BadgeSet.createPlayer(p); + } + badge1 = (Integer) FPChat.getPlugin().getMySQLConnection().get("badge_slot1", "player_uuid", "=", uuid, FPChat.getPlugin().getMainConfig().getChatFeatureTable()); + badge2 = (Integer)FPChat.getPlugin().getMySQLConnection().get("badge_slot2", "player_uuid", "=", uuid, FPChat.getPlugin().getMainConfig().getChatFeatureTable()); + badge3 = (Integer)FPChat.getPlugin().getMySQLConnection().get("badge_slot3", "player_uuid", "=", uuid, FPChat.getPlugin().getMainConfig().getChatFeatureTable()); + Integer[] badges = {badge1, badge2, badge3}; + return badges; + } + + public static Boolean hasBadge(FPlayer p, int id){ + if(id == 0) { + return true; + } + return p.hasPermission("fpchat.badge" + BadgeList.badgeperm.get(id)) || p.isSynced(id); + } + + public static Boolean canUseSlot(FPlayer p, int slotid){ + if(slotid == 1){ + return p.hasPermission("fpchat.slot1"); + }else if(slotid == 2){ + if(hasBadge(p,33) || hasBadge(p,34) || hasBadge(p,35) || hasBadge(p,52)){ + return true; + } + return p.hasPermission("fpchat.slot2"); + }else if(slotid == 3){ + if(hasBadge(p,53)){ + return true; + } + return p.hasPermission("fpchat.slot3"); + } + return false; + } +} diff --git a/src/main/java/com/fpghoti/fpchatx/badge/BadgeList.java b/src/main/java/com/fpghoti/fpchatx/badge/BadgeList.java new file mode 100644 index 0000000..c35771e --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/badge/BadgeList.java @@ -0,0 +1,324 @@ +package com.fpghoti.fpchatx.badge; + +import java.util.HashMap; +import java.util.LinkedHashMap; + +import org.bukkit.ChatColor; + +import com.fpghoti.fpchatx.player.FPlayer; + +public class BadgeList { + + + public static HashMap badgelist = new LinkedHashMap<>(); + public static HashMap badgename = new LinkedHashMap<>(); + public static HashMap badgeperm = new LinkedHashMap<>(); + + public static HashMap pageInstance = new HashMap<>(); + + + public static void purge() { + badgelist = new LinkedHashMap<>(); + badgename = new LinkedHashMap<>(); + badgeperm = new LinkedHashMap<>(); + + pageInstance = new HashMap<>(); + } + + public static void badgeList(FPlayer p , int page){ + p.sendMessage(""); + p.sendMessage(ChatColor.RED + "HOW TO USE:" + ChatColor.YELLOW + " You can equip badges with " + ChatColor.DARK_AQUA + "/equip slot# badge#" + ChatColor.YELLOW +". To unequip all badges, use " + ChatColor.DARK_AQUA + "/badgesclear" + ChatColor.YELLOW + "."); + p.sendMessage(ChatColor.AQUA + "------------------- Your Badges -------------------"); + p.sendMessage(""); + int eventnum = 0; + //for(Integer item : badgelist.keySet()){ + for(int i = 0; i < badgelist.size(); i++){ + eventnum = eventnum + 1; + } + double dp = (float)eventnum / 10.0; + int pagenum = (int)Math.ceil(dp); + if(page <= pagenum && page > 0){ + pageInstance.put(p,0); + int pageten = (page * 10)- 10; + for(Integer entry : badgelist.keySet()){ + if(pageInstance.get(p) == pageten || pageInstance.get(p) == pageten + 1 || pageInstance.get(p) == pageten + 2 || pageInstance.get(p) == pageten + 3 || pageInstance.get(p) == pageten + 4 || pageInstance.get(p) == pageten + 5 || pageInstance.get(p) == pageten + 6 || pageInstance.get(p) == pageten + 7 || pageInstance.get(p) == pageten + 8 || pageInstance.get(p) == pageten + 9){ + if(entry == 0){ + }else if(p.hasPermission("fpchat.badge" + badgeperm.get(entry)) || p.isSynced(entry)){ + p.sendMessage(badgelist.get(entry) + ChatColor.GOLD + " Badge #" + entry + ": " + ChatColor.GREEN + " - " + badgename.get(entry) + ChatColor.GOLD + " - UNLOCKED"); + }else{ + p.sendMessage(badgelist.get(entry) + ChatColor.GOLD + " Badge #" + entry + ": " + ChatColor.GREEN + " - " + badgename.get(entry) + ChatColor.RED + " - LOCKED"); + } + } + pageInstance.put(p,(pageInstance.get(p)+1)); + } + p.sendMessage(ChatColor.AQUA + ""); + p.sendMessage(ChatColor.YELLOW + "Page " + Integer.toString(page) + " of " + Integer.toString(pagenum)); + p.sendMessage(ChatColor.AQUA + "---------------------------------------------------"); + pageInstance.remove(p); + } + } + + public static void setupBadges(){ + + //DO NOT CHANGE ANY OF THE BADGEID NUMBERS. THIS WILL REALLY SCREW UP PEOPLES BADGE PERMISSIONS IN GAME. I WILL SOON ADD SOMETHING FOR PEOPLE TO MORE EASILY SEE THEIR UNLOCKED BADGES + + //These are the designs used in game of each badge + + badgelist.put(0, ""); + badgelist.put(1, "&6{✮}"); + badgelist.put(2, "&b{&7❂&b}"); + badgelist.put(3, "&c[0G]"); + badgelist.put(4, "&8{&9Ⓜ&8}"); + badgelist.put(5, "&b(✌)"); + badgelist.put(6, "&3{☹}"); + badgelist.put(7, "&4<&8➳&4>"); + badgelist.put(8, "&a(รɦṁ)"); + badgelist.put(9, "&e[Ⓒ]"); + badgelist.put(10, "&8[&f☠&8]"); + badgelist.put(11, "&b{&f☃&b}"); + badgelist.put(12, "&d{&6❀&d}"); + badgelist.put(13, "&e<&a☣&e>"); + badgelist.put(14, "&5(&3☔&5)"); + badgelist.put(15, "&a{☎}"); + badgelist.put(16, "&7{&b♫&7}"); + badgelist.put(17, "&e<&6⚡&e>"); + badgelist.put(18, "&3(&c⍤&3)"); + badgelist.put(19, "&f[&c♛&f]"); + badgelist.put(20, "&b[&a✦&b]"); + badgelist.put(21, "&e[&7♜&e]"); + badgelist.put(22, "&6[&7⚒&6]"); + badgelist.put(23, "&3[&7❖&3]"); + badgelist.put(24, "&2[&7⧈&2]"); + badgelist.put(25, "&5(&d⚉&5)"); + badgelist.put(26, "&1[&4β&1]"); + badgelist.put(27, "&b{&3&lᴮᵀ&b}"); + badgelist.put(28, "&c{&b&lᴴᴮᵀ&c}"); + badgelist.put(29, "&8{&6&lᴮ&a&lᵒ&6&lᵒ&8}"); + badgelist.put(30, "&3<&eᵒᵒᶠ&3>"); + badgelist.put(31, "&b&l{&f&l✔&b&l}"); + badgelist.put(32, "&a|PR0|"); + badgelist.put(33, "&1⦅&b&lx2&r&1⦆"); + badgelist.put(34, "&a«&2&lx2&r&a»"); + badgelist.put(35, "&e⦉&6x2&e⦊"); + badgelist.put(36, "&6﴾&cⰀ&6﴿"); + badgelist.put(37, "&7﴾※﴿"); + badgelist.put(38, "&7⌈&f◉&d⩐&f◉&7⌉"); + badgelist.put(39, "&8[&7༗&8]"); + badgelist.put(40, "&8[&bⒺ➀&8]"); + badgelist.put(41, "&8[&eⒺ➁&8]"); + badgelist.put(42, "&8[&2Ⓔ➂&8]"); + badgelist.put(43, "&8[&6Ⓔ&c➃&8]"); + badgelist.put(44, "&8[&bⒺ&a➄&8]"); + badgelist.put(45, "&8[&cⒺ&b➅&8]"); + badgelist.put(46, "&5{&dᴠɪᴘ&5}"); + badgelist.put(47, "&5{&4ᴠ&eɪ&9ᴘ&a⁺&5}"); + badgelist.put(48, "&6{&bᴠ&c⁺&a⁺&6}"); + badgelist.put(49, "&3{&bᴛᴏᴘ&3}"); + badgelist.put(50, "&6{&eᴘʟᴀᴛ&6}"); + badgelist.put(51, "&8{&7ᴛɪ&8}"); + badgelist.put(52, "&c⦉&4x2&c⦊"); + badgelist.put(53, "&b⦅&1&lx3&r&b⦆"); + badgelist.put(54, "&8[&5✥&8]"); + badgelist.put(55, "&8{&bⒶ&8}"); + badgelist.put(56, "&8{&3ᴼᴾ&8}"); + badgelist.put(57, "&8{&4&l♔&8}"); + badgelist.put(58, "&7{&9☯&7}"); + badgelist.put(59, "&f⟦&6&o&l0G&8&f⟧"); + badgelist.put(60, "&6ヽ( •_)ᕗ"); + badgelist.put(61, "&c⦇&6☕&c⦈"); + badgelist.put(62, "&b&l⦍&c&lF&b&l⦐"); + badgelist.put(63, "&a⦇&e⧔⧕&d⦈"); + badgelist.put(64, "&2[&c❒&2]"); + badgelist.put(65, "&4{&e▼&4}"); + badgelist.put(66, "&e{&d☞&e}"); + badgelist.put(67, "&f<&7✄&f>"); + badgelist.put(68, "&5⸨&d◕‿‿◕&5⸩"); + badgelist.put(69, "&d⌇&4❤&d⌇"); + badgelist.put(70, "&6ʕ•ᴥ•ʔ"); + badgelist.put(71, "&f<&9☆彡&f>"); + badgelist.put(72, "&a(&5✿&a}"); + badgelist.put(73, "&a&k!&e&k!&c&k!&b&k!&c&k!&e&k!&a&k!&r"); + badgelist.put(74, "&a[&f[&6Ⱑ&f]&a]"); + badgelist.put(75, "&4]&8⸮&4["); + badgelist.put(76, "&0【&7&l〆&r&0】"); + badgelist.put(77, "&9[&2⸙&9]"); + badgelist.put(78, "&8⸠⨷⸡"); + badgelist.put(79, "&a⦑&4⚐&9⚑&a⦒"); + badgelist.put(80, "p"); + + // These are the badge names listed in the badge menu. + // See notes here for possible badge uses + + badgename.put(0, "Empty"); //Represents an empty badge slot. Equipping removes whatever badge is in that slot. + badgename.put(1, "Gold Star"); //We have given these to people who win contests or in game events we have + badgename.put(2, "Silver Star"); //We've used this as a voting reward in the past + badgename.put(3, "Original Player"); //I've tried to reserve this one but people started giving it out, but we can still give this to old donors. + badgename.put(4, "Staff"); //Staff only + badgename.put(5, "Peace"); //Sell in-game or on the donor shop + badgename.put(6, "Boo-hoo"); //Obtainable by easter egg in one of the spawn vaults + badgename.put(7, "Hunter"); //Sell in-game or on the donor shop + badgename.put(8, "Shmeckle"); //Sell in-game or on the donor shop + badgename.put(9, "Copyright"); //Sell in-game or on the donor shop + badgename.put(10, "Skull"); //Sell in-game or on the donor shop + badgename.put(11, "Snowman"); //Sell in-game or on the donor shop + badgename.put(12, "Flower"); //Sell in-game or on the donor shop + badgename.put(13, "Radioactive"); //Sell in-game or on the donor shop + badgename.put(14, "Rainy"); //Sell in-game or on the donor shop + badgename.put(15, "Telephone"); //Sell in-game or on the donor shop + badgename.put(16, "Music"); //Sell in-game or on the donor shop + badgename.put(17, "Lightning"); //Sell in-game or on the donor shop + badgename.put(18, "Wow"); //Sell in-game or on the donor shop + badgename.put(19, "Monarch"); //Give to old creative donor with Monarch + badgename.put(20, "Baron"); //Give to old creative donor with Baron + badgename.put(21, "Artificer"); // Give to old creative donor with Artificer + badgename.put(22, "Craftsman"); // Give to old creative donor with Craftsman + badgename.put(23, "Journeyman"); // Give to old creative donor with Journeyman + badgename.put(24, "Carpenter"); // Give to old creative donor with Carpenter + badgename.put(25, "Pig"); //Sell in-game or on the donor shop + badgename.put(26, "Beta"); // Reserve for contests or special gift from staff + badgename.put(27, "Build Team"); // Reserve for Build team + badgename.put(28, "Head Builder"); // May not have any use anymore, but not really something for players + badgename.put(29, "Boo"); //Sell in-game or on the donor shop (OR give to players at Halloween) + badgename.put(30, "OOF!"); //Obtainable easteregg + badgename.put(31, "Trusted / Verified Player"); //Give to trusted/ex staff/ build team + badgename.put(32, "Professional Player"); //Can make a reward for parkour. We've associated this badge with an achievement in the past + badgename.put(33, "x2 Slots (Blue)"); // Anyone with this badge can equip a badge to a second slot + badgename.put(34, "x2 Slots (Green)"); // Same as #33 but green + badgename.put(35, "x2 Slots (Yellow)"); // same as #33 and #34 but yellow + badgename.put(36, "Gilded Crest"); //I've typically only given this one to staff + badgename.put(37, "Silver Crest"); //Sell in-game or on the donor shop + badgename.put(38, "Derp"); //Sell in-game or on the donor shop + badgename.put(39, "Hawk-Eye");//Sell in-game or on the donor shop + badgename.put(40, "Expert Level 1"); // Survival can make unlockable with rank progression + badgename.put(41, "Expert Level 2"); // Survival can make unlockable with rank progression + badgename.put(42, "Expert Level 3"); // Survival can make unlockable with rank progression + badgename.put(43, "Expert Level 4"); // Survival can make unlockable with rank progression + badgename.put(44, "Expert Level 5"); // Survival can make unlockable with rank progression + badgename.put(45, "Expert Level 6"); // Survival can make unlockable with rank progression + badgename.put(46, "VIP"); // Give to old main donors + badgename.put(47, "VIP+"); // Give to old main donors + badgename.put(48, "VIP++"); // Give to old main donors + badgename.put(49, "Topaz"); // Give to old main donors + badgename.put(50, "Platinum"); // Give to old main donors + badgename.put(51, "Titanium"); // Give to old main donors + badgename.put(52, "x2 Slots (Red)"); // Same as #33, #34, and #35 but red + badgename.put(53, "x3 Slots (Blue)"); // Anyone with this badge can equip 3 badges + badgename.put(54, "Architect"); //Can make unlockable on creative + badgename.put(55, "Admin"); // Reserved for staff + badgename.put(56, "Operator"); // Reserved for staff + badgename.put(57, "Owner"); // I wonder who this is for + badgename.put(58, "PvP Legend"); // Can give to old PvP donors and maybe even kitpvp donors + badgename.put(59, "Gold OG"); // Can give to old donors who had some of the higher ranks + badgename.put(60, "Dab"); //Sell in-game or on the donor shop + badgename.put(61, "Coffee"); //Sell in-game or on the donor shop + badgename.put(62, "F"); //Sell in-game or on the donor shop + badgename.put(63, "Candy"); //Sell in-game or on the donor shop + badgename.put(64, "Box"); //Sell in-game or on the donor shop + badgename.put(65, "Pizza"); //Sell in-game or on the donor shop + badgename.put(66, "Pointer"); //Sell in-game or on the donor shop + badgename.put(67, "Scissors"); //Sell in-game or on the donor shop + badgename.put(68, "Grin");//Sell in-game or on the donor shop + badgename.put(69, "Heart"); //Can give away for Valentine's day + badgename.put(70, "Bear");//Sell in-game or on the donor shop + badgename.put(71, "Comet");//Sell in-game or on the donor shop + badgename.put(72, "Tropical Flower");//Sell in-game or on the donor shop + badgename.put(73, "Magic");//Sell in-game or on the donor shop + badgename.put(74, "Sealed");//Sell in-game or on the donor shop + badgename.put(75, "Backwards");//Sell in-game or on the donor shop + badgename.put(76, "Dagger");//Sell in-game or on the donor shop + badgename.put(77, "Leaf");//Sell in-game or on the donor shop + badgename.put(78, "Starship");//Sell in-game or on the donor shop + badgename.put(79, "Flags");//Sell in-game or on the donor shop + badgename.put(80, "Stunned");//Sell in-game or on the donor shop + + + // BADGE PERMS + // These are the specific perm for each badge. They go like this: + // fpchat.badge. I.E fpchat.badge.goldstar + // See notes above for badges use ideas + + badgeperm.put(0, ""); + badgeperm.put(1, ".goldstar"); + badgeperm.put(2, ".silverstar"); + badgeperm.put(3, ".og"); + badgeperm.put(4, ".staff"); + badgeperm.put(5, ".peace"); + badgeperm.put(6, ".boohoo"); + badgeperm.put(7, ".hunter"); + badgeperm.put(8, ".shmeckle"); + badgeperm.put(9, ".copyright"); + badgeperm.put(10, ".skull"); + badgeperm.put(11, ".snowman"); + badgeperm.put(12, ".flower"); + badgeperm.put(13, ".radioactive"); + badgeperm.put(14, ".rainy"); + badgeperm.put(15, ".telephone"); + badgeperm.put(16, ".music"); + badgeperm.put(17, ".lightning"); + badgeperm.put(18, ".wow"); + badgeperm.put(19, ".monarch"); + badgeperm.put(20, ".baron"); + badgeperm.put(21, ".artificer"); + badgeperm.put(22, ".craftsman"); + badgeperm.put(23, ".journeyman"); + badgeperm.put(24, ".carpenter"); + badgeperm.put(25, ".pig"); + badgeperm.put(26, ".fpn"); + badgeperm.put(27, ".bt"); + badgeperm.put(28, ".hbt"); + badgeperm.put(29, ".boo"); + badgeperm.put(30, ".oof"); + badgeperm.put(31, ".verified"); + badgeperm.put(32, ".pro"); + badgeperm.put(33, ".2blue"); + badgeperm.put(34, ".2green"); + badgeperm.put(35, ".2yellow"); + badgeperm.put(36, ".gildedcrest"); + badgeperm.put(37, ".silvercrest"); + badgeperm.put(38, ".derp"); + badgeperm.put(39, ".hawkeye"); + badgeperm.put(40, ".expert1"); + badgeperm.put(41, ".expert2"); + badgeperm.put(42, ".expert3"); + badgeperm.put(43, ".expert4"); + badgeperm.put(44, ".expert5"); + badgeperm.put(45, ".expert6"); + badgeperm.put(46, ".vip"); + badgeperm.put(47, ".vip+"); + badgeperm.put(48, ".vip++"); + badgeperm.put(49, ".topaz"); + badgeperm.put(50, ".platinum"); + badgeperm.put(51, ".titanium"); + badgeperm.put(52, ".2red"); + badgeperm.put(53, ".3blue"); + badgeperm.put(54, ".architect"); + badgeperm.put(55, ".admin"); + badgeperm.put(56, ".operator"); + badgeperm.put(57, ".owner"); + badgeperm.put(58, ".pvplegend"); + badgeperm.put(59, ".goldog"); + badgeperm.put(60, ".dab"); + badgeperm.put(61, ".coffee"); + badgeperm.put(62, ".f"); + badgeperm.put(63, ".candy"); + badgeperm.put(64, ".box"); + badgeperm.put(65, ".pizza"); + badgeperm.put(66, ".pointer"); + badgeperm.put(67, ".scissors"); + badgeperm.put(68, ".grin"); + badgeperm.put(69, ".heart"); + badgeperm.put(70, ".bear"); + badgeperm.put(71, ".comet"); + badgeperm.put(72, ".tropicalflower"); + badgeperm.put(73, ".magic"); + badgeperm.put(74, ".sealed"); + badgeperm.put(75, ".backwards"); + badgeperm.put(76, ".dagger"); + badgeperm.put(77, ".leaf"); + badgeperm.put(78, ".starship"); + badgeperm.put(79, ".flags"); + badgeperm.put(80, ".stunned"); + } + + +} diff --git a/src/main/java/com/fpghoti/fpchatx/badge/BadgeSet.java b/src/main/java/com/fpghoti/fpchatx/badge/BadgeSet.java new file mode 100644 index 0000000..3226546 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/badge/BadgeSet.java @@ -0,0 +1,32 @@ +package com.fpghoti.fpchatx.badge; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.Util; + +public class BadgeSet { + + public static void setBadge(FPlayer p, int slot, int badgeId){ + if(slot > 3){ + slot = 3; + }else if(slot < 1){ + slot = 1; + } + String uuid = p.getUniqueId().toString(); + Util.connect(); + if(!FPChat.getPlugin().getMySQLConnection().itemExists("player_uuid", uuid, FPChat.getPlugin().getMainConfig().getChatFeatureTable())){ + createPlayer(p); + } + FPChat.getPlugin().getMySQLConnection().set("badge_slot" + String.valueOf(slot), badgeId, "player_uuid", "=", uuid, FPChat.getPlugin().getMainConfig().getChatFeatureTable()); + BadgeGetter.getBadges(p); + } + + public static void createPlayer(FPlayer p){ + String uuid = p.getUniqueId().toString(); + Util.connect(); + if(!FPChat.getPlugin().getMySQLConnection().itemExists("player_uuid", uuid, FPChat.getPlugin().getMainConfig().getChatFeatureTable())){ + FPChat.getPlugin().getMySQLConnection().insertInto("player_uuid, badge_slot1, badge_slot2, badge_slot3", " '" + uuid + "', '0', '0', '0' ", FPChat.getPlugin().getMainConfig().getChatFeatureTable()); + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/badge/SyncGetter.java b/src/main/java/com/fpghoti/fpchatx/badge/SyncGetter.java new file mode 100644 index 0000000..81407c4 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/badge/SyncGetter.java @@ -0,0 +1,46 @@ +package com.fpghoti.fpchatx.badge; + +import java.util.UUID; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.Util; + +public class SyncGetter { + + public static void syncBadges(FPlayer p, boolean create){ + UUID id = p.getUniqueId(); + String uuid = id.toString(); + Util.connect(); + if(create && !FPChat.getPlugin().getMySQLConnection().itemExists("player_uuid", uuid, FPChat.getPlugin().getMainConfig().getPermSyncTable())){ + SyncSet.createPlayer(p); + } + String raw = (String) FPChat.getPlugin().getMySQLConnection().get("badges", "player_uuid", "=", uuid, FPChat.getPlugin().getMainConfig().getPermSyncTable()); + if(raw != null && raw.length() > 0 && raw.charAt(0) == ','){ + raw = raw.substring(1); + } + if(raw != null && !raw.equals("")) { + String list[] = Util.stripLast(raw).split(","); + for(String item : list) { + if(!item.equals("")) { + Integer badgeId = Integer.parseInt(item); + p.addSyncedBadge(badgeId); + } + } + } + } + + public static Boolean syncExists(FPlayer p){ + Boolean check = false; + if(p == null) { + return false; + } + String uuid = p.getUniqueId().toString(); + Util.connect(); + if(FPChat.getPlugin().getMySQLConnection().itemExists("player_uuid", uuid, FPChat.getPlugin().getMainConfig().getPermSyncTable())){ + check = true; + } + return check; + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/badge/SyncSet.java b/src/main/java/com/fpghoti/fpchatx/badge/SyncSet.java new file mode 100644 index 0000000..e03c9ce --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/badge/SyncSet.java @@ -0,0 +1,126 @@ +package com.fpghoti.fpchatx.badge; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.Util; + +public class SyncSet { + + public static void update(FPlayer p) { + update(p, true); + } + + public static void update(FPlayer p, boolean create){ + String uuid = p.getUniqueId().toString(); + Util.connect(); + if(create && !FPChat.getPlugin().getMySQLConnection().itemExists("player_uuid", uuid, FPChat.getPlugin().getMainConfig().getPermSyncTable())){ + createPlayer(p); + } + SyncGetter.syncBadges(p, false); + String nl = ""; + String nl2 = ""; + String permstring = getBadgeString(p); + String[] permids = permstring.split(","); + for(String item : permids){ + if(Util.isDigit(item)) { + int id = Integer.parseInt(item); + if(!p.isSynced(id)){ + nl = nl + item + ","; + } + } + } + for(int id : p.syncedList()){ + String item = Integer.toString(id); + nl2 = nl2 + item + ","; + } + nl = nl + nl2; + FPChat.getPlugin().getMySQLConnection().set("badges", nl, "player_uuid", "=", uuid, FPChat.getPlugin().getMainConfig().getPermSyncTable()); + SyncGetter.syncBadges(p,false); + } + + public static void revoke(FPlayer p) { + revoke(p,true); + } + + public static void revoke(FPlayer p, boolean create) { + String uuid = p.getUniqueId().toString(); + Util.connect(); + if(create && !FPChat.getPlugin().getMySQLConnection().itemExists("player_uuid", uuid, FPChat.getPlugin().getMainConfig().getPermSyncTable())){ + createPlayer(p); + } + SyncGetter.syncBadges(p, false); + String nl = ""; + FPChat.getPlugin().getMySQLConnection().set("badges", nl, "player_uuid", "=", uuid, FPChat.getPlugin().getMainConfig().getPermSyncTable()); + SyncGetter.syncBadges(p, false); + } + public static void revoke(FPlayer p, int badgeId){ + revoke(p, badgeId, true); + } + + public static void revoke(FPlayer p, int badgeId, boolean create){ + String uuid = p.getUniqueId().toString(); + + Util.connect(); + if(create && !FPChat.getPlugin().getMySQLConnection().itemExists("player_uuid", uuid, FPChat.getPlugin().getMainConfig().getPermSyncTable())){ + createPlayer(p); + } + SyncGetter.syncBadges(p, false); + String nl = ""; + String nl2 = ""; + for(String item : revokeBadgeString(p, badgeId).split(",")){ + if(Util.isDigit(item)) { + int id = Integer.parseInt(item); + if(p.isSynced(id)){ + nl = nl + item + ","; + } + } + } + for(int id : p.syncedList()){ + String item = Integer.toString(id); + if(id != badgeId){ + nl2 = nl2 + item + ","; + } + } + nl = nl + nl2; + FPChat.getPlugin().getMySQLConnection().set("badges", nl, "player_uuid", "=", uuid, FPChat.getPlugin().getMainConfig().getPermSyncTable()); + SyncGetter.syncBadges(p, false); + } + + public static String getBadgeString(FPlayer p){ + String list = ""; + for(int i = 1; i < BadgeList.badgeperm.size(); i++){ + if(p.hasPermission("fpchat.badge" + BadgeList.badgeperm.get(i))){ + String add = Integer.toString(i) + ","; + list = list + add; + }else if(p.getBadgeQueue().contains(i)) { + String add = Integer.toString(i) + ","; + list = list + add; + p.unqueueBadge(i); + } + } + + return list; + } + + public static String revokeBadgeString(FPlayer p, int badgeId){ + String list = ""; + for(int i = 1; i < BadgeList.badgeperm.size(); i++){ + if(p.hasPermission("fpchat.badge" + BadgeList.badgeperm.get(i))){ + if(i != badgeId){ + String add = Integer.toString(i) + ","; + list = list + add; + } + } + } + + return list; + } + + public static void createPlayer(FPlayer p){ + String uuid = p.getUniqueId().toString(); + Util.connect(); + if(!FPChat.getPlugin().getMySQLConnection().itemExists("player_uuid", uuid, FPChat.getPlugin().getMainConfig().getPermSyncTable())){ + FPChat.getPlugin().getMySQLConnection().insertInto("player_uuid, badges", " '" + uuid + "', '' ", FPChat.getPlugin().getMainConfig().getPermSyncTable()); + } + } +} diff --git a/src/main/java/com/fpghoti/fpchatx/chat/ChatChannel.java b/src/main/java/com/fpghoti/fpchatx/chat/ChatChannel.java new file mode 100644 index 0000000..2a350e3 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/chat/ChatChannel.java @@ -0,0 +1,344 @@ +package com.fpghoti.fpchatx.chat; + +import java.io.File; +import java.util.ArrayList; +import java.util.UUID; +import java.util.logging.Level; + +import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.badge.BadgeList; +import com.fpghoti.fpchatx.config.ChannelFile; +import com.fpghoti.fpchatx.customcodes.BubbleCode; +import com.fpghoti.fpchatx.customcodes.Codify; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; + +public abstract class ChatChannel { + + private static ChatChannel defaultChannel = null; + private static ArrayList channels; + private static ArrayList tempchannels; + private static ChatChannel shout; + private static final String[] reserved = {"shout"}; + + private static ArrayList loadChannelNames() { + ArrayList cnames = new ArrayList(); + for(File f : ChannelFile.getChannelFiles()) { + String fname = f.getName(); + cnames.add(fname.substring(0, fname.length()-4)); + } + return cnames; + } + + + public static StandardChannel loadChannel(String channelname) { + if(ChannelFile.channelExists(channelname)) { + return makeChannel(channelname); + } + return null; + } + + public static StandardChannel makeChannel(String channelname) { + ChannelFile file = new ChannelFile(FPChat.getPlugin(), channelname); + StandardChannel c = new StandardChannel(FPChat.getPlugin(), file); + return c; + } + + public static TempChannel makeTempChannel(FPlayer owner, String channelname) { + TempChannel t = new TempChannel(FPChat.getPlugin(), owner, channelname); + t.setShortcut(channelname); + tempchannels.add(t); + return t; + } + + public static void setShout(ShoutChannel shoutchannel) { + shout = shoutchannel; + } + + public static void deleteChannel(String channelname) { + ChatChannel c = getChannel(channelname); + boolean temp = false; + if(c == null) { + c = getTempChannel(channelname); + temp = true; + } + if(c != null) { + String cname = c.getName(); + for(FPlayer pl : c.getPlayers()) { + pl.leaveChannel(cname); + FPlayer.dualMsg(pl, ChatColor.YELLOW + "The channel you were in " + ChatColor.WHITE + c.getName() + ChatColor.YELLOW + " was deleted."); + } + tempchannels.remove(c); + channels.remove(c); + if(!temp) { + File cdir = new File(FPChat.getPlugin().getDataFolder() + File.separator + "channels"); + cdir.mkdirs(); + File configFile = new File(cdir, cname + ".yml"); + if(configFile.delete()) { + FPChat.getPlugin().log(Level.INFO, "Channel file for " + cname + " successfully deleted."); + } else { + FPChat.getPlugin().log(Level.SEVERE, "======================================================"); + FPChat.getPlugin().log(Level.SEVERE, "| ------------------ FPCHATX ERROR ----------------- |"); + FPChat.getPlugin().log(Level.SEVERE, "======================================================"); + FPChat.getPlugin().log(Level.SEVERE, "| Channel not properly removed. File deletion error. |"); + FPChat.getPlugin().log(Level.SEVERE, "| ---------- Check the file and try again. --------- |"); + FPChat.getPlugin().log(Level.SEVERE, "======================================================"); + return; + } + }else { + FPChat.getPlugin().log(Level.INFO, "Temp Channel " + cname + " was deleted."); + } + } + } + + public static ChatChannel getDefault() { + return defaultChannel; + } + + public static void setDefault(String channel) { + defaultChannel = getChannel(channel); + } + + public static ArrayList getChannels(){ + ArrayList c = new ArrayList(); + for(StandardChannel ch : channels) { + c.add(ch); + } + for(TempChannel ch : tempchannels) { + c.add(ch); + } + return c; + } + + public static ChatChannel getChannel(String name) { + for(ChatChannel c : channels) { + if(c.getName().equalsIgnoreCase(name)) { + return c; + } + } + return null; + } + + public static ChatChannel getTempChannel(String name) { + for(ChatChannel c : tempchannels) { + if(c.getName().equalsIgnoreCase(name)) { + return c; + } + } + return null; + } + + public static void loadChannels() { + shout = (ChatChannel)(new ShoutChannel(FPChat.getPlugin())); + channels = new ArrayList(); + tempchannels = new ArrayList(); + for(String c : loadChannelNames()) { + StandardChannel chan = loadChannel(c); + if(chan != null) { + channels.add(chan); + } + } + } + + public static ChatChannel getShout() { + return shout; + } + + public static boolean channelExists(String name) { + for(ChatChannel c : getChannels()) { + if(c.getName().equalsIgnoreCase(name)) { + return true; + } + } + return false; + } + + public static boolean isReserved(String name) { + if(channelExists(name)) { + return true; + } + for(String s : reserved) { + if(s.equalsIgnoreCase(name)) { + return true; + } + } + return false; + } + + public static void addChannel(StandardChannel channel) { + channels.add(channel); + } + + protected FPChat plugin; + protected String name; + protected String shortcut; + protected String chatFormat; + protected String distinguishedChatFormat; + protected boolean isWhitelisted; + + protected ArrayList whitelist; + protected ArrayList banned; + + public ChatChannel(FPChat plugin) { + this.plugin = plugin; + this.isWhitelisted = false; + this.whitelist = new ArrayList(); + } + + public void makeDefault() { + ChatChannel.defaultChannel = this; + } + + public abstract boolean isTemp(); + + public abstract boolean isDefault(); + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return this.name; + } + + public abstract void kick(FPlayer p); + + public abstract void setShortcut(String shortcut); + + public String getShortcut() { + return this.shortcut; + } + + public abstract void setChatFormat(String chatFormat); + + public String getChatFormat() { + return this.chatFormat.replace("{channel}", name); + } + + public abstract void setDistinguishedChatFormat(String chatFormat); + + public String getDistinguishedChatFormat() { + return this.distinguishedChatFormat.replace("{channel}", name); + } + + public abstract void enableWhitelist(); + + public abstract void disableWhitelist(); + + public boolean whitelistEnabled() { + return this.isWhitelisted; + } + + public void whitelistAdd(OfflinePlayer p) { + whitelistAdd(p.getUniqueId()); + } + + public void whitelistAdd(Player p) { + whitelistAdd(p.getUniqueId()); + } + + public void whitelistAdd(FPlayer p) { + whitelistAdd(p.getUniqueId()); + } + + public abstract void whitelistAdd(UUID uuid); + + public void whitelistRemove(OfflinePlayer p) { + whitelistRemove(p.getUniqueId()); + } + + public void whitelistRemove(Player p) { + whitelistRemove(p.getUniqueId()); + } + + public void whitelistRemove(FPlayer p) { + whitelistRemove(p.getUniqueId()); + } + + public abstract void whitelistRemove(UUID uuid); + + public abstract boolean isWhitelisted(FPlayer p); + + public void log(String str) { + plugin.log(Level.INFO, str); + } + + public abstract void enableRadius(); + + public abstract void disableRadius(); + + public abstract boolean hasRadius(); + + public abstract void setRadius(int radius); + + public abstract int getRadius(); + + public boolean isBanned(FPlayer p) { + return banned.contains(p.getUniqueId()); + } + + public abstract void addBanned(FPlayer p); + + public abstract ArrayList getPlayers(); + + public abstract void removeBanned(FPlayer p); + + public ArrayList getBanned(){ + return this.banned; + } + + public int playerCount() { + int count = 0; + for(FPlayer p : FPlayer.getPlayers()) { + if(p.getChannels().contains(name) || p.getTempChannels().contains(name)) { + count++; + } + } + return count; + } + + public String format(FPlayer p, String msg) { + String finalMessage = ""; + String slot3 = "", slot2 = "", slot1 = ""; + String stf = ""; + if (Permission.canUseColor(p)) { + msg = msg.replaceAll("&([0-9a-fk-or])", "§$1"); + } else { + msg = msg.replaceAll("§[0-9a-fk-or]", ""); + } + String header = PrepareChat.swapPlaceholders(p, this, msg); + if(Permission.isStaff(p)){ + stf = FPChat.getPlugin().getMainConfig().getStaffBadge(); + } + if(plugin.getMainConfig().mySQLEnabled()){ + Integer[] badges = p.getBadges(); + slot1 = BadgeList.badgelist.get(badges[0]); + slot2 = BadgeList.badgelist.get(badges[1]); + slot3 = BadgeList.badgelist.get(badges[2]); + } + String filler = ""; + if(plugin.getMainConfig().chatFilterEnabled()){ + filler = "word "; + } + if(Permission.canUseColor(p)){ + String last = ChatFilter.filter(filler + msg); + last = BubbleCode.bubblecode(Permission.canBubbleCode(p), Codify.changeFormatSign(last)); + finalMessage = stf + slot3 + slot2 + slot1 + header + last; + }else{ + String newmsg = ChatColor.stripColor(ChatColor.translateAlternateColorCodes('§', ChatFilter.filter(filler + msg))); + finalMessage = stf + slot3 + slot2 + slot1 + Codify.removeBubbles(header + newmsg); + } + return finalMessage; + } + + public abstract void sendMessage(String msg, FPlayer from); + + public void delete() { + ChatChannel.deleteChannel(name); + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/chat/ChatFilter.java b/src/main/java/com/fpghoti/fpchatx/chat/ChatFilter.java new file mode 100644 index 0000000..8bb4156 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/chat/ChatFilter.java @@ -0,0 +1,87 @@ +package com.fpghoti.fpchatx.chat; + +import java.util.ArrayList; + +import org.bukkit.ChatColor; + +import com.fpghoti.fpchatx.FPChat; + +public class ChatFilter { + + public static ArrayList filtered = null; + + //CHAT FILTER + + public static String filter(String sentence){ // THIS FUNCTION TAKES THE RAW CHAT MESSAGE AND SENDS EACH + String msg = sentence; // INDIVIDUAL WORD INTO THE FILTER WORD FUNCTION BELOW + if(FPChat.getPlugin().getMainConfig().chatFilterEnabled()){ + msg = ""; + int i = 0; + for(String s : sentence.split(" ")){ + if(i != 0){ + msg = msg + filterWord(s) + " "; + } + i++; + } + } + return msg; + } + + public static String filterWord(String word){ // THIS TAKES THE WORD, LOWERCASES IT, + String wordp = ""; // AND REPLACES CHARACTERS "1" and "!" with "i", "5" with "s", "6" with "g", and + if(FPChat.getPlugin().getMainConfig().chatFilterEnabled()){ // "3" with "e". It then compares it to the list of + String word2 = word.toLowerCase(); // Naughty words and replaces it with "Frank" or "bleep" if a match is found + String color = ChatColor.getLastColors(word2); + if(word2.length() >= 2 && word2.charAt(word2.length() -1) == '!'){ + for(int i = 0; i < word2.length() -1; i++ ){ + wordp += word2.charAt(i); + } + word2 = wordp; + } + wordp = ""; + for(int i = 0; i < word2.length(); i++ ){ + if(word2.charAt(i) != '!'){ + wordp += word2.charAt(i); + }else{ + wordp += 'i'; + } + } + word2 = wordp; + word2 = ChatColor.translateAlternateColorCodes('§', word2); + word2 = ChatColor.translateAlternateColorCodes('&', word2); + word2 = ChatColor.stripColor(word2); + word2 = word2.replaceAll("\\p{Punct}+", "").replaceAll("1", "i").replaceAll("5", "s").replaceAll("6", "g").replaceAll("3", "e"); + if(filtered == null) { + filtered = new ArrayList(); + for(String s : FPChat.getPlugin().getMainConfig().getNaughtyWords().split(",")) { + filtered.add(s); + } + } + + for(String item : filtered){ + if(ChatColor.stripColor(word2).equalsIgnoreCase(item) || ChatColor.stripColor(word2).equalsIgnoreCase(item + "s")){ + if (word2.length() > 2) { + if(word2.substring(word2.length() - 3).equalsIgnoreCase("ing")){ + word = "bleeping"; + if(FPChat.getPlugin().getMainConfig().frankModeEnabled()){ + word = "Franking"; + } + }else{ + word = "bleep"; + if(FPChat.getPlugin().getMainConfig().frankModeEnabled()){ + word = "Frank"; + } + } + } + } + word = color + word; + } + word2 = null; + } + return word; + } + + + // By the end of the loop, the sentence is reconstructed with the naughty words replaced + +} diff --git a/src/main/java/com/fpghoti/fpchatx/chat/PrepareChat.java b/src/main/java/com/fpghoti/fpchatx/chat/PrepareChat.java new file mode 100644 index 0000000..79c0135 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/chat/PrepareChat.java @@ -0,0 +1,84 @@ +package com.fpghoti.fpchatx.chat; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.customcodes.BubbleCode; +import com.fpghoti.fpchatx.customcodes.Codify; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.VaultUtil; + +public class PrepareChat { + + public static String swapPlaceholders(FPlayer p, ChatChannel channel, String msg) { + return swapPlaceholders(p,channel,msg,"", false); + } + + public static String swapPlaceholders(FPlayer p, String recipient, String msg, boolean in) { + return swapPlaceholders(p,null,msg,recipient,in); + } + + public static String swapPlaceholders(FPlayer p, String msg) { + return swapPlaceholders(p,null,msg,"",false); + } + + + private static String swapPlaceholders(FPlayer p, ChatChannel channel, String msg, String recipient, boolean in) { + if(!p.isOnline()) { + return ""; + } + Player sender = Bukkit.getPlayer(p.getUniqueId()); + String prefix = ""; + String suffix = ""; + String group = ""; + String groupPrefix = ""; + String groupSuffix = ""; + World world = sender.getWorld(); + prefix = VaultUtil.chat.getPlayerPrefix(sender); + prefix = BubbleCode.bubblecode(Permission.canBubbleCode(p), Codify.changeFormatSign(prefix)).replaceAll("&([0-9A-FK-OR])", "§$1").replace("&", "§"); + suffix = VaultUtil.chat.getPlayerSuffix(sender); + suffix = BubbleCode.bubblecode(Permission.canBubbleCode(p), Codify.changeFormatSign(suffix)).replaceAll("&([0-9A-FK-OR])", "§$1").replace("&", "§"); + group = VaultUtil.permission.getPrimaryGroup(sender); + groupPrefix = VaultUtil.chat.getGroupPrefix(world, group).replace("&", "§"); + groupSuffix = VaultUtil.chat.getGroupSuffix(world, group).replace("&", "§"); + String displayName = sender.getDisplayName(); + displayName = BubbleCode.bubblecode(Permission.canBubbleCode(p), Codify.changeFormatSign(displayName)).replaceAll("&([0-9A-FK-OR])", "§$1").replace("&", "§"); + String format = ""; + if(channel != null) { + if(Permission.isDistinguished(p)) { + format = channel.getDistinguishedChatFormat(); + }else { + format = channel.getChatFormat(); + } + }else { + if(recipient.equals("")) { + format = FPChat.getPlugin().getMainConfig().getShoutFormat(); + }else { + if(in) { + format = FPChat.getPlugin().getMainConfig().getInMsgFormat(); + }else { + format = FPChat.getPlugin().getMainConfig().getOutMsgFormat(); + } + } + } + format = format.replaceAll("&([0-9a-fk-or])", "§$1"); + format = format.replace("{prefix}", prefix); + format = format.replace("{prefix}", prefix); + format = format.replace("{suffix}", suffix); + format = format.replace("{group}", group); + format = format.replace("{groupprefix}", groupPrefix); + format = format.replace("{groupSuffix}", groupSuffix); + if (channel != null) { + format = format.replace("{shortcut}", channel.getShortcut()); + format = format.replace("{name}", channel.getName()); + } + format = format.replace("{player}", displayName); + format = format.replace("{recipient}", recipient); + format = format.replace("{world}", world.getName()); + + return format; + } +} diff --git a/src/main/java/com/fpghoti/fpchatx/chat/ShoutChannel.java b/src/main/java/com/fpghoti/fpchatx/chat/ShoutChannel.java new file mode 100644 index 0000000..dfef591 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/chat/ShoutChannel.java @@ -0,0 +1,158 @@ +package com.fpghoti.fpchatx.chat; + +import java.util.ArrayList; +import java.util.UUID; +import java.util.logging.Level; + +import org.bukkit.ChatColor; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.player.FPlayer; + +public class ShoutChannel extends ChatChannel{ + + /* + * This is the shout channel + * + * Shout is intended to act as a streamlined alternative + * to setting up a StandardChannel with the radius disabled. + * + * It also provides the ability to restrict global message sending + * to a cooldown. + * + * It also allows for a separate mute (hush) to be enforced. + * + * Players can opt out of seeing shout. + * + * Many functions here will do nothing. Shout extends ChatChannel + * for the sake of treating shouts as a form of chat message. + */ + + public ShoutChannel(FPChat plugin) { + super(plugin); + this.name = "Shout"; + this.shortcut = "Shout"; + this.chatFormat = plugin.getMainConfig().getShoutFormat(); + this.distinguishedChatFormat = plugin.getMainConfig().getDistinguishedShout(); + } + + @Override + public boolean isTemp() { + // Shout will always be a registered channel while the plugin is enabled. + return false; + } + + @Override + public boolean isDefault() { + // Shout can only be spoken in by use of command, so cannot be default. + return false; + } + + @Override + public void kick(FPlayer p) { + // No real reason to use this. It will hush the player if called. + // Leaving the shout channel is impossible. Standard channel should + // be used if the ability to leave is required. + + p.hush(); + } + + @Override + public void setShortcut(String shortcut) { + // Shout has a dedicated command, so a shortcut is not needed. + } + + @Override + public void setChatFormat(String chatFormat) { + this.chatFormat = plugin.getMainConfig().getShoutFormat(); + } + + @Override + public void setDistinguishedChatFormat(String chatFormat) { + this.distinguishedChatFormat = plugin.getMainConfig().getDistinguishedShout(); + } + + @Override + public void enableWhitelist() { + return; + } + + @Override + public void disableWhitelist() { + return; + } + + @Override + public void whitelistAdd(UUID uuid) { + return; + } + + @Override + public void whitelistRemove(UUID uuid) { + return; + } + + @Override + public boolean isWhitelisted(FPlayer p) { + return false; + } + + @Override + public void enableRadius() { + return; + } + + @Override + public void disableRadius() { + return; + } + + @Override + public boolean hasRadius() { + return false; + } + + @Override + public void setRadius(int radius) { + return; + } + + @Override + public int getRadius() { + return 0; + } + + @Override + public ArrayList getPlayers(){ + return FPlayer.getPlayers(); + } + + @Override + public void addBanned(FPlayer p) { + // No real reason to use this. It will hush the player if called. + // Leaving the shout channel is impossible. Standard channel should + // be used if the ability to leave is required. + + p.hush(); + } + + @Override + public void removeBanned(FPlayer p) { + // No real reason to use this. It will hush the player if called. + // Leaving the shout channel is impossible. Standard channel should + // be used if the ability to leave is required. + + p.unhush(); + } + + @Override + public void sendMessage(String msg, FPlayer from) { + plugin.log(Level.INFO, "Shout: " + msg); + for(FPlayer p : FPlayer.getPlayers()) { + if(p.isShoutVisible() && !p.isIgnoring(from)) { + p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&8[&4&lS&r&8]&r") + msg); + } + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/chat/StandardChannel.java b/src/main/java/com/fpghoti/fpchatx/chat/StandardChannel.java new file mode 100644 index 0000000..b70cc4f --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/chat/StandardChannel.java @@ -0,0 +1,358 @@ +package com.fpghoti.fpchatx.chat; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.UUID; +import java.util.logging.Level; + +import org.apache.commons.lang3.StringUtils; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.config.ChannelFile; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.Util; + +public class StandardChannel extends ChatChannel{ + + private boolean hasRadius; + private int chatRadius; + private String permission; + private ChannelFile file; + + public StandardChannel(FPChat plugin, ChannelFile file) { + super(plugin); + this.file = file; + setName(file.getName()); + this.hasRadius = file.hasRadius(); + this.permission = file.getWhitelistedPermissionNode(); + this.banned = new ArrayList(); + if(!file.getBannedUUIDs().equals("")) { + for(String s : file.getBannedUUIDs().split(",")) { + UUID u = UUID.fromString(s); + banned.add(u); + } + } + this.whitelist = new ArrayList(); + if(!file.getWhitelistedUUIDs().equals("")) { + for(String s : file.getWhitelistedUUIDs().split(",")) { + UUID u = UUID.fromString(s); + whitelist.add(u); + } + } + this.shortcut = file.getShortcut(); + this.distinguishedChatFormat = file.getDistinguishedChatFormat(); + this.chatFormat = file.getChatFormat(); + this.chatRadius = file.getRadius(); + this.isWhitelisted = file.isWhitelisted(); + } + + @Override + public boolean isTemp() { + return false; + } + + @Override + public void enableRadius() { + this.hasRadius = true; + new BukkitRunnable() { + @Override + public void run() { + try { + file.saveHasRadius(true); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.runTaskAsynchronously(plugin); + } + + @Override + public void disableRadius() { + this.hasRadius = false; + new BukkitRunnable() { + @Override + public void run() { + try { + file.saveHasRadius(false); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.runTaskAsynchronously(plugin); + } + + @Override + public boolean hasRadius() { + return this.hasRadius; + } + + @Override + public void setRadius(int radius) { + this.chatRadius = radius; + new BukkitRunnable() { + @Override + public void run() { + try { + file.saveRadius(radius); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.runTaskAsynchronously(plugin); + } + + @Override + public int getRadius() { + return this.chatRadius; + } + + @Override + public boolean isWhitelisted(FPlayer p) { + if(!whitelistEnabled()) { + return true; + } + if(isDefault()){ + return true; + } + if(whitelist.contains(p.getUniqueId())) { + return true; + } + if(p.hasPermission(permission)) { + return true; + } + return false; + } + + public void setPermission(String perm) { + this.permission = perm; + } + + public String getPermission() { + return this.permission; + } + + @Override + public boolean isDefault() { + return ChatChannel.getDefault() == this; + } + + @Override + public void kick(FPlayer p) { + p.leaveChannel(getName()); + } + + @Override + public void setShortcut(String shortcut) { + this.shortcut = shortcut; + new BukkitRunnable() { + @Override + public void run() { + try { + file.saveShortcut(shortcut); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.runTaskAsynchronously(plugin); + } + + @Override + public void enableWhitelist() { + this.isWhitelisted = true; + new BukkitRunnable() { + @Override + public void run() { + try { + file.saveWhitelist(true); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.runTaskAsynchronously(plugin); + } + + @Override + public void disableWhitelist() { + this.isWhitelisted = false; + new BukkitRunnable() { + @Override + public void run() { + try { + file.saveWhitelist(false); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.runTaskAsynchronously(plugin); + } + + @Override + public void whitelistAdd(UUID uuid) { + this.whitelist.add(uuid); + + ArrayList rl = this.whitelist; + new BukkitRunnable() { + @Override + public void run() { + try { + String setting = ""; + for(UUID u : rl) { + String su = u.toString(); + setting = setting + su + ","; + } + setting = StringUtils.chop(setting); + file.saveWhitelistedUUIDs(setting); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.runTaskAsynchronously(plugin); + + + } + + @Override + public void whitelistRemove(UUID uuid) { + this.whitelist.remove(uuid); + ArrayList rl = this.whitelist; + new BukkitRunnable() { + @Override + public void run() { + try { + String setting = ""; + for(UUID u : rl) { + String su = u.toString(); + setting = setting + su + ","; + } + setting = StringUtils.chop(setting); + file.saveWhitelistedUUIDs(setting); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.runTaskAsynchronously(plugin); + } + + @Override + public void setChatFormat(String chatFormat) { + this.chatFormat = chatFormat; + new BukkitRunnable() { + @Override + public void run() { + try { + file.saveChatFormat(chatFormat); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.runTaskAsynchronously(plugin); + } + + @Override + public ArrayList getPlayers(){ + ArrayList players = new ArrayList(); + for(FPlayer p : FPlayer.getPlayers()) { + if(p.getChannels().contains(name)) { + players.add(p); + } + } + return players; + } + + @Override + public void addBanned(FPlayer p) { + this.banned.add(p.getUniqueId()); + ArrayList rl = this.banned; + new BukkitRunnable() { + @Override + public void run() { + try { + String setting = ""; + for(UUID u : rl) { + String su = u.toString(); + setting = setting + su + ","; + } + setting = StringUtils.chop(setting); + file.saveBannedUUIDs(setting); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.runTaskAsynchronously(plugin); + } + + @Override + public void removeBanned(FPlayer p) { + this.banned.remove(p.getUniqueId()); + ArrayList rl = this.banned; + new BukkitRunnable() { + @Override + public void run() { + try { + String setting = ""; + for(UUID u : rl) { + String su = u.toString(); + setting = setting + su + ","; + } + setting = StringUtils.chop(setting); + file.saveBannedUUIDs(setting); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.runTaskAsynchronously(plugin); + } + + @Override + public void setDistinguishedChatFormat(String chatFormat) { + this.distinguishedChatFormat = chatFormat; + new BukkitRunnable() { + @Override + public void run() { + try { + file.saveDistinguishedChatFormat(chatFormat); + } catch (IOException e) { + e.printStackTrace(); + } + } + }.runTaskAsynchronously(plugin); + } + + @Override + public void sendMessage(String msg, FPlayer from) { + Player pf = Util.getEP(from.getName()); + plugin.log(Level.INFO, name + ": " + msg); + for(FPlayer p : FPlayer.getPlayers()) { + if(p.getChannels().contains(name) && !p.isIgnoring(from)) { + if(hasRadius) { + Player pp = Util.getEP(p.getName()); + if(pp.getWorld() == pf.getWorld()) { + if(pp.getLocation().distance(pf.getLocation()) < chatRadius){ + p.sendMessage(msg); + } + } + }else { + p.sendMessage(msg); + } + } + } + } + + public void update(ChannelFile file) { + this.file = file; + setName(file.getName()); + this.hasRadius = file.hasRadius(); + this.permission = file.getWhitelistedPermissionNode(); + this.banned = new ArrayList(); + for(String s : file.getBannedUUIDs().split(",")) { + UUID u = UUID.fromString(s); + banned.add(u); + } + this.shortcut = file.getShortcut(); + } + +} + + diff --git a/src/main/java/com/fpghoti/fpchatx/chat/TempChannel.java b/src/main/java/com/fpghoti/fpchatx/chat/TempChannel.java new file mode 100644 index 0000000..7280462 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/chat/TempChannel.java @@ -0,0 +1,157 @@ +package com.fpghoti.fpchatx.chat; + +import java.util.ArrayList; +import java.util.UUID; +import java.util.logging.Level; + +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.player.FPlayer; + +public class TempChannel extends ChatChannel{ + + private UUID owner; + + public TempChannel(FPChat plugin, FPlayer owner, String name) { + super(plugin); + this.name = name; + this.owner = owner.getUniqueId(); + this.chatFormat = plugin.getMainConfig().getTempChannelFormat(); + this.distinguishedChatFormat = plugin.getMainConfig().getTempChannelFormat(); + this.banned = new ArrayList(); + } + + public FPlayer getOwner() { + OfflinePlayer p = Bukkit.getOfflinePlayer(owner); + return FPlayer.getPlayer(p, !p.isOnline()); + } + + public boolean isOwner(FPlayer p) { + return p.getUniqueId() == this.owner; + } + + public void setOwner(FPlayer p) { + this.owner = p.getUniqueId(); + } + + @Override + public boolean isTemp() { + return true; + } + + @Override + public boolean isWhitelisted(FPlayer p) { + if(!whitelistEnabled()) { + return true; + } + if(whitelist.contains(p.getUniqueId())) { + return true; + } + return false; + } + + @Override + public void enableRadius() { + return; + } + + @Override + public void disableRadius() { + return; + } + + @Override + public boolean hasRadius() { + return false; + } + + @Override + public void setRadius(int radius) { + return; + } + + @Override + public int getRadius() { + return 0; + } + + @Override + public boolean isDefault() { + return false; + } + + @Override + public void kick(FPlayer p) { + p.leaveTempChannel(getName()); + } + + @Override + public void setShortcut(String shortcut) { + this.shortcut = shortcut; + } + + @Override + public void enableWhitelist() { + this.isWhitelisted = true; + } + + @Override + public void disableWhitelist() { + this.isWhitelisted = false; + } + + @Override + public void whitelistAdd(UUID uuid){ + this.whitelist.add(uuid); + } + + @Override + public void whitelistRemove(UUID uuid) { + this.whitelist.remove(uuid); + } + + @Override + public void addBanned(FPlayer p) { + this.banned.add(p.getUniqueId()); + } + + + @Override + public void removeBanned(FPlayer p) { + this.banned.remove(p.getUniqueId()); + } + + @Override + public void setChatFormat(String chatFormat) { + this.chatFormat = chatFormat; + } + + @Override + public void setDistinguishedChatFormat(String chatFormat) { + this.distinguishedChatFormat = chatFormat; + } + + @Override + public ArrayList getPlayers(){ + ArrayList players = new ArrayList(); + for(FPlayer p : FPlayer.getPlayers()) { + if(p.getTempChannels().contains(name)) { + players.add(p); + } + } + return players; + } + + @Override + public void sendMessage(String msg, FPlayer from) { + plugin.log(Level.INFO, "[TC] " + name + ": " + msg); + for(FPlayer p : FPlayer.getPlayers()) { + if(p.getTempChannels().contains(name) && !p.isIgnoring(from)) { + p.sendMessage(msg); + } + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/Commands.java b/src/main/java/com/fpghoti/fpchatx/command/Commands.java new file mode 100644 index 0000000..92f6027 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/Commands.java @@ -0,0 +1,139 @@ +package com.fpghoti.fpchatx.command; + +import java.util.ArrayList; + +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; + +import com.fpghoti.fpchatx.FPChat; + +public abstract class Commands { + + private static ArrayList commands = new ArrayList(); + + public static void register(Commands cmd) { + commands.add(cmd); + } + + public static ArrayList getCommands(){ + return commands; + } + + private static boolean blocked = false; + + public static boolean performCommand(CommandSender sender, Command command, String label, String[] args) { + if(blocked) { + return false; + } + String input = label + " "; + for (String s : args) { + input += s + " "; + } + + Commands match = null; + String[] trim = null; + StringBuilder lab = new StringBuilder(); + + for(Commands cmd : commands) { + StringBuilder l = new StringBuilder(); + String[] temp = cmd.getArgs(input, l); + if (l.length() > lab.length()) { + lab = l; + match = cmd; + trim = temp; + } + } + + if(match != null) { + if (trim == null || (trim.length > 0 && trim[0].equals("?"))) { + sender.sendMessage(ChatColor.RED + "Command:" + ChatColor.YELLOW + " " + match.getName()); + sender.sendMessage(ChatColor.RED + "Description:" + ChatColor.YELLOW + " " + match.getDescription()); + sender.sendMessage(ChatColor.RED + "Syntax:" + ChatColor.YELLOW + " " + match.getSyntax()); + ArrayList notes = match.getMisc(); + for (String note : notes) { + sender.sendMessage(ChatColor.YELLOW + note); + } + } else { + match.execute(sender, trim); + } + } + return true; + } + + public static void blockCommands() { + blocked = true; + } + + public static void allowCommands() { + blocked = false; + } + + protected FPChat plugin; + protected String name; + protected String syntax; + protected String description; + protected int minArgs; + protected int maxArgs; + protected ArrayList labels; + protected ArrayList misc; + + public Commands(FPChat plugin) { + this.plugin = plugin; + this.labels = new ArrayList(); + this.misc = new ArrayList(); + } + + public String[] getArgs(String input, StringBuilder label) { + boolean found = false; + int count = 0; + for(int i = 0; i < labels.size(); i++) { + String lab = labels.get(i).toLowerCase(); + if (input.toLowerCase().matches(lab + "(\\s+.*|\\s*)")) { + if (lab.length() > labels.get(count).length() || !found) { + count = i; + found = true; + } + } + } + if (found) { + label = label.append(labels.get(count)); + String[] args = input.substring(label.length()).trim().split(" "); + if (args[0].isEmpty()) { + args = new String[0]; + } + if (args.length >= minArgs && args.length <= maxArgs) { + return args; + } + } + return null; + } + + + public ArrayList getLabels() { + return this.labels; + } + + public void setlabels(ArrayList labels) { + this.labels = labels; + } + + public String getName() { + return this.name; + } + + public String getSyntax() { + return this.syntax; + } + + public String getDescription() { + return this.description; + } + + public ArrayList getMisc() { + return this.misc; + } + + public abstract void execute(CommandSender sender, String[] args); + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/BadgeClearCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/BadgeClearCommand.java new file mode 100644 index 0000000..ab5ffc0 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/BadgeClearCommand.java @@ -0,0 +1,41 @@ +package com.fpghoti.fpchatx.command.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.badge.BadgeSet; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.player.FPlayer; + +public class BadgeClearCommand extends Commands { + + public BadgeClearCommand(FPChat plugin) { + super(plugin); + name = "BadgeClear"; + description = "Unequips all badges"; + syntax = ChatColor.GRAY + "/badgeclear"; + minArgs = 0; + maxArgs = 0; + labels.add("fpc badgeclear"); + labels.add("fpchat badgeclear"); + labels.add("ch badgeclear"); + labels.add("badgeclear"); + labels.add("badgesclear"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + if(!(sender instanceof Player)) { + FPlayer.errMsg(null, "This command is for players only."); + return; + } + FPlayer p = FPlayer.getPlayer((Player)sender); + BadgeSet.setBadge(p, 1, 0); + BadgeSet.setBadge(p, 2, 0); + BadgeSet.setBadge(p, 3, 0); + p.sendMessage(FPChat.logo() + ChatColor.YELLOW + " Unequipped all badges!"); + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/BadgeEquipCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/BadgeEquipCommand.java new file mode 100644 index 0000000..f3af7f5 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/BadgeEquipCommand.java @@ -0,0 +1,56 @@ +package com.fpghoti.fpchatx.command.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.badge.BadgeGetter; +import com.fpghoti.fpchatx.badge.BadgeList; +import com.fpghoti.fpchatx.badge.BadgeSet; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.Util; + +public class BadgeEquipCommand extends Commands { + + public BadgeEquipCommand(FPChat plugin) { + super(plugin); + name = "BadgeEquip"; + description = "Equips badges for use in chat"; + syntax = ChatColor.GRAY + "/equip " + ChatColor.GOLD + "slot# badge#"; + minArgs = 2; + maxArgs = 2; + labels.add("fpc badgeequip"); + labels.add("fpchat badgeequip"); + labels.add("ch badgeequip"); + labels.add("badgeequip"); + labels.add("equip"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + if(!(sender instanceof Player)) { + FPlayer.errMsg(null, "This command is for players only."); + return; + } + + FPlayer p = FPlayer.getPlayer((Player)sender); + if(Util.isDigit(args[0]) && Util.isDigit(args[1])){ + + Integer slot = Integer.parseInt(args[0]), badgeId = Integer.parseInt(args[1]); + if(BadgeGetter.canUseSlot(p, slot)){ + if(BadgeList.badgelist.containsKey(badgeId) && BadgeGetter.hasBadge(p, badgeId)){ + BadgeSet.setBadge(p, slot, badgeId); + p.updateBadges(slot, badgeId); + p.sendMessage( FPChat.logo() + ChatColor.YELLOW + " You have equipped a badge!"); + }else{ + p.sendMessage(FPChat.logo() + ChatColor.YELLOW + " You do not have permission to equip this badge!"); + } + }else{ + p.sendMessage(FPChat.logo() + ChatColor.YELLOW + " You do not have permission to equip a badge in this slot!"); + } + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/BadgeListCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/BadgeListCommand.java new file mode 100644 index 0000000..ea72fa8 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/BadgeListCommand.java @@ -0,0 +1,43 @@ +package com.fpghoti.fpchatx.command.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.badge.BadgeList; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.Util; + +public class BadgeListCommand extends Commands { + + public BadgeListCommand(FPChat plugin) { + super(plugin); + name = "BadgeList"; + description = "Pulls up a list of badges you own"; + syntax = ChatColor.GRAY + "/badgelist " + ChatColor.GOLD + "[page#]"; + minArgs = 0; + maxArgs = 1; + labels.add("fpc badgelist"); + labels.add("fpchat badgelist"); + labels.add("ch badgelist"); + labels.add("badges"); + labels.add("badgelist"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + if(!(sender instanceof Player)) { + FPlayer.errMsg(null, "This command is for players only."); + return; + } + FPlayer p = FPlayer.getPlayer((Player)sender); + if(args.length == 0 || !Util.isDigit(args[0])){ + BadgeList.badgeList(p, 1); + }else{ + BadgeList.badgeList(p, Integer.parseInt(args[0])); + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/BlacklistCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/BlacklistCommand.java new file mode 100644 index 0000000..d9410b1 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/BlacklistCommand.java @@ -0,0 +1,115 @@ +package com.fpghoti.fpchatx.command.commands; + +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.chat.ChatChannel; +import com.fpghoti.fpchatx.chat.StandardChannel; +import com.fpghoti.fpchatx.chat.TempChannel; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; + +public class BlacklistCommand extends Commands { + + public BlacklistCommand(FPChat plugin) { + super(plugin); + name = "Blacklist"; + description = "Toggles blacklisted status of a player in a specific channel"; + syntax = ChatColor.GRAY + "/fpc blacklist " + ChatColor.GOLD + "channel player"; + minArgs = 1; + maxArgs = 2; + labels.add("fpc blacklist"); + labels.add("fpchat blacklist"); + labels.add("ch blacklist"); + labels.add("fpc ban"); + labels.add("fpchat ban"); + labels.add("ch ban"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + + FPlayer p = null; + if(sender instanceof Player) { + p = FPlayer.getPlayer((Player)sender); + } + + ChatChannel c = ChatChannel.getChannel(args[0]); + + if(c == null) { + c = ChatChannel.getTempChannel(args[0]); + } + + if(c == ChatChannel.getDefault()) { + FPlayer.errMsg(p, "You cannot blacklist a player from the default/fallback channel. If you wish to prevent someone from speaking in default, try muting instead."); + return; + } + + if (c != null) { + if (args.length == 1) { + + String msg = "There are no blacklisted players in this channel."; + if (!c.getBanned().isEmpty()) { + msg = c.getName() + " Blacklist: "; + for (UUID uuid : c.getBanned()) { + FPlayer bp = FPlayer.getPlayer(Bukkit.getOfflinePlayer(uuid)); + String name = ChatColor.RED + bp.getName(); + if(bp.isOnline()) { + name = ChatColor.GREEN + bp.getName(); + } + msg = msg + name + ChatColor.WHITE + ", "; + } + msg = msg.substring(0, msg.length() - 2); + } + FPlayer.dualMsg(p, msg); + + } else { + if( p == null || (Permission.isAdmin(p) || Permission.canBan(p) || (c instanceof TempChannel && ((TempChannel)c).getOwner().equals(p)))) { + FPlayer banned = FPlayer.getPlayer(args[1]); + if(banned == null) { + banned = FPlayer.getOfflinePlayer(args[1]); + } + if(banned != null) { + String name = banned.getName(); + if(p == null || !(Permission.isAdmin(banned) || Permission.canBan(banned))) { + if(c.getBanned().contains(banned.getUniqueId())) { + c.removeBanned(banned); + FPlayer.goodMsg(p, ChatColor.YELLOW + name + ChatColor.GREEN + " has been removed from the blacklist of channel " + ChatColor.YELLOW + c.getName() + ChatColor.GREEN + "."); + }else{ + if(banned.getChannels().contains(c.getName()) || banned.getTempChannels().contains(c.getName())) { + FPlayer.errMsg(banned, "You have been blacklisted from " + ChatColor.YELLOW + c.getName() + ChatColor.RED + "."); + } + c.addBanned(banned); + c.kick(banned); + FPlayer.goodMsg(p, ChatColor.YELLOW + name + ChatColor.GREEN + " has been blacklisted from " + ChatColor.YELLOW + c.getName() + ChatColor.GREEN + "."); + banned.leaveChannel(c.getName()); + if(c instanceof StandardChannel) { + banned.setPrimaryChannel(ChatChannel.getDefault().getName()); + } + if(c instanceof TempChannel) { + banned.stopTempSpeak(); + banned.setPrimaryTempChannel(""); + } + } + } else { + FPlayer.errMsg(p, "Player cannot be removed from the channel."); + } + } else { + FPlayer.errMsg(p, "Cannot find specified player."); + } + } else { + FPlayer.errMsg(p, Permission.noPerm); + } + } + } else { + FPlayer.errMsg(p, "That channel does not exist."); + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/ChannelsCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/ChannelsCommand.java new file mode 100644 index 0000000..ddc1f53 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/ChannelsCommand.java @@ -0,0 +1,75 @@ +package com.fpghoti.fpchatx.command.commands; + +import java.util.ArrayList; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.chat.ChatChannel; +import com.fpghoti.fpchatx.chat.StandardChannel; +import com.fpghoti.fpchatx.chat.TempChannel; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.Util; + +import net.md_5.bungee.api.ChatColor; + +public class ChannelsCommand extends Commands { + public ChannelsCommand(FPChat plugin) { + super(plugin); + name = "Channels"; + description = "Lists all open channels"; + syntax = ChatColor.GRAY + "/fpc channels " + ChatColor.GOLD + "[page#]"; + minArgs = 0; + maxArgs = 1; + labels.add("fpc channels"); + labels.add("fpchat channels"); + labels.add("ch channels"); + labels.add("fpc list"); + labels.add("fpchat list"); + labels.add("ch list"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + FPlayer p = null; + if(sender instanceof Player) { + p = FPlayer.getPlayer((Player)sender); + } + int pg = 1; + if (args.length > 0) { + if(Util.isDigit(args[0])) { + pg = Integer.parseInt(args[0]); + }else { + FPlayer.errMsg(p, syntax); + } + } + ArrayList channels = new ArrayList(); + for(ChatChannel c : ChatChannel.getChannels()) { + if(p == null || p.canJoin(c)) { + if(c instanceof StandardChannel) { + String s = ChatColor.DARK_GREEN + "Channel: " + ChatColor.GREEN + c.getName(); + channels.add(s); + }else if(c instanceof TempChannel) { + String s = ChatColor.DARK_AQUA + "TempChannel: " + ChatColor.AQUA + c.getName(); + channels.add(s); + } + } + } + int pageCount = (int) Math.ceil((double) channels.size() / 8); + if (pg > pageCount) { + pg = pageCount; + } + + FPlayer.plainMsg(p, ChatColor.GOLD + "[" + Integer.toString(pg) + "/" + Integer.toString(pageCount) + "] " + ChatColor.YELLOW + "Open Channels:"); + for (int i = 0; i < 8; i++) { + int index = (pg - 1) * 8 + i; + if (index < channels.size()) { + String msg = channels.get(index); + FPlayer.plainMsg(p, msg); + } + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/CreateCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/CreateCommand.java new file mode 100644 index 0000000..1be2eaa --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/CreateCommand.java @@ -0,0 +1,182 @@ +package com.fpghoti.fpchatx.command.commands; + +import java.util.ArrayList; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.chat.ChatChannel; +import com.fpghoti.fpchatx.chat.ChatFilter; +import com.fpghoti.fpchatx.chat.StandardChannel; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.Util; + +public class CreateCommand extends Commands { + + public CreateCommand(FPChat plugin) { + super(plugin); + name = "Create"; + description = "Makes a new channel"; + syntax = ChatColor.GRAY + "/fpc create " + ChatColor.GOLD + " name "; + minArgs = 1; + maxArgs = 2 + validflags.length; + labels.add("fpc create"); + labels.add("fpchat create"); + labels.add("ch create"); + misc.add("Possible Flags:"); + misc.add("-w : Create with whitelist enabled"); + misc.add("-a : Broadcast alert to all players when channel is made"); + misc.add("-p : Set your primary channel to the new channel upon creation"); + } + + private static String[] validflags = {"-w", "-a", "-p"}; + + @Override + public void execute(CommandSender sender, String[] args) { + FPlayer p = null; + if (sender instanceof Player) { + p = FPlayer.getPlayer((Player)sender); + } + + boolean canTemp = false; + boolean canStandard = false; + boolean canAlert = false; + boolean isTemp = false; + + boolean whitelist = false; + boolean alert = false; + boolean primary = false; + + String name; + ArrayList flags = new ArrayList(); + + ChatChannel channel; + + if(p == null) { + canStandard = true; + canAlert = true; + }else { + canTemp = Permission.canMakeTempChannel(p); + canStandard = Permission.canMakeChannel(p); + canAlert = Permission.canAlertMakeChannel(p); + } + + if(args[0].equalsIgnoreCase("temp")) { + isTemp = true; + } + + if(isTemp && args.length == 1) { + FPlayer.errMsg(p, syntax); + return; + } + + if(isTemp && !canTemp) { + if(p == null) { + FPlayer.errMsg(p,"Temporary channels are designed for player use only."); + }else { + FPlayer.errMsg(p, "You do not have permission to create temporary channels."); + } + return; + } + + if(!isTemp && !canStandard) { + FPlayer.errMsg(p, "You do not have permission to create permanent channels."); + return; + } + + if(isTemp) { + name = args[1]; + if(args.length > 2) { + for(int i = 2; i < args.length; i++) { + flags.add(args[i]); + } + } + }else { + name = args[0]; + if(args.length > 1) { + for(int i = 1; i < args.length; i++) { + flags.add(args[i]); + } + } + } + + if(FPChat.getPlugin().getMainConfig().chatFilterEnabled()) { + if(!ChatFilter.filterWord(name).equals(name)) { + FPlayer.errMsg(p, "This channel name is not allowed on this server."); + return; + } + } + + for(String s : flags) { + if(!Util.contains(validflags, s.toLowerCase())) { + FPlayer.errMsg(p, "You tried use an invalid flag."); + return; + } + if(p == null && s.equalsIgnoreCase("-p")) { + FPlayer.errMsg(p, "Console cannot set a primary chat channel."); + return; + } + if(s.equalsIgnoreCase("-w")) { + whitelist = true; + } + if(s.equalsIgnoreCase("-a")) { + alert = true; + } + if(s.equalsIgnoreCase("-p")) { + primary = true; + } + } + + if(ChatChannel.isReserved(name)) { + FPlayer.errMsg(p, "This name is unavailable. Please try something else."); + return; + } + + if(isTemp) { + channel = ChatChannel.makeTempChannel(p, name); + p.joinChannel(name); + if(primary) { + p.speakingInTemp(); + p.setPrimaryTempChannel(name); + } + }else { + channel = ChatChannel.makeChannel(name); + StandardChannel loaded = ChatChannel.loadChannel(name); + if(loaded != null) { + ChatChannel.addChannel(loaded); + } + if(p != null) { + p.joinChannel(name); + if(primary) { + p.stopTempSpeak(); + p.setPrimaryChannel(name); + } + } + } + + if(whitelist) { + channel.enableWhitelist(); + } + if(alert) { + if(canAlert) { + String creator = "CONSOLE"; + if(p != null) { + creator = p.getName(); + } + for(FPlayer player : FPlayer.getPlayers()) { + FPlayer.plainMsg(player, ChatColor.YELLOW + creator + ChatColor.AQUA + " has created a new channel: " + ChatColor.WHITE + name); + } + }else { + FPlayer.errMsg(p, "You do not have permission to send an alert."); + return; + } + } + + FPlayer.goodMsg(p, "Channel created!"); + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/DeleteCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/DeleteCommand.java new file mode 100644 index 0000000..41e7697 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/DeleteCommand.java @@ -0,0 +1,76 @@ +package com.fpghoti.fpchatx.command.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.chat.ChatChannel; +import com.fpghoti.fpchatx.chat.TempChannel; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; + +public class DeleteCommand extends Commands { + + public DeleteCommand(FPChat plugin) { + super(plugin); + name = "Delete"; + description = "Deletes a channel"; + syntax = ChatColor.GRAY + "/fpc delete " + ChatColor.GOLD + "channel"; + minArgs = 1; + maxArgs = 1; + labels.add("fpc delete"); + labels.add("fpchat delete"); + labels.add("ch delete"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + + FPlayer p = null; + if(sender instanceof Player) { + p = FPlayer.getPlayer((Player)sender); + } + + ChatChannel c = ChatChannel.getChannel(args[0]); + + if(c == null) { + c = ChatChannel.getTempChannel(args[0]); + } + + boolean allowed = false; + + if(p == null) { + allowed = true; + }else { + if(c instanceof TempChannel) { + TempChannel temp = (TempChannel)c; + if(temp.getOwner().equals(p)) { + allowed = true; + } + + } + if(Permission.canDeleteChannel(p)) { + allowed = true; + } + } + + if(!allowed) { + FPlayer.errMsg(p, Permission.noPerm); + } + + if(c == ChatChannel.getDefault()) { + FPlayer.errMsg(p, "You cannot delete the default/fallback channel. If you wish to delete this channel, try setting a different default channel first."); + return; + } + + if (c != null) { + c.delete(); + FPlayer.goodMsg(p,"Channel deleted."); + } else { + FPlayer.errMsg(p, "That channel does not exist."); + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/GiveBadgeCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/GiveBadgeCommand.java new file mode 100644 index 0000000..497a50e --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/GiveBadgeCommand.java @@ -0,0 +1,60 @@ +package com.fpghoti.fpchatx.command.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.badge.BadgeList; +import com.fpghoti.fpchatx.badge.SyncSet; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.Util; + +public class GiveBadgeCommand extends Commands { + + public GiveBadgeCommand(FPChat plugin) { + super(plugin); + name = "GiveBadge"; + description = "Give player a badge"; + syntax = ChatColor.GRAY + "/givebadge " + ChatColor.GOLD + "player badge#"; + minArgs = 2; + maxArgs = 2; + labels.add("fpc givebadge"); + labels.add("fpchat givebadge"); + labels.add("ch givebadge"); + labels.add("givebadge"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + FPlayer p = null; + Boolean console = true; + if(sender instanceof Player){ + console = false; + p = FPlayer.getPlayer((Player) sender); + } + + if(console || Permission.isAdmin(p)){ + FPlayer toGive = FPlayer.getPlayer(args[0]); + if(toGive == null) { + toGive = FPlayer.getPlayer(args[0]); + } + if(toGive == null) { + FPlayer.errMsg(p,"That player cannot be found."); + return; + } + if(Util.isDigit(args[1]) && BadgeList.badgeperm.containsKey(Integer.parseInt(args[1]))) { + int id = Integer.parseInt(args[1]); + toGive.queueBadgeAdd(id); + SyncSet.update(toGive); + toGive.addSyncedBadge(id); + FPlayer.goodMsg(p, "Badge granted."); + }else { + FPlayer.errMsg(p,"Wrong command usage."); + } + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/HelpCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/HelpCommand.java new file mode 100644 index 0000000..08704c2 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/HelpCommand.java @@ -0,0 +1,95 @@ +package com.fpghoti.fpchatx.command.commands; + +import java.util.ArrayList; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.Util; + +public class HelpCommand extends Commands { + + public HelpCommand(FPChat plugin) { + super(plugin); + name = "Help"; + description = "Displays the help menu"; + syntax = ChatColor.GRAY + "/fpc help " + ChatColor.GOLD + "page#"; + minArgs = 0; + maxArgs = 1; + labels.add("fpc help"); + labels.add("fpchat help"); + labels.add("ch help"); + labels.add("fpc"); + labels.add("fpchat"); + labels.add("ch"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + FPlayer p = null; + if(sender instanceof Player) { + p = FPlayer.getPlayer((Player)sender); + } + + int pg = 1; + if (args.length > 0) { + if(Util.isDigit(args[0])) { + pg = Integer.parseInt(args[0]); + }else { + FPlayer.errMsg(p, syntax); + } + } + + ArrayList commands = Commands.getCommands(); + + int pageCount = (int) Math.ceil((double) commands.size() / 8); + if (pg > pageCount) { + pg = pageCount; + } + + FPlayer.plainMsg(p, ""); + String name = ""; + String ctype = "Normal"; + if(Permission.isAdmin(p)) { + name = name + ChatColor.AQUA + "[ADMIN] "; + }else if(Permission.isStaff(p)) { + name = name + ChatColor.BLUE + "[STAFF] "; + } + name = ChatColor.DARK_AQUA + "Player: " + name + ChatColor.GREEN + p.getName(); + String cname = p.getPrimaryChannel().getName(); + String ccount = Integer.toString(p.getPrimaryChannel().playerCount()); + if(p.speakingInTemp() && p.getPrimaryTempChannel() != null) { + ccount = Integer.toString(p.getPrimaryTempChannel().playerCount()); + cname = p.getPrimaryTempChannel().getName(); + ctype = "Temporary"; + } + String primary = ChatColor.DARK_AQUA + "Current Channel: " + ChatColor.GREEN + cname; + ctype = ChatColor.DARK_AQUA + "Channel Type: " + ChatColor.GREEN + ctype; + String online = ChatColor.DARK_AQUA + "Members Online: " + ChatColor.GREEN + ccount; + if(args.length == 0) { + FPlayer.plainMsg(p, ChatColor.GOLD + "[INFO] " + ChatColor.YELLOW + "FPChatX:"); + FPlayer.plainMsg(p,name); + FPlayer.plainMsg(p,primary); + FPlayer.plainMsg(p,ctype); + FPlayer.plainMsg(p,online); + FPlayer.plainMsg(p,ChatColor.GRAY + "Use " + ChatColor.WHITE + "/fpc who " + ChatColor.GRAY + "to see who is in this channel."); + FPlayer.plainMsg(p, ChatColor.GRAY + "Use " + ChatColor.WHITE + "/fpc help page# " + ChatColor.GRAY + "for a list of commands."); + return; + } + FPlayer.plainMsg(p, ChatColor.GOLD + "[" + Integer.toString(pg) + "/" + Integer.toString(pageCount) + "] " + ChatColor.YELLOW + "FPChatX Commands:"); + for (int i = 0; i < 8; i++) { + int index = (pg - 1) * 8 + i; + if (index < commands.size()) { + String msg = ChatColor.GREEN + "- " + commands.get(index).getSyntax(); + FPlayer.plainMsg(p, msg); + } + } + + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/HushCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/HushCommand.java new file mode 100644 index 0000000..b1d14c3 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/HushCommand.java @@ -0,0 +1,51 @@ +package com.fpghoti.fpchatx.command.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; + +public class HushCommand extends Commands { + + public HushCommand(FPChat plugin) { + super(plugin); + name = "Hush"; + description = "Prevents a player from shouting"; + syntax = ChatColor.GRAY + "/hush " + ChatColor.GOLD + "player"; + minArgs = 1; + maxArgs = 1; + labels.add("fpc hush"); + labels.add("fpchat hush"); + labels.add("ch hush"); + labels.add("hush"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + FPlayer p = null; + Boolean console = true; + if(sender instanceof Player){ + console = false; + p = FPlayer.getPlayer((Player) sender); + } + + if(console || Permission.canHush(p)){ + FPlayer hush = FPlayer.getPlayer(args[0]); + if(hush == null) { + hush = FPlayer.getPlayer(args[0]); + } + if(hush == null) { + FPlayer.errMsg(p,"That player cannot be found."); + }else{ + hush.hush(); + FPlayer.dualMsg(hush, "You have been hushed. Your shouts will no longer send."); + FPlayer.goodMsg(p, "Player can no longer use shout."); + } + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/IgnoreCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/IgnoreCommand.java new file mode 100644 index 0000000..e944ed7 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/IgnoreCommand.java @@ -0,0 +1,64 @@ +package com.fpghoti.fpchatx.command.commands; + +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; + +public class IgnoreCommand extends Commands { + + public IgnoreCommand(FPChat plugin) { + super(plugin); + name = "Ignore"; + description = "Ignores all messages from a player"; + syntax = ChatColor.GRAY + "/ignore " + ChatColor.GOLD + "player"; + minArgs = 1; + maxArgs = 1; + labels.add("fpc ignore"); + labels.add("fpchat ignore"); + labels.add("ch ignore"); + labels.add("ignore"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + if(sender instanceof Player) { + FPlayer p = FPlayer.getPlayer((Player)sender); + if(Permission.canIgnore(p)) { + UUID u = plugin.getPlayerCache().getUUID(args[0]); + if(u == null) { + FPlayer.errMsg(p, "Invalid player."); + return; + } + OfflinePlayer o = Bukkit.getOfflinePlayer(u); + + if(o != null) { + FPlayer ignored = FPlayer.getPlayer(o, true); + if(p.getIgnored().contains(u)) { + FPlayer.errMsg(p, "This player is already ignored."); + return; + } + boolean result = p.ignore(ignored); + if(result) { + FPlayer.goodMsg(p, "Player ignored."); + }else { + FPlayer.errMsg(p, "This player cannot be ignored."); + } + } else { + FPlayer.errMsg(p, "Invalid player."); + } + } + } else { + FPlayer.errMsg(null, "You must be a player to use ignore."); + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/IgnoreListCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/IgnoreListCommand.java new file mode 100644 index 0000000..f29a41c --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/IgnoreListCommand.java @@ -0,0 +1,74 @@ +package com.fpghoti.fpchatx.command.commands; + +import java.util.ArrayList; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.Util; + +public class IgnoreListCommand extends Commands { + + public IgnoreListCommand(FPChat plugin) { + super(plugin); + name = "Ignore List"; + description = "Lists all players you have ignored"; + syntax = ChatColor.GRAY + "/ignorelist " + ChatColor.GOLD + "[page#]"; + minArgs = 0; + maxArgs = 1; + labels.add("fpc ignorelist"); + labels.add("fpchat ignorelist"); + labels.add("ch ignorelist"); + labels.add("ignorelist"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + if (sender instanceof Player) { + FPlayer p = FPlayer.getPlayer((Player)sender); + + int pg = 1; + if (args.length > 0) { + if(Util.isDigit(args[0])) { + pg = Integer.parseInt(args[0]); + }else { + FPlayer.errMsg(p, syntax); + } + } + + ArrayList players = p.getIgnored(); + + if(players.size() == 0) { + FPlayer.dualMsg(p, "Your ignore list is currently empty."); + return; + } + + int pageCount = (int) Math.ceil((double) players.size() / 8); + if (pg > pageCount) { + pg = pageCount; + } + + FPlayer.plainMsg(p, ""); + FPlayer.plainMsg(p, ChatColor.GOLD + "[" + Integer.toString(pg) + "/" + Integer.toString(pageCount) + "] " + ChatColor.YELLOW + "Ignored Players:"); + for (int i = 0; i < 8; i++) { + int index = (pg - 1) * 8 + i; + if (index < players.size()) { + OfflinePlayer o = Bukkit.getOfflinePlayer(players.get(index)); + String msg = ChatColor.GREEN + "- " + ChatColor.YELLOW + o.getName(); + FPlayer.plainMsg(p, msg); + } + } + + }else{ + FPlayer.errMsg(null, "This command is for players only."); + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/JoinCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/JoinCommand.java new file mode 100644 index 0000000..1253480 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/JoinCommand.java @@ -0,0 +1,42 @@ +package com.fpghoti.fpchatx.command.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.chat.ChatChannel; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.player.FPlayer; + +public class JoinCommand extends Commands { + + public JoinCommand(FPChat plugin) { + super(plugin); + name = "Join"; + description = "Enters a channel"; + syntax = ChatColor.GRAY + "/fpc join " + ChatColor.GOLD + "channel"; + minArgs = 1; + maxArgs = 1; + labels.add("fpc join"); + labels.add("fpchat join"); + labels.add("ch join"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + if (sender instanceof Player) { + FPlayer p = FPlayer.getPlayer((Player)sender); + ChatChannel channel = ChatChannel.getChannel(args[0]); + if(channel == null) { + channel = ChatChannel.getTempChannel(args[0]); + } + if(channel == null) { + FPlayer.errMsg(p, "The channel you are trying to join does not exist."); + return; + } + p.joinChannel(channel.getName()); + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/KickCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/KickCommand.java new file mode 100644 index 0000000..cf926c8 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/KickCommand.java @@ -0,0 +1,84 @@ +package com.fpghoti.fpchatx.command.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.chat.ChatChannel; +import com.fpghoti.fpchatx.chat.StandardChannel; +import com.fpghoti.fpchatx.chat.TempChannel; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; + +public class KickCommand extends Commands { + + public KickCommand(FPChat plugin) { + super(plugin); + name = "Kick"; + description = "Kicks a player from a channel"; + syntax = ChatColor.GRAY + "/fpc kick " + ChatColor.GOLD + "channel player"; + minArgs = 2; + maxArgs = 2; + labels.add("fpc kick"); + labels.add("fpchat kick"); + labels.add("ch kick"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + + FPlayer p = null; + if(sender instanceof Player) { + p = FPlayer.getPlayer((Player)sender); + } + + ChatChannel c = ChatChannel.getChannel(args[0]); + + if(c == null) { + c = ChatChannel.getTempChannel(args[0]); + } + + if(c == ChatChannel.getDefault()) { + FPlayer.errMsg(p, "You cannot kick a player from the default/fallback channel. If you wish to prevent someone from speaking in default, try muting instead."); + return; + } + + if (c != null) { + if( p == null || (Permission.isAdmin(p) || Permission.canBan(p))) { + FPlayer kicked = FPlayer.getPlayer(args[1]); + if(kicked == null) { + kicked = FPlayer.getOfflinePlayer(args[1]); + } + if(kicked != null) { + String name = kicked.getName(); + if(p == null || !(Permission.isAdmin(kicked) || Permission.canBan(kicked))) { + if(kicked.getChannels().contains(c.getName())) { + c.kick(kicked); + FPlayer.goodMsg(p, ChatColor.YELLOW + name + ChatColor.GREEN + " has been kicked from " + c.getName()); + FPlayer.errMsg(kicked, "You have been kicked from " + ChatColor.YELLOW + c.getName()); + kicked.leaveChannel(c.getName()); + if(c instanceof StandardChannel) { + kicked.setPrimaryChannel(ChatChannel.getDefault().getName()); + } + if(c instanceof TempChannel) { + kicked.stopTempSpeak(); + kicked.setPrimaryTempChannel(""); + } + } + } else { + FPlayer.errMsg(p, "Player cannot be kicked from the channel."); + } + } else { + FPlayer.errMsg(p, "Cannot find specified player."); + } + } else { + FPlayer.errMsg(p, Permission.noPerm); + } + } else { + FPlayer.errMsg(p, "That channel does not exist."); + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/LeaveCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/LeaveCommand.java new file mode 100644 index 0000000..a3c7266 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/LeaveCommand.java @@ -0,0 +1,41 @@ +package com.fpghoti.fpchatx.command.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.chat.ChatChannel; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.player.FPlayer; + +public class LeaveCommand extends Commands { + + public LeaveCommand(FPChat plugin) { + super(plugin); + name = "Leave"; + description = "Leaves a channel"; + syntax = ChatColor.GRAY + "/fpc leave " + ChatColor.GOLD + "channel"; + minArgs = 1; + maxArgs = 1; + labels.add("fpc leave"); + labels.add("fpchat leave"); + labels.add("ch leave"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + if (sender instanceof Player) { + FPlayer p = FPlayer.getPlayer((Player)sender); + ChatChannel channel = ChatChannel.getChannel(args[0]); + if(channel == null) { + FPlayer.errMsg(p, "The channel you are trying to leave does not exist."); + return; + } + p.leaveChannel(channel.getName()); + p.leaveTempChannel(channel.getName()); + FPlayer.goodMsg(p, "You left the channel."); + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/MessageCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/MessageCommand.java new file mode 100644 index 0000000..b88769e --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/MessageCommand.java @@ -0,0 +1,72 @@ +package com.fpghoti.fpchatx.command.commands; + +import java.util.logging.Level; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.Util; + +public class MessageCommand extends Commands { + + public MessageCommand(FPChat plugin) { + super(plugin); + name = "Message"; + description = "Sends a private message to another player"; + syntax = ChatColor.GRAY + "/msg " + ChatColor.GOLD + "player message"; + minArgs = 2; + maxArgs = 100000; + labels.add("msg"); + labels.add("fpc msg"); + labels.add("fpchat msg"); + labels.add("ch msg"); + labels.add("tell"); + labels.add("ch tell"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + if(sender instanceof Player) { + FPlayer p = FPlayer.getPlayer((Player)sender); + if(Permission.canPrivateMessage(p)) { + Player tp = Util.getEP(args[0]); + if(tp != null) { + FPlayer target = FPlayer.getPlayer(tp); + String msg =""; + String last = args[args.length - 1]; + for(int i = 1; i < args.length - 1; i++) { + msg = msg + args[i] + " "; + } + msg = msg + last; + p.sendPM(target, msg); + }else { + FPlayer.errMsg(p, "Target player is not online."); + } + }else { + FPlayer.errMsg(p, Permission.noPerm); + } + }else { + String msg = ChatColor.GREEN + "PM from CONSOLE: " + ChatColor.GRAY; + String last = args[args.length - 1]; + for(int i = 1; i < args.length - 1; i++) { + msg = msg + args[i] + " "; + } + msg = msg + last; + + Player target = Util.getEP(args[0]); + if(target == null) { + FPlayer.errMsg(null,"Invalid player."); + }else { + target.sendMessage(msg); + plugin.log(Level.INFO, ChatColor.GREEN + "PM to " + target.getName() + ": " + ChatColor.GRAY + msg); + } + } + + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/ReloadCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/ReloadCommand.java new file mode 100644 index 0000000..0ba4326 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/ReloadCommand.java @@ -0,0 +1,46 @@ +package com.fpghoti.fpchatx.command.commands; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; + +public class ReloadCommand extends Commands { + + public ReloadCommand(FPChat plugin) { + super(plugin); + name = "Reload"; + description = "Reloads the plugin's configuration and data files."; + syntax = "§7/fpc reload"; + minArgs = 0; + maxArgs = 0; + labels.add("fpc reload"); + labels.add("fpchat reload"); + labels.add("ch reload"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + FPlayer p = null; + boolean allowed = true; + if(sender instanceof Player) { + p = FPlayer.getPlayer((Player)sender); + allowed = Permission.isAdmin(p); + } + + if(allowed) { + + FPlayer.dualMsg(p,"Reloading config files..."); + plugin.reload(); + FPlayer.goodMsg(p,"Config files reloaded."); + + }else { + FPlayer.errMsg(p, Permission.noPerm); + } + + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/ReplyCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/ReplyCommand.java new file mode 100644 index 0000000..34d50b4 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/ReplyCommand.java @@ -0,0 +1,51 @@ +package com.fpghoti.fpchatx.command.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; + +public class ReplyCommand extends Commands { + + public ReplyCommand(FPChat plugin) { + super(plugin); + name = "Reply"; + description = "Reply to a PM from another player"; + syntax = ChatColor.GRAY + "/r " + ChatColor.GOLD + "message"; + minArgs = 1; + maxArgs = 10000; + labels.add("reply"); + labels.add("fpc reply"); + labels.add("fpchat reply"); + labels.add("ch reply"); + labels.add("r"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + if (sender instanceof Player) { + FPlayer p = FPlayer.getPlayer((Player)sender); + if(Permission.canPrivateMessage(p)) { + FPlayer target = p.getLastMessage(); + if(target != null) { + String msg =""; + String last = args[args.length - 1]; + for(int i = 0; i < args.length - 1; i++) { + msg = msg + args[i] + " "; + } + msg = msg + last; + p.sendPM(target, msg); + }else { + FPlayer.errMsg(p, "Target player is not online."); + } + }else { + FPlayer.errMsg(p, Permission.noPerm); + } + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/RevokeBadgeCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/RevokeBadgeCommand.java new file mode 100644 index 0000000..59c025c --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/RevokeBadgeCommand.java @@ -0,0 +1,78 @@ +package com.fpghoti.fpchatx.command.commands; + +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.badge.BadgeList; +import com.fpghoti.fpchatx.badge.SyncGetter; +import com.fpghoti.fpchatx.badge.SyncSet; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.Util; + +public class RevokeBadgeCommand extends Commands { + + public RevokeBadgeCommand(FPChat plugin) { + super(plugin); + name = "RevokeBadge"; + description = "Revokes badge from player"; + syntax = ChatColor.GRAY + "/revokebadge " + ChatColor.GOLD + "player badge#"; + minArgs = 2; + maxArgs = 2; + labels.add("fpc revokebadge"); + labels.add("fpchat revokebadge"); + labels.add("ch revokebadge"); + labels.add("revokebadge"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + FPlayer p = null; + Boolean console = true; + if(sender instanceof Player){ + console = false; + p = FPlayer.getPlayer((Player) sender); + } + + if(console || Permission.isAdmin(p)){ + UUID u = plugin.getPlayerCache().getUUID(args[0]); + if(u == null) { + FPlayer.errMsg(null, "Invalid player."); + return; + } + OfflinePlayer o = Bukkit.getOfflinePlayer(u); + if(o != null) { + FPlayer toRevoke = FPlayer.getPlayer(o,true); + if(SyncGetter.syncExists(toRevoke) && (Util.isDigit(args[1]) || args[1].equals("*") )){ + + if(args[1].equals("*")) { + SyncSet.revoke(toRevoke); + FPlayer.goodMsg(p, "All badges revoked from the specified player."); + }else { + + if(Integer.parseInt(args[1]) < BadgeList.badgeperm.size()) { + int id = Integer.parseInt(args[1]); + SyncSet.revoke(toRevoke, id); + toRevoke.removeSyncedBadge(id); + toRevoke.clearUnownedBadges(); + FPlayer.goodMsg(p, "Badge revoked from the specified player."); + }else { + FPlayer.errMsg(p, "Invalid badge."); + } + } + } + }else { + FPlayer.errMsg(p, "Invalid player."); + } + } + } + + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/ShoutCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/ShoutCommand.java new file mode 100644 index 0000000..ce21d83 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/ShoutCommand.java @@ -0,0 +1,48 @@ +package com.fpghoti.fpchatx.command.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.player.FPlayer; + +public class ShoutCommand extends Commands { + + public ShoutCommand(FPChat plugin) { + super(plugin); + name = "Shout"; + description = "Sends a chat message to every online player"; + syntax = ChatColor.GRAY + "/shout " + ChatColor.GOLD + "msg"; + minArgs = 0; + maxArgs = 100000; + labels.add("fpc shout"); + labels.add("fpchat shout"); + labels.add("ch shout"); + labels.add("fshout"); + labels.add("fyell"); + labels.add("shout"); + labels.add("yell"); + labels.add("y"); + } + + + @Override + public void execute(CommandSender sender, String[] args) { + if (sender instanceof Player) { + FPlayer p = FPlayer.getPlayer((Player)sender); + String msg = ""; + String last = args[args.length - 1]; + for(int i = 0; i < args.length - 1; i++) { + msg = msg + args[i] + " "; + } + msg = msg + last; + p.shout(msg); + }else{ + FPlayer.errMsg(null, "This command is for players only."); + } + + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/ShoutToggleCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/ShoutToggleCommand.java new file mode 100644 index 0000000..ab9ae0d --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/ShoutToggleCommand.java @@ -0,0 +1,50 @@ +package com.fpghoti.fpchatx.command.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; + +public class ShoutToggleCommand extends Commands { + + public ShoutToggleCommand(FPChat plugin) { + super(plugin); + name = "ShoutToggle"; + description = "Temporarily enables or disables shout"; + syntax = ChatColor.GRAY + "/fpc shouttoggle " + ChatColor.GOLD + "channel"; + minArgs = 0; + maxArgs = 0; + labels.add("fpc shouttoggle"); + labels.add("fpchat shouttoggle"); + labels.add("ch shouttoggle"); + labels.add("shouttoggle"); + labels.add("frankoffshout"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + if (sender instanceof Player) { + FPlayer p = FPlayer.getPlayer((Player) sender); + if(Permission.canToggleShout(p)){ + if(args.length == 0){ + if(!p.isShoutVisible()){ + p.showShout(); + FPlayer.goodMsg(p,"Now showing shout!"); + }else if(p.isShoutVisible()){ + p.hideShout(); + FPlayer.goodMsg(p,"Now hiding shout!"); + } + } + }else{ + FPlayer.errMsg(p, "You do not have permission to use this command!"); + } + }else{ + FPlayer.errMsg(null, "This command is for players only."); + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/SpyCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/SpyCommand.java new file mode 100644 index 0000000..92d1fb9 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/SpyCommand.java @@ -0,0 +1,51 @@ +package com.fpghoti.fpchatx.command.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; + +public class SpyCommand extends Commands{ + + FPChat plugin; + + public SpyCommand(FPChat plugin) { + super(plugin); + name = "Spy"; + description = "Toggles Spy mode"; + syntax = ChatColor.GRAY + "/spy " + ChatColor.GOLD + "on/off"; + minArgs = 1; + maxArgs = 1; + labels.add("spy"); + labels.add("fpc spy"); + labels.add("fpchat spy"); + labels.add("ch spy"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + if (sender instanceof Player) { + FPlayer p = FPlayer.getPlayer((Player) sender); + if(Permission.canSpy(p)){ + if(args.length == 1){ + if(args[0].equalsIgnoreCase("true") || args[0].equalsIgnoreCase("on")){ + p.enableSpy(); + FPlayer.goodMsg(p,"PM Spy Enabled!"); + }else if(args[0].equalsIgnoreCase("false") || args[0].equalsIgnoreCase("off")){ + p.disableSpy(); + FPlayer.goodMsg(p,"PM Spy Disabled!"); + } + } + }else{ + FPlayer.errMsg(p, "You do not have permission to use this command!"); + } + }else{ + FPlayer.errMsg(null, "This command is for players only."); + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/TalkCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/TalkCommand.java new file mode 100644 index 0000000..37ce03e --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/TalkCommand.java @@ -0,0 +1,82 @@ +package com.fpghoti.fpchatx.command.commands; + +import java.util.HashSet; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.chat.ChatChannel; +import com.fpghoti.fpchatx.chat.StandardChannel; +import com.fpghoti.fpchatx.chat.TempChannel; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.Util; + +public class TalkCommand extends Commands { + + public TalkCommand(FPChat plugin) { + super(plugin); + name = "Talk"; + description = "Talk in a specific channel"; + syntax = ChatColor.GRAY + "/talk " + ChatColor.GOLD + "channel [msg]"; + minArgs = 1; + maxArgs = 100000; + labels.add("fpc talk"); + labels.add("fpchat talk"); + labels.add("ch talk"); + labels.add("fpc tk"); + labels.add("fpchat tk"); + labels.add("ch tk"); + labels.add("talk"); + labels.add("tk"); + misc.add("Helpful alias: /tk"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + if (sender instanceof Player) { + FPlayer p = FPlayer.getPlayer((Player)sender); + ChatChannel channel = ChatChannel.getChannel(args[0]); + if(channel == null) { + channel = ChatChannel.getTempChannel(args[0]); + } + if(channel == null) { + FPlayer.errMsg(p, "The channel you are trying to talk in does not exist."); + return; + } + if(!p.getChannels().contains(channel.getName()) && !p.getTempChannels().contains(channel.getName())) { + FPlayer.errMsg(p, "You are not currently in that channel."); + return; + } + if(args.length == 1) { + if(channel instanceof StandardChannel) { + p.setPrimaryChannel(channel.getName()); + p.stopTempSpeak(); + }else if(channel instanceof TempChannel) { + p.setPrimaryTempChannel(channel.getName()); + p.speakInTemp(); + } + FPlayer.dualMsg(p,ChatColor.YELLOW + "Now speaking in " + ChatColor.GREEN + channel.getName() + ChatColor.YELLOW + "."); + }else { + String msg = ""; + String last = args[args.length - 1]; + for(int i = 1; i < args.length - 1; i++) { + msg = msg + args[i] + " "; + } + msg = msg + last; + p.setTalk(true); + p.setTalkChannel(channel); + Player pl = Util.getEP(p.getName()); + AsyncPlayerChatEvent event = new AsyncPlayerChatEvent(false, pl, msg, new HashSet(Bukkit.getOnlinePlayers())); + Bukkit.getPluginManager().callEvent(event); + } + }else{ + FPlayer.errMsg(null, "This command is for players only."); + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/UnHushCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/UnHushCommand.java new file mode 100644 index 0000000..76d43c3 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/UnHushCommand.java @@ -0,0 +1,51 @@ +package com.fpghoti.fpchatx.command.commands; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; + +public class UnHushCommand extends Commands { + + public UnHushCommand(FPChat plugin) { + super(plugin); + name = "UnHush"; + description = "Unhushes a player"; + syntax = ChatColor.GRAY + "/unhush " + ChatColor.GOLD + "player"; + minArgs = 1; + maxArgs = 1; + labels.add("fpc unhush"); + labels.add("fpchat unhush"); + labels.add("ch unhush"); + labels.add("unhush"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + FPlayer p = null; + Boolean console = true; + if(sender instanceof Player){ + console = false; + p = FPlayer.getPlayer((Player) sender); + } + + if(console || Permission.canHush(p)){ + FPlayer hush = FPlayer.getPlayer(args[0]); + if(hush == null) { + hush = FPlayer.getPlayer(args[0]); + } + if(hush == null) { + FPlayer.errMsg(p,"That player cannot be found."); + }else{ + hush.unhush(); + FPlayer.dualMsg(hush, "You have been unhushed. Your shouts will now send."); + FPlayer.goodMsg(p, "Player can now use shout."); + } + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/UnignoreCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/UnignoreCommand.java new file mode 100644 index 0000000..c8bfb29 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/UnignoreCommand.java @@ -0,0 +1,52 @@ +package com.fpghoti.fpchatx.command.commands; + +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.player.FPlayer; + +public class UnignoreCommand extends Commands { + + public UnignoreCommand(FPChat plugin) { + super(plugin); + name = "Unignore"; + description = "Unignores all messages from a player"; + syntax = ChatColor.GRAY + "/unignore " + ChatColor.GOLD + "player"; + minArgs = 1; + maxArgs = 1; + labels.add("fpc unignore"); + labels.add("fpchat unignore"); + labels.add("ch unignore"); + labels.add("unignore"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + if(sender instanceof Player) { + FPlayer p = FPlayer.getPlayer((Player)sender); + UUID u = plugin.getPlayerCache().getUUID(args[0]); + if(u == null) { + FPlayer.errMsg(p, "Invalid player."); + return; + } + OfflinePlayer o = Bukkit.getOfflinePlayer(u); + if(o != null) { + FPlayer unignored = FPlayer.getPlayer(o, true); + p.unignore(unignored); + FPlayer.goodMsg(p, "Player unignored."); + } else { + FPlayer.errMsg(p, "Invalid player."); + } + } else { + FPlayer.errMsg(null, "You must be a player to use unignore."); + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/command/commands/WhoCommand.java b/src/main/java/com/fpghoti/fpchatx/command/commands/WhoCommand.java new file mode 100644 index 0000000..44b0dee --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/command/commands/WhoCommand.java @@ -0,0 +1,80 @@ +package com.fpghoti.fpchatx.command.commands; + +import java.util.ArrayList; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.chat.ChatChannel; +import com.fpghoti.fpchatx.command.Commands; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.player.FPlayer; +import com.fpghoti.fpchatx.util.Util; + +public class WhoCommand extends Commands { + + public WhoCommand(FPChat plugin) { + super(plugin); + name = "Who"; + description = "Lists all players in your primary channel"; + syntax = ChatColor.GRAY + "/fpc who " + ChatColor.GOLD + "[page#]"; + minArgs = 0; + maxArgs = 1; + labels.add("fpc who"); + labels.add("fpchat who"); + labels.add("ch who"); + } + + @Override + public void execute(CommandSender sender, String[] args) { + if (sender instanceof Player) { + FPlayer p = FPlayer.getPlayer((Player)sender); + ChatChannel c = p.getPrimaryChannel(); + if(p.speakingInTemp()) { + c = p.getPrimaryTempChannel(); + } + if (c != null) { + + int pg = 1; + if (args.length > 0) { + if(Util.isDigit(args[0])) { + pg = Integer.parseInt(args[0]); + }else { + FPlayer.errMsg(p, syntax); + } + } + + ArrayList players = c.getPlayers(); + + int pageCount = (int) Math.ceil((double) players.size() / 8); + if (pg > pageCount) { + pg = pageCount; + } + + FPlayer.plainMsg(p, ""); + FPlayer.plainMsg(p, ChatColor.GOLD + "[" + Integer.toString(pg) + "/" + Integer.toString(pageCount) + "] " + ChatColor.YELLOW + "Players in " + ChatColor.WHITE + c.getName() + ChatColor.YELLOW +":"); + for (int i = 0; i < 8; i++) { + int index = (pg - 1) * 8 + i; + if (index < players.size()) { + FPlayer member = players.get(index); + String msg = ChatColor.GREEN + "- "; + if(Permission.isAdmin(member)) { + msg = msg + ChatColor.AQUA + "[ADMIN] "; + }else if(Permission.isStaff(member)) { + msg = msg + ChatColor.BLUE + "[STAFF] "; + } + msg = msg + ChatColor.YELLOW + member.getName(); + FPlayer.plainMsg(p, msg); + } + } + + + } + }else{ + FPlayer.errMsg(null, "This command is for players only."); + } + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/config/ChannelFile.java b/src/main/java/com/fpghoti/fpchatx/config/ChannelFile.java new file mode 100644 index 0000000..e32f413 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/config/ChannelFile.java @@ -0,0 +1,221 @@ +package com.fpghoti.fpchatx.config; + +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.util.ArrayList; + +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import com.fpghoti.fpchatx.FPChat; + +public class ChannelFile { + + private FPChat plugin; + private File configFile; + private FileConfiguration config; + private String filename; + private String channel; + + public ChannelFile(FPChat plugin, String channel) { + this.channel = channel; + this.filename = channel + ".yml"; + this.plugin = plugin; + File cdir = new File(this.plugin.getDataFolder() + File.separator + "channels"); + cdir.mkdirs(); + this.configFile = new File(cdir, filename); + this.config = YamlConfiguration.loadConfiguration(configFile); + try { + generate(); + } catch (IOException e) { + e.printStackTrace(); + } + config = YamlConfiguration.loadConfiguration(configFile); + } + + public static ArrayList getChannelFiles(){ + ArrayList files = new ArrayList(); + File cdir = new File(FPChat.getPlugin().getDataFolder(), "channels"); + if(!cdir.exists()) { + cdir.mkdirs(); + new ChannelFile(FPChat.getPlugin(), "Default"); + } + File[] foundfiles = cdir.listFiles(new FilenameFilter() { + @Override public boolean accept(File dir, String name) { + return name.toLowerCase().endsWith(".yml"); + } + }); + for(File f : foundfiles) { + files.add(f); + } + return files; + } + + public static boolean channelExists(String c) { + File cdir = new File(FPChat.getPlugin().getDataFolder() + File.separator + "channels"); + if(!cdir.exists()) { + return false; + } + String fname = c + ".yml"; + File file = new File(cdir, fname); + return file.exists(); + } + + private void generate() throws IOException{ + if (config.get("Name")==null) { + config.createSection("Name"); + config.set("Name", channel); + } + if (config.get("Shortcut")==null) { + config.createSection("Shortcut"); + config.set("Shortcut", channel); + } + if (config.get("ChatFormat")==null) { + config.createSection("ChatFormat"); + config.set("ChatFormat", "&8[{prefix}&8]{suffix}{player}&8:&7 "); + } + if (config.get("DistinguishedChatFormat")==null){ + config.createSection("DistinguishedChatFormat"); + config.set("DistinguishedChatFormat", "&8&l(&r{prefix}&8&l)&r{suffix}{player}&8&l - &r&7"); + } + if (config.get("Whitelist")==null) { + config.createSection("Whitelist"); + config.set("Whitelist", false); + } + if (config.get("WhitelistedUUIDs")==null) { + config.createSection("WhitelistedUUIDs"); + config.set("WhitelistedUUIDs", ""); + } + if (config.get("WhitelistedPermissionNode")==null) { + config.createSection("WhitelistedPermissionNode"); + config.set("WhitelistedPermissionNode", "fpchat.whitelisted." + channel); + } + if (config.get("HasRadius")==null) { + config.createSection("HasRadius"); + config.set("HasRadius", false); + } + if (config.get("Radius")==null) { + config.createSection("Radus"); + config.set("Radius", 300); + } + if (config.get("BannedUUIDs")==null) { + config.createSection("BannedUUIDs"); + config.set("BannedUUIDs", ""); + } + config.save(configFile); + } + + + public String getName() { + return config.getString("Name"); + } + + public String getShortcut() { + return config.getString("Shortcut"); + } + + public void saveShortcut(String shortcut) throws IOException{ + if (config.get("Shortcut")==null) { + config.createSection("Shortcut"); + } + config.set("Shortcut", shortcut); + config.save(configFile); + } + + public String getChatFormat() { + return config.getString("ChatFormat"); + } + + public void saveChatFormat(String format) throws IOException{ + if (config.get("ChatFormat")==null) { + config.createSection("ChatFormat"); + } + config.set("ChatFormat", format); + config.save(configFile); + } + + public String getDistinguishedChatFormat() { + return config.getString("DistinguishedChatFormat"); + } + + public void saveDistinguishedChatFormat(String format) throws IOException{ + if (config.get("DistinguishedChatFormat")==null) { + config.createSection("DistinguishedChatFormat"); + } + config.set("DistinguishedChatFormat", format); + config.save(configFile); + } + + public boolean isWhitelisted() { + return config.getBoolean("Whitelist"); + } + + public void saveWhitelist(boolean whitelisted) throws IOException { + if (config.get("Whitelist")==null) { + config.createSection("Whitelist"); + } + config.set("Whitelist", whitelisted); + config.save(configFile); + } + + public String getWhitelistedUUIDs() { + return config.getString("WhitelistedUUIDs"); + } + + public void saveWhitelistedUUIDs(String uuids) throws IOException { + if (config.get("WhitelistedUUIDs")==null) { + config.createSection("WhitelistedUUIDs"); + } + config.set("WhitelistedUUIDs", uuids); + config.save(configFile); + } + + public String getWhitelistedPermissionNode() { + return config.getString("WhitelistedPermissionNode"); + } + + public void saveWhitelistedPermissionNode(String perm) throws IOException{ + if (config.get("WhitelistedPermissionNode")==null) { + config.createSection("WhitelistedPermissionNode"); + } + config.set("WhitelistedPermissionNode", perm); + config.save(configFile); + } + + public boolean hasRadius() { + return config.getBoolean("HasRadius"); + } + + public void saveHasRadius(boolean b) throws IOException { + if (config.get("HasRadius")==null) { + config.createSection("HasRadius"); + } + config.set("HasRadius", b); + config.save(configFile); + } + + public int getRadius() { + return config.getInt("Radius"); + } + + public void saveRadius(int radius) throws IOException{ + if (config.get("Radius")==null) { + config.createSection("Radius"); + } + config.set("Radius", radius); + config.save(configFile); + } + + public String getBannedUUIDs() { + return config.getString("BannedUUIDs"); + } + + public void saveBannedUUIDs(String uuids) throws IOException { + if (config.get("BannedUUIDs")==null) { + config.createSection("BannedUUIDs"); + } + config.set("BannedUUIDs", uuids); + config.save(configFile); + } +} diff --git a/src/main/java/com/fpghoti/fpchatx/config/MainConfig.java b/src/main/java/com/fpghoti/fpchatx/config/MainConfig.java new file mode 100644 index 0000000..15810b8 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/config/MainConfig.java @@ -0,0 +1,242 @@ +package com.fpghoti.fpchatx.config; + +import java.io.File; +import java.io.IOException; +import java.util.logging.Level; + +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import com.fpghoti.fpchatx.FPChat; + +public class MainConfig { + + private FPChat plugin; + private File configFile; + private FileConfiguration config; + + public MainConfig(FPChat plugin) { + this.plugin = plugin; + this.configFile = new File(plugin.getDataFolder(), "config.yml"); + this.config = YamlConfiguration.loadConfiguration(configFile); + generate(); + } + + private void generate(){ + if (config.get("MySQL")==null) { + config.createSection("MySQL"); + config.set("MySQL", false); + } + if (config.get("Host")==null) { + config.createSection("Host"); + config.set("Host", "0.0.0.0"); + } + if (config.get("Port")==null) { + config.createSection("Port"); + config.set("Port", "3306"); + } + if (config.get("User")==null) { + config.createSection("User"); + config.set("User", "Username"); + } + if (config.get("Password")==null) { + config.createSection("Password"); + config.set("Password", "blee"); + } + if (config.get("Database")==null) { + config.createSection("Database"); + config.set("Database", "mydb"); + } + if (config.get("Chat-Feature-Table")==null) { + config.createSection("Chat-Feature-Table"); + config.set("Chat-Feature-Table", "fpchat"); + } + + if (config.get("PermSync-Table")==null) { + config.createSection("PermSync-Table"); + config.set("PermSync-Table", "fpchatsync"); + } + if (config.get("StaffBadgeEnabled")==null) { + config.createSection("StaffBadgeEnabled"); + config.set("StaffBadgeEnabled", false); + } + if (config.get("StaffBadge")==null) { + config.createSection("StaffBadge"); + config.set("StaffBadge", "&6&l⟪Տ⟫&r"); + } + if (config.get("ShoutCooldownEnabled")==null) { + config.createSection("ShoutCooldownEnabled"); + config.set("ShoutCooldownEnabled", false); + } + if (config.get("ShoutCooldownSeconds")==null) { + config.createSection("ShoutCooldownSeconds"); + config.set("ShoutCooldownSeconds", 45); + } + if (config.get("ShoutFormat")==null) { + config.createSection("ShoutFormat"); + config.set("ShoutFormat", "&8[{prefix}&8]{suffix}{player}&8:&f "); + } + if (config.get("In-Message-Format")==null) { + config.createSection("In-Message-Format"); + config.set("In-Message-Format", "&3[&a{player} &c -> &aMe&3]&f "); + } + if (config.get("Out-Message-Format")==null) { + config.createSection("Out-Message-Format"); + config.set("Out-Message-Format", "&3[&aMe &c -> &a{recipient}&3]&f "); + } + if (config.get("Temp-Channel-Format")==null) { + config.createSection("Temp-Channel-Format"); + config.set("Temp-Channel-Format", "&2[&6{channel}&2]&7{player}&2:&e "); + } + if (config.get("Filter")==null){ + config.createSection("Filter"); + config.set("Filter", false); + } + if (config.get("NaughtyWords")==null){ + config.createSection("NaughtyWords"); + config.set("NaughtyWords", "word1,word2,word3"); + } + if (config.get("FrankMode")==null){ + config.createSection("FrankMode"); + config.set("FrankMode", false); + } + if (config.get("DistinguishedShout")==null){ + config.createSection("DistinguishedShout"); + config.set("DistinguishedShout", "&8&l(&r{prefix}&8&l)&r{suffix}{player}&8&l - &r&f"); + } + if (config.get("DefaultChannel")==null){ + config.createSection("DefaultChannel"); + config.set("DefaultChannel", "Default"); + } + try { + config.save(configFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public boolean mySQLEnabled() { + return config.getBoolean("MySQL"); + } + + public String getHost() { + if(mySQLEnabled()) { + return config.getString("Host"); + }else { + plugin.getLogger().log(Level.SEVERE, "Null SQL host. Is MySQL disabled?"); + return null; + } + } + + public String getPort() { + if(mySQLEnabled()) { + return config.getString("Port"); + }else { + plugin.getLogger().log(Level.SEVERE, "Null SQL port. Is MySQL disabled?"); + return null; + } + } + + public String getUser() { + if(mySQLEnabled()) { + return config.getString("User"); + }else { + plugin.getLogger().log(Level.SEVERE, "Null SQL user. Is MySQL disabled?"); + return null; + } + } + + public String getPassword() { + if(mySQLEnabled()) { + return config.getString("Password"); + }else { + plugin.getLogger().log(Level.SEVERE, "Null SQL password. Is MySQL disabled?"); + return null; + } + } + + public String getDatabase() { + if(mySQLEnabled()) { + return config.getString("Database"); + }else { + plugin.getLogger().log(Level.SEVERE, "Null SQL database. Is MySQL disabled?"); + return null; + } + } + + public String getChatFeatureTable() { + if(mySQLEnabled()) { + return config.getString("Chat-Feature-Table"); + }else { + plugin.getLogger().log(Level.SEVERE, "Null SQL chat feature table. Is MySQL disabled?"); + return null; + } + } + + public String getPermSyncTable() { + if(mySQLEnabled()) { + return config.getString("PermSync-Table"); + }else { + plugin.getLogger().log(Level.SEVERE, "Null SQL perm sync table. Is MySQL disabled?"); + return null; + } + } + + public boolean staffBadgeEnabled() { + return config.getBoolean("StaffBadgeEnabled"); + } + + public String getStaffBadge() { + if(staffBadgeEnabled()) { + return ChatColor.translateAlternateColorCodes('&', config.getString("StaffBadge")); + } + return ""; + } + + public boolean shoutCooldownEnabled(){ + return config.getBoolean("ShoutCooldownEnabled"); + } + + + public int getShoutSeconds(){ + return config.getInt("ShoutCooldownSeconds"); + } + + public String getDefaultChannel() { + return config.getString("DefaultChannel"); + } + + public String getShoutFormat() { + return config.getString("ShoutFormat"); + } + + public String getInMsgFormat() { + return config.getString("In-Message-Format"); + } + + public String getOutMsgFormat() { + return config.getString("Out-Message-Format"); + } + + public String getTempChannelFormat() { + return config.getString("Temp-Channel-Format"); + } + + public boolean chatFilterEnabled() { + return config.getBoolean("Filter"); + } + + public String getNaughtyWords() { + return config.getString("NaughtyWords"); + } + + public boolean frankModeEnabled() { + return config.getBoolean("FrankMode"); + } + + public String getDistinguishedShout() { + return config.getString("DistinguishedShout"); + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/config/PlayerCache.java b/src/main/java/com/fpghoti/fpchatx/config/PlayerCache.java new file mode 100644 index 0000000..bddd262 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/config/PlayerCache.java @@ -0,0 +1,46 @@ +package com.fpghoti.fpchatx.config; + +import java.io.File; +import java.io.IOException; +import java.util.UUID; + +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import com.fpghoti.fpchatx.FPChat; + +public class PlayerCache { + + private FPChat plugin; + private File configFile; + private FileConfiguration config; + + public PlayerCache(FPChat plugin) { + this.plugin = plugin; + configFile = new File(this.plugin.getDataFolder(), "playercache.yml"); + this.config = YamlConfiguration.loadConfiguration(configFile); + config = YamlConfiguration.loadConfiguration(configFile); // In case the player had changed their name and the config updated. + } + + public UUID getUUID(String name) { + try { + return UUID.fromString(config.getString(name.toLowerCase())); + }catch(IllegalArgumentException ex) { + return null; + }catch(NullPointerException ex) { + return null; + } + } + + public void saveUUID(String name, UUID uuid) throws IOException { + name = name.toLowerCase(); + if (config.get(name)==null) { + config.createSection(name); + } + config.set(name, uuid.toString()); + config.save(configFile); + } + + + +} diff --git a/src/main/java/com/fpghoti/fpchatx/config/PlayerFile.java b/src/main/java/com/fpghoti/fpchatx/config/PlayerFile.java new file mode 100644 index 0000000..4a51588 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/config/PlayerFile.java @@ -0,0 +1,157 @@ +package com.fpghoti.fpchatx.config; + +import java.io.File; +import java.io.IOException; + +import org.bukkit.OfflinePlayer; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.chat.ChatChannel; + +public class PlayerFile { + + private FPChat plugin; + private File configFile; + private FileConfiguration config; + private String filename; + private OfflinePlayer player; + + public PlayerFile(FPChat plugin, OfflinePlayer p) { + this.player = p; + filename = p.getUniqueId().toString() + ".yml"; + this.plugin = plugin; + File pdir = new File(this.plugin.getDataFolder(), "players"); + pdir.mkdirs(); + configFile = new File(pdir, filename); + this.config = YamlConfiguration.loadConfiguration(configFile); + try { + generate(); + } catch (IOException e) { + e.printStackTrace(); + } + config = YamlConfiguration.loadConfiguration(configFile); // In case the player had changed their name and the config updated. + } + + private void generate() throws IOException{ + if (config.get("UUID")==null) { + config.createSection("UUID"); + config.set("UUID", player.getUniqueId().toString()); + } + if (config.get("Name")==null) { + config.createSection("Name"); + config.set("Name", player.getName()); + } + if (config.get("CurrentChannel")==null) { + config.createSection("CurrentChannel"); + config.set("CurrentChannel", ChatChannel.getDefault().getName()); + } + if (config.get("Ignore")==null) { + config.createSection("Ignore"); + config.set("Ignore", ""); + } + if (config.get("Channels")==null) { + config.createSection("Channels"); + config.set("Channels", ChatChannel.getDefault().getName() + ","); + } + if (config.get("Spy")==null) { + config.createSection("Spy"); + config.set("Spy", false); + } + if (config.get("ShoutVisible")==null) { + config.createSection("ShoutVisible"); + config.set("ShoutVisible", true); + } + if (config.get("Hushed")==null) { + config.createSection("Hushed"); + config.set("Hushed", false); + } + config.set("Name", player.getName()); + + config.save(configFile); + } + + + public String getUUID() { + return config.getString("UUID"); + } + + public String getName() { + return config.getString("Name"); + } + + public boolean isSpy() { + return config.getBoolean("Spy"); + } + + public void saveSpy(boolean spy) throws IOException { + if (config.get("Spy")==null) { + config.createSection("Spy"); + } + config.set("Spy", spy); + config.save(configFile); + } + + public boolean shoutVisible() { + return config.getBoolean("ShoutVisible"); + } + + public void saveShoutVisible(boolean visible) throws IOException { + if (config.get("ShoutVisible")==null) { + config.createSection("ShoutVisible"); + } + config.set("ShoutVisible", visible); + config.save(configFile); + } + + public boolean isHushed() { + return config.getBoolean("Hushed"); + } + + public void saveHushed(boolean hushed) throws IOException { + if (config.get("Hushed")==null) { + config.createSection("Hushed"); + } + config.set("Hushed", hushed); + config.save(configFile); + } + + + public String getCurrentChannel() { + return config.getString("CurrentChannel"); + } + + public void saveCurrentChannel(String channel) throws IOException { + if (config.get("CurrentChannel")==null) { + config.createSection("CurrentChannel"); + } + config.set("CurrentChannel", channel); + config.save(configFile); + } + + public String getIgnore() { + return config.getString("Ignore"); + } + + public void saveIgnore(String ignore) throws IOException { + if (config.get("Ignore")==null) { + config.createSection("Ignore"); + } + config.set("Ignore", ignore); + config.save(configFile); + } + + public String getChannels() { + return config.getString("Channels"); + } + + public void saveChannels(String channels) throws IOException { + if (config.get("Channels")==null) { + config.createSection("Channels"); + } + config.set("Channels", channels); + config.save(configFile); + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/customcodes/BubbleCode.java b/src/main/java/com/fpghoti/fpchatx/customcodes/BubbleCode.java new file mode 100644 index 0000000..1273186 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/customcodes/BubbleCode.java @@ -0,0 +1,114 @@ +package com.fpghoti.fpchatx.customcodes; + +public class BubbleCode { + + public static String bubblecode(Boolean hasPerm, String msg) { + String newmsg = msg; + if(hasPerm) { + newmsg = replaceChar(msg); + } + return newmsg; + } + + private static String replaceChar(String msg) { + Boolean on = false; + String newmsg = ""; + int i = 0; + + while(i < msg.length()) { + if(msg.substring(i, i + 1).equals("§")) { + String code = msg.substring(i + 1, i + 2); + if(code.equals("r")) { + on = false; + } + String wcode = "§" + code; + newmsg = newmsg + wcode; + i++; + }else if(msg.substring(i, i + 1).equals("&")) { + if(msg.substring(i + 1, i + 2).equals("w")) { + on = true; + i++; + }else { + newmsg = newmsg + "&"; + } + + }else{ + String sub = msg.substring(i, i + 1); + if(on) { + sub = sub.replace('a', 'ⓐ'); + sub = sub.replace('b', 'ⓑ'); + sub = sub.replace('c', 'ⓒ'); + sub = sub.replace('d', 'ⓓ'); + sub = sub.replace('e', 'ⓔ'); + sub = sub.replace('f', 'ⓕ'); + sub = sub.replace('g', 'ⓖ'); + sub = sub.replace('h', 'ⓗ'); + sub = sub.replace('i', 'ⓘ'); + sub = sub.replace('j', 'ⓙ'); + sub = sub.replace('k', 'ⓚ'); + sub = sub.replace('l', 'ⓛ'); + sub = sub.replace('m', 'ⓜ'); + sub = sub.replace('n', 'ⓝ'); + sub = sub.replace('o', 'ⓞ'); + sub = sub.replace('p', 'ⓟ'); + sub = sub.replace('q', 'ⓠ'); + sub = sub.replace('r', 'ⓡ'); + sub = sub.replace('s', 'ⓢ'); + sub = sub.replace('t', 'ⓣ'); + sub = sub.replace('u', 'ⓤ'); + sub = sub.replace('v', 'ⓥ'); + sub = sub.replace('w', 'ⓦ'); + sub = sub.replace('x', 'ⓧ'); + sub = sub.replace('y', 'ⓨ'); + sub = sub.replace('z', 'ⓩ'); + sub = sub.replace('A', 'Ⓐ'); + sub = sub.replace('B', 'Ⓑ'); + sub = sub.replace('C', 'Ⓒ'); + sub = sub.replace('D', 'Ⓓ'); + sub = sub.replace('E', 'Ⓔ'); + sub = sub.replace('F', 'Ⓕ'); + sub = sub.replace('G', 'Ⓖ'); + sub = sub.replace('H', 'Ⓗ'); + sub = sub.replace('I', 'Ⓘ'); + sub = sub.replace('J', 'Ⓙ'); + sub = sub.replace('K', 'Ⓚ'); + sub = sub.replace('L', 'Ⓛ'); + sub = sub.replace('M', 'Ⓜ'); + sub = sub.replace('N', 'Ⓝ'); + sub = sub.replace('O', 'Ⓞ'); + sub = sub.replace('P', 'Ⓟ'); + sub = sub.replace('Q', 'Ⓠ'); + sub = sub.replace('R', 'Ⓡ'); + sub = sub.replace('S', 'Ⓢ'); + sub = sub.replace('T', 'Ⓣ'); + sub = sub.replace('U', 'Ⓤ'); + sub = sub.replace('V', 'Ⓥ'); + sub = sub.replace('W', 'Ⓦ'); + sub = sub.replace('X', 'Ⓧ'); + sub = sub.replace('Y', 'Ⓨ'); + sub = sub.replace('Z', 'Ⓩ'); + sub = sub.replace('1', '①'); + sub = sub.replace('2', '②'); + sub = sub.replace('3', '③'); + sub = sub.replace('4', '④'); + sub = sub.replace('5', '⑤'); + sub = sub.replace('6', '⑥'); + sub = sub.replace('7', '⑦'); + sub = sub.replace('8', '⑧'); + sub = sub.replace('9', '⑨'); + sub = sub.replace('0', '⓪'); + } + newmsg = newmsg + sub; + } + i++; + } + + + + + return newmsg; + } + + + +} diff --git a/src/main/java/com/fpghoti/fpchatx/customcodes/Codify.java b/src/main/java/com/fpghoti/fpchatx/customcodes/Codify.java new file mode 100644 index 0000000..cae99bb --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/customcodes/Codify.java @@ -0,0 +1,114 @@ +package com.fpghoti.fpchatx.customcodes; + +public class Codify { + + public static String changeFormatSign(String str) { + String nstr = str; + nstr = nstr.replace("&0", "§0"); + nstr = nstr.replace("&1", "§1"); + nstr = nstr.replace("&2", "§2"); + nstr = nstr.replace("&3", "§3"); + nstr = nstr.replace("&4", "§4"); + nstr = nstr.replace("&5", "§5"); + nstr = nstr.replace("&6", "§6"); + nstr = nstr.replace("&7", "§7"); + nstr = nstr.replace("&8", "§8"); + nstr = nstr.replace("&9", "§9"); + nstr = nstr.replace("&a", "§a"); + nstr = nstr.replace("&b", "§b"); + nstr = nstr.replace("&c", "§c"); + nstr = nstr.replace("&d", "§d"); + nstr = nstr.replace("&e", "§e"); + nstr = nstr.replace("&f", "§f"); + nstr = nstr.replace("&k", "§k"); + nstr = nstr.replace("&l", "§l"); + nstr = nstr.replace("&m", "§m"); + nstr = nstr.replace("&n", "§n"); + nstr = nstr.replace("&o", "§o"); + nstr = nstr.replace("&r", "§r"); + //nstr = nstr.replace("&w", "§w"); + //nstr = nstr.replace("&x", "§x"); + return nstr; + } + + public static String removeBubbles(String str) { + String nstr = str; + nstr = nstr.replace('ⓐ', 'a'); + nstr = nstr.replace('ⓑ', 'b'); + nstr = nstr.replace('ⓒ', 'c'); + nstr = nstr.replace('ⓓ', 'd'); + nstr = nstr.replace('ⓔ', 'e'); + nstr = nstr.replace('ⓕ', 'f'); + nstr = nstr.replace('ⓖ', 'g'); + nstr = nstr.replace('ⓗ', 'h'); + nstr = nstr.replace('ⓘ', 'i'); + nstr = nstr.replace('ⓙ', 'j'); + nstr = nstr.replace('ⓚ', 'k'); + nstr = nstr.replace('ⓛ', 'l'); + nstr = nstr.replace('ⓜ', 'm'); + nstr = nstr.replace('ⓝ', 'n'); + nstr = nstr.replace('ⓞ', 'o'); + nstr = nstr.replace('ⓟ', 'p'); + nstr = nstr.replace('ⓠ', 'q'); + nstr = nstr.replace('ⓡ', 'r'); + nstr = nstr.replace('ⓢ', 's'); + nstr = nstr.replace('ⓣ', 't'); + nstr = nstr.replace('ⓤ', 'u'); + nstr = nstr.replace('ⓥ', 'v'); + nstr = nstr.replace('ⓦ', 'w'); + nstr = nstr.replace('ⓧ', 'x'); + nstr = nstr.replace('ⓨ', 'y'); + nstr = nstr.replace('ⓩ', 'z'); + nstr = nstr.replace('Ⓐ', 'A'); + nstr = nstr.replace('Ⓑ', 'B'); + nstr = nstr.replace('Ⓒ', 'C'); + nstr = nstr.replace('Ⓓ', 'D'); + nstr = nstr.replace('Ⓔ', 'E'); + nstr = nstr.replace('Ⓕ', 'F'); + nstr = nstr.replace('Ⓖ', 'G'); + nstr = nstr.replace('Ⓗ', 'H'); + nstr = nstr.replace('Ⓘ', 'I'); + nstr = nstr.replace('Ⓙ', 'J'); + nstr = nstr.replace('Ⓚ', 'K'); + nstr = nstr.replace('Ⓛ', 'L'); + nstr = nstr.replace('Ⓜ', 'M'); + nstr = nstr.replace('Ⓝ', 'N'); + nstr = nstr.replace('Ⓞ', 'O'); + nstr = nstr.replace('Ⓟ', 'P'); + nstr = nstr.replace('Ⓠ', 'Q'); + nstr = nstr.replace('Ⓡ', 'R'); + nstr = nstr.replace('Ⓢ', 'S'); + nstr = nstr.replace('Ⓣ', 'T'); + nstr = nstr.replace('Ⓤ', 'U'); + nstr = nstr.replace('Ⓥ', 'V'); + nstr = nstr.replace('Ⓦ', 'W'); + nstr = nstr.replace('Ⓧ', 'X'); + nstr = nstr.replace('Ⓨ', 'Y'); + nstr = nstr.replace('Ⓩ', 'Z'); + nstr = nstr.replace('①', '1'); + nstr = nstr.replace('②', '2'); + nstr = nstr.replace('③', '3'); + nstr = nstr.replace('④', '4'); + nstr = nstr.replace('⑤', '5'); + nstr = nstr.replace('⑥', '6'); + nstr = nstr.replace('⑦', '7'); + nstr = nstr.replace('⑧', '8'); + nstr = nstr.replace('⑨', '9'); + nstr = nstr.replace('⓪', '0'); + return nstr; + } + + public static Boolean isCode(String c) { + String code = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,k,l,m,n,o,r,w,x"; + Boolean found = false; + String[] codes = code.split(","); + int size = codes.length; + for(int i = 0; i < size; i++) { + if(c.contains(codes[i])) { + found = true; + } + } + return found; + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/listener/PlayerListener.java b/src/main/java/com/fpghoti/fpchatx/listener/PlayerListener.java new file mode 100644 index 0000000..9e92068 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/listener/PlayerListener.java @@ -0,0 +1,78 @@ +package com.fpghoti.fpchatx.listener; + +import java.io.IOException; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerKickEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.chat.ChatChannel; +import com.fpghoti.fpchatx.player.FPlayer; + +public class PlayerListener implements Listener { + + private boolean enabled = true; + + @EventHandler (priority = EventPriority.HIGH) + public void onPlayerChat(AsyncPlayerChatEvent event) { + if(enabled) { + if (event.isCancelled()) { + return; + } + Player sender = event.getPlayer(); + FPlayer p = FPlayer.getPlayer(sender); + if(p.toTalk() && p.getTalkChannel() != null) { + p.setTalk(false); + ChatChannel c = p.getTalkChannel(); + p.setTalkChannel(null); + p.chat(c, event.getMessage()); + }else { + p.chat(event.getMessage()); + } + event.setCancelled(true); + } + } + + @EventHandler (priority = EventPriority.NORMAL) + public void onPlayerJoin(PlayerJoinEvent event) { + if(enabled) { + try { + FPChat.getPlugin().getPlayerCache().saveUUID(event.getPlayer().getName(), event.getPlayer().getUniqueId()); + } catch (IOException e) { + e.printStackTrace(); + } + FPlayer.getPlayer(event.getPlayer()); + } + } + + @EventHandler (priority = EventPriority.NORMAL) + public void onPlayerQuit(PlayerQuitEvent event) { + if(enabled) { + FPlayer p = FPlayer.getPlayer(event.getPlayer()); + p.cleanup(); + } + } + + @EventHandler (priority = EventPriority.NORMAL) + public void onPlayerKick(PlayerKickEvent event) { + if(enabled) { + FPlayer p = FPlayer.getPlayer(event.getPlayer()); + p.cleanup(); + } + } + + public void enable() { + this.enabled = true; + } + + public void disable() { + this.enabled = false; + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/mysql/MySQLConnection.java b/src/main/java/com/fpghoti/fpchatx/mysql/MySQLConnection.java new file mode 100644 index 0000000..f6f30a4 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/mysql/MySQLConnection.java @@ -0,0 +1,233 @@ +package com.fpghoti.fpchatx.mysql; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.logging.Level; + +import org.bukkit.scheduler.BukkitRunnable; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.config.MainConfig; + + +public class MySQLConnection{ + + private FPChat plugin; + private String host, user, password, database, port; + private MainConfig config; + + public MySQLConnection(FPChat plugin) { + this.plugin = plugin; + config = plugin.getMainConfig(); + host = config.getHost(); + user = config.getUser(); + password = config.getPassword(); + database = config.getDatabase(); + port = config.getPort(); + } + + private Connection connection; + + public Connection getConnection(){ + return connection; + } + + public void generate() { + if(config.mySQLEnabled()){ + plugin.log(Level.INFO, "Connecting to MySQL..."); + connect(); + if(!tableExists(config.getChatFeatureTable())){ + plugin.log(Level.INFO, "FPChat table not found. Creating new table..."); + //createTable(config.getChatFeatureTable(), "player_uuid VARCHAR (36), badge_slot1 INT (11), badge_slot2 INT (11), badge_slot3 INT (11)"); + update("CREATE TABLE " + config.getChatFeatureTable() + " (player_uuid VARCHAR (36), badge_slot1 INT (11), badge_slot2 INT (11), badge_slot3 INT (11), PRIMARY KEY(player_uuid))"); + plugin.log(Level.INFO, "FPChat table created!"); + } + if(!tableExists(config.getPermSyncTable())){ + //createTable(config.getPermSyncTable(), "player_uuid VARCHAR (36), badges TEXT"); + update("CREATE TABLE " + config.getPermSyncTable() + " (player_uuid VARCHAR (36), badges TEXT, PRIMARY KEY(player_uuid))"); + } + plugin.log(Level.INFO, "FPChat successfully connected to MySQL!"); + plugin.log(Level.INFO, "Badges have been enabled!"); + }else{ + plugin.log(Level.INFO, "Continuing without MySQL."); + } + } + + public void connect(){ + + if (host.equalsIgnoreCase("") || host == null) { + plugin.log(Level.SEVERE, "You have not specified a host in the FPChatX config!"); + } else if (user.equalsIgnoreCase("") || user == null) { + plugin.log(Level.SEVERE, "You have not specified a user in the FPChatX config!"); + } else if (password.equalsIgnoreCase("") || password == null) { + plugin.log(Level.SEVERE, "You have not specified a password in the FPChatX config!"); + } else if (database.equalsIgnoreCase("") || database == null) { + plugin.log(Level.SEVERE, "You have not specified a database in the FPChatX config!"); + } else { + login(); + } + } + + public void disconnect(){ + try{ + if (getConnection() != null){ + connection.close(); + } + else{ + plugin.log(Level.SEVERE, "There was an issue with MySQL: FPChatX is not currently connected to a database."); + } + }catch(SQLException e){ + plugin.log(Level.SEVERE, "There was an issue with MySQL: " + e.getMessage()); + e.printStackTrace(); + } + connection = null; + } + + public void reconnect(){ + disconnect(); + connect(); + } + + public void login(){ + try{ + if (getConnection() != null){ + connection.close(); + } + } + catch (Exception e){} + connection = null; + try{ + connection = DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "/" + database, user, password); + }catch(SQLException e){ + plugin.log(Level.SEVERE, "There was an issue with MySQL: " + e.getMessage()); + e.printStackTrace(); + } + } + + public ResultSet query(String query){ + if (query == null) { + return null; + } + connect(); + ResultSet results = null; + try{ + Statement statement = getConnection().createStatement(); + results = statement.executeQuery(query); + }catch(SQLException e){ + plugin.log(Level.SEVERE, "There has been an error:" + e.getMessage()); + plugin.log(Level.SEVERE,"Failed Query in MySQL using the following query input:"); + plugin.log(Level.SEVERE, query); + e.printStackTrace(); + } + return results; + } + + public void update(String input){ + if (input == null){ + return; + } + connect(); + try{ + Statement statement = getConnection().createStatement(); + statement.executeUpdate(input); + statement.close(); + }catch(SQLException e){ + plugin.log(Level.SEVERE, "There has been an error:" + e.getMessage()); + plugin.log(Level.SEVERE,"Failed to update MySQL using the following update input:"); + plugin.log(Level.SEVERE, input); + e.printStackTrace(); + } + } + + public boolean tableExists(String tablename){ + if (tablename == null) { + return false; + } + try{ + if (getConnection() == null) { + return false; + } + if (getConnection().getMetaData() == null) { + return false; + } + ResultSet results = getConnection().getMetaData().getTables(null, null, tablename, null); + if (results.next()) { + return true; + } + }catch(SQLException e) { + e.printStackTrace(); + } + return false; + } + + public boolean itemExists(String column, String data, String table){ + if (data != null) { + data = "'" + data + "'"; + } + try{ + ResultSet results = query("SELECT * FROM " + table + " WHERE " + column + "=" + data); + while (results.next()) { + if (results.getString(column) != null) { + return true; + } + } + }catch(SQLException e) { + plugin.log(Level.SEVERE, "MYSQL itemExists error: " + e.getMessage()); + e.printStackTrace(); + } + return false; + } + + public void createTable(String table, String columns){ + if (!tableExists(table)) { + update("CREATE TABLE " + table + " (" + columns + ")"); + } + } + + public void insertInto(final String columns, final String values, final String table){ + new BukkitRunnable() { + @Override + public void run() { + update("INSERT INTO " + table + " (" + columns + ") VALUES (" + values + ")"); + } + }.runTaskAsynchronously(plugin); + } + + + public void set(final String selected, final Object object, final String column, final String equality, final String data, final String table){ + new BukkitRunnable() { + @Override + public void run() { + Object gobject = object; + String gdata = data; + if (gobject != null) { + gobject = "'" + gobject + "'"; + } + if (gdata != null) { + gdata = "'" + gdata + "'"; + } + update("UPDATE " + table + " SET " + selected + "=" + gobject + " WHERE " + column + equality + gdata + ";"); + } + }.runTaskAsynchronously(plugin); + } + + + public Object get(String selected, String column, String equality, String data, String table){ + if (data != null) { + data = "'" + data + "'"; + } + try{ + ResultSet rs = query("SELECT * FROM " + table + " WHERE " + column + equality + data); + if (rs.next()) { + return rs.getObject(selected); + } + }catch(SQLException e) { + plugin.log(Level.SEVERE, "MySQL get error: " + e.getMessage()); + e.printStackTrace(); + } + return null; + } +} diff --git a/src/main/java/com/fpghoti/fpchatx/permission/Permission.java b/src/main/java/com/fpghoti/fpchatx/permission/Permission.java new file mode 100644 index 0000000..9839ab6 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/permission/Permission.java @@ -0,0 +1,242 @@ +package com.fpghoti.fpchatx.permission; + +import com.fpghoti.fpchatx.player.FPlayer; + +public class Permission { + + public static String noPerm = "You lack the permission required to perform this action."; + + public static boolean canUseColor(FPlayer p) { + return p.hasPermission("fpchat.colorcodes"); + } + + public static boolean canUseColor(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return canUseColor(p); + } + return false; + } + + public static boolean canShoutColor(FPlayer p) { + return p.hasPermission("fpchat.shoutcolor"); + } + + public static boolean canShoutColor(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return canShoutColor(p); + } + return false; + } + + public static boolean canPMColor(FPlayer p) { + return p.hasPermission("fpchat.pmcolor"); + } + + public static boolean canPMColor(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return canPMColor(p); + } + return false; + } + + public static boolean canBubbleCode(FPlayer p) { + return p.hasPermission("fpchat.bubblecode"); + } + + public static boolean canBubbleCode(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return canBubbleCode(p); + } + return false; + } + + public static boolean canSpy(FPlayer p) { + return p.hasPermission("fpchat.spy"); + } + + public static boolean canSpy(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return canSpy(p); + } + return false; + } + + public static boolean isAdmin(FPlayer p) { + return p.hasPermission("fpchat.admin"); + } + + public static boolean isAdmin(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return isAdmin(p); + } + return false; + } + + public static boolean canBan(FPlayer p) { + return p.hasPermission("fpchat.ban"); + } + + public static boolean canMakeChannel(FPlayer p) { + return p.hasPermission("fpchat.makechannel"); + } + + public static boolean canMakeChannel(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return canMakeChannel(p); + } + return false; + } + + public static boolean canMakeTempChannel(FPlayer p) { + return p.hasPermission("fpchat.maketempchannel"); + } + + public static boolean canMakeTempChannel(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return canMakeTempChannel(p); + } + return false; + } + + public static boolean canAlertMakeChannel(FPlayer p) { + return p.hasPermission("fpchat.alertmakechannel"); + } + + public static boolean canAlertMakeChannel(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return canAlertMakeChannel(p); + } + return false; + } + + public static boolean canIgnore(FPlayer p) { + return p.hasPermission("fpchat.ignore"); + } + + public static boolean canIgnore(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return canIgnore(p); + } + return false; + } + + public static boolean isStaff(FPlayer p) { + return p.hasPermission("fpchat.staff"); + } + + public static boolean isStaff(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return isStaff(p); + } + return false; + } + + public static boolean canKick(FPlayer p) { + return p.hasPermission("fpchat.kick"); + } + + public static boolean canKick(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return canKick(p); + } + return false; + } + + public static boolean canMute(FPlayer p) { + return p.hasPermission("fpchat.mute"); + } + + public static boolean canMute(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return canMute(p); + } + return false; + } + + public static boolean canHush(FPlayer p) { + return p.hasPermission("fpchat.hush"); + } + + public static boolean canHush(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return canHush(p); + } + return false; + } + + public static boolean canShout(FPlayer p) { + return p.hasPermission("fpchat.shout"); + } + + public static boolean canShout(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return canShout(p); + } + return false; + } + + public static boolean canToggleShout(FPlayer p) { + return p.hasPermission("fpchat.toggleshout"); + } + + public static boolean canToggleShout(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return canToggleShout(p); + } + return false; + } + + + public static boolean isDistinguished(FPlayer p) { + return p.hasPermission("fpchat.distinguished"); + } + + public static boolean isDistinguished(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return isDistinguished(p); + } + return false; + } + + public static boolean canDeleteChannel(FPlayer p) { + return p.hasPermission("fpchat.deletechannel"); + } + + public static boolean canDeleteChannel(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return canDeleteChannel(p); + } + return false; + } + + public static boolean canPrivateMessage(FPlayer p) { + return p.hasPermission("fpchat.privatemessage"); + } + + public static boolean canPrivateMessage(String playername) { + if(FPlayer.getPlayer(playername) != null) { + FPlayer p = FPlayer.getPlayer(playername); + return canPrivateMessage(p); + } + return false; + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/player/FPlayer.java b/src/main/java/com/fpghoti/fpchatx/player/FPlayer.java new file mode 100644 index 0000000..d180db8 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/player/FPlayer.java @@ -0,0 +1,677 @@ +package com.fpghoti.fpchatx.player; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.UUID; +import java.util.logging.Level; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +import com.fpghoti.fpchatx.FPChat; +import com.fpghoti.fpchatx.badge.BadgeGetter; +import com.fpghoti.fpchatx.badge.BadgeSet; +import com.fpghoti.fpchatx.badge.SyncSet; +import com.fpghoti.fpchatx.chat.ChatChannel; +import com.fpghoti.fpchatx.chat.ChatFilter; +import com.fpghoti.fpchatx.chat.PrepareChat; +import com.fpghoti.fpchatx.chat.StandardChannel; +import com.fpghoti.fpchatx.chat.TempChannel; +import com.fpghoti.fpchatx.config.PlayerFile; +import com.fpghoti.fpchatx.customcodes.BubbleCode; +import com.fpghoti.fpchatx.customcodes.Codify; +import com.fpghoti.fpchatx.permission.Permission; +import com.fpghoti.fpchatx.util.Util; +import com.fpghoti.fpchatx.util.VaultUtil; + +public class FPlayer { + + private static HashMap players = new HashMap(); + + public static void purge() { + players = new HashMap(); + } + + public static ArrayList getPlayers(){ + ArrayList temp = new ArrayList(players.values()); + return temp; + } + + public static FPlayer getPlayer(OfflinePlayer p) { + return getPlayer(p,false); + } + + @SuppressWarnings("deprecation") // Needed in order to run command using name when player offline. Most people can't remember UUIDs!! + public static FPlayer getOfflinePlayer(String name) { + return getPlayer(Bukkit.getOfflinePlayer(name)); + } + + public static void dualMsg(FPlayer p, String msg) { // Messages FPlayer. If FPlayer NULL msges CONSOLE instead + if(p == null) { + FPChat.getPlugin().log(Level.INFO, msg); + }else { + p.sendMessage(FPChat.logo() + ChatColor.YELLOW + " " + msg); + } + } + + public static void goodMsg(FPlayer p, String msg) { // Messages FPlayer. If FPlayer NULL msges CONSOLE instead + if(p == null) { + FPChat.getPlugin().log(Level.INFO, msg); + }else { + p.sendMessage(FPChat.logo() + ChatColor.YELLOW + " " + msg); + } + } + + public static void errMsg(FPlayer p, String msg) { // Messages FPlayer. If FPlayer NULL msges CONSOLE instead + if(p == null) { + FPChat.getPlugin().log(Level.INFO, "" + ChatColor.RED + msg); + }else { + p.sendMessage(FPChat.logo() + ChatColor.RED + " " + msg); + } + } + + public static void plainMsg(FPlayer p, String msg) { // Messages FPlayer. If FPlayer NULL msges CONSOLE instead + if(p == null) { + FPChat.getPlugin().log(Level.INFO, msg); + }else { + p.sendMessage(msg); + } + } + + + public static FPlayer getPlayer(Player p) { + return getPlayer(Bukkit.getOfflinePlayer(p.getUniqueId())); + } + + public static FPlayer getPlayer(String playername) { + return getPlayer(Util.getEP(playername)); + } + + public static FPlayer getPlayer(OfflinePlayer p, Boolean temp) { + UUID uuid = p.getUniqueId(); + if(players.containsKey(uuid)) { + return players.get(uuid); + }else { + FPlayer fplayer = new FPlayer(p); + if(!temp) { + players.put(uuid, fplayer); + } + return fplayer; + } + } + + private String name; + private UUID uuid; + private PlayerFile pfile; + private OfflinePlayer offlinePlayer; + private ArrayList ignored; + private ArrayList channels; + private ArrayList tempchannels; + private boolean tempspeak; + private String primaryChannel; + private String primaryTempChannel; + private int shoutCooldown; + private Integer[] badges; + private UUID lastMsg; + private boolean spy; + private boolean shoutVisible; + private boolean hushed; + private ArrayList synced; + private boolean toShout; + private boolean toTalk; + private ChatChannel talkChannel; + private ArrayList giveBadgeQueue; + + private FPlayer(OfflinePlayer p) { + this.toShout = false; + this.toTalk = false; + this.talkChannel = null; + this.synced = new ArrayList(); + this.offlinePlayer = p; + this.name = p.getName(); + this.uuid = p.getUniqueId(); + this.pfile = new PlayerFile(FPChat.getPlugin(),p); + this.ignored = new ArrayList(); + this.shoutCooldown = 0; + this.lastMsg = null; + this.spy = pfile.isSpy(); + this.shoutVisible = pfile.shoutVisible(); + this.hushed = pfile.isHushed(); + this.giveBadgeQueue = new ArrayList(); + String rawignore = pfile.getIgnore(); + if(!rawignore.equals("")) { + for(String s : rawignore.split(",")) { + ignored.add(UUID.fromString(s)); + } + } + String rawchannel = pfile.getCurrentChannel(); + if(rawchannel.equals("default")) { + this.primaryChannel = ChatChannel.getDefault().getName(); + }else if(ChatChannel.getChannel(rawchannel) != null) { + this.primaryChannel = rawchannel; + }else { + this.primaryChannel = ChatChannel.getDefault().getName(); + } + this.channels = new ArrayList(); + this.tempchannels = new ArrayList(); + channels.add(ChatChannel.getDefault().getName()); + channels.add(primaryChannel); + String rawchannels = pfile.getChannels(); + if(!rawchannels.equals("")) { + for(String s : rawchannels.split(",")) { + ChatChannel chan = ChatChannel.getChannel(s); + if(chan != null && !chan.getName().equals(ChatChannel.getDefault().getName()) && !chan.getName().equals(primaryChannel)) { + this.channels.add(chan.getName()); + } + } + } + if(FPChat.getPlugin().getMainConfig().mySQLEnabled()) { + Util.connect(); + SyncSet.update(this); + this.badges = BadgeGetter.getBadges(this); + }else { + Integer[] empt = {0,0,0}; + this.badges = empt; + } + } + + public boolean equals(FPlayer p) { + return this.uuid == p.getUniqueId(); + } + + public String getName() { + return this.name; + } + + public void updateBadges(int slot, int id) { + badges[slot-1] = id; + } + + public void clearUnownedBadges() { + if(!BadgeGetter.hasBadge(this, badges[0])) { + BadgeSet.setBadge(this, 1, 0); + updateBadges(1,0); + } + if(!BadgeGetter.hasBadge(this, badges[1])) { + BadgeSet.setBadge(this, 2, 0); + updateBadges(2,0); + } + if(!BadgeGetter.hasBadge(this, badges[2])) { + BadgeSet.setBadge(this, 3, 0); + updateBadges(3,0); + } + } + + public void addSyncedBadge(Integer id) { + if(!synced.contains(id)) { + this.synced.add(id); + } + } + + public void removeSyncedBadge(Integer id) { + this.synced.remove(id); + } + + public boolean isSynced(Integer id) { + return this.synced.contains(id); + } + + public ArrayList syncedList(){ + return this.synced; + } + + public int getShoutCooldown() { + return this.shoutCooldown; + } + + public void setShoutCooldown(int time) { + this.shoutCooldown = time; + } + + public UUID getUniqueId() { + return this.uuid; + } + + public PlayerFile getFile() { + return this.pfile; + } + + public boolean isOnline() { + return offlinePlayer.isOnline(); + } + + public boolean isSpy() { + return this.spy && Permission.canSpy(this); + } + + public boolean enableSpy() { + if(Permission.canSpy(this)) { + this.spy = true; + return true; + } + return false; + } + + public void disableSpy() { + this.spy = false; + } + + public boolean isShoutVisible() { + return this.shoutVisible; + } + + public void showShout() { + this.shoutVisible = true; + } + + public void hideShout() { + this.shoutVisible = false; + } + + public boolean isHushed() { + return this.hushed; + } + + public void hush() { + this.hushed = true; + } + + public void unhush() { + this.hushed = false; + } + + public Integer[] getBadges() { + return this.badges; + } + + public FPlayer getLastMessage() { + if(this.lastMsg == null) { + return null; + } + if(Bukkit.getOfflinePlayer(this.lastMsg).isOnline()) { + return FPlayer.getPlayer(Bukkit.getPlayer(this.lastMsg)); + } + return null; + } + + public boolean hasPermission(String permission) { + if(isOnline()) { + Player p = offlinePlayer.getPlayer(); + return VaultUtil.permission.playerHas(p, permission); + } + return false; + } + + public void setPrimaryChannel(String channel) { + this.primaryChannel = channel; + } + + public ChatChannel getPrimaryChannel() { + ChatChannel c = ChatChannel.getChannel(this.primaryChannel); + if(c != null) { + return c; + } + c = ChatChannel.getDefault(); + this.primaryChannel = c.getName(); + return c; + } + + public void setPrimaryTempChannel(String channel) { + this.primaryTempChannel = channel; + } + + public ChatChannel getPrimaryTempChannel() { + ChatChannel c = ChatChannel.getTempChannel(this.primaryTempChannel); + if(c != null) { + return c; + } + this.tempspeak = false; + return getPrimaryChannel(); + } + + public boolean speakingInTemp() { + return this.tempspeak; + } + + public void speakInTemp() { + this.tempspeak = true; + } + + public void stopTempSpeak() { + this.tempspeak = false; + } + + public ArrayList getChannels(){ + return this.channels; + } + + public ArrayList getTempChannels(){ + return this.tempchannels; + } + + public void sendMessage(String message) { + if(isOnline()) { + Player p = Bukkit.getPlayer(uuid); + p.sendMessage(message); + } + } + + public Player getPlayer() { + if(isOnline()) { + return Util.getEP(name); + } + return null; + } + + public boolean joinChannel(String channel) { + ChatChannel cc = ChatChannel.getChannel(channel); + if(cc == null) { + cc = ChatChannel.getTempChannel(channel); + } + if(cc == null) { + joinStandardChannel(ChatChannel.getDefault().getName()); + FPlayer.errMsg(this, "You tried to join a channel that no longer exists. You have been placed in the default channel instead."); + return false; + } + if(cc.isBanned(this)) { + FPlayer.errMsg(this, "Unable to join. You are blacklisted from this channel."); + return false; + } + if(cc instanceof StandardChannel) { + return joinStandardChannel(cc.getName()); + }else if(cc instanceof TempChannel) { + return joinTempChannel(cc.getName()); + } + FPlayer.errMsg(this, "An error has occurred. Unable to join channel."); + return false; + } + + public boolean joinStandardChannel(String channel) { + ChatChannel cc = ChatChannel.getChannel(channel); + if(cc == null || !(cc instanceof StandardChannel)) { + joinStandardChannel(ChatChannel.getDefault().getName()); + FPlayer.errMsg(this, "You tried to join a channel that no longer exists. You have been placed in the default channel instead."); + return false; + } + StandardChannel c = (StandardChannel)cc; + if(!c.whitelistEnabled() || c.isWhitelisted(this)) { + channels.add(channel); + FPlayer.goodMsg(this, "You have joined channel " + ChatColor.YELLOW + cc.getName() + ChatColor.GREEN + "."); + return true; + }else { + FPlayer.errMsg(this, "Unable to join. Channel is whitelisted."); + } + return false; + } + + public void leaveChannel(String channel) { + if(ChatChannel.getDefault().getName().equalsIgnoreCase(channel)) { + FPlayer.errMsg(this, "You cannot leave the default channel."); + return; + } + if(getPrimaryChannel().getName().equalsIgnoreCase(channel)) { + setPrimaryChannel(ChatChannel.getDefault().getName()); + } + channels.remove(channel); + } + + public boolean joinTempChannel(String channel) { + ChatChannel cc = ChatChannel.getTempChannel(channel); + if(cc == null || !(cc instanceof TempChannel)) { + joinStandardChannel(ChatChannel.getDefault().getName()); + FPlayer.errMsg(this, "You tried to join a channel that no longer exists. You have been placed in the default channel instead."); + return false; + } + TempChannel c = (TempChannel)cc; + if(!c.whitelistEnabled() || c.isWhitelisted(this)) { + tempchannels.add(channel); + FPlayer.goodMsg(this, "You have joined temporary channel " + ChatColor.YELLOW + cc.getName() + ChatColor.GREEN + "."); + return true; + }else { + FPlayer.errMsg(this, "Unable to join. Channel is whitelisted."); + } + return false; + } + + public boolean canJoin(ChatChannel channel) { + if(channel.isBanned(this)) { + return false; + } + if(channel.whitelistEnabled() && !channel.isWhitelisted(this)) { + return false; + } + return true; + } + + public void leaveTempChannel(String channel) { + if(getPrimaryTempChannel().getName().equalsIgnoreCase(channel)) { + stopTempSpeak(); + this.primaryTempChannel = null; + } + tempchannels.remove(channel); + } + + public String formatChat(String msg) { + if(tempspeak) { + return formatChat(getPrimaryTempChannel(),msg); + } + return formatChat(getPrimaryChannel(), msg); + } + + public String formatChat(ChatChannel channel, String msg) { + return channel.format(this, msg); + } + + public void chat(ChatChannel channel, String msg) { + channel.sendMessage(formatChat(channel,msg), this); + } + + public void chat(String msg) { + if(toShout) { + toShout = false; + ChatChannel.getShout().sendMessage(formatChat(ChatChannel.getShout(),msg), this); + if(FPChat.getPlugin().getMainConfig().shoutCooldownEnabled()) { + shoutCooldown = FPChat.getPlugin().getMainConfig().getShoutSeconds(); + } + }else if(tempspeak) { + getPrimaryTempChannel().sendMessage(formatChat(getPrimaryTempChannel(),msg), this); + }else { + getPrimaryChannel().sendMessage(formatChat(msg), this); + } + } + + public boolean shout(String message) { + if(!hushed && FPChat.getPlugin().getMainConfig().shoutCooldownEnabled() && shoutCooldown > 0) { + int i = shoutCooldown; + String time = " seconds "; + if(i == 1) { + time = " second "; + } + FPlayer.errMsg(this, "You must wait " + Integer.toString(i) + time + "before you can shout again."); + } + + if(hushed) { + FPlayer.errMsg(this, "You are hushed."); + } + + if(isOnline() && (shoutCooldown == 0 || !FPChat.getPlugin().getMainConfig().shoutCooldownEnabled() ) && !isHushed()) { + if(Permission.canShout(this)) { + Player p = Bukkit.getPlayer(uuid); + toShout = true; + AsyncPlayerChatEvent event = new AsyncPlayerChatEvent(false, p, message, new HashSet(Bukkit.getOnlinePlayers())); + Bukkit.getPluginManager().callEvent(event); + return true; + }else { + FPlayer.errMsg(this, Permission.noPerm); + } + } + return false; + } + + public boolean ignore(FPlayer p) { + if(Permission.isAdmin(p) || Permission.isStaff(p)) { + return false; + } + ignored.add(p.getUniqueId()); + return true; + } + + public void unignore(FPlayer p) { + ignored.remove(p.getUniqueId()); + } + + public ArrayList getIgnored(){ + return ignored; + } + + public boolean isIgnoring(FPlayer p) { + if(Permission.isAdmin(p) || Permission.isStaff(p)) { + return false; + } + return this.ignored.contains(p.getUniqueId()); + } + + public boolean reply(String msg) { + if(getLastMessage() == null) { + sendMessage(FPChat.logo() + ChatColor.RED + "There is nobody currently online who you can reply to."); + return false; + }else { + FPlayer p = getLastMessage(); + return sendPM(p,msg); + } + } + + public boolean toTalk() { + return this.toTalk; + } + + public void setTalk(boolean b) { + toTalk = b; + } + public ChatChannel getTalkChannel() { + return this.talkChannel; + } + + public void setTalkChannel(ChatChannel c) { + talkChannel = c; + } + + public boolean receivePM(FPlayer from, String msg) { + if(!from.isIgnoring(this)) { + String finalMessage = ""; + String stf = ""; + if (Permission.canPMColor(from)) { + msg = msg.replaceAll("&([0-9a-fk-or])", "§$1"); + } else { + msg = msg.replaceAll("§[0-9a-fk-or]", ""); + } + String header = PrepareChat.swapPlaceholders(from, this.getName(), msg, true); + if(Permission.isStaff(from)){ + stf = FPChat.getPlugin().getMainConfig().getStaffBadge(); + } + String filler = ""; + if(FPChat.getPlugin().getMainConfig().chatFilterEnabled()){ + filler = "word "; + } + if(Permission.canPMColor(from)){ + String last = ChatFilter.filter(filler + msg); + last = BubbleCode.bubblecode(Permission.canBubbleCode(from), Codify.changeFormatSign(last)); + finalMessage = stf + header + last; + }else{ + String newmsg = ChatColor.stripColor(ChatColor.translateAlternateColorCodes('§', ChatFilter.filter(filler + msg))); + finalMessage = stf + Codify.removeBubbles(header + newmsg); + } + sendMessage(finalMessage); + lastMsg = from.getUniqueId(); + return true; + } + return false; + + } + + public boolean sendPM(FPlayer to, String msg) { + boolean received = to.receivePM(this, msg); + if(to.isOnline() && received) { + String finalMessage = ""; + String stf = ""; + if (Permission.canPMColor(this)) { + msg = msg.replaceAll("&([0-9a-fk-or])", "§$1"); + } else { + msg = msg.replaceAll("§[0-9a-fk-or]", ""); + } + String header = PrepareChat.swapPlaceholders(this, to.getName(), msg, false); + if(Permission.isStaff(this)){ + stf = FPChat.getPlugin().getMainConfig().getStaffBadge(); + } + String filler = ""; + if(FPChat.getPlugin().getMainConfig().chatFilterEnabled()){ + filler = "word "; + } + if(Permission.canPMColor(this)){ + String last = ChatFilter.filter(filler + msg); + last = BubbleCode.bubblecode(Permission.canBubbleCode(this), Codify.changeFormatSign(last)); + finalMessage = stf + header + last; + }else{ + String newmsg = ChatColor.stripColor(ChatColor.translateAlternateColorCodes('§', ChatFilter.filter(filler + msg))); + finalMessage = stf + Codify.removeBubbles(header + newmsg); + } + lastMsg = to.getUniqueId(); + sendMessage(finalMessage); + if(!Permission.isAdmin(this)) { + for(FPlayer p: FPlayer.getPlayers()){ + if(p.isSpy()){ + p.sendMessage(ChatColor.DARK_GRAY + name + " --> " + to.getName() + ": " + msg); + } + } + } + return true; + } + sendMessage(FPChat.logo() + ChatColor.RED + "The person you are trying to send a message to is either offline or ignoring you."); + return false; + } + + public void queueBadgeAdd(int id) { + if(!BadgeGetter.hasBadge(this, id) && !giveBadgeQueue.contains(id)) { + giveBadgeQueue.add(id); + } + } + + public void unqueueBadge(Integer id) { + giveBadgeQueue.remove(id); + } + + public ArrayList getBadgeQueue(){ + return this.giveBadgeQueue; + } + + public void cleanup() { + String ignorelist = ""; + for(UUID id : ignored) { + ignorelist = id.toString() + ","; + } + ignorelist = Util.stripLast(ignorelist); + String chanlist = ""; + for(String c : channels) { + if(chanlist.equals("") || !Util.contains(Util.stripLast(chanlist).split(","), c)) { + chanlist = chanlist + c + ","; + } + } + chanlist = Util.stripLast(chanlist); + try { + pfile.saveIgnore(ignorelist); + pfile.saveChannels(chanlist); + pfile.saveCurrentChannel(getPrimaryChannel().getName()); + pfile.saveSpy(spy); + pfile.saveHushed(hushed); + } catch (IOException e) { + e.printStackTrace(); + } + players.remove(this.uuid); + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/util/Util.java b/src/main/java/com/fpghoti/fpchatx/util/Util.java new file mode 100644 index 0000000..2b8e354 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/util/Util.java @@ -0,0 +1,60 @@ +package com.fpghoti.fpchatx.util; + +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import com.fpghoti.fpchatx.FPChat; + +public class Util { + + public static void connect(){ + if(FPChat.getPlugin().getMySQLConnection().getConnection() == null){ + FPChat.getPlugin().getMySQLConnection().reconnect(); + } + } + + public Player playerGet(String uuid){ + UUID id = UUID.fromString(uuid); + Player p = Bukkit.getPlayer(id); + return p; + } + + public static String fixCodes(String s){ + return s.replaceAll("&", "§"); + } + + public static Player getEP(String playername){ + Player p = null; + for(Player item : Bukkit.getOnlinePlayers()){ + if(playername.equalsIgnoreCase(item.getName())){ + p = item; + } + } + return p; + } + + public static boolean isDigit(String s){ + return s.matches("[0-9]+"); + } + + public static String stripLast(String s) { + if (s.length() != 0) { + s = s.substring(0, s.length()-1); + } + return s; + } + + public static Boolean contains(String[] list, String s) { + Boolean check = false; + for(String item: list){ + if(item.equals(s)){ + check = true; + } + } + + return check; + } + +} diff --git a/src/main/java/com/fpghoti/fpchatx/util/VaultUtil.java b/src/main/java/com/fpghoti/fpchatx/util/VaultUtil.java new file mode 100644 index 0000000..cc0c5b0 --- /dev/null +++ b/src/main/java/com/fpghoti/fpchatx/util/VaultUtil.java @@ -0,0 +1,52 @@ +package com.fpghoti.fpchatx.util; + +import org.bukkit.plugin.RegisteredServiceProvider; + +import com.fpghoti.fpchatx.FPChat; + +import net.milkbowl.vault.chat.Chat; +import net.milkbowl.vault.economy.Economy; +import net.milkbowl.vault.permission.Permission; + +public class VaultUtil { + + public static Permission permission = null; + public static Economy economy = null; + public static Chat chat = null; + private FPChat plugin; + + public VaultUtil(FPChat plugin) { + this.plugin = plugin; + } + + public boolean setupPermissions(){ + RegisteredServiceProvider permissionProvider = plugin.getServer().getServicesManager().getRegistration(net.milkbowl.vault.permission.Permission.class); + if (permissionProvider != null) { + permission = permissionProvider.getProvider(); + } + return (permission != null); + } + + public boolean setupChat(){ + RegisteredServiceProvider chatProvider = plugin.getServer().getServicesManager().getRegistration(net.milkbowl.vault.chat.Chat.class); + if (chatProvider != null) { + chat = chatProvider.getProvider(); + } + + return (chat != null); + } + + public boolean setupEconomy(){ + RegisteredServiceProvider economyProvider = plugin.getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class); + if (economyProvider != null) { + economy = economyProvider.getProvider(); + } + + return (economy != null); + } + + public Chat getChat() { + return chat; + } + +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..17cc844 --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,72 @@ +name: FPChatX +version: ${project.version} +main: com.fpghoti.fpchatx.FPChat +description: Chat plugin for 1.12+ +depend: [Vault] +softdepend: [PlaceholderAPI] +commands: + fpc: + aliases: [fpchat,ch] + description: Main FPChat command + usage: Wrong usage. For help, type / help + shout: + aliases: [fyell, fshout, yell, y] + description: Send a global message to all players + usage: /shout message + spy: + description: Enables listening in on private messages + usage: /spy + hush: + description: Disables a user's shout and tempchannel abilities + usage: / player + unhush: + description: Re-enables a user's shout and tempchannel abilities + usage: / player + badgelist: + aliases: [badges] + description: Pulls up a list of badges you own + usage: / page# + badgeequip: + aliases: [equip] + description: equips a badge + usage: / slot# badge# + badgeclear: + aliases: [badgesclear] + description: unequips all badges + usage: / + msg: + aliases: [tell] + description: Starts or ends a private conversation + usage: / player message + reply: + aliases: [r] + description: Replies to a private conversation + usage: / message + ignore: + description: Ignores a player + usage: / player + unignore: + description: Unignores a player. + usage: / player + ignorelist: + description: Shows ignorelist + usage: / + revokebadge: + description: Deletes synced badge in MySQL. + usage: / player badge# + givebadge: + description: Grants player a badge. + usage: / player badge# + shouttoggle: + aliases: [frankoffshout] + description: Toggles ability to see shout. + usage: / player badge# + tempchat: + aliases: [tc] + description: Tempchat main command. + usage: / + talk: + aliases: [tk] + description: Set main channel + usage: / channel +