[twxproxy-ep commit] r61 - in trunk/twxbbs: scripts src/main/java/org/twdata/twxbbs/proxy/script src/main/resources/or...

0 views
Skip to first unread message

codesite...@google.com

unread,
Aug 30, 2008, 2:05:02 AM8/30/08
to twxp...@googlegroups.com
Author: donald.brown
Date: Fri Aug 29 23:03:51 2008
New Revision: 61

Added:
trunk/twxbbs/scripts/
trunk/twxbbs/scripts/test.js
trunk/twxbbs/src/main/resources/org/twdata/twxbbs/proxy/
trunk/twxbbs/src/main/resources/org/twdata/twxbbs/proxy/script/
trunk/twxbbs/src/main/resources/org/twdata/twxbbs/proxy/script/global.js
Modified:

trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/JavascriptScript.java
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptApi.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/test/java/org/twdata/twxbbs/proxy/script/ScriptLexerTest.java

Log:
Improving the Javascript API, fixing capturing text triggers, adding
an example script that swallows attacks and does some login process


Added: trunk/twxbbs/scripts/test.js
==============================================================================
--- (empty file)
+++ trunk/twxbbs/scripts/test.js Fri Aug 29 23:03:51 2008
@@ -0,0 +1,28 @@
+function login(prompt) {
+ game.send("don*");
+}
+function menu(prompt) {
+ game.send("a");
+}
+function attack(prompt) {
+ player.send("*\u001b[30mDon't be a dick*");
+ game.setCapturingTextLineTrigger("no", "No",
function(txt){println("txt:"+txt);});
+ game.send("n");
+ game.pause();
+}
+function gamePause(prompt) {
+ game.send(" ");
+ game.pause();
+}
+
+game.setTextTrigger("pause", "[Pause]", gamePause);
+game.setTextTrigger("login","ENTER", login);
+game.pause();
+game.setTextTrigger("menu", "menu):", menu);
+game.pause();
+game.setTextTrigger("attack", "<Attack>", attack);
+game.killTextTrigger("menu");
+game.killTextTrigger("login");
+game.pause();
+
+println("Script done");

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
Fri Aug 29 23:03:51 2008
@@ -7,6 +7,7 @@
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
+import java.util.Map;

/**
* Created by IntelliJ IDEA.
@@ -19,30 +20,42 @@
private URL script;
private ScriptApi gameApi;
private ScriptApi playerApi;
+ private Map<String,Object> session;
+ private Map<String, Object> appContext;

- public JavascriptScript(URL script, ScriptApi gameApi, ScriptApi
playerApi) {
+ public JavascriptScript(URL script, ScriptApi gameApi, ScriptApi
playerApi, Map<String,Object> session, Map<String,Object> appContext) {
this.script = script;
this.gameApi = gameApi;
this.playerApi = playerApi;
+ this.session = session;
+ this.appContext = appContext;
}

public void run() {
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
- Reader reader = null;
- jsEngine.put("game", gameApi);
- jsEngine.put("player", playerApi);
+ jsEngine.put("gameApi", gameApi);
+ jsEngine.put("playerApi", playerApi);
+ jsEngine.put("session", session);
+ jsEngine.put("application", appContext);
+
+ readScriptIntoEngine(jsEngine,
getClass().getClassLoader().getResource("org/twdata/twxbbs/proxy/script/global.js"));
+ readScriptIntoEngine(jsEngine, script);
+ }
+
+ private void readScriptIntoEngine(ScriptEngine jsEngine, URL script) {
+ Reader scriptReader = null;
try {
- reader = new InputStreamReader(script.openStream());
- jsEngine.eval(reader);
+ scriptReader = new InputStreamReader(script.openStream());
+ jsEngine.eval(scriptReader);
} catch (ScriptException e) {
e.printStackTrace(); //To change body of catch statement use
File | Settings | File Templates.
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use
File | Settings | File Templates.
} finally {
- if (reader != null) {
+ if (scriptReader != null) {
try {
- reader.close();
+ scriptReader.close();
} catch (IOException ex) {
// ignore
}

Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptApi.java
==============================================================================
---
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptApi.java
(original)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptApi.java
Fri Aug 29 23:03:51 2008
@@ -4,8 +4,6 @@

String getCurrentLine();

- String getMatchedLine();
-
void setTextTrigger(String id, String text);

void setTextLineTrigger(String id, String text);

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
Fri Aug 29 23:03:51 2008
@@ -44,6 +44,9 @@
}

public void send(String text) throws Exception {
+ if (text != null) {
+ text = text.replace("*", "\r\n");
+ }
sender.send(text);
}


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
Fri Aug 29 23:03:51 2008
@@ -1,9 +1,12 @@
package org.twdata.twxbbs.proxy.script;

import org.apache.mina.common.*;
+import org.apache.mina.common.support.DefaultWriteFuture;

import java.util.List;
import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
import java.net.URL;

/**
@@ -16,9 +19,11 @@
public class ScriptIoFilter extends IoFilterAdapter {

private final List<URL> scriptUrls;
+ private final Map<String,Object> applicationContext;

public ScriptIoFilter(List<URL> scriptUrls) {
this.scriptUrls = scriptUrls;
+ this.applicationContext = new HashMap<String,Object>();
}

@Override
@@ -36,14 +41,16 @@
}

@Override
- public void messageSent(NextFilter nextFilter, IoSession ioSession,
Object o) throws Exception {
+ public void filterWrite(NextFilter nextFilter, IoSession ioSession,
WriteRequest req) throws Exception {
+ Object o = req.getMessage();
if (o instanceof ByteBuffer) {
ByteBuffer buffer = (ByteBuffer) o;
for (ScriptLexer lexer : getGameLexers(ioSession)) {
buffer = lexer.parse(buffer);
buffer.flip();
}
- nextFilter.messageSent(ioSession, buffer);
+ WriteFuture future = new DefaultWriteFuture(ioSession, buffer);
+ nextFilter.filterWrite(ioSession, new WriteRequest(buffer,
future));
} else {
throw new IllegalArgumentException("Only byte buffers are
supported");
}
@@ -61,6 +68,7 @@
List<Thread> scripts = new ArrayList<Thread>();
List<ScriptLexer> gameLexers = new ArrayList<ScriptLexer>();
List<ScriptLexer> playerLexers = new ArrayList<ScriptLexer>();
+ Map<String,Object> sessionContext = new HashMap<String,Object>();
for (URL url : scriptUrls) {
ScriptLexer gameLexer = new ScriptLexer();
ScriptApi gameApi = new ScriptApiImpl(gameLexer, new
ScriptApiImpl.TextSender() {
@@ -74,7 +82,7 @@
nextFilter.filterWrite(ioSession, new
WriteRequest(ByteBuffer.wrap(text.getBytes())));
}
});
- Script script = new JavascriptScript(url, gameApi, playerApi);
+ Script script = new JavascriptScript(url, gameApi, playerApi,
sessionContext, applicationContext);
gameLexers.add(gameLexer);
playerLexers.add(playerLexer);
Thread t = new Thread(script);

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
Fri Aug 29 23:03:51 2008
@@ -109,19 +109,31 @@
readCopyBuffer.put(b);
} else {
char c = (char) b;
+ boolean capturing = false;
+ putInCurrentLine(c);
for (Trigger trigger : activeTriggers.values()) {
- putInCurrentLine(c);

- if (trigger.potentialMatch(c)) {
- captureBuffer.append(c);
- } else {
- for (int x=0; x<captureBuffer.length(); x++) {
-
readCopyBuffer.putChar(captureBuffer.charAt(x));
- }
- captureBuffer.setLength(0);
- readCopyBuffer.put(b);
+ if (trigger instanceof CapturingTrigger &&
trigger.potentialMatch(c)) {
+ capturing = true;
+ }
+ }
+
+ if (capturing) {
+ captureBuffer.append(c);
+ System.out.println("adding to buffer:"+captureBuffer);
+ } else {
+ if (captureBuffer.length() > 0) {
+ System.out.println("Clearing buffer");
}
+ for (int x=0; x<captureBuffer.length(); x++) {
+ readCopyBuffer.putChar(captureBuffer.charAt(x));
+ }
+ captureBuffer.setLength(0);
+ readCopyBuffer.put(b);
+
+ }

+ for (Trigger trigger : activeTriggers.values()) {
if (trigger.match(c)) {
handleMatch(trigger);
}
@@ -162,8 +174,12 @@
} else {
matchedText = currentLine.toString();
}
- if (matchedText.length() > 0 &&
matchedText.charAt(matchedText.length()-1) == '\r') {
- matchedText = matchedText.substring(0, matchedText.length()
-1);
+ if (matchedText.length() > 0) {
+ if (matchedText.charAt(matchedText.length()-1) == '\r') {
+ matchedText = matchedText.substring(0,
matchedText.length() -1);
+ } else if (matchedText.charAt(matchedText.length()-1) == '\n')
{
+ matchedText = matchedText.substring(0,
matchedText.length() -2);
+ }
}
Match match = new Match(trigger.getId(), matchedText);
if (trigger.shouldBeRemovedAfterMatch()) {
@@ -237,7 +253,7 @@
pos = 0;
}
} else {
- if ('\r' == c) {
+ if ('\n' == c) {
reset();
return true;
}

Added:
trunk/twxbbs/src/main/resources/org/twdata/twxbbs/proxy/script/global.js
==============================================================================
--- (empty file)
+++
trunk/twxbbs/src/main/resources/org/twdata/twxbbs/proxy/script/global.js
Fri Aug 29 23:03:51 2008
@@ -0,0 +1,39 @@
+function Api(lexer) {
+
+ var triggerCallbacks = {};
+
+ this.send = function(txt) {
+ lexer.send(txt);
+ };
+ this.getCurrentLine = function() {
+ lexer.getCurrentLine();
+ };
+ this.pause = function() {
+ var id = lexer.pause();
+ if (id != null) {
+ triggerCallbacks[id](lexer.getMatchedLine());
+ }
+ }
+ this.killTextTrigger = function(id) {
+ lexer.killTextTrigger(id);
+ }
+ this.setTextTrigger = function(id, text, callback) {
+ lexer.setTextTrigger(id, text);
+ triggerCallbacks[id] = callback;
+ }
+ this.setTextLineTrigger = function(id, text, callback) {
+ lexer.setTextLineTrigger(id, text);
+ triggerCallbacks[id] = callback;
+ }
+ this.setCapturingTextTrigger = function(id, text, callback) {
+ lexer.setCapturingTextTrigger(id, text);
+ triggerCallbacks[id] = callback;
+ }
+ this.setCapturingTextLineTrigger = function(id, text, callback) {
+ lexer.setCapturingTextLineTrigger(id, text);
+ triggerCallbacks[id] = callback;
+ }
+}
+
+var game = new Api(gameApi);
+var player = new Api(playerApi);
\ No newline at end of file

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
Fri Aug 29 23:03:51 2008
@@ -97,7 +97,32 @@
Thread.sleep(500);
ByteBuffer outBuffer =
lexer.parse(ByteBuffer.wrap("This guy bob is great\r\nyeah".getBytes()));
String bufferAsStr = readBufferIntoString(outBuffer);
- assertEquals("This guy \nyeah", bufferAsStr);
+ assertEquals("This guy 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("bob is great", match.getMatchedText());
+ }
+
+ public void testCapturingTriggerSpreadOverMultipleCalls() throws
IOException, InterruptedException {
+ final ScriptLexer lexer = new ScriptLexer();
+ lexer.addCapturingTextLineTrigger("foo", "bob");
+ lexer.setTimeout(5000);
+ Thread t = new Thread(new Runnable() {
+ public void run() {
+ try {
+ Thread.sleep(500);
+ ByteBuffer outBuffer =
lexer.parse(ByteBuffer.wrap("This guy bo".getBytes()));
+ ByteBuffer outBuffer2 = lexer.parse(ByteBuffer.wrap("b
is great\r\nyeah".getBytes()));
+ assertEquals("This guy ",
readBufferIntoString(outBuffer));
+ assertEquals("yeah", readBufferIntoString(outBuffer2));
} catch (Exception e) {
e.printStackTrace();
fail("bad exception: "+ e);

Reply all
Reply to author
Forward
0 new messages