diff --git a/vChat/com/bukkit/nossr50/vChat/vChat.java b/vChat/com/bukkit/nossr50/vChat/vChat.java index cefa9a8b3..d92f08d48 100644 --- a/vChat/com/bukkit/nossr50/vChat/vChat.java +++ b/vChat/com/bukkit/nossr50/vChat/vChat.java @@ -24,14 +24,15 @@ public class vChat extends JavaPlugin { public vChat(PluginLoader pluginLoader, Server instance, PluginDescriptionFile desc, File folder, File plugin, ClassLoader cLoader) { super(pluginLoader, instance, desc, folder, plugin, cLoader); } - - - public void onEnable() { PluginManager pm = getServer().getPluginManager(); pm.registerEvent(Event.Type.PLAYER_CHAT, playerListener, Priority.Normal, this); + pm.registerEvent(Event.Type.PLAYER_JOIN, playerListener, Priority.Normal, this); + pm.registerEvent(Event.Type.PLAYER_COMMAND, playerListener, Priority.Normal, this); PluginDescriptionFile pdfFile = this.getDescription(); System.out.println( pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!" ); + //Load the users file + vUsers.getInstance().loadUsers(); } public void onDisable() { System.out.println("vChat Disabled!"); diff --git a/vChat/com/bukkit/nossr50/vChat/vPlayerListener.java b/vChat/com/bukkit/nossr50/vChat/vPlayerListener.java index f4cea095a..41ae278af 100644 --- a/vChat/com/bukkit/nossr50/vChat/vPlayerListener.java +++ b/vChat/com/bukkit/nossr50/vChat/vPlayerListener.java @@ -24,6 +24,10 @@ public class vPlayerListener extends PlayerListener { public vPlayerListener(vChat instance) { plugin = instance; } + public void onPlayerJoin(PlayerEvent event) { + Player player = event.getPlayer(); + vUsers.addUser(player); + } //Special Color Codes protected static final String[] rainbow = new String[] { ChatColor.DARK_RED.toString(), @@ -56,7 +60,7 @@ public class vPlayerListener extends PlayerListener { Player[] players = plugin.getServer().getOnlinePlayers(); //Quotes if(split[0].startsWith(">")) - quote(player, message); + quote(player, message, players); else{ quakeColors(player, message, players); } @@ -121,91 +125,87 @@ public class vPlayerListener extends PlayerListener { //===================================================================== public static void gmsg(String msg){gmsg(null, msg, null);} public static void gmsg(Player player, String msg){gmsg(player, msg, null);} - //===================================================================== - //Function: wordWrap - //Input: String msg: The message to be wrapped - //Output: String[]: The array of substrings - //Use: Cuts the message apart into whole words short enough to fit - // on one line - //===================================================================== - public static String[] wordWrap(String msg){ + //===================================================================== + //Function: wordWrap + //Input: String msg: The message to be wrapped + //Output: String[]: The array of substrings + //Use: Cuts the message apart into whole words short enough to fit + // on one line + //===================================================================== + public static String[] wordWrap(String msg){ + //Split each word apart + ArrayList split = new ArrayList(); + for(String in : msg.split(" ")) + split.add(in); + + //Create an arraylist for the output + ArrayList out = new ArrayList(); + //While i is less than the length of the array of words + while(!split.isEmpty()){ + int len = 0; + + //Create an arraylist to hold individual words + ArrayList words = new ArrayList(); - //Create an arraylist for the output - ArrayList out = new ArrayList(); - //Constructs the line that will be added to the output - StringBuffer line = new StringBuffer(); - //The current length of the line - int curLength = 0; - //The most recent color in a line - String color = ChatColor.WHITE.toString(); - //The number of words on this line - int wordLength = 0; - - for(int i = 0; i < msg.length(); i++) - { - - //If the next char would be a color, don't count it as length - //but add it to the output line - if(msg.charAt(i) == ChatColor.DARK_RED.toString().charAt(0)) + //Loop through the words finding their length and increasing + //j, the end point for the sub string + while(!split.isEmpty() && split.get(0) != null && len <= lineLength) + { + int wordLength = msgLength(split.get(0)) + 4; + + //If a word is too long for a line + if(wordLength > lineLength) + { + String[] tempArray = wordCut(len, split.remove(0)); + words.add(tempArray[0]); + split.add(tempArray[1]); + } + + //If the word is not too long to fit + len += wordLength; + if( len < lineLength) + words.add(split.remove(0)); + } + //Merge them and add them to the output array. + out.add(combineSplit(words.toArray(new String[words.size()]), " ") + " " ); + } + //Convert to an array and return + return out.toArray(new String[out.size()]); + } + + //CombineSplit + public static String combineSplit(String[] array, String merge) { + String out = ""; + for(String word : array) + out += word + merge; + return out; + } + + //===================================================================== + //Function: msgLength + //Input: String str: The string to find the length of + //Output: int: The length on the screen of a string + //Use: Finds the length on the screen of a string. Ignores colors. + //===================================================================== + public static int msgLength(String str){ + int length = 0; + //Loop through all the characters, skipping any color characters + //and their following color codes + for(int x = 0; x lineLength) - { - //Go back one to avoid making it too long - i--; - - //Go back to the place we would split the line - //If there is more than one word - if(wordLength > 0) - while(lineSplit.indexOf(msg.charAt(i)) == -1) - { - i--; - line.deleteCharAt(line.length() - 1); - } - //Add the line to the output - out.add(line.toString()); - - //Make sure you have the most recent color - for(int j = i; j > 0; j--) + if((x+1 <= str.length()) && (str.charAt(x) == '^' || str.charAt(x) == ChatColor.WHITE.toString().charAt(0))) { - if(msg.charAt(j) == ChatColor.DARK_RED.toString().charAt(0)) + if(colorChange(str.charAt(x + 1)) != null) { - color = msg.substring(j, j+1); - break; + x++; + continue; } } - - //Create a new line - line = new StringBuffer(); - curLength = 0; + int len = charLength(str.charAt(x)); + length += len; } - //If the line isn't long enough yet - else - { - //Add the character to the line - line.append(msg.charAt(i)); - } - } - //Add the final line - out.add(line.toString()); - - //Return the output as an array - return out.toArray(new String[out.size()]); - } + return length; + } //===================================================================== //Function: colorChange //Input: char colour: The color code to find the color for @@ -392,14 +392,14 @@ public class vPlayerListener extends PlayerListener { //Output: boolean: If this feature is enabled //Use: Displays a message as a quote //===================================================================== - public void quote(Player player, String message) + public void quote(Player player, String message, Player[] players) { //Format the name String playerName = ChatColor.WHITE + "<" + player.getName() + "> "; //Log the chat log.log(Level.INFO, "<"+player.getName()+"> " + message); //Output the message - gmsg(player, playerName + ChatColor.GREEN + message); + gmsg(player, playerName + ChatColor.GREEN + message, players); } //===================================================================== @@ -424,7 +424,7 @@ public class vPlayerListener extends PlayerListener { { //Start the line with the most recent color String temp = ""; - if(!recentColor.equals("^r") && recentColor != null) + if(!recentColor.equals("^r") && !recentColor.equals("^x") && recentColor != null) temp += recentColor; //Loop through looking for a color code @@ -459,7 +459,6 @@ public class vPlayerListener extends PlayerListener { && msg.charAt(x) != ChatColor.DARK_RED.toString().charAt(0)) { temp += rainbow[i] + msg.charAt(x); - if(msg.charAt(x) != ' ') i++; if(i == rainbow.length) i = 0; x++; @@ -467,15 +466,15 @@ public class vPlayerListener extends PlayerListener { //If it reached another color instead of the end if(x < msg.length() && msg.charAt(x) == '^' - || x < msg.length() - && msg.charAt(x) == ChatColor.DARK_RED.toString().charAt(0) ) + /* Not sure what this check is for + * || x < msg.length() && msg.charAt(x) == ChatColor.DARK_RED.toString().charAt(0)*/) { taste = false; i = 0; x--; } } - if(xmasparty || recentColor.equals("^x")) + if(xmasparty || recentColor.equals("^x")) { //Skip the quake code for xmas if(recentColor.equals("^x")) @@ -483,7 +482,7 @@ public class vPlayerListener extends PlayerListener { x += 2; } - //Taste keeps it going with xmas if there + //xmasparty keeps it going with xmas if there //are more lines xmasparty = true; //Loop through the message applying the colors diff --git a/vChat/com/bukkit/nossr50/vChat/vUsers.java b/vChat/com/bukkit/nossr50/vChat/vUsers.java new file mode 100644 index 000000000..6d6016517 --- /dev/null +++ b/vChat/com/bukkit/nossr50/vChat/vUsers.java @@ -0,0 +1,552 @@ +package com.bukkit.nossr50.vChat; + +import java.io.*; +import java.util.ArrayList; +import java.util.Properties; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.bukkit.entity.*; + +public class vUsers { + private static volatile vUsers instance; + protected static final Logger log = Logger.getLogger("Minecraft"); + String location = "vChat.users"; + public static PlayerList players = new PlayerList(); + private Properties properties = new Properties(); + + //To load + public void load() throws IOException { + properties.load(new FileInputStream(location)); + } + //To save + public void save() { + try { + properties.store(new FileOutputStream(location), null); + }catch(IOException ex) { + } + } + + + public void loadUsers(){ + File theDir = new File(location); + if(!theDir.exists()){ + //properties = new PropertiesFile(location); + FileWriter writer = null; + try { + writer = new FileWriter(location); + writer.write("#Storage place for user information\r\n"); + writer.write("#username:nickname:suffix:tag:ignore,list,names:alias,commands,here\r\n"); + } catch (Exception e) { + log.log(Level.SEVERE, "Exception while creating " + location, e); + } finally { + try { + if (writer != null) { + writer.close(); + } + } catch (IOException e) { + log.log(Level.SEVERE, "Exception while closing writer for " + location, e); + } + } + + } else { + //properties = new PropertiesFile(location); + try { + load(); + } catch (IOException e) { + log.log(Level.SEVERE, "Exception while loading " + location, e); + } + } + } + + //===================================================================== + //Function: addUser + //Input: Player player: The player to create a profile for + //Output: none + //Use: Loads the profile for the specified player + //===================================================================== + public static void addUser(Player player){ + players.addPlayer(player); + } + + //===================================================================== + //Function: removeUser + //Input: Player player: The player to stop following + //Output: none + //Use: Creates the player profile + //===================================================================== + public static void removeUser(Player player){ + players.removePlayer(player); + } + + //===================================================================== + //Function: getProfile + //Input: Player player: The player to find the profile for + //Output: PlayerList.PlayerProfile: The profile + //Use: Gets the player profile + //===================================================================== + public static PlayerList.PlayerProfile getProfile(Player player){ + return players.findProfile(player); + } + + public static vUsers getInstance() { + if (instance == null) { + instance = new vUsers(); + } + return instance; + } + public static void getRow(){ + + } +} +class PlayerList +{ + protected static final Logger log = Logger.getLogger("Minecraft"); + ArrayList players; + + //===================================================================== + //Function: PlayerList + //Input: Player player: The player to create a profile object for + //Output: none + //Use: Initializes the ArrayList + //===================================================================== + public PlayerList() { players = new ArrayList(); } + + //===================================================================== + //Function: addPlayer + //Input: Player player: The player to add + //Output: None + //Use: Add a profile of the specified player + //===================================================================== + public void addPlayer(Player player) + { + players.add(new PlayerProfile(player)); + } + + //===================================================================== + //Function: removePlayer + //Input: Player player: The player to remove + //Output: None + //Use: Remove the profile of the specified player + //===================================================================== + public void removePlayer(Player player) + { + players.remove(findProfile(player)); + } + + //===================================================================== + //Function: findProfile + //Input: Player player: The player to find's profile + //Output: PlayerProfile: The profile of the specified player + //Use: Get the profile for the specified player + //===================================================================== + public PlayerProfile findProfile(Player player) + { + for(PlayerProfile ply : players) + { + if(ply.isPlayer(player)) + return ply; + } + return null; + } + + //===================================================================== + //Class: PlayerProfile + //Use: Encapsulates all commands for player options + //Author: cerevisiae + //===================================================================== + class PlayerProfile + { + protected final Logger log = Logger.getLogger("Minecraft"); + private String playerName, + lastMessage, + nickName, + tag, + suffix, + party; + + private boolean dead, + silent; + + char defaultColor; + + String location = "vChat.users"; + + private ArrayList ignoreList; + //private commandList aliasList; + + static final int EXIT_FAIL = 0, + EXIT_SUCCESS = 1, + EXIT_CONTINUE = 2; + + //===================================================================== + //Function: PlayerProfile + //Input: Player player: The player to create a profile object for + //Output: none + //Use: Loads settings for the player or creates them if they don't + // exist. + //===================================================================== + public PlayerProfile(Player player) + { + //Declare things + playerName = player.getName(); + tag = new String(); + nickName = new String(); + suffix = new String(); + party = new String(); + party = null; + defaultColor = 'f'; + ignoreList = new ArrayList(); + dead = false; + + //Try to load the player and if they aren't found, append them + if(!load()) + addPlayer(); + } + + public boolean load() + { + try { + //Open the user file + FileReader file = new FileReader(location); + BufferedReader in = new BufferedReader(file); + String line = ""; + while((line = in.readLine()) != null) + { + //Find if the line contains the player we want. + String[] character = line.split(":"); + if(!character[0].equals(playerName)){continue;} + + //Get the tag + if(character.length > 1) + tag = character[1]; + //Get the nickname + if(character.length > 2) + nickName = character[2]; + //Get the suffix + if(character.length > 3) + suffix = character[3]; + //Get the color + if(character.length > 4) + defaultColor = character[4].charAt(0); + //Ignore previously ignored players + if(character.length > 5) + { + String[] ignores = character[5].split(","); + if(ignores.length > 0) + { + for(String ignore : ignores) + ignoreList.add(ignore); + } + } + in.close(); + return true; + } + in.close(); + } catch (Exception e) { + log.log(Level.SEVERE, "Exception while reading " + + location + " (Are you sure you formatted it correctly?)", e); + } + return false; + } + + //===================================================================== + // Function: save + // Input: none + // Output: None + // Use: Writes current values of PlayerProfile to disk + // Call this function to save current values + //===================================================================== + public void save() + { + try { + //Open the file + FileReader file = new FileReader(location); + BufferedReader in = new BufferedReader(file); + StringBuilder writer = new StringBuilder(); + String line = ""; + + //While not at the end of the file + while((line = in.readLine()) != null) + { + //Read the line in and copy it to the output it's not the player + //we want to edit + if(!line.split(":")[0].equalsIgnoreCase(playerName)) + { + writer.append(line).append("\r\n"); + + //Otherwise write the new player information + } else { + writer.append(playerName + ":"); + writer.append(tag + ":"); + writer.append(nickName + ":"); + writer.append(suffix + ":"); + writer.append(defaultColor + ":"); + + int i = 0; + for(String ignore : ignoreList) + { + writer.append(ignore); + if(i < ignoreList.size() - 1) + writer.append(","); + } + writer.append("\r\n"); + } + } + in.close(); + //Write the new file + FileWriter out = new FileWriter(location); + out.write(writer.toString()); + out.close(); + } catch (Exception e) { + log.log(Level.SEVERE, "Exception while writing to " + location + " (Are you sure you formatted it correctly?)", e); + } + } + public void addPlayer() + { + try { + //Open the file to write the player + FileWriter file = new FileWriter(location, true); + BufferedWriter out = new BufferedWriter(file); + + //Add the player to the end + out.append(playerName + ":"); + out.append(tag + ":"); + out.append(nickName + ":"); + out.append(suffix + ":"); + out.append(defaultColor + ":"); + + + int i = 0; + for(String ignore : ignoreList) + { + out.append(ignore); + if(i < ignoreList.size() - 1) + out.append(","); + } + out.newLine(); + out.close(); + } catch (Exception e) { + log.log(Level.SEVERE, "Exception while writing to " + location + " (Are you sure you formatted it correctly?)", e); + } + } + + //===================================================================== + //Function: isPlayer + //Input: None + //Output: Player: The player this profile belongs to + //Use: Finds if this profile belongs to a specified player + //===================================================================== + public boolean isPlayer(Player player) + { + return player.getName().equals(playerName); + } + + //===================================================================== + //Function: isIgnored + //Input: Player player: Checks if a player is ignored + //Output: boolean: If they're ignored + //Use: Finds if the specified player is in the ignore list + //===================================================================== + public boolean isIgnored(Player player){ + return ignoreList.contains(player.getName()); + } + + //===================================================================== + //Function: addIgnore + //Input: Player name: The player to ignore + //Output: boolean: If the player was successfully ignored + //Use: Ignores a player. + //===================================================================== + public boolean addIgnore(Player name) + { + if(!ignoreList.contains(name)) + { + ignoreList.add(name.getName()); + save(); + return true; + } + return false; + } + + //===================================================================== + //Function: removeIgnore + //Input: Player name: The player to unignore + //Output: boolean: If the player was successfully unignored + //Use: Stops ignoring a player. + //===================================================================== + public boolean removeIgnore(Player name) + { + if(ignoreList.contains(name.getName())) + { + ignoreList.remove(name.getName()); + save(); + return true; + } + return false; + } + + //===================================================================== + //Function: removeIgnore + //Input: Player name: The player to unignore + //Output: boolean: If the player was successfully unignored + //Use: Stops ignoring a player. + //===================================================================== + public String[] listIgnore() + { + return ignoreList.toArray(new String[ignoreList.size()]); + } + + //===================================================================== + //Function: setTag + //Input: String newTag: The tag to set for the player + //Output: None + //Use: Sets a player tag + //===================================================================== + public void setTag(String newTag) + { + tag = newTag; + save(); + } + //===================================================================== + //Function: getTag + //Input: None + //Output: String: The player tag + //Use: Gets a player tag + //===================================================================== + public String getTag() { return tag; } + + //===================================================================== + //Function: setNick + //Input: String newTag: The nickname to set for the player + //Output: None + //Use: Sets a player nickname + //===================================================================== + public void setNick(String newNick) + { + nickName = newNick; + save(); + } + + public void setSilent(){ + silent = true; + } + public void disableSilent(){ + silent = false; + } + public boolean isSilent(){ + return silent; + } + //Store the player's party + public void setParty(String newParty) + { + party = newParty; + save(); + } + //Retrieve the player's party + public String getParty() {return party;} + //Remove party + public void removeParty() { + party = null; + save(); + } + //Retrieve whether or not the player is in a party + public boolean inParty() { + if(party != null){ + return true; + } else { + return false; + } + } + + //===================================================================== + //Function: getNick + //Input: None + //Output: String: The player nickname + //Use: Gets a player nickname + //===================================================================== + public String getNick() { return nickName; } + + //===================================================================== + //Function: setSuffix + //Input: String newTag: The suffix to set for the player + //Output: None + //Use: Sets a player suffix + //===================================================================== + public void setSuffix(String newSuffix) + { + suffix = newSuffix; + save(); + } + + //===================================================================== + //Function: getSuffix + //Input: None + //Output: String: The player suffix + //Use: Gets a player suffix + //===================================================================== + public String getSuffix() { return suffix; } + + //===================================================================== + //Function: setColor + //Input: String newTag: The color to set for the player + //Output: None + //Use: Sets a player color + //===================================================================== + public void setColor(String newColor) + { + defaultColor = newColor.charAt(0); + save(); + } + + //===================================================================== + //Function: getColor + //Input: None + //Output: String: The player color + //Use: Gets a player color + //===================================================================== + public String getColor() {return vPlayerListener.colorChange(defaultColor);} + + //===================================================================== + //Function: setMessage + //Input: String newName: The name of the player they last messaged + // or recieved a message from. + //Output: None + //Use: Sets a player tag + //===================================================================== + public void setMessage(Player newName){ lastMessage = newName.getName(); } + + //===================================================================== + //Function: getMessage + //Input: None + //Output: String: The player name + //Use: Gets the name of the player they last messaged or recieved + // a message from. + //===================================================================== + public Player getMessage() + { + //if(lastMessage != null) + //We need the bukkit equivalent of this + //return matchPlayer(lastMessage); + return null; + } + + //===================================================================== + //Function: isDead + //Input: None + //Output: boolean: If the player is dead or not + //Use: Gets the player is dead or not. + //===================================================================== + public boolean isDead() {return dead;} + + //===================================================================== + //Function: isDead + //Input: boolean isded: if the player is dead or not. + //Output: None + //Use: Sets if the player is dead or not + //===================================================================== + public void isDead(boolean isded){dead = isded;} + } +} + + +