package VASSAL.build.module.dice;
import java.util.Enumeration;
import java.util.StringTokenizer;
import java.util.Vector;
import VASSAL.build.module.DieRoll;
import VASSAL.tools.FormattedString;
/**
*
* ShadowDice Dice Server
*
*/
public class ShadowDiceDieServer extends DieServer {
public static final String ROLL_MARKER = "VASSAL auto-generated dice roll";
public ShadowDiceDieServer() {
name = "ShadowDice";
description = "ShadowDice Dice Server";
emailOnly = false;
maxRolls = 0;
maxEmails = 0;
serverURL = "http://www.gamerz.net/shadowdice/shadowdice.cgi";
passwdRequired = false;
canDoSeparateDice = true;
}
public String[] buildInternetRollString(RollSet toss) {
final String CRLF = "%0D%0A"; // CRLF
final String LSQUARE = "%5B"; // '['
final String RSQUARE = "%5D"; // ']'
final String HASH = "%23";
// final String PLUS = "%2B";
String desc, s, pEmail = "", sEmail = "";
if (getUseEmail()) {
pEmail = extractEmail(getPrimaryEmail());
sEmail = extractEmail(getSecondaryEmail());
}
desc = hexify(toss.description);
s = "mto=" + pEmail + "&mcc=" + sEmail + "&yem=" + pEmail;
s += "&sbj=" + desc;
s += "&msg=" + ROLL_MARKER + CRLF + desc + CRLF;
int mLen = toss.getMaxDescLength();
DieRoll[] rolls = toss.getDieRolls();
for (int i = 0; i < rolls.length; i++) {
s += hexify(rolls[i].getDescription());
for (int j = 0; j < mLen - rolls[i].getDescription().length(); j++) {
s += ' ';
}
s += ' ' + HASH;
int nd = rolls[i].getNumDice();
int ns = rolls[i].getNumSides();
// int p = rolls[i].getPlus();
for (int j = 0; j < nd; j++) {
s += LSQUARE + "1d" + ns + RSQUARE;
}
s += CRLF;
}
s += "&todo=Action%21&hid=1";
s = s.replace(' ', '+'); // No spaces allowed, use '+' instead.
return new String[]{s};
}
/*
* The Irony server requires most of the non-alphanumerics to be
* converted to a hex escape code %nn. '*-_.' excepted.
* '#' characters interfere with the output parsing and are stripped out.
*/
public String hexify(String s) {
final String hexyChars = "~!$%^&()+`={}[]|:;'<>,?/\\\"";
final StringBuilder b = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '#') {
b.append('.');
}
else if (hexyChars.indexOf(c) >= 0) {
b.append("%" + Integer.toHexString(c).toUpperCase());
}
else {
b.append(c);
}
}
return b.toString();
}
public void parseInternetRollString(RollSet rollSet, Vector<String> results) {
Enumeration<String> e = results.elements();
// Initialise and search for start line
String line = e.nextElement();
while (e.hasMoreElements() && !line.startsWith("! " + ROLL_MARKER))
line = e.nextElement();
// Skip description line
line = e.nextElement();
// And process the results, 1 per roll in the multiroll
DieRoll[] rolls = rollSet.getDieRolls();
for (int i = 0; i < rolls.length; i++) {
line = e.nextElement();
int firsthash = line.indexOf('#') - 1;
StringTokenizer st = new StringTokenizer(line.substring(firsthash), " ");
for (int j = 0; j < rollSet.dieRolls[i].getNumDice(); j++) {
st.nextToken();
String result = st.nextToken();
int res = Integer.parseInt(result);
rollSet.dieRolls[i].setResult(j, res);
}
}
}
public void roll(RollSet mr, FormattedString format) {
super.doInternetRoll(mr, format);
}
}