diff --git a/src/main/java/com/l2jserver/service/game/chat/ChatChannel.java b/src/main/java/com/l2jserver/service/game/chat/ChatChannel.java index 9ee738e4e..9903587e2 100644 --- a/src/main/java/com/l2jserver/service/game/chat/ChatChannel.java +++ b/src/main/java/com/l2jserver/service/game/chat/ChatChannel.java @@ -68,6 +68,23 @@ public interface ChatChannel { */ void removeChatChannelListener(ChatChannelListener listener); + /** + * Adds a {@link ChatChannelFilter} that will be used to filter each message + * sent in the channel. + * + * @param filter + * the filter + */ + void addChatChannelFilter(ChatChannelFilter filter); + + /** + * Removes a {@link ChatChannelListener}. + * + * @param filter + * the filter + */ + void removeChatChannelFilter(ChatChannelFilter filter); + /** * @return the chat channel numeric ID */ diff --git a/src/main/java/com/l2jserver/service/game/chat/ChatChannelFilter.java b/src/main/java/com/l2jserver/service/game/chat/ChatChannelFilter.java new file mode 100644 index 000000000..618f325fa --- /dev/null +++ b/src/main/java/com/l2jserver/service/game/chat/ChatChannelFilter.java @@ -0,0 +1,42 @@ +/* + * This file is part of l2jserver . + * + * l2jserver is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * l2jserver is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with l2jserver. If not, see . + */ +package com.l2jserver.service.game.chat; + +import com.l2jserver.model.id.object.CharacterID; + +/** + * This is a filter that can filter messages sent into an given + * {@link ChatChannel}. The filter is applied in a individual basis per each + * message. Note that the filter is called before the message is logged + * or sent to listeners. + * + * @author Rogiel + */ +public interface ChatChannelFilter { + /** + * Filter the message + * + * @param sender + * the sender + * @param channel + * the chat channel + * @param message + * the message + * @return true if message was accepted, false otherwise + */ + boolean filter(CharacterID sender, ChatChannel channel, String message); +} diff --git a/src/main/java/com/l2jserver/service/game/chat/SimpleChatService.java b/src/main/java/com/l2jserver/service/game/chat/SimpleChatService.java index 0045a27a3..6254e1463 100644 --- a/src/main/java/com/l2jserver/service/game/chat/SimpleChatService.java +++ b/src/main/java/com/l2jserver/service/game/chat/SimpleChatService.java @@ -105,8 +105,9 @@ public class SimpleChatService extends AbstractService implements ChatService { } @Override - public ChatMessage send(CharacterID sender, ChatMessageType chat, String message, - String extra) throws TargetNotFoundChatServiceException, + public ChatMessage send(CharacterID sender, ChatMessageType chat, + String message, String extra) + throws TargetNotFoundChatServiceException, CannotChatToSelfChatServiceException, ChatBanActiveChatServiceException, ChatTargetOfflineServiceException { @@ -213,6 +214,11 @@ public class SimpleChatService extends AbstractService implements ChatService { */ protected final Set listeners = CollectionFactory .newSet(); + /** + * The list of all filters on this channel + */ + protected final Set filters = CollectionFactory + .newSet(); @Override public ChatMessage send(CharacterID sender, String textMessage) { @@ -220,6 +226,14 @@ public class SimpleChatService extends AbstractService implements ChatService { Preconditions.checkNotNull(textMessage, "message"); // TODO throw exception if sender is banned from chat + // filter the message. if a single filter refuses it, the message + // will be discarded + for (final ChatChannelFilter filter : filters) { + if (!filter.filter(sender, this, textMessage)) + // discard message + return null; + } + // log this chat message ChatMessage message = chatLoggingService.log(sender, this, textMessage); @@ -227,7 +241,7 @@ public class SimpleChatService extends AbstractService implements ChatService { for (final ChatChannelListener listener : listeners) { listener.onMessage(this, message); } - + return message; } @@ -243,6 +257,18 @@ public class SimpleChatService extends AbstractService implements ChatService { listeners.remove(listener); } + @Override + public void addChatChannelFilter(ChatChannelFilter filter) { + Preconditions.checkNotNull(filter, "filter"); + filters.add(filter); + } + + @Override + public void removeChatChannelFilter(ChatChannelFilter filter) { + Preconditions.checkNotNull(filter, "filter"); + filters.remove(filter); + } + @Override public String getChannelName() { return getMessageType().name();