Modified:
trunk/twxbbs/scripts/session/login.js
trunk/twxbbs/scripts/session/stop-attacks.js
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/DefaultScriptManager.java
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/JavascriptScript.java
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptApiImpl.java
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptIoFilter.java
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptLexer.java
trunk/twxbbs/src/main/java/org/twdata/twxbbs/util/CircularFifoBuffer.java
trunk/twxbbs/src/test/java/org/twdata/twxbbs/proxy/script/ScriptLexerTest.java
Log:
Better login script, added ability to capture any text, added proper
shutdown of scripts and deregistring of their lexers
Modified: trunk/twxbbs/scripts/session/login.js
==============================================================================
--- trunk/twxbbs/scripts/session/login.js (original)
+++ trunk/twxbbs/scripts/session/login.js Sat Aug 30 23:38:06 2008
@@ -11,11 +11,29 @@
game.send(" ");
game.pause();
}
+function twMenu(prompt) {
+ game.send("T*");
+}
+
+function todaysLog(prompt) {
+ game.send("n");
+}
+
+function passwd(prompt) {
+ game.send("bob*");
+}
game.setTextTrigger("pause", "[Pause]", gamePause);
game.setTextTrigger("login","ENTER", login);
game.pause();
game.setTextTrigger("menu", "menu):", menu);
game.pause();
-
+game.setTextTrigger("twmenu", "Enter your choice:", twMenu);
+game.pause();
+game.setTextTrigger("todaysLog", "Show today's log?", todaysLog);
+game.pause();
+game.setTextTrigger("passwd", "Password?", passwd);
+game.pause();
+game.setTextTrigger("Command", "Command [", function(txt){});
+game.pause();
println("Login done");
Modified: trunk/twxbbs/scripts/session/stop-attacks.js
==============================================================================
--- trunk/twxbbs/scripts/session/stop-attacks.js (original)
+++ trunk/twxbbs/scripts/session/stop-attacks.js Sat Aug 30 23:38:06 2008
@@ -8,9 +8,9 @@
function attack(prompt) {
match = prompt.match(attackPtn);
if (match != null) {
- println("Try to attack "+match[1]+" with "+match[4]+"
using "+match[3]+" fighters");
- player.send("*\u001b[30mDon't be a dick*");
- game.setCapturingTextLineTrigger("no", "No",
function(txt){println("txt:"+txt);});
+ println("Try to attack "+match[1]+" with "+match[4]+"
using "+match[3]+" fighters in game "+currentGame);
+ player.send("*\u001b[31m\u001b[1mLet's just be
friends\u001b[22m*");
+ game.setCapturingTextLineTrigger("no", "No", function(txt){});
game.send("n");
game.pause();
} else {
@@ -20,6 +20,13 @@
game.pause();
}
+function gameSelection(prompt) {
+ player.setCapturingTextTrigger("sel", "", function(txt)
{currentGame=txt; game.send(txt); game.pause()});
+ player.pause();
+}
+
+var currentGame;
+game.setTextTrigger("gameSelection", "(? for menu):", gameSelection);
game.setTextTrigger("attack", "Attack", maybeAttack);
game.pause();
Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/DefaultScriptManager.java
==============================================================================
---
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/DefaultScriptManager.java
(original)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/DefaultScriptManager.java
Sat Aug 30 23:38:06 2008
@@ -38,15 +38,15 @@
start();
}
- private List<URL> collectScripts(String name) {
- List<URL> scripts = new ArrayList<URL>();
+ private Collection<URL> collectScripts(String name) {
+ Map<String,URL> scripts = new TreeMap<String,URL>();
if (scriptsDir.exists()) {
File sessionScriptsDir = new File(scriptsDir, name);
if (sessionScriptsDir.exists()) {
for (File file : sessionScriptsDir.listFiles()) {
if (!file.isDirectory()) {
try {
- scripts.add(file.toURI().toURL());
+ scripts.put(file.getName(),
file.toURI().toURL());
} catch (MalformedURLException e) {
System.err.println("Unable to add
script:"+file.getAbsolutePath());
}
@@ -54,7 +54,7 @@
}
}
}
- return scripts;
+ return scripts.values();
}
public void stop() {
@@ -91,7 +91,7 @@
if (type != ScriptType.application) {
context = new HashMap<String,Object>();
}
- List<URL> scriptUrls = collectScripts(type.name());
+ Collection<URL> scriptUrls = collectScripts(type.name());
for (URL url : scriptUrls) {
Map<String,Object> vars = varFactory.create();
Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/JavascriptScript.java
==============================================================================
---
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/JavascriptScript.java
(original)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/JavascriptScript.java
Sat Aug 30 23:38:06 2008
@@ -33,6 +33,7 @@
}
readScriptIntoEngine(jsEngine,
getClass().getClassLoader().getResource("org/twdata/twxbbs/proxy/script/global.js"));
readScriptIntoEngine(jsEngine, script);
+ variables.clear();
}
private void readScriptIntoEngine(ScriptEngine jsEngine, URL script) {
Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptApiImpl.java
==============================================================================
---
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptApiImpl.java
(original)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptApiImpl.java
Sat Aug 30 23:38:06 2008
@@ -67,6 +67,10 @@
}
}
+ public ScriptLexer getScriptLexer() {
+ return lexer;
+ }
+
public void killTextTrigger(String id) {
lexer.removeTextTrigger(id);
}
Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptIoFilter.java
==============================================================================
---
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptIoFilter.java
(original)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptIoFilter.java
Sat Aug 30 23:38:06 2008
@@ -68,7 +68,13 @@
List<Thread> scripts =
scriptManager.startScripts(ScriptType.session, new ScriptVariablesFactory()
{
public Map<String, Object> create() {
- Map<String,Object> vars = new HashMap<String,Object>();
+ Map<String,Object> vars = new HashMap<String,Object>(){
+ @Override
+ public void clear() {
+
gameLexers.remove(((ScriptApiImpl)get("gameApi")).getScriptLexer());
+
playerLexers.remove(((ScriptApiImpl)get("playerApi")).getScriptLexer());
+ }
+ };
ScriptLexer gameLexer = new ScriptLexer();
ScriptApi gameApi = new ScriptApiImpl(gameLexer, new
ScriptApiImpl.TextSender() {
public void send(String text) throws Exception {
Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptLexer.java
==============================================================================
---
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptLexer.java
(original)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptLexer.java
Sat Aug 30 23:38:06 2008
@@ -61,11 +61,17 @@
public synchronized void addCapturingTextTrigger(String id, String
text) {
if (waiting) throw new IllegalStateException("Cannot accept new
triggers while lexing text");
+ if (text == null || text.length() == 0) {
+ backBuffer.clear();
+ }
activeTriggers.put(id, new CapturingTrigger(id, text, false));
}
public synchronized void addCapturingTextLineTrigger(String id, String
text) {
if (waiting) throw new IllegalStateException("Cannot accept new
triggers while lexing text");
+ if (text == null || text.length() == 0) {
+ backBuffer.clear();
+ }
activeTriggers.put(id, new CapturingTrigger(id, text, true));
}
@@ -88,6 +94,8 @@
if (lastMatch == null) {
wait(timeout);
}
+ } catch (InterruptedException ex) {
+ System.out.println("Stopping script");
} catch (Exception ex) {
ex.printStackTrace();
}
@@ -108,6 +116,7 @@
if (!waiting) {
backBuffer.put(b);
readCopyBuffer.put(b);
+ captureBuffer.setLength(0);
} else {
char c = (char) b;
boolean capturing = false;
@@ -236,14 +245,14 @@
}
public boolean potentialMatch(char c) {
- return triggered || text[pos] == c;
+ return triggered || text.length == 0 || text[pos] == c;
}
public boolean match(char c) {
if (!triggered) {
- if (text[pos] == c) {
+ if (text.length == 0 || text[pos] == c) {
pos++;
- if (text.length == pos) {
+ if (text.length == 0 || text.length == pos) {
triggered = true;
if (!waitForLine) {
reset();
Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/util/CircularFifoBuffer.java
==============================================================================
---
trunk/twxbbs/src/main/java/org/twdata/twxbbs/util/CircularFifoBuffer.java
(original)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/util/CircularFifoBuffer.java
Sat Aug 30 23:38:06 2008
@@ -19,8 +19,7 @@
public CircularFifoBuffer(int size) {
this.buffer = new byte[size];
- pos = 0;
- start = 0;
+ clear();
}
public ByteBuffer put(byte b) {
@@ -81,6 +80,12 @@
return result;
}
+ public ByteBuffer clear() {
+ pos = 0;
+ start = 0;
+ return this;
+ }
+
public byte get(int i) {
throw new UnsupportedOperationException();
}
@@ -306,10 +311,6 @@
}
public ByteBuffer reset() {
- throw new UnsupportedOperationException();
- }
-
- public ByteBuffer clear() {
throw new UnsupportedOperationException();
}
Modified:
trunk/twxbbs/src/test/java/org/twdata/twxbbs/proxy/script/ScriptLexerTest.java
==============================================================================
---
trunk/twxbbs/src/test/java/org/twdata/twxbbs/proxy/script/ScriptLexerTest.java
(original)
+++
trunk/twxbbs/src/test/java/org/twdata/twxbbs/proxy/script/ScriptLexerTest.java
Sat Aug 30 23:38:06 2008
@@ -87,6 +87,93 @@
assertEquals("bob", match.getMatchedText());
}
+ public void testCapturingTriggerTwice() throws IOException,
InterruptedException {
+ final ScriptLexer lexer = new ScriptLexer();
+ lexer.addCapturingTextTrigger("foo", "bob");
+ lexer.setTimeout(5000);
+ sendTextOnOtherThread(lexer, "This guy bob is great\r\n", "This
guy is great\r\n");
+ ScriptLexer.Match match = lexer.waitForTriggers();
+ assertNotNull(match);
+ assertEquals("foo", match.getMatchedId());
+ assertEquals("bob", match.getMatchedText());
+ lexer.addCapturingTextTrigger("foo", "bob");
+ sendTextOnOtherThread(lexer, "This guy bob is great\r\n", "This
guy is great\r\n");
+ match = lexer.waitForTriggers();
+ assertNotNull(match);
+ assertEquals("foo", match.getMatchedId());
+ assertEquals("bob", match.getMatchedText());
+ }
+
+ private void sendTextOnOtherThread(final ScriptLexer lexer, final
String txt, final String expected) {
+ Thread t = new Thread(new Runnable() {
+ public void run() {
+ try {
+ Thread.sleep(500);
+ ByteBuffer outBuffer =
lexer.parse(ByteBuffer.wrap(txt.getBytes()));
+ String bufferAsStr = readBufferIntoString(outBuffer);
+ assertEquals(expected, bufferAsStr);
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail("bad exception: "+ e);
+ }
+ }
+ });
+ t.start();
+ }
+
+ public void testCapturingTriggerThatMatchesAnything() throws
IOException, InterruptedException {
+ final ScriptLexer lexer = new ScriptLexer();
+ lexer.addCapturingTextTrigger("foo", "");
+ lexer.setTimeout(5000);
+ sendTextOnOtherThread(lexer, "This guy bob is great\r\n", "his guy
bob is great\r\n");
+ ScriptLexer.Match match = lexer.waitForTriggers();
+ assertNotNull(match);
+ assertEquals("foo", match.getMatchedId());
+ assertEquals("T", match.getMatchedText());
+ }
+
+ public void testCapturingTriggerThatMatchesAnythingTwice() throws
IOException, InterruptedException {
+ final ScriptLexer lexer = new ScriptLexer();
+ lexer.addCapturingTextTrigger("foo", "");
+ lexer.setTimeout(5000);
+ sendTextOnOtherThread(lexer, "This guy bob is great\r\n", "his guy
bob is great\r\n");
+ ScriptLexer.Match match = lexer.waitForTriggers();
+ assertNotNull(match);
+ assertEquals("foo", match.getMatchedId());
+ assertEquals("T", match.getMatchedText());
+ lexer.addCapturingTextTrigger("foo", "");
+ sendTextOnOtherThread(lexer, "And jan is cool too\r\n", "nd jan is
cool too\r\n");
+ match = lexer.waitForTriggers();
+ assertNotNull(match);
+ assertEquals("foo", match.getMatchedId());
+ assertEquals("A", match.getMatchedText());
+ }
+
+ public void testCapturingTriggerThatMatchesAnythingButNotBackBuffer()
throws IOException, InterruptedException {
+ final ScriptLexer lexer = new ScriptLexer();
+ lexer.parse(ByteBuffer.wrap("some precursor text".getBytes()));
+ lexer.addCapturingTextTrigger("foo", "");
+ lexer.setTimeout(5000);
+ Thread t = new Thread(new Runnable() {
+ public void run() {
+ try {
+ Thread.sleep(500);
+ ByteBuffer outBuffer =
lexer.parse(ByteBuffer.wrap("This guy bob is great\r\n".getBytes()));
+ String bufferAsStr = readBufferIntoString(outBuffer);
+ assertEquals("his guy bob is great\r\n", bufferAsStr);
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail("bad exception: "+ e);
+ }
+ }
+ });
+ t.start();
+ ScriptLexer.Match match = lexer.waitForTriggers();
+ assertNotNull(match);
+ assertEquals("foo", match.getMatchedId());
+ assertEquals("T", match.getMatchedText());
+ }
+
public void testCapturingTriggerForLine() throws IOException,
InterruptedException {
final ScriptLexer lexer = new ScriptLexer();
lexer.addCapturingTextLineTrigger("foo", "bob");
@@ -109,6 +196,30 @@
assertNotNull(match);
assertEquals("foo", match.getMatchedId());
assertEquals("bob is great", match.getMatchedText());
+ }
+
+ public void testCapturingTriggerForLineThatMatchesAnything() throws
IOException, InterruptedException {
+ final ScriptLexer lexer = new ScriptLexer();
+ lexer.addCapturingTextLineTrigger("foo", "");
+ lexer.setTimeout(5000);
+ Thread t = new Thread(new Runnable() {
+ public void run() {
+ try {
+ Thread.sleep(500);
+ ByteBuffer outBuffer =
lexer.parse(ByteBuffer.wrap("This guy bob is great\r\nyeah".getBytes()));
+ String bufferAsStr = readBufferIntoString(outBuffer);
+ assertEquals("yeah", bufferAsStr);
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail("bad exception: "+ e);
+ }
+ }
+ });
+ t.start();
+ ScriptLexer.Match match = lexer.waitForTriggers();
+ assertNotNull(match);
+ assertEquals("foo", match.getMatchedId());
+ assertEquals("This guy bob is great", match.getMatchedText());
}
public void testCapturingTriggerSpreadOverMultipleCalls() throws
IOException, InterruptedException {