/*
* Copyright (c) 2010 SimpleServer authors (see CONTRIBUTORS)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package simpleserver.message;
import java.util.LinkedList;
import simpleserver.Player;
import simpleserver.Server;
import simpleserver.util.RingCache;
public class Messager {
private static final int MESSAGE_SIZE = 360;
private Server server;
private RingCache<String> forwardedMessages = new RingCache<String>(String.class, 10);
public Messager(Server server) {
this.server = server;
}
public void propagate(Chat chat, String message, boolean build) {
int recieverCount = 0;
String builtMessage = build ? chat.buildMessage(message) : message;
for (Player reciever : chat.getRecievers(server.playerList)) {
reciever.addMessage(builtMessage);
if (!reciever.equals(chat.getSender())) {
recieverCount++;
}
}
if (server.config.properties.getBoolean("forwardChat")) {
forwardToServer(chat, message);
}
if (server.config.properties.getBoolean("chatToConsole")) {
writeToConsole(builtMessage);
}
if (server.config.properties.getBoolean("logMessages")) {
server.messageLog(chat, message);
}
if (recieverCount == 0) {
chat.noRecieverFound();
return;
}
}
public void propagate(Chat chat, String message) {
propagate(chat, message, true);
}
private void forwardToServer(Chat chat, String message) {
Player sender = chat.getSender();
String forwardMessage = String.format(server.config.properties.get("msgForwardFormat"), chat, message);
for (String msgPart : wrapMessage(forwardMessage)) {
forwardedMessages.put(String.format("<%s> %s", sender.getName(), msgPart));
sender.forwardMessage(msgPart);
}
}
private void writeToConsole(String message) {
for (String msgPart : wrapMessage(message)) {
// They are always wrapped
System.out.println(msgPart);
}
}
public boolean wasForwarded(String message) {
return forwardedMessages.has(message);
}
private LinkedList<String> wrapMessage(String message) {
LinkedList<String> messages = new LinkedList<String>();
if (message.length() > 0) {
while (message.length() > MESSAGE_SIZE) {
int end = MESSAGE_SIZE - 1;
while (end > 0 && message.charAt(end) != ' ') {
end--;
}
if (end == 0) {
end = MESSAGE_SIZE;
} else {
end++;
}
if (end > 0 && message.charAt(end) == '\u00a7') {
end--;
}
messages.add(message.substring(0, end).trim());
message = message.substring(end);
}
int end = message.length();
if (message.length() > 0 && message.charAt(end - 1) == '\u00a7') {
end--;
}
if (end > 0) {
messages.add(message.substring(0, end).trim());
}
}
return messages;
}
}