├── .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
--------------------------------------------------------------------------------