From 4574c9e4998c779f78e05e904e718f28f12e8706 Mon Sep 17 00:00:00 2001 From: Electroid Date: Sun, 8 Nov 2015 23:05:59 -0700 Subject: [PATCH] Support components --- pom.xml | 2 +- .../com/github/rmsy/channels/Channel.java | 55 +++---- .../github/rmsy/channels/ChannelsPlugin.java | 18 ++- .../channels/event/ChannelMessageEvent.java | 9 +- .../rmsy/channels/impl/SimpleChannel.java | 146 +++++++----------- .../channels/impl/SimplePlayerManager.java | 2 +- src/main/resources/config.yml | 3 - 7 files changed, 105 insertions(+), 130 deletions(-) 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.