/**
* Warlock, the open-source cross-platform game client
*
* Copyright 2008, Warlock LLC, and individual contributors as indicated
* by the @authors tag.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package cc.warlock.core.stormfront.settings;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import cc.warlock.core.client.IWarlockStyle;
import cc.warlock.core.client.WarlockColor;
import cc.warlock.core.client.WarlockFont;
import cc.warlock.core.client.internal.WarlockStyle;
import cc.warlock.core.client.settings.IHighlightString;
import cc.warlock.core.client.settings.internal.ClientConfigurationProvider;
import cc.warlock.core.client.settings.internal.ClientSettings;
import cc.warlock.core.client.settings.internal.HighlightString;
import cc.warlock.core.client.settings.internal.Ignore;
import cc.warlock.core.client.settings.internal.Variable;
import cc.warlock.core.client.settings.internal.WindowSettings;
import cc.warlock.core.configuration.ConfigurationUtil;
import cc.warlock.core.configuration.WarlockConfiguration;
import cc.warlock.core.script.configuration.ScriptConfiguration;
import cc.warlock.core.stormfront.client.IStormFrontClient;
import cc.warlock.core.stormfront.client.StormFrontColor;
import cc.warlock.core.stormfront.settings.internal.StormFrontClientSettings;
import cc.warlock.core.stormfront.settings.server.HighlightPreset;
import cc.warlock.core.stormfront.settings.server.IgnoreSetting;
import cc.warlock.core.stormfront.settings.server.MacroKey;
import cc.warlock.core.stormfront.settings.server.Preset;
import cc.warlock.core.stormfront.settings.server.ServerScript;
import cc.warlock.core.stormfront.settings.server.ServerSettings;
import cc.warlock.core.stormfront.xml.StormFrontDocument;
import cc.warlock.core.stormfront.xml.StormFrontElement;
/**
* The purpose of this class is to import/export (and eventually merge) StormFront's server settings
*
* We keep a log of the imported settings version as well as the CRC so we can merge correctly later.
*
* @author marshall
*
*/
@SuppressWarnings("deprecation")
public class StormFrontServerSettings extends ClientConfigurationProvider {
protected String clientVersion, majorVersion, crc;
protected IStormFrontMacroImporter macroImporter;
public StormFrontServerSettings ()
{
super("stormfront-settings");
}
public static String readStream (InputStream stream)
{
try {
InputStreamReader reader = new InputStreamReader(stream);
char chunk[] = new char[1024];
StringBuffer buffer = new StringBuffer();
while (reader.ready())
{
int read = reader.read(chunk);
buffer.append(chunk, 0, read);
}
stream.close();
return buffer.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static StormFrontDocument getInitialServerSettings()
{
try {
URL initialServerSettingsURL = StormFrontServerSettings.class.getClassLoader().getResource(
"cc/warlock/core/stormfront/settings/initialServerSettings.xml");
InputStream stream = initialServerSettingsURL.openStream();
StormFrontDocument document = new StormFrontDocument(stream);
stream.close();
return document;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void sendInitialServerSettings (IStormFrontClient client)
{
StormFrontDocument initialDoc = getInitialServerSettings();
sendSettingsDocument(client, initialDoc);
}
public static void sendInitialStreamWindows (IStormFrontClient client)
{
try {
URL initialStreamWindowsURL = StormFrontServerSettings.class.getClassLoader().getResource(
"cc/warlock/core/stormfront/settings/initialStreamWindows.xml");
InputStream stream = initialStreamWindowsURL.openStream();
String initialStreamWindows = readStream(stream);
initialStreamWindows += "\n";
client.getConnection().send(initialStreamWindows);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void sendSettingsDocument (IStormFrontClient client, StormFrontDocument document)
{
StormFrontElement settingsElement = document.getRootElement();
if (settingsElement.attribute("crc") != null)
settingsElement.removeAttribute("crc");
String settingsDoc = settingsElement.toXML("", false, true);
settingsDoc = "<c>\n<db>" + settingsDoc + "\n";
try {
client.getConnection().send(settingsDoc);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void importServerSettings (InputStream stream, StormFrontClientSettings settings)
{
IStormFrontClient client = settings.getStormFrontClient();
ServerSettings serverSettings = new ServerSettings(client);
serverSettings.load(settings.getStormFrontClient().getPlayerId(), stream);
settings.addChildProvider(this);
settings.addClientSettingProvider(this);
this.clientVersion = serverSettings.getClientVersion();
this.majorVersion = ""+serverSettings.getMajorVersion();
this.crc = serverSettings.getCrc();
for (IHighlightString string : serverSettings.getHighlightStrings())
{
importHighlightString((HighlightPreset)string, settings);
}
for (Preset preset : serverSettings.getPresets())
{
importPreset(preset, settings);
}
importCommandLineSettings(serverSettings.getCommandLineSettings(), settings);
for (cc.warlock.core.stormfront.settings.server.WindowSettings wSettings : serverSettings.getAllWindowSettings())
{
importWindowSettings(wSettings, settings);
}
for (ServerScript script : serverSettings.getAllServerScripts())
{
importScript(script, settings);
}
for (String varName : serverSettings.getVariableNames())
{
importVariable(varName, serverSettings.getVariable(varName), settings);
}
for (IgnoreSetting ignore : serverSettings.getIgnores())
{
importIgnore(ignore, settings);
}
for (MacroKey macro : serverSettings.getMacroSet(0))
{
importMacro(macro, settings);
}
WarlockConfiguration.getWarlockConfiguration(client.getClientId()).save();
// FIXME: we should probably notify people when this happens
//settings.getStormFrontClient().loadClientSettings(settings);
}
protected WarlockColor stormfrontColorToWarlockColor (StormFrontColor color)
{
if (color.equals(StormFrontColor.DEFAULT_COLOR) || color.isSkinColor()) return new WarlockColor(WarlockColor.DEFAULT_COLOR);
else return new WarlockColor(color.toHexString());
}
protected void importHighlightString (HighlightPreset string, StormFrontClientSettings settings)
{
Pattern pattern = string.getPattern();
IWarlockStyle style = new WarlockStyle();
style.setBackgroundColor(stormfrontColorToWarlockColor(string.getBackgroundColor()));
style.setForegroundColor(stormfrontColorToWarlockColor(string.getForegroundColor()));
style.setFullLine(string.isFillEntireLine());
style.setSound(string.getSound());
try {
HighlightString newString = new HighlightString(
settings.getHighlightConfigurationProvider(), pattern.pattern(), true, true, true, style);
newString.setFullWordMatch(string.isFullWordMatch());
settings.getHighlightConfigurationProvider().addHighlightString(newString);
} catch(PatternSyntaxException e) {
e.printStackTrace();
}
}
protected void importPreset (Preset preset, StormFrontClientSettings settings)
{
WarlockStyle style = new WarlockStyle();
style.setName(preset.getName());
style.setBackgroundColor(stormfrontColorToWarlockColor(preset.getBackgroundColor()));
style.setForegroundColor(stormfrontColorToWarlockColor(preset.getForegroundColor()));
style.setFullLine(preset.isFillEntireLine());
if (style != null) {
settings.getHighlightConfigurationProvider().addNamedStyle(preset.getName(), style);
}
}
protected void importCommandLineSettings (cc.warlock.core.stormfront.settings.server.CommandLineSettings settings, StormFrontClientSettings clientSettings)
{
ICommandLineSettings cmdLineSettings =
clientSettings.getCommandLineConfigurationProvider().getCommandLineSettings();
cmdLineSettings.setBackgroundColor(stormfrontColorToWarlockColor(settings.getBackgroundColor()));
cmdLineSettings.setForegroundColor(stormfrontColorToWarlockColor(settings.getForegroundColor()));
cmdLineSettings.setBarColor(stormfrontColorToWarlockColor(settings.getBarColor()));
WarlockFont font = new WarlockFont();
font.setFamilyName(settings.getFontFace());
font.setSize(settings.getFontSizeInPixels());
cmdLineSettings.setFont(font);
}
protected String mapWindowId (String original)
{
if (original.equals(ServerSettings.WINDOW_DEATHS)) {
return StormFrontClientSettings.WINDOW_DEATHS;
} else if (original.equals(ServerSettings.WINDOW_INVENTORY)) {
return StormFrontClientSettings.WINDOW_INVENTORY;
} else if (original.equals(ServerSettings.WINDOW_MAIN)) {
return ClientSettings.WINDOW_MAIN;
} else if (original.equals(ServerSettings.WINDOW_SPELLS)) {
return StormFrontClientSettings.WINDOW_SPELLS;
} else if (original.equals(ServerSettings.WINDOW_THOUGHTS)) {
return StormFrontClientSettings.WINDOW_THOUGHTS;
} else if (original.equals(ServerSettings.WINDOW_ASSESS)) {
return StormFrontClientSettings.WINDOW_ASSESS;
} else if (original.equals(ServerSettings.WINDOW_EXPERIENCE)) {
return StormFrontClientSettings.WINDOW_EXPERIENCE;
} else if (original.equals(ServerSettings.WINDOW_LOGONS)) {
return StormFrontClientSettings.WINDOW_LOGONS;
} else if (original.equals(ServerSettings.WINDOW_ROOM)) {
return StormFrontClientSettings.WINDOW_ROOM;
} else if (original.equals(ServerSettings.WINDOW_CHAR_SHEET)) {
return StormFrontClientSettings.WINDOW_CHAR_SHEET;
} else if (original.equals(ServerSettings.WINDOW_CONTAINER_STOW)) {
return StormFrontClientSettings.WINDOW_CONTAINER_STOW;
} else if (original.equals(ServerSettings.WINDOW_FAMILIAR)) {
return StormFrontClientSettings.WINDOW_FAMILIAR;
} else if (original.equals(ServerSettings.WINDOW_NEWS)) {
return StormFrontClientSettings.WINDOW_NEWS;
} else {
return original;
}
}
protected void importWindowSettings (cc.warlock.core.stormfront.settings.server.WindowSettings settings, StormFrontClientSettings clientSettings)
{
WindowSettings wSettings = (WindowSettings) clientSettings.getWindowSettings(mapWindowId(settings.getId()));
if (wSettings == null) {
wSettings = new WindowSettings(clientSettings.getWindowSettingsProvider());
}
wSettings.setBackgroundColor(stormfrontColorToWarlockColor(settings.getBackgroundColor()));
wSettings.setForegroundColor(stormfrontColorToWarlockColor(settings.getForegroundColor()));
WarlockFont font = new WarlockFont();
font.setFamilyName(settings.getColumnFontFace());
font.setSize(settings.getColumnFontSizeInPixels());
wSettings.setColumnFont(font);
wSettings.setId(mapWindowId(settings.getId()));
clientSettings.getWindowSettingsProvider().addWindowSettings(wSettings);
}
protected void importIgnore (IgnoreSetting ignore, StormFrontClientSettings settings)
{
Pattern pattern = ignore.getRegex();
settings.getIgnoreConfigurationProvider().addIgnore(
new Ignore(settings.getIgnoreConfigurationProvider(), pattern.pattern(), true, true, true));
}
protected void importVariable (String var, String value, StormFrontClientSettings settings)
{
settings.getVariableConfigurationProvider().addVariable(
new Variable(settings.getVariableConfigurationProvider(), var, value));
}
protected void importMacro (MacroKey macro, StormFrontClientSettings settings)
{
if (macroImporter != null) {
macroImporter.importMacro(settings, macro.getKey(), macro.getModifiers(), macro.getAction());
}
}
protected void importScript (ServerScript script, StormFrontClientSettings settings)
{
File stormfrontScriptsDir = ConfigurationUtil.getUserDirectory("stormfront-scripts", true);
Set<File> scriptDirs = ScriptConfiguration.instance().getScriptDirectories();
if (!scriptDirs.contains(stormfrontScriptsDir)) {
scriptDirs.add(stormfrontScriptsDir);
}
String scriptName = script.getName() + ".cmd";
try {
FileWriter writer = new FileWriter(new File(stormfrontScriptsDir, scriptName));
writer.write(script.getScriptContents().toCharArray());
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void parseData() {
clientVersion = stringValue("client-version");
majorVersion = stringValue("major-version");
crc = stringValue("crc");
}
@Override
protected void saveTo(List<Element> elements) {
Element element = DocumentHelper.createElement("stormfront-settings");
element.addAttribute("client-version", clientVersion);
element.addAttribute("major-version", majorVersion);
element.addAttribute("crc", crc);
elements.add(element);
}
public String getCrc() {
return crc;
}
public void setCrc(String crc) {
this.crc = crc;
}
public String getClientVersion() {
return clientVersion;
}
public void setClientVersion(String clientVersion) {
this.clientVersion = clientVersion;
}
public String getMajorVersion() {
return majorVersion;
}
public void setMajorVersion(String majorVersion) {
this.majorVersion = majorVersion;
}
public IStormFrontMacroImporter getMacroImporter() {
return macroImporter;
}
public void setMacroImporter(IStormFrontMacroImporter macroImporter) {
this.macroImporter = macroImporter;
}
}