├── .gitignore ├── build.xml ├── pom.xml └── src └── main ├── java └── com │ └── dinnerbone │ └── bukkit │ └── chat │ ├── ChatBukkit.java │ ├── CommandHandler.java │ ├── commands │ ├── MessageCommand.java │ ├── ReplyCommand.java │ └── WhoCommand.java │ └── events │ └── WhoisRequestEvent.java └── resources └── plugin.yml /.gitignore: -------------------------------------------------------------------------------- 1 | # Eclipse stuff 2 | /.classpath 3 | /.project 4 | /.settings 5 | 6 | # netbeans 7 | /nbproject 8 | 9 | # maven 10 | /target 11 | 12 | # ant 13 | /bin 14 | /dist 15 | 16 | # vim 17 | .*.sw[a-p] 18 | -------------------------------------------------------------------------------- /build.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4.0.0 3 | org.bukkit 4 | bukkit-chat 5 | 1.1-SNAPSHOT 6 | ChatBukkit 7 | http://www.bukkit.org 8 | 9 | 10 | 11 | bukkit-repo 12 | http://repo.bukkit.org/content/groups/public 13 | 14 | 15 | 16 | 17 | 18 | org.bukkit 19 | bukkit 20 | 1.4.6-R0.3 21 | jar 22 | compile 23 | 24 | 25 | 26 | 27 | 28 | 29 | src/main/resources 30 | true 31 | 32 | 33 | 34 | 35 | org.apache.maven.plugins 36 | maven-compiler-plugin 37 | 2.0.2 38 | 39 | 1.5 40 | 1.5 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /src/main/java/com/dinnerbone/bukkit/chat/ChatBukkit.java: -------------------------------------------------------------------------------- 1 | package com.dinnerbone.bukkit.chat; 2 | 3 | import com.dinnerbone.bukkit.chat.commands.MessageCommand; 4 | import com.dinnerbone.bukkit.chat.commands.ReplyCommand; 5 | import com.dinnerbone.bukkit.chat.commands.WhoCommand; 6 | import org.bukkit.plugin.java.JavaPlugin; 7 | 8 | /** 9 | * Basic chat functionality 10 | * 11 | * @author Dinnerbone 12 | */ 13 | public class ChatBukkit extends JavaPlugin { 14 | @Override 15 | public void onEnable() { 16 | getCommand("who").setExecutor(new WhoCommand(this)); 17 | getCommand("msg").setExecutor(new MessageCommand(this)); 18 | getCommand("reply").setExecutor(new ReplyCommand(this)); 19 | } 20 | } -------------------------------------------------------------------------------- /src/main/java/com/dinnerbone/bukkit/chat/CommandHandler.java: -------------------------------------------------------------------------------- 1 | package com.dinnerbone.bukkit.chat; 2 | 3 | import java.util.List; 4 | import org.bukkit.command.Command; 5 | import org.bukkit.command.CommandExecutor; 6 | import org.bukkit.command.CommandSender; 7 | import org.bukkit.entity.Player; 8 | 9 | public abstract class CommandHandler implements CommandExecutor { 10 | protected final ChatBukkit plugin; 11 | 12 | public CommandHandler(ChatBukkit plugin) { 13 | this.plugin = plugin; 14 | } 15 | 16 | public abstract boolean onCommand(CommandSender sender, Command command, String label, String[] args); 17 | 18 | protected static boolean anonymousCheck(CommandSender sender) { 19 | if (!(sender instanceof Player)) { 20 | sender.sendMessage("Cannot execute that command, I don't know who you are!"); 21 | return true; 22 | } else { 23 | return false; 24 | } 25 | } 26 | 27 | protected static Player getPlayer(CommandSender sender, String[] args, int index) { 28 | if (args.length > index) { 29 | List players = sender.getServer().matchPlayer(args[index]); 30 | 31 | if (players.isEmpty()) { 32 | sender.sendMessage("I don't know who '" + args[index] + "' is!"); 33 | return null; 34 | } else { 35 | return players.get(0); 36 | } 37 | } else { 38 | if (anonymousCheck(sender)) { 39 | return null; 40 | } else { 41 | return (Player) sender; 42 | } 43 | } 44 | } 45 | 46 | protected static String recompileMessage(String[] args, int start, int end) { 47 | if (start > args.length) { 48 | throw new IndexOutOfBoundsException(); 49 | } 50 | 51 | String result = args[start]; 52 | 53 | for (int i = start + 1; i <= end; i++) { 54 | result += " " + args[i]; 55 | } 56 | 57 | return result; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/com/dinnerbone/bukkit/chat/commands/MessageCommand.java: -------------------------------------------------------------------------------- 1 | package com.dinnerbone.bukkit.chat.commands; 2 | 3 | import com.dinnerbone.bukkit.chat.ChatBukkit; 4 | import com.dinnerbone.bukkit.chat.CommandHandler; 5 | import java.util.HashMap; 6 | import java.util.Map; 7 | import org.bukkit.ChatColor; 8 | import org.bukkit.command.Command; 9 | import org.bukkit.command.CommandSender; 10 | import org.bukkit.entity.Player; 11 | 12 | public class MessageCommand extends CommandHandler { 13 | private Map lastMessages = new HashMap(); 14 | 15 | public MessageCommand(ChatBukkit plugin) { 16 | super(plugin); 17 | } 18 | 19 | @Override 20 | public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { 21 | if (args.length < 2) { 22 | return false; 23 | } 24 | 25 | if (!sender.hasPermission("chatbukkit.msg")) { 26 | sender.sendMessage(ChatColor.RED + "You do not have permission to send private messages"); 27 | return true; 28 | } 29 | 30 | CommandSender target; 31 | 32 | if (args[0].equalsIgnoreCase("CONSOLE")) { 33 | target = plugin.getServer().getConsoleSender(); 34 | } else { 35 | target = getPlayer(sender, args, 0); 36 | } 37 | 38 | if (target != null) { 39 | String message = recompileMessage(args, 1, args.length - 1); 40 | String senderName = sender.getName(); 41 | String targetName = target.getName(); 42 | 43 | // TODO: This should use an event, but we need some internal changes to support that fully. 44 | 45 | if (sender instanceof Player) { 46 | senderName = ((Player) sender).getDisplayName(); 47 | } 48 | 49 | if (target instanceof Player) { 50 | targetName = ((Player) target).getDisplayName(); 51 | } 52 | 53 | target.sendMessage(String.format("[%s]->[you]: %s", senderName, message)); 54 | sender.sendMessage(String.format("[you]->[%s]: %s", targetName, message)); 55 | 56 | lastMessages.put(targetName, sender); 57 | } 58 | 59 | return true; 60 | } 61 | 62 | public CommandSender getLastSender(CommandSender target) { 63 | CommandSender lastSender = null; 64 | 65 | if (target != null) { 66 | String senderName = target.getName(); 67 | lastSender = lastMessages.get(senderName); 68 | 69 | if (lastSender instanceof Player) { 70 | if (!((Player) lastSender).isValid()) { 71 | lastSender = plugin.getServer().getPlayerExact(lastSender.getName()); 72 | lastMessages.put(target.getName(), lastSender); 73 | } 74 | } 75 | } 76 | 77 | return lastSender; 78 | } 79 | } -------------------------------------------------------------------------------- /src/main/java/com/dinnerbone/bukkit/chat/commands/ReplyCommand.java: -------------------------------------------------------------------------------- 1 | package com.dinnerbone.bukkit.chat.commands; 2 | 3 | import com.dinnerbone.bukkit.chat.ChatBukkit; 4 | import com.dinnerbone.bukkit.chat.CommandHandler; 5 | import org.bukkit.ChatColor; 6 | import org.bukkit.command.Command; 7 | import org.bukkit.command.CommandSender; 8 | import org.bukkit.command.PluginCommand; 9 | import org.bukkit.entity.Player; 10 | 11 | public class ReplyCommand extends CommandHandler { 12 | public ReplyCommand(ChatBukkit plugin) { 13 | super(plugin); 14 | } 15 | 16 | @Override 17 | public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { 18 | if (args.length < 1) { 19 | return false; 20 | } 21 | 22 | if (!sender.hasPermission("chatbukkit.msg")) { 23 | sender.sendMessage(ChatColor.RED + "You do not have permission to send private messages"); 24 | return true; 25 | } 26 | 27 | CommandSender target = getTarget(sender); 28 | 29 | if (target == null) { 30 | sender.sendMessage(ChatColor.RED + "There is nobody to reply to!"); 31 | } else { 32 | String message = recompileMessage(args, 0, args.length - 1); 33 | String senderName = sender.getName(); 34 | String targetName = target.getName(); 35 | 36 | // TODO: This should use an event, but we need some internal changes to support that fully. 37 | 38 | if (target instanceof Player) { 39 | targetName = ((Player) target).getDisplayName(); 40 | } 41 | 42 | if (sender instanceof Player) { 43 | senderName = ((Player) sender).getDisplayName(); 44 | } 45 | 46 | target.sendMessage(String.format("[%s]->[you]: %s", senderName, message)); 47 | sender.sendMessage(String.format("[you]->[%s]: %s", targetName, message)); 48 | } 49 | 50 | return true; 51 | } 52 | 53 | private CommandSender getTarget(CommandSender sender) { 54 | PluginCommand command = plugin.getCommand("msg"); 55 | 56 | if (command != null && command.getExecutor() instanceof MessageCommand) { 57 | return ((MessageCommand) command.getExecutor()).getLastSender(sender); 58 | } else { 59 | return null; 60 | } 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/com/dinnerbone/bukkit/chat/commands/WhoCommand.java: -------------------------------------------------------------------------------- 1 | package com.dinnerbone.bukkit.chat.commands; 2 | 3 | import com.dinnerbone.bukkit.chat.ChatBukkit; 4 | import com.dinnerbone.bukkit.chat.CommandHandler; 5 | import com.dinnerbone.bukkit.chat.events.WhoisRequestEvent; 6 | import java.util.Set; 7 | import org.bukkit.ChatColor; 8 | import org.bukkit.command.Command; 9 | import org.bukkit.command.CommandSender; 10 | import org.bukkit.entity.Player; 11 | 12 | public class WhoCommand extends CommandHandler { 13 | public WhoCommand(ChatBukkit plugin) { 14 | super(plugin); 15 | } 16 | 17 | @Override 18 | public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { 19 | if (args.length == 0) { 20 | if (!sender.hasPermission("chatbukkit.who.list")) { 21 | sender.sendMessage(ChatColor.RED + "You do not have permission to view the online players"); 22 | return true; 23 | } 24 | 25 | PerformPlayerList(sender, args); 26 | return true; 27 | } else if (args.length == 1) { 28 | if (!sender.hasPermission("chatbukkit.who.whois")) { 29 | sender.sendMessage(ChatColor.RED + "You do not have permission to view their details"); 30 | return true; 31 | } 32 | 33 | PerformWhois(sender, args); 34 | return true; 35 | } 36 | 37 | return false; 38 | } 39 | 40 | private void PerformWhois(CommandSender sender, String[] args) { 41 | Player player = getPlayer(sender, args, 0); 42 | 43 | if (player != null) { 44 | WhoisRequestEvent report = new WhoisRequestEvent(sender, player); 45 | report.setField("Display Name", player.getDisplayName()); 46 | report.setField("World", player.getWorld().getName()); 47 | 48 | if (!ChatColor.stripColor(player.getDisplayName()).equalsIgnoreCase(player.getName())) { 49 | report.setField("Username", player.getName()); 50 | } 51 | 52 | player.getServer().getPluginManager().callEvent(report); 53 | sender.sendMessage("------ WHOIS report ------"); 54 | Set keys = report.getFields().keySet(); 55 | 56 | for (String key : keys) { 57 | sender.sendMessage(key + ": " + report.getField(key)); 58 | } 59 | } 60 | } 61 | 62 | private void PerformPlayerList(CommandSender sender, String[] args) { 63 | String result = ""; 64 | Player[] players = plugin.getServer().getOnlinePlayers(); 65 | int count = 0; 66 | 67 | for (Player player : players) { 68 | String name = player.getDisplayName(); 69 | 70 | if (name.length() > 0) { 71 | if (result.length() > 0) { 72 | result += ", "; 73 | } 74 | result += name; 75 | count++; 76 | } 77 | } 78 | 79 | if (count == 0) { 80 | sender.sendMessage("There's currently nobody playing on this server!"); 81 | } else if (count == 1) { 82 | sender.sendMessage("There's only one player online: " + result); 83 | } else { 84 | sender.sendMessage("Online players: " + result); 85 | } 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/main/java/com/dinnerbone/bukkit/chat/events/WhoisRequestEvent.java: -------------------------------------------------------------------------------- 1 | package com.dinnerbone.bukkit.chat.events; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | import org.bukkit.command.CommandSender; 6 | import org.bukkit.entity.Player; 7 | import org.bukkit.event.Event; 8 | import org.bukkit.event.HandlerList; 9 | 10 | /** 11 | * Thrown when someone requests a WHOIS on a player 12 | */ 13 | public class WhoisRequestEvent extends Event { 14 | private static final HandlerList handlers = new HandlerList(); 15 | private final CommandSender sender; 16 | private final Player player; 17 | private final Map result = new HashMap(); 18 | 19 | public WhoisRequestEvent(CommandSender sender, Player player) { 20 | this.sender = sender; 21 | this.player = player; 22 | } 23 | 24 | /** 25 | * Gets the target player to display details about 26 | * 27 | * @return Player target of this event 28 | */ 29 | public Player getPlayer() { 30 | return player; 31 | } 32 | 33 | /** 34 | * Gets the {@link CommandSender} who requested the WHOIS report 35 | * 36 | * @return The origin of this request 37 | */ 38 | public CommandSender getSender() { 39 | return sender; 40 | } 41 | 42 | /** 43 | * Sets the specified field of this report to the given value. Use null if 44 | * you wish to remove that field. 45 | * 46 | * @param field Name of the field to set 47 | * @param value New value of the field (or null to remove) 48 | */ 49 | public void setField(String field, String value) { 50 | if (value == null) { 51 | result.remove(field); 52 | } else { 53 | result.put(field, value); 54 | } 55 | } 56 | 57 | /** 58 | * Gets a field which is already collected by this report. 59 | * 60 | * @param field Name of the field to retrieve 61 | * @return Value contained in that field, or null if none exist 62 | */ 63 | public String getField(String field) { 64 | return result.get(field); 65 | } 66 | 67 | /** 68 | * Returns all fields collected by this report so far 69 | * 70 | * @return Map of all collected fields 71 | */ 72 | public Map getFields() { 73 | return result; 74 | } 75 | 76 | @Override 77 | public HandlerList getHandlers() { 78 | return handlers; 79 | } 80 | } -------------------------------------------------------------------------------- /src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | name: ${name} 2 | main: com.dinnerbone.bukkit.chat.ChatBukkit 3 | version: ${version} 4 | website: http://www.bukkit.org 5 | author: The Bukkit Team 6 | description: > 7 | Basic chat functionality. 8 | This plugin is one of the default plugins shipped with Bukkit. 9 | commands: 10 | who: 11 | aliases: [whois, whos, player, players, listplayers] 12 | description: Looks up a player, returning various details about them. If no player is specified, it lists all available players. 13 | usage: | 14 | / [player] 15 | Example: / Walrus 16 | msg: 17 | aliases: [priv, tell] 18 | description: Sends a player a message 19 | usage: | 20 | / 21 | Example: / Dinosaur You're extinct! :( 22 | reply: 23 | aliases: [r] 24 | description: Replies to the last received message 25 | usage: | 26 | / 27 | Example: / Oh no! 28 | permissions: 29 | chatbukkit.msg: 30 | description: Allows the player to send messages to other players 31 | default: true 32 | chatbukkit.who.list: 33 | description: Allows the player to view who's online 34 | chatbukkit.who.whois: 35 | description: Allows the player to lookup another player's information 36 | chatbukkit.who: 37 | description: Allows the player to view who's online and their details 38 | default: true 39 | children: 40 | chatbukkit.who.list: true 41 | chatbukkit.who.whois: true 42 | chatbukkit.*: 43 | description: Gives all abilities in Chatbukkit 44 | children: 45 | chatbukkit.who: true 46 | chatbukkit.msg: true --------------------------------------------------------------------------------