00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.settings;
00023
00024 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireDrawextinfoListener;
00025 import com.realtime.crossfire.jxclient.server.crossfire.CrossfireServerConnection;
00026 import com.realtime.crossfire.jxclient.server.crossfire.MessageTypes;
00027 import java.util.HashMap;
00028 import java.util.Map;
00029 import java.util.regex.Matcher;
00030 import java.util.regex.Pattern;
00031 import org.jetbrains.annotations.NotNull;
00032
00037 public class Macros {
00038
00042 @NotNull
00043 private static final String REPLY_TO = "reply_to";
00044
00048 @NotNull
00049 private final Pattern macroPattern = Pattern.compile("<<([a-z_]+)>>");
00050
00054 @NotNull
00055 private final Map<String, String> expansions = new HashMap<String, String>();
00056
00060 @NotNull
00061 private final CrossfireDrawextinfoListener crossfireDrawextinfoListener = new CrossfireDrawextinfoListener() {
00062
00063 @Override
00064 public void commandDrawextinfoReceived(final int color, final int type, final int subtype, @NotNull final String message) {
00065 switch (type) {
00066 case MessageTypes.MSG_TYPE_BOOK:
00067 case MessageTypes.MSG_TYPE_CARD:
00068 case MessageTypes.MSG_TYPE_PAPER:
00069 case MessageTypes.MSG_TYPE_SIGN:
00070 case MessageTypes.MSG_TYPE_MONUMENT:
00071 case MessageTypes.MSG_TYPE_DIALOG:
00072 case MessageTypes.MSG_TYPE_MOTD:
00073 case MessageTypes.MSG_TYPE_ADMIN:
00074 case MessageTypes.MSG_TYPE_SHOP:
00075 case MessageTypes.MSG_TYPE_COMMAND:
00076 case MessageTypes.MSG_TYPE_ATTRIBUTE:
00077 case MessageTypes.MSG_TYPE_SKILL:
00078 case MessageTypes.MSG_TYPE_APPLY:
00079 case MessageTypes.MSG_TYPE_ATTACK:
00080 break;
00081
00082 case MessageTypes.MSG_TYPE_COMMUNICATION:
00083 if (subtype == MessageTypes.MSG_TYPE_COMMUNICATION_TELL) {
00084 final int index = message.indexOf(" tells you:");
00085 if (index != -1) {
00086 final String name = message.substring(0, index);
00087 expansions.put(REPLY_TO, name);
00088 }
00089 }
00090 break;
00091
00092 case MessageTypes.MSG_TYPE_SPELL:
00093 case MessageTypes.MSG_TYPE_ITEM:
00094 case MessageTypes.MSG_TYPE_MISC:
00095 case MessageTypes.MSG_TYPE_VICTIM:
00096 default:
00097 break;
00098 }
00099 }
00100
00101 @Override
00102 public void setDebugMode(final boolean printMessageTypes) {
00103
00104 }
00105
00106 };
00107
00113 public Macros(@NotNull final CrossfireServerConnection crossfireServerConnection) {
00114 expansions.put(REPLY_TO, "");
00115 crossfireServerConnection.addCrossfireDrawextinfoListener(crossfireDrawextinfoListener);
00116 }
00117
00123 @NotNull
00124 public String expandMacros(@NotNull final String string) {
00125 StringBuilder result = null;
00126 int index = 0;
00127 final Matcher macroMatcher = macroPattern.matcher(string);
00128 while (macroMatcher.find()) {
00129 if (result == null) {
00130 result = new StringBuilder();
00131 }
00132
00133 final String name = macroMatcher.group(1);
00134 String expansion = expansions.get(name);
00135 if (expansion == null) {
00136 expansion = macroMatcher.group();
00137 }
00138 result.append(string.substring(index, macroMatcher.start()));
00139 result.append(expansion);
00140 index = macroMatcher.end();
00141 }
00142 if (result != null) {
00143 result.append(string.substring(index, string.length()));
00144 }
00145 return result == null ? string : result.toString();
00146 }
00147
00148 }