package nl.tudelft.bw4t.client.message;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.StringTokenizer;
import eis.iilang.Parameter;
import nl.tudelft.bw4t.map.ColorTranslator;
/**
* Class used for translating messages (String->BW4TMessage and
* BW4TMessage->String)
*/
public class MessageTranslator {
/**
* Should never
*/
private MessageTranslator(){
}
private static final Map<String, StringToMessageCommand> stringToMessage = new HashMap<>();
private static final Map<String, StringToMessageCommand> stringToMessageEquals = new HashMap<>();
private static final Map<MessageType, MessageCommand> messageCommands = new HashMap<>();
static {
stringToMessage.put("I am going to ", new CommandRoomColor(MessageType.GOINGTOROOM));
stringToMessage.put("I have a ", new CommandRoomColor(MessageType.HASCOLOR));
stringToMessage.put("has been checked", new CommandContainsBy(MessageType.CHECKED));
stringToMessage.put("contains", new CommandContains());
stringToMessage.put("empty", new CommandRoom(MessageType.ROOMISEMPTY));
stringToMessage.put("Is anybody going to", new CommandRoom(MessageType.ISANYBODYGOINGTOROOM));
stringToMessage.put("Who has a", new CommandColor(MessageType.WHOHASABLOCK));
stringToMessage.put("We need", new CommandColor(MessageType.WENEED));
stringToMessage.put("I am looking for", new CommandColor(MessageType.LOOKINGFOR));
stringToMessage.put("I will get", new CommandColor(MessageType.WILLGETCOLOR));
stringToMessage.put("I am getting", new CommandRoomColor(MessageType.AMGETTINGCOLOR));
stringToMessage.put("go to", new CommandRoomColorPlayer(MessageType.GOTOROOM));
stringToMessage.put("find a", new CommandRoomColorPlayer(MessageType.FINDCOLOR));
stringToMessage.put("get the", new CommandRoomColorPlayer(MessageType.GETCOLORFROMROOM));
stringToMessage.put("Where should I go", new CommandType(MessageType.WHERESHOULDIGO));
stringToMessage.put("What color should I ", new CommandType(MessageType.WHATCOLORSHOULDIGET));
stringToMessage.put("Where is a ", new CommandColor(MessageType.WHEREISCOLOR));
stringToMessage.put("What is in ", new CommandRoom(MessageType.WHATISINROOM));
stringToMessage.put("Has anybody checked", new CommandRoom(MessageType.HASANYBODYCHECKEDROOM));
stringToMessage.put("Who is in ", new CommandRoom(MessageType.WHOISINROOM));
stringToMessage.put("I am in ", new CommandRoom(MessageType.INROOM));
stringToMessage.put("I am about to drop ", new CommandColor(MessageType.ABOUTTODROPOFFBLOCK));
stringToMessage.put("I just dropped off", new CommandColor(MessageType.DROPPEDOFFBLOCK));
stringToMessage.put("I am waiting outside", new CommandRoom(MessageType.AMWAITINGOUTSIDEROOM));
stringToMessage.put("are you close", new CommandRoomColorPlayer(MessageType.AREYOUCLOSE));
stringToMessage.put("will you be long", new CommandRoomColorPlayer(MessageType.WILLYOUBELONG));
stringToMessage.put("I am at a", new CommandColor(MessageType.ATBOX));
stringToMessage.put("I want to go to ", new CommandRoom(MessageType.IWANTTOGO));
stringToMessage.put("You forgot me in ", new CommandRoom(MessageType.YOUFORGOTME));
stringToMessageEquals.put("yes", new CommandType(MessageType.YES));
stringToMessageEquals.put("no", new CommandType(MessageType.NO));
stringToMessageEquals.put("I do", new CommandType(MessageType.IDO));
stringToMessageEquals.put("I don't", new CommandType(MessageType.IDONOT));
stringToMessageEquals.put("I don't know", new CommandType(MessageType.IDONOTKNOW));
stringToMessageEquals.put("OK", new CommandRoom(MessageType.OK));
stringToMessageEquals.put("wait", new CommandType(MessageType.WAIT));
stringToMessageEquals.put("I am on the way", new CommandType(MessageType.ONTHEWAY));
stringToMessageEquals.put("I am almost there", new CommandType(MessageType.ALMOSTTHERE));
stringToMessageEquals.put("I am far away", new CommandType(MessageType.FARAWAY));
stringToMessageEquals.put("I am delayed", new CommandType(MessageType.DELAYED));
messageCommands.put(MessageType.WHERESHOULDIGO, new CommandWhereShouldIGo());
messageCommands.put(MessageType.CHECKED, new CommandChecked());
messageCommands.put(MessageType.WHATCOLORSHOULDIGET, new CommandWhatColorShouldIGet());
messageCommands.put(MessageType.YES, new CommandYes());
messageCommands.put(MessageType.NO, new CommandNo());
messageCommands.put(MessageType.IDO, new CommandIDo());
messageCommands.put(MessageType.IDONOT, new CommandIDoNot());
messageCommands.put(MessageType.IDONOTKNOW, new CommandIDoNotKnow());
messageCommands.put(MessageType.OK, new CommandOk());
messageCommands.put(MessageType.WAIT, new CommandWait());
messageCommands.put(MessageType.ONTHEWAY, new CommandOnTheWay());
messageCommands.put(MessageType.ALMOSTTHERE, new CommandAlmostThere());
messageCommands.put(MessageType.FARAWAY, new CommandFarAway());
messageCommands.put(MessageType.DELAYED, new CommandDelayed());
messageCommands.put(MessageType.COULDNOT, new CommandCouldNot());
messageCommands.put(MessageType.GOINGTOROOM, new CommandGoingToRoom());
messageCommands.put(MessageType.ROOMISEMPTY, new CommandRoomIsEmpty());
messageCommands.put(MessageType.ISANYBODYGOINGTOROOM, new CommandIsAnybodyGoingToRoom());
messageCommands.put(MessageType.WHATISINROOM, new CommandWhatIsInRoom());
messageCommands.put(MessageType.HASANYBODYCHECKEDROOM, new CommandHasAnybodyCheckedRoom());
messageCommands.put(MessageType.WHOISINROOM, new CommandWhoIsInRoom());
messageCommands.put(MessageType.INROOM, new CommandInRoom());
messageCommands.put(MessageType.HASCOLOR, new CommandHasColor());
messageCommands.put(MessageType.WHOHASABLOCK, new CommandWhoHasABlock());
messageCommands.put(MessageType.WENEED, new CommandWeNeed());
messageCommands.put(MessageType.LOOKINGFOR, new CommandLookingFor());
messageCommands.put(MessageType.WILLGETCOLOR, new CommandWillGetColor());
messageCommands.put(MessageType.AMGETTINGCOLOR, new CommandAmGettingColor());
messageCommands.put(MessageType.WHEREISCOLOR, new CommandWhereIsColor());
messageCommands.put(MessageType.ABOUTTODROPOFFBLOCK, new CommandAboutToDropOffBlock());
messageCommands.put(MessageType.DROPPEDOFFBLOCK, new CommandDroppedOffBlock());
messageCommands.put(MessageType.ROOMCONTAINS, new CommandRoomContains());
messageCommands.put(MessageType.ROOMCONTAINSAMOUNT, new CommandRoomContainsAmount());
messageCommands.put(MessageType.ATBOX, new CommandAtBox());
messageCommands.put(MessageType.AMWAITINGOUTSIDEROOM, new CommandAmWaitingOutsideRoom());
messageCommands.put(MessageType.PUTDOWN, new CommandPutDown());
messageCommands.put(MessageType.GOTOROOM, new CommandGotoRoom());
messageCommands.put(MessageType.FINDCOLOR, new CommandFindColor());
messageCommands.put(MessageType.GETCOLORFROMROOM, new CommandGetColorFromRoom());
messageCommands.put(MessageType.AREYOUCLOSE, new CommandAreYouClose());
messageCommands.put(MessageType.WILLYOUBELONG, new CommandWillYouBeLong());
messageCommands.put(MessageType.IWANTTOGO, new CommandEPartnerIWantToGo());
messageCommands.put(MessageType.YOUFORGOTME, new CommandEPartnerYouForgotMe());
}
/**
* Translate a message (String) to a message (BW4TMessage)
*
* @param message
* , the message that should be translated
* @return the translated message
*/
public static BW4TMessage translateMessage(String message) {
for (Entry<String, StringToMessageCommand> e : stringToMessageEquals.entrySet()) {
String key = e.getKey();
if (message.equals(key)) {
return stringToMessageEquals.get(key).getMessage(message);
}
}
for (Entry<String, StringToMessageCommand> e : stringToMessage.entrySet()) {
String key = e.getKey();
if (message.contains(key)) {
return stringToMessage.get(key).getMessage(message);
}
}
return null;
}
/**
* Translate a message (BW4TMessage) to a message (String)
*
* @param message
* , the message that should be translated
* @return the translated message
*/
public static String translateMessage(BW4TMessage message) {
return messageCommands.get(message.getType()).getString(message);
}
/**
* Find a room id in a message. Note #1933, we can not look specifically for
* room names because we have no map loaded and don't know any navpoint
* names. Therefore the message must contain a segment "room abc" and abc
* then will be the room.
*
* @param message
* the message in which "room <room id>" should be found
* @return the room id or Long.MAX_VALUE if no room id found
*/
static String findRoomId(String message) {
StringTokenizer tokenizer = new StringTokenizer(message);
String token = tokenizer.nextToken();
while (tokenizer.hasMoreTokens()) {
if ("room".equals(token)) {
return tokenizer.nextToken().replace("?", "");
}
token = tokenizer.nextToken();
}
return null;
}
/**
* Find a color id in a message
*
* @param message
* , the message in which a color id should be found
* @return the color id or null if no color id found
*/
static String findColorId(String message) {
StringTokenizer tokenizer = new StringTokenizer(message);
String token = tokenizer.nextToken();
while (tokenizer.hasMoreTokens()) {
for (String color : ColorTranslator.getAllColors()) {
if (token.equals(color)) {
return color;
}
}
token = tokenizer.nextToken();
}
return null;
}
protected static int findNumber(String message) {
StringTokenizer tokenizer = new StringTokenizer(message);
while (tokenizer.hasMoreTokens()) {
try {
String token = tokenizer.nextToken();
return Integer.parseInt(token);
} catch (NumberFormatException e) {
// unclear how to properly test and avoid this exception.
// we just want to get the first parseable number and skip the
// rest.
}
}
return Integer.MAX_VALUE;
}
/**
* Translate a BW4TMessage to a LinkedList<Parameter> that can be sent to
* GOAL
*
* @param message
* , the message to be translated
* @param entityId
* , the sender of the message
* @return the translated message
*/
public static Parameter translateMessage(BW4TMessage message,
String entityId) {
return messageCommands.get(message.getType()).getParam(message, entityId);
}
}