diff --git a/pom.xml b/pom.xml
index 9c179b5..ff0a3d3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
com.github.rmsy.Channels
Channels
- 1.0.3-SNAPSHOT
+ 1.0.4-SNAPSHOT
Channels
Channels is a simple chat channel plugin and API.
diff --git a/src/main/java/com/github/rmsy/channels/Channel.java b/src/main/java/com/github/rmsy/channels/Channel.java
index 362a480..01d0cb7 100644
--- a/src/main/java/com/github/rmsy/channels/Channel.java
+++ b/src/main/java/com/github/rmsy/channels/Channel.java
@@ -1,6 +1,8 @@
package com.github.rmsy.channels;
import com.google.common.collect.ImmutableSet;
+import net.md_5.bungee.api.chat.BaseComponent;
+import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.permissions.Permission;
@@ -8,41 +10,34 @@
/** Interface to represent a chat channel. */
public interface Channel {
- /**
- * Gets the channel's format.
- *
- * @return The channel's format.
- * @see #setFormat(String)
- */
- public String getFormat();
+
/**
- * Sets the channel's format.
- *
- * @param format The format.
- */
- public void setFormat(String format);
- /**
- * Gets the channel's broadcast format.
+ * Creates the channel's format.
*
- * @return The channel's format.
- * @see #setFormat(String)
+ * @param message the message.
+ * @param sender the sender, null if console.
+ * @param receiver the receiver.
+ * @param broadcast whether this is a broadcast.
+ * @return the formatted component.
*/
- public String getBroadcastFormat();
+ BaseComponent getFormat(final BaseComponent message, @Nullable final Player sender, final CommandSender receiver, boolean broadcast);
/**
- * Sets the channel's broadcast format.
+ * Gets the users who are sending to this channel by default.
*
- * @param format The format.
+ * @return The users who are sending to this channel by default.
*/
- public void setBroadcastFormat(String format);
+ ImmutableSet getMembers();
/**
- * Gets the users who are sending to this channel by default.
+ * Sends a new message to the channel.
*
- * @return The users who are sending to this channel by default.
+ * @param message The message to be sent.
+ * @param sender The message sender, or null for console.
+ * @return Whether or not the message was sent.
*/
- public ImmutableSet getMembers();
+ boolean sendMessage(final BaseComponent message, @Nullable final Player sender);
/**
* Sends a new message to the channel.
@@ -51,7 +46,7 @@ public interface Channel {
* @param sender The message sender, or null for console.
* @return Whether or not the message was sent.
*/
- public boolean sendMessage(final String message, @Nullable final Player sender);
+ boolean sendMessage(String message, @Nullable final Player sender);
/**
* Gets the permission node that is required for listening on this channel. Users without this permission node will
@@ -59,12 +54,20 @@ public interface Channel {
*
* @return The permission node that is required for listening on this channel.
*/
- public Permission getListeningPermission();
+ Permission getListeningPermission();
/**
* Broadcasts a message to the channel.
*
* @param message The message to be broadcast.
*/
- public void broadcast(final String message);
+ void broadcast(final BaseComponent message);
+
+ /**
+ * Broadcasts a message to the channel.
+ *
+ * @param message The message to be broadcast.
+ */
+ void broadcast(String message);
+
}
diff --git a/src/main/java/com/github/rmsy/channels/ChannelsPlugin.java b/src/main/java/com/github/rmsy/channels/ChannelsPlugin.java
index 614f849..d04418b 100644
--- a/src/main/java/com/github/rmsy/channels/ChannelsPlugin.java
+++ b/src/main/java/com/github/rmsy/channels/ChannelsPlugin.java
@@ -9,15 +9,20 @@
import com.sk89q.bukkit.util.BukkitCommandsManager;
import com.sk89q.bukkit.util.CommandsManagerRegistration;
import com.sk89q.minecraft.util.commands.*;
+import net.md_5.bungee.api.chat.BaseComponent;
+import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.Configuration;
+import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionDefault;
import org.bukkit.plugin.java.JavaPlugin;
+import javax.annotation.Nullable;
+
public class ChannelsPlugin extends JavaPlugin {
public static final String GLOBAL_CHANNEL_PARENT_NODE = "channels.global";
public static final String GLOBAL_CHANNEL_SEND_NODE = ChannelsPlugin.GLOBAL_CHANNEL_PARENT_NODE + ".send";
@@ -93,13 +98,12 @@ public void onEnable() {
config.options().copyDefaults(true);
this.saveConfig();
- this.globalChannel = new SimpleChannel(
- config.getString(
- "global-chat.format",
- ChatColor.WHITE + "<{1}" + ChatColor.RESET + ChatColor.WHITE + ">: {3}"
- ),
- new Permission(ChannelsPlugin.GLOBAL_CHANNEL_PARENT_NODE, PermissionDefault.TRUE)
- );
+ this.globalChannel = new SimpleChannel(new Permission(ChannelsPlugin.GLOBAL_CHANNEL_PARENT_NODE, PermissionDefault.TRUE)) {
+ @Override
+ public BaseComponent getFormat(BaseComponent message, @Nullable Player sender, CommandSender receiver, boolean broadcast) {
+ return broadcast ? new TextComponent(new TextComponent("[Broadcast] "), message) : new TextComponent(new TextComponent("<"), new TextComponent(sender != null ? sender.getDisplayName(receiver) : "Console"), new TextComponent(">: "), message);
+ }
+ };
this.defaultChannel = this.globalChannel;
this.playerManager = new SimplePlayerManager();
Bukkit.getPluginManager().registerEvents(new ChatListener(this), this);
diff --git a/src/main/java/com/github/rmsy/channels/event/ChannelMessageEvent.java b/src/main/java/com/github/rmsy/channels/event/ChannelMessageEvent.java
index 8281118..fb8baf0 100644
--- a/src/main/java/com/github/rmsy/channels/event/ChannelMessageEvent.java
+++ b/src/main/java/com/github/rmsy/channels/event/ChannelMessageEvent.java
@@ -3,6 +3,7 @@
import com.github.rmsy.channels.Channel;
import com.github.rmsy.channels.ChannelsEvent;
import com.google.common.base.Preconditions;
+import net.md_5.bungee.api.chat.BaseComponent;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
@@ -18,7 +19,7 @@ public final class ChannelMessageEvent extends ChannelsEvent implements Cancella
/** The message sender, or null for console. */
private @Nullable final Player sender;
/** The message to be sent. */
- private String message;
+ private BaseComponent message;
/** Whether or not the event is cancelled. */
private boolean cancelled = false;
@@ -28,7 +29,7 @@ public final class ChannelMessageEvent extends ChannelsEvent implements Cancella
* @param message The message.
* @param sender The sender, or null for console.
*/
- public ChannelMessageEvent(String message, @Nullable final Player sender, Channel channel) {
+ public ChannelMessageEvent(BaseComponent message, @Nullable final Player sender, Channel channel) {
this.message = Preconditions.checkNotNull(message, "message");
this.sender = sender;
this.channel = Preconditions.checkNotNull(channel, "Channel");
@@ -48,7 +49,7 @@ public ChannelMessageEvent(String message, @Nullable final Player sender, Channe
*
* @return The message to be sent.
*/
- public String getMessage() {
+ public BaseComponent getMessage() {
return message;
}
@@ -57,7 +58,7 @@ public String getMessage() {
*
* @param message The message to be sent.
*/
- public void setMessage(String message) {
+ public void setMessage(BaseComponent message) {
this.message = Preconditions.checkNotNull(message, "message");
}
diff --git a/src/main/java/com/github/rmsy/channels/impl/SimpleChannel.java b/src/main/java/com/github/rmsy/channels/impl/SimpleChannel.java
index 407eac9..75500b0 100644
--- a/src/main/java/com/github/rmsy/channels/impl/SimpleChannel.java
+++ b/src/main/java/com/github/rmsy/channels/impl/SimpleChannel.java
@@ -4,152 +4,132 @@
import com.github.rmsy.channels.event.ChannelMessageEvent;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableSet;
+import net.md_5.bungee.api.chat.BaseComponent;
+import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.permissions.Permission;
import javax.annotation.Nullable;
-import java.text.MessageFormat;
import java.util.HashSet;
import java.util.Set;
/**
- * Simple implementation of {@link Channel}. This implementation of {@link Channel} supports several different
- * custom format variables:
| Variable | Meaning | Examples |
| {0} | The sending {@link Player}'s name (or
- * "Console", if the sending {@link Player} is null. | - If player
- * "iamramsey" sent a message,
{0} would evaluate to "iamramsey". - If a message was sent with a
- *
null sender, {0} would evaluate to "Console". |
| {1} | The sending {@link Player}'s display name (or "§3*§6Console", if the
- * sending {@link Player} is null. | - If player "iamramsey" (with display
- * name "§ciamramsey") sent a message,
{1} would evaluate to "§ciamramsey". - If a message was
- * sent with a
null sender, {1} would evaluate to "§3*§6Console". |
- * | {2} | The raw message. | - If the message
- * "§cHello!" is sent,
{2} would evaluate to "§cHello!". |
| {3} | The color-filtered message. The message is passed through {@link
- * ChatColor#stripColor}, removing any color codes. | - If the message "§cHello!" is sent,
- *
{3} would evaluate to "Hello!". |
+ * Simple implementation of {@link Channel}.
*/
-public class SimpleChannel implements Channel {
+public abstract class SimpleChannel implements Channel {
/** The members of the channel (stored by their names) */
private final Set members;
/** The permission node that will be broadcast from this channel to. */
private final Permission permission;
- /** The format. */
- private String format;
- private String broadcastFormat;
-
- private SimpleChannel() {
- this.members = null;
- this.permission = null;
- }
/**
* Creates a new SimpleChannel.
*
- * @param format The format to be applied to messages.
* @param permission The permission node that will be broadcast from this channel to.
* @see SimpleChannel for detailed formatting information.
*/
- public SimpleChannel(final String format, final String broadcastFormat, final Permission permission) {
- this.format = Preconditions.checkNotNull(format, "format");
- this.broadcastFormat = Preconditions.checkNotNull(broadcastFormat, "broadcast format");
+ public SimpleChannel(final Permission permission) {
this.permission = Preconditions.checkNotNull(permission);
this.members = new HashSet<>();
}
- public SimpleChannel(final String format, final Permission permission) {
- this(format, format, permission);
- }
-
/**
- * Gets the channel's format.
+ * Create the channel's format.
+ * This is called every time a message is about to be sent.
*
- * @return The channel's format.
- * @see #setFormat(String)
+ * @param message the message.
+ * @param sender the sender, null if console.
+ * @param receiver the receiver.
+ * @param broadcast whether this is a broadcast message.
+ * @return the formatted component message.
+ * @see #sendMessageToViewer(Player, CommandSender, ChannelMessageEvent, boolean)
*/
- @Override
- public String getFormat() {
- return this.format;
- }
+ public abstract BaseComponent getFormat(BaseComponent message, @Nullable Player sender, CommandSender receiver, boolean broadcast);
/**
- * Sets the channel's format (the string that appears before the message).
+ * Gets the users who are sending to this channel by default.
*
- * @param format The format.
- * @see SimpleChannel for detailed formatting information.
+ * @return The users who are sending to this channel by default.
*/
@Override
- public void setFormat(String format) {
- this.format = Preconditions.checkNotNull(format, "format");
+ public final ImmutableSet getMembers() {
+ return ImmutableSet.copyOf(this.members);
}
+ /**
+ * Sends a new message to the channel.
+ *
+ * @param message The message to be sent.
+ * @param sender The message sender, or null for console.
+ * @return Whether or not the message was sent.
+ */
@Override
- public String getBroadcastFormat() {
- return this.broadcastFormat;
+ public boolean sendMessage(BaseComponent message, @Nullable Player sender) {
+ return sendMessageToAll(message, sender, false);
}
+ /**
+ * Sends a new message to the channel.
+ *
+ * @param message The message to be sent.
+ * @param sender The message sender, or null for console.
+ * @return Whether or not the message was sent.
+ */
@Override
- public void setBroadcastFormat(String format) {
- this.broadcastFormat = Preconditions.checkNotNull(format, "format");
+ public boolean sendMessage(String message, @Nullable Player sender) {
+ return sendMessage(new TextComponent(message), sender);
}
/**
- * Gets the users who are sending to this channel by default.
+ * Broadcasts a message to the channel.
*
- * @return The users who are sending to this channel by default.
+ * @param message The message to be broadcast.
*/
@Override
- public final ImmutableSet getMembers() {
- return ImmutableSet.copyOf(this.members);
+ public void broadcast(final BaseComponent message) {
+ this.sendMessageToAll(message, null, true);
}
/**
- * Sends a new message to the channel.
+ * Broadcasts a message to the channel.
*
- * @param rawMessage The message to be sent.
- * @param sender The message sender, or null for console.
- * @return Whether or not the message was sent.
+ * @param message The message to be broadcast.
*/
@Override
- public boolean sendMessage(String rawMessage, @Nullable Player sender) {
- ChannelMessageEvent event = new ChannelMessageEvent(rawMessage, sender, this);
+ public void broadcast(final String message) {
+ this.broadcast(new TextComponent(message));
+ }
+
+ public boolean sendMessageToAll(BaseComponent message, @Nullable Player sender, boolean broadcast) {
+ ChannelMessageEvent event = new ChannelMessageEvent(message, sender, this);
Bukkit.getPluginManager().callEvent(event);
if(event.isCancelled()) {
return false;
}
- String sanitizedMessage = ChatColor.stripColor(Preconditions.checkNotNull(rawMessage, "Message"));
-
- this.sendMessageToViewer(sender, Bukkit.getConsoleSender(), sanitizedMessage, event);
+ this.sendMessageToViewer(sender, Bukkit.getConsoleSender(), event, broadcast);
for(Player viewer : Bukkit.getOnlinePlayers()) {
if(viewer.hasPermission(this.permission)) {
- this.sendMessageToViewer(sender, viewer, sanitizedMessage, event);
+ this.sendMessageToViewer(sender, viewer, event, broadcast);
}
}
return true;
}
- public void sendMessageToViewer(Player sender, CommandSender viewer, String sanitizedMessage, ChannelMessageEvent event) {
- boolean senderPresent = sender != null;
- String senderName = senderPresent ? sender.getName(viewer) : "Console";
- String senderDisplayName = senderPresent ? sender.getDisplayName(viewer) : ChatColor.GOLD + "*" + ChatColor.AQUA + "Console";
- String format = senderPresent ? this.format : this.broadcastFormat;
-
- viewer.sendMessage(MessageFormat.format(
- format,
- senderName,
- senderDisplayName,
- event.getMessage(),
- sanitizedMessage
- ));
+ public void sendMessageToViewer(Player sender, CommandSender viewer, ChannelMessageEvent event, boolean broadcast) {
+ BaseComponent component = getFormat(event.getMessage(), sender, viewer, broadcast);
+ if(viewer instanceof Player) {
+ ((Player) viewer).sendMessage(component);
+ } else {
+ viewer.sendMessage(component.toLegacyText());
+ }
}
/**
@@ -163,16 +143,6 @@ public Permission getListeningPermission() {
return this.permission;
}
- /**
- * Broadcasts a message to the channel.
- *
- * @param message The message to be broadcast.
- */
- @Override
- public void broadcast(final String message) {
- this.sendMessage(message, null);
- }
-
/**
* Removes a user as a member.Caution: Only invoke this when the user has been (or will be) assigned as
* a member to another channel.
@@ -180,7 +150,7 @@ public void broadcast(final String message) {
* @param member The user.
*/
protected final void removeMember(Player member) {
- this.members.remove(Preconditions.checkNotNull(member, "member"));
+ this.members.remove(Preconditions.checkNotNull(member, "member").getName());
}
/**
diff --git a/src/main/java/com/github/rmsy/channels/impl/SimplePlayerManager.java b/src/main/java/com/github/rmsy/channels/impl/SimplePlayerManager.java
index f49b7a0..400e92f 100644
--- a/src/main/java/com/github/rmsy/channels/impl/SimplePlayerManager.java
+++ b/src/main/java/com/github/rmsy/channels/impl/SimplePlayerManager.java
@@ -38,7 +38,7 @@ public Channel getMembershipChannel(final Player player) {
*/
@Override
public void setMembershipChannel(Player player, Channel membershipChannel) {
- SimpleChannel oldChannel = (SimpleChannel) this.playerMembershipMap.get(Preconditions.checkNotNull(player, "player"));
+ SimpleChannel oldChannel = (SimpleChannel) this.playerMembershipMap.get(Preconditions.checkNotNull(player, "player").getName());
if (oldChannel != null) {
oldChannel.removeMember(player);
}
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 94d0074..b90c0ed 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -1,7 +1,4 @@
global-chat:
- ## See http://rmsy.github.io/Channels
- ## for detailed formatting information.
- format: '§f<{1}§r§f>: {3}'
switch:
success-msg: Changed default channel to global chat.
no-change-msg: Global chat is already your default channel.