/*
* $Id$
*
* Copyright (c) 2000-2003 by Brent Easton
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License (LGPL) as published by the Free Software Foundation.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, copies are available
* at http://www.opensource.org.
*/
package VASSAL.build.module;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.DefaultListModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;
import VASSAL.build.AbstractConfigurable;
import VASSAL.build.Buildable;
import VASSAL.build.GameModule;
import VASSAL.build.module.dice.BonesDiceServer;
import VASSAL.build.module.dice.DieServer;
import VASSAL.build.module.dice.RollSet;
import VASSAL.build.module.documentation.HelpFile;
import VASSAL.command.Command;
import VASSAL.configure.BooleanConfigurer;
import VASSAL.configure.StringArrayConfigurer;
import VASSAL.configure.StringConfigurer;
import VASSAL.configure.StringEnumConfigurer;
import VASSAL.i18n.Resources;
import VASSAL.preferences.Prefs;
import VASSAL.tools.FormattedString;
/**
* @author Brent Easton
*
* Internet Die Roller Manager. Includes all the smarts to interface to web-based
* Die Servers
*/
public class DieManager extends AbstractConfigurable {
private Map<String,DieServer> servers;
private List<InternetDiceButton> dieButtons =
new ArrayList<InternetDiceButton>();
private String desc = "Die Manager";
private boolean useMultiRoll;
private int defaultNDice = 2;
private int defaultNSides = 6;
private DieServer server;
private String lastServerName = "";
private MultiRoll myMultiRoll;
final StringEnumConfigurer semail;
public static final String USE_INTERNET_DICE = "useinternetdice";
public static final String DICE_SERVER = "diceserver";
public static final String SERVER_PW = "serverpw";
public static final String USE_EMAIL = "useemail";
public static final String PRIMARY_EMAIL = "primaryemail";
public static final String SECONDARY_EMAIL = "secondaryemail";
public static final String ADDRESS_BOOK = "addressbook";
public static final String MULTI_ROLL = "multiroll";
public static final String DIE_MANAGER = "Internet Die Roller";
public static final String DESC = "description";
public static final String DFLT_NSIDES = "dfltnsides";
public static final String DFLT_NDICE = "dfltndice";
public DieManager() {
DieServer d;
servers = new HashMap<String,DieServer>();
/*
* Create the Internet Dice Servers we know about
*/
// d = new InbuiltDieServer();
// servers.put(d.getName(), d);
// server = d; // Set the default Internet Server
// d = new IronyDieServer();
// servers.put(d.getName(), d);
//
// d = new InternetGamesDieServer();
// servers.put(d.getName(), d);
// d = new ShadowDiceDieServer();
// servers.put(d.getName(), d);
d = new BonesDiceServer();
servers.put(d.getName(), d);
server = d;
/*
* The Dice Manager needs some preferences
*/
final StringEnumConfigurer dieserver = new StringEnumConfigurer(DICE_SERVER, "Internet Dice Server", getDescriptions());
dieserver.setValue(server.getDescription());
final StringConfigurer serverpw = new StringConfigurer(SERVER_PW, "Dice Server Password");
final BooleanConfigurer useemail = new BooleanConfigurer(USE_EMAIL, "Email results?");
final StringConfigurer pemail = new StringConfigurer(PRIMARY_EMAIL, "Primary Email");
final StringArrayConfigurer abook = new StringArrayConfigurer(ADDRESS_BOOK, "Address Book");
final BooleanConfigurer multiroll = new BooleanConfigurer(MULTI_ROLL, "Put multiple rolls into single email");
GameModule.getGameModule().getPrefs().addOption(null, dieserver);
GameModule.getGameModule().getPrefs().addOption(null, serverpw);
GameModule.getGameModule().getPrefs().addOption(DIE_MANAGER, useemail);
GameModule.getGameModule().getPrefs().addOption(DIE_MANAGER, abook);
String[] addressList = (String[]) GameModule.getGameModule().getPrefs().getValue(ADDRESS_BOOK);
semail = new StringEnumConfigurer(SECONDARY_EMAIL, "Secondary Email", addressList);
GameModule.getGameModule().getPrefs().addOption(DIE_MANAGER, pemail);
GameModule.getGameModule().getPrefs().addOption(DIE_MANAGER, semail);
GameModule.getGameModule().getPrefs().addOption(DIE_MANAGER, multiroll);
setSemailValues();
DefaultListModel m = abook.getModel();
ListDataListener ldl = new ListDataListener() {
public void contentsChanged(ListDataEvent arg0) {
setSemailValues();
}
public void intervalAdded(ListDataEvent arg0) {
setSemailValues();
}
public void intervalRemoved(ListDataEvent arg0) {
setSemailValues();
}
};
m.addListDataListener(ldl);
}
public void setSemailValues() {
String currentSemail = (String) GameModule.getGameModule().getPrefs().getValue(SECONDARY_EMAIL);
String[] addressBook = (String[]) GameModule.getGameModule().getPrefs().getValue(ADDRESS_BOOK);
semail.setValidValues(addressBook);
semail.setValue(currentSemail);
}
// Return names of all known Dice Servers
public String[] getNames() {
// FIXME: better to return zero-length array
if (servers == null) {
return null;
}
else {
return servers.keySet().toArray(new String[servers.size()]);
}
}
// Return descriptions of all known dice servers
public String[] getDescriptions() {
// FIXME: better to return zero-length array
if (servers == null) {
return null;
}
else {
String s[] = new String[servers.size()];
int i = 0;
for (DieServer d : servers.values()) {
s[i++] = d.getDescription();
}
return s;
}
}
// Return server matching Name
public DieServer getServerForName(String name) {
return servers.get(name);
}
// Return server matching Description
public DieServer getServerFromDescription(String de) {
for (DieServer d : servers.values()) {
if (de.equals(d.getDescription())) {
return d;
}
}
return null;
}
public DieServer getServer() {
getPrefs();
return server;
}
public String getServerDescription() {
return getServer().getDescription();
}
public String getServerName() {
return getServer().getName();
}
public int getDfltNDice() {
return defaultNDice;
}
public int getDfltNSides() {
return defaultNSides;
}
public MultiRoll getMultiRoll(int nDice, int nSides) {
String serverName = getServer().getName();
if (myMultiRoll == null || !serverName.equals(lastServerName)) {
myMultiRoll = new MultiRoll(this, nDice, nSides);
}
lastServerName = serverName;
return myMultiRoll;
}
public void roll(int nDice, int nSides, int plus, boolean reportTotal, String description, FormattedString format) {
MultiRoll mroll = getMultiRoll(nDice, nSides);
getPrefs();
RollSet rollSet;
String desc = GameModule.getGameModule().getChatter().getInputField().getText();
if (desc != null && desc.length() > 0) {
mroll.setDescription(desc);
}
// Do we want full multi-roll capabilities? If required, pop-up the multi-roll
// cofigurer to get the details
if (useMultiRoll) {
mroll.setVisible(true);
if (mroll.wasCancelled()) {
return;
}
rollSet = mroll.getRollSet();
desc = rollSet.getDescription();
}
// Multi Roll preference not selected, so build a dummy MultiRoll object
else {
DieRoll[] rolls = new DieRoll[]{new DieRoll(description, nDice, nSides, plus, reportTotal)};
rollSet = new RollSet(description, rolls);
desc = "";
}
Command chatCommand = new Chatter.DisplayText(GameModule.getGameModule().getChatter(),
" - Roll sent to " + server.getDescription());
if (desc == null || desc.length() == 0) {
desc = GameModule.getGameModule().getChatter().getInputField().getText();
}
if (server.getUseEmail()) {
if (desc == null || desc.length() == 0) {
chatCommand.append(new Chatter.DisplayText(GameModule.getGameModule().getChatter(),
" - Emailing " + server.getSecondaryEmail() + " (no subject line)"));
chatCommand.append(new Chatter.DisplayText(GameModule.getGameModule().getChatter(),
" - Leave text in the chat input area to provide a subject line"));
}
else {
chatCommand.append(new Chatter.DisplayText(GameModule.getGameModule().getChatter(),
" - Emailing " + server.getSecondaryEmail() + " (Subject: " + desc + ")"));
}
}
chatCommand.execute();
GameModule.getGameModule().sendAndLog(chatCommand);
GameModule.getGameModule().getChatter().getInputField().setText("");
rollSet.setDescription(desc);
server.roll(rollSet, format);
}
/*
* Retrieve the Dice Manager preferences and update the current Server
* Preferences may change at ANY time!
*/
private void getPrefs() {
Prefs prefs = GameModule.getGameModule().getPrefs();
// Get the correct server
String serverName = ((String) prefs.getValue(DICE_SERVER));
server = getServerFromDescription(serverName);
// And tell it the prefs it will need
server.setPasswd((String) prefs.getValue(SERVER_PW));
server.setUseEmail(((Boolean) prefs.getValue(USE_EMAIL)).booleanValue());
server.setPrimaryEmail((String) prefs.getValue(PRIMARY_EMAIL));
server.setSecondaryEmail((String) prefs.getValue(SECONDARY_EMAIL));
useMultiRoll = ((Boolean) prefs.getValue(MULTI_ROLL)).booleanValue();
}
/*
public void addDie(SpecialDie d) {
specialDice.add(d);
}
public void removeDie(SpecialDie d) {
specialDice.remove(d);
}
*/
public void addDieButton(InternetDiceButton d) {
dieButtons.add(d);
}
public void removeDieButton(InternetDiceButton d) {
dieButtons.remove(d);
}
public String[] getAttributeDescriptions() {
return new String[]{
Resources.getString("Editor.DieManager.description"), //$NON-NLS-1$
Resources.getString("Editor.DieManager.ndice"), //$NON-NLS-1$
Resources.getString("Editor.DieManager.nsides") //$NON-NLS-1$
};
}
public Class<?>[] getAttributeTypes() {
return new Class<?>[]{
String.class,
Integer.class,
Integer.class
};
}
public String[] getAttributeNames() {
return new String[]{
DESC,
DFLT_NDICE,
DFLT_NSIDES
};
}
public void setAttribute(String key, Object value) {
if (DESC.equals(key)) {
desc = (String) value;
}
else if (DFLT_NDICE.equals(key)) {
if (value instanceof String) {
value = Integer.valueOf((String) value);
}
defaultNDice = ((Integer) value).intValue();
}
else if (DFLT_NSIDES.equals(key)) {
if (value instanceof String) {
value = Integer.valueOf((String) value);
}
defaultNSides = ((Integer) value).intValue();
}
}
public String getAttributeValueString(String key) {
if (DESC.equals(key)) {
return desc;
}
else if (DFLT_NDICE.equals(key)) {
return defaultNDice + "";
}
else if (DFLT_NSIDES.equals(key)) {
return defaultNSides + "";
}
else
return null;
}
public void removeFrom(Buildable parent) {
}
public HelpFile getHelpFile() {
return null;
}
public Class<?>[] getAllowableConfigureComponents() {
return new Class<?>[]{InternetDiceButton.class};
}
public void addTo(Buildable parent) {
}
public static String getConfigureTypeName() {
return Resources.getString("Editor.DieManager.component_type"); //$NON-NLS-1$
}
public void setSecondaryEmail(String email) {
GameModule.getGameModule().getPrefs().setValue(SECONDARY_EMAIL, email);
server.setSecondaryEmail(email);
}
}