[twxproxy-ep commit] r76 - in trunk/twxbbs: scripts/game-A scripts/session src/main/java/org/twdata/twxbbs/proxy/scrip...

4 views
Skip to first unread message

codesite...@google.com

unread,
Sep 1, 2008, 8:16:32 AM9/1/08
to twxp...@googlegroups.com
Author: donald.brown
Date: Mon Sep 1 05:15:42 2008
New Revision: 76

Added:
trunk/twxbbs/scripts/game-A/
trunk/twxbbs/scripts/game-A/stop-attacks.js (contents, props changed)
- copied, changed from r70,
/trunk/twxbbs/scripts/session/stop-attacks.js
trunk/twxbbs/scripts/session/runGameScripts.js

trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/SessionScriptRunner.java
Removed:
trunk/twxbbs/scripts/session/stop-attacks.js
Modified:
trunk/twxbbs/scripts/session/login.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/Script.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/main/java/org/twdata/twxbbs/proxy/script/ScriptManager.java
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptType.java
trunk/twxbbs/src/main/resources/org/twdata/twxbbs/proxy/script/global.js

Log:
Adding new feature for game-specific scripts to just be placed in the
appropriate directory (scripts/game-X), better script cleanup


Copied: trunk/twxbbs/scripts/game-A/stop-attacks.js (from r70,
/trunk/twxbbs/scripts/session/stop-attacks.js)
==============================================================================
--- /trunk/twxbbs/scripts/session/stop-attacks.js (original)
+++ trunk/twxbbs/scripts/game-A/stop-attacks.js Mon Sep 1 05:15:42 2008
@@ -8,7 +8,7 @@
function attack(prompt) {
match = prompt.match(attackPtn);
if (match != null) {
- println("Try to attack "+match[1]+" with "+match[4]+"
using "+match[3]+" fighters in game "+currentGame);
+ println("Try to attack "+match[1]+" with "+match[4]+"
using "+match[3]+" fighters");
player.send("*\u001b[31m\u001b[1mLet's just be
friends\u001b[22m*");
game.setCapturingTextLineTrigger("no", "No", function(txt){});
game.send("n");
@@ -20,14 +20,5 @@
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();
-
-println("Attack script done");
+game.pause();
\ No newline at end of file

Modified: trunk/twxbbs/scripts/session/login.js
==============================================================================
--- trunk/twxbbs/scripts/session/login.js (original)
+++ trunk/twxbbs/scripts/session/login.js Mon Sep 1 05:15:42 2008
@@ -35,5 +35,4 @@
game.setTextTrigger("passwd", "Password?", passwd);
game.pause();
game.setTextTrigger("Command", "Command [", function(txt){});
-game.pause();
-println("Login done");
+game.pause();
\ No newline at end of file

Added: trunk/twxbbs/scripts/session/runGameScripts.js
==============================================================================
--- (empty file)
+++ trunk/twxbbs/scripts/session/runGameScripts.js Mon Sep 1 05:15:42 2008
@@ -0,0 +1,19 @@
+var lastGameThreads;
+function gameSelectionPrompt(prompt) {
+ player.setCapturingTextTrigger("gameSelection", "", gameSelection);
+ player.pause();
+}
+
+function gameSelection(input) {
+ if (lastGameThreads != null) {
+ sessionScriptRunner.stopScripts(lastGameThreads);
+ }
+ if (input.match(/[A-Pa-p]/) != null) {
+ lastGameThreads =
sessionScriptRunner.runAllInDirectory("game-"+input.toUpperCase());
+ }
+ game.send(input);
+ game.pause();
+}
+
+game.setTextTrigger("gameSelectionPrompt", "Selection (? for menu):",
gameSelectionPrompt);
+game.pause();
\ No newline at end of file

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
Mon Sep 1 05:15:42 2008
@@ -71,7 +71,7 @@
}

public void start() {
- applicationScriptThreads = startScripts(ScriptType.application,
new ScriptVariablesFactory() {
+ applicationScriptThreads =
startScripts(ScriptType.application.name(), new ScriptVariablesFactory() {
public Map<String, Object> create() {
final Map<String,Object> vars = new
HashMap<String,Object>();
vars.put("configuration", configuration);
@@ -85,26 +85,25 @@
stop();
}

- public List<Thread> startScripts(ScriptType type,
ScriptVariablesFactory varFactory) {
+ public List<Thread> startScripts(String path, ScriptVariablesFactory
varFactory) {
List<Thread> scriptThreads = new ArrayList<Thread>();
- Map<String,Object> context = applicationContext;
- if (type != ScriptType.application) {
- context = new HashMap<String,Object>();
- }
- Collection<URL> scriptUrls = collectScripts(type.name());
+ Collection<URL> scriptUrls = collectScripts(path);
for (URL url : scriptUrls) {
-
- Map<String,Object> vars = varFactory.create();
- if (type == ScriptType.session) {
- vars.put("session", context);
- }
- vars.put("application", context);
- Script script = new JavascriptScript(url, vars);
- Thread t = new Thread(script);
- scriptThreads.add(t);
- System.out.println("Executing script "+url);
- t.start();
+ Script script = new JavascriptScript(url);
+ scriptThreads.add(startScript(script, varFactory.create()));
}
return scriptThreads;
+ }
+
+ public Thread startScript(final Script script, final
Map<String,Object> vars) {
+
+ vars.put("application", applicationContext);
+ Thread t = new Thread(new Runnable() {
+ public void run() {
+ script.run(vars);
+ }
+ });
+ t.start();
+ return t;
}
}

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
Mon Sep 1 05:15:42 2008
@@ -17,27 +17,28 @@
*/
public class JavascriptScript implements Script {
private final URL script;
- private final Map<String, Object> variables;

- public JavascriptScript(URL script, Map<String,Object> variables) {
+ public JavascriptScript(URL script) {
this.script = script;
- this.variables = variables;
}

- public void run() {
+ public void run(Map<String,Object> variables) {
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");

for (Map.Entry<String,Object> entry : variables.entrySet()) {
jsEngine.put(entry.getKey(), entry.getValue());
}
+ System.out.println(this+" started");
readScriptIntoEngine(jsEngine,
getClass().getClassLoader().getResource("org/twdata/twxbbs/proxy/script/global.js"));
readScriptIntoEngine(jsEngine, script);
+ System.out.println(this+" finished");
variables.clear();
}

private void readScriptIntoEngine(ScriptEngine jsEngine, URL script) {
Reader scriptReader = null;
+
try {
scriptReader = new InputStreamReader(script.openStream());
jsEngine.put(ScriptEngine.NAME, script.toString());
@@ -56,6 +57,10 @@
}
}
}
+ }
+
+ public String toString() {
+ return "Script ["+script.toString()+"]";
}

}

Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/Script.java
==============================================================================
--- trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/Script.java
(original)
+++ trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/Script.java
Mon Sep 1 05:15:42 2008
@@ -2,6 +2,7 @@

import javax.script.ScriptException;
import java.io.IOException;
+import java.util.Map;

/**
* Created by IntelliJ IDEA.
@@ -10,7 +11,7 @@
* Time: 10:53:37 PM
* To change this template use File | Settings | File Templates.
*/
-public interface Script extends Runnable {
+public interface Script {

- void run();
+ void run(Map<String,Object> args);
}

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
Mon Sep 1 05:15:42 2008
@@ -20,4 +20,8 @@


String stripAnsi(String text);
+
+ void setTimeout(long timeout);
+
+ String getMatchedLine();
}

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
Mon Sep 1 05:15:42 2008
@@ -75,6 +75,10 @@
lexer.removeTextTrigger(id);
}

+ public void setTimeout(long timeout) {
+ lexer.setTimeout(timeout);
+ }
+
public String stripAnsi(String text) {
return stripAnsi(text.getBytes(), text.length());
}

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
Mon Sep 1 05:15:42 2008
@@ -4,10 +4,7 @@
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;

/**
* Created by IntelliJ IDEA.
@@ -28,7 +25,7 @@
public void messageReceived(NextFilter nextFilter, IoSession
ioSession, Object o) throws Exception {
if (o instanceof ByteBuffer) {
ByteBuffer buffer = (ByteBuffer) o;
- for (ScriptLexer lexer : getPlayerLexers(ioSession)) {
+ for (ScriptLexer lexer :
getSessionScriptRunner(ioSession).getPlayerLexers()) {
buffer = lexer.parse(buffer);
buffer.flip();
}
@@ -43,7 +40,7 @@
Object o = req.getMessage();
if (o instanceof ByteBuffer) {
ByteBuffer buffer = (ByteBuffer) o;
- for (ScriptLexer lexer : getGameLexers(ioSession)) {
+ for (ScriptLexer lexer :
getSessionScriptRunner(ioSession).getGameLexers()) {
buffer = lexer.parse(buffer);
buffer.flip();
}
@@ -54,63 +51,21 @@
}
}

- private List<ScriptLexer> getGameLexers(IoSession session) {
- return (List<ScriptLexer>) session.getAttribute("gameLexers");
- }
- private List<ScriptLexer> getPlayerLexers(IoSession session) {
- return (List<ScriptLexer>) session.getAttribute("playerLexers");
+ private SessionScriptRunner getSessionScriptRunner(IoSession session) {
+ return ((SessionScriptRunner)
session.getAttribute("sessionScriptRunner"));
}

@Override
public void sessionOpened(final NextFilter nextFilter, final IoSession
ioSession) throws Exception {
- final List<ScriptLexer> gameLexers = new ArrayList<ScriptLexer>();
- final List<ScriptLexer> playerLexers = new
ArrayList<ScriptLexer>();
- List<Thread> scripts =
scriptManager.startScripts(ScriptType.session, new ScriptVariablesFactory()
{
-
- public Map<String, Object> create() {
- 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 {
- nextFilter.messageReceived(ioSession,
ByteBuffer.wrap(text.getBytes()));
- }
- });
- ScriptLexer playerLexer = new ScriptLexer();
- ScriptApi playerApi = new ScriptApiImpl(playerLexer, new
ScriptApiImpl.TextSender() {
- public void send(String text) throws Exception {
- nextFilter.filterWrite(ioSession, new
WriteRequest(ByteBuffer.wrap(text.getBytes())));
- }
- });
- vars.put("gameApi", gameApi);
- vars.put("playerApi", playerApi);
- gameLexers.add(gameLexer);
- playerLexers.add(playerLexer);
- return vars;
- }
- });
-
- ioSession.setAttribute("gameLexers", gameLexers);
- ioSession.setAttribute("playerLexers", playerLexers);
- ioSession.setAttribute("scriptThreads", scripts);
+ final SessionScriptRunner sessionScriptRunner = new
SessionScriptRunner(ioSession, nextFilter, scriptManager);
+ ioSession.setAttribute("sessionScriptRunner", sessionScriptRunner);
super.sessionOpened(nextFilter, ioSession);
}

@Override
public void sessionClosed(NextFilter nextFilter, IoSession ioSession)
throws Exception {
- List<Thread> threads = (List<Thread>)
ioSession.getAttribute("scriptThreads");
- for (Thread thread : threads) {
- thread.interrupt();
- }
- ioSession.removeAttribute("gameLexers");
- ioSession.removeAttribute("playerLexers");
- ioSession.removeAttribute("scriptThreads");
- // todo: stop scripts somehow?
- super.sessionClosed(nextFilter, ioSession); //To change body of
overridden methods use File | Settings | File Templates.
+ getSessionScriptRunner(ioSession).stop();
+ ioSession.removeAttribute("sessionScriptRunner");
+ super.sessionClosed(nextFilter, ioSession);
}
}

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
Mon Sep 1 05:15:42 2008
@@ -92,12 +92,18 @@
parse(backBuffer);
}
if (lastMatch == null) {
- wait(timeout);
+ if (timeout > 0) {
+ wait(timeout);
+ } else {
+ wait();
+ }
}
} catch (InterruptedException ex) {
System.out.println("Stopping script");
} catch (Exception ex) {
ex.printStackTrace();
+ } finally {
+ waiting = false;
}
return lastMatch;
}

Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptManager.java
==============================================================================
---
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptManager.java
(original)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptManager.java
Mon Sep 1 05:15:42 2008
@@ -3,6 +3,7 @@
import org.twdata.twxbbs.StartableManager;

import java.util.List;
+import java.util.Map;

/**
* Created by IntelliJ IDEA.
@@ -16,5 +17,7 @@

void start();

- List<Thread> startScripts(ScriptType type, ScriptVariablesFactory
varFactory);
+ List<Thread> startScripts(String path, ScriptVariablesFactory
varFactory);
+
+ Thread startScript(Script script, Map<String,Object> vars);
}

Modified:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptType.java
==============================================================================
---
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptType.java
(original)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/ScriptType.java
Mon Sep 1 05:15:42 2008
@@ -8,6 +8,7 @@
* To change this template use File | Settings | File Templates.
*/
public enum ScriptType {
+ game,
session,
application
}

Added:
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/SessionScriptRunner.java
==============================================================================
--- (empty file)
+++
trunk/twxbbs/src/main/java/org/twdata/twxbbs/proxy/script/SessionScriptRunner.java
Mon Sep 1 05:15:42 2008
@@ -0,0 +1,117 @@
+package org.twdata.twxbbs.proxy.script;
+
+import org.apache.mina.common.IoSession;
+import org.apache.mina.common.IoFilter;
+import org.apache.mina.common.ByteBuffer;
+
+import java.util.*;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: mrdon
+ * Date: 01/09/2008
+ * Time: 9:00:37 PM
+ * To change this template use File | Settings | File Templates.
+ */
+public class SessionScriptRunner {
+ private final IoSession ioSession;
+ private final List<ScriptLexer> gameLexers;
+ private final List<ScriptLexer> playerLexers;
+ private final List<Thread> scriptThreads;
+ private final IoFilter.NextFilter nextFilter;
+ private final Map<String,Object> contextMap;
+ private final ScriptManager scriptManager;
+
+ public SessionScriptRunner(IoSession ioSession, IoFilter.NextFilter
nextFilter, ScriptManager scriptManager) {
+ this.ioSession = ioSession;
+ this.nextFilter = nextFilter;
+ this.scriptManager = scriptManager;
+ gameLexers = new CopyOnWriteArrayList<ScriptLexer>();
+ playerLexers = new CopyOnWriteArrayList<ScriptLexer>();
+ scriptThreads = new CopyOnWriteArrayList<Thread>();
+ contextMap = Collections.synchronizedMap(new
HashMap<String,Object>());
+
+ runSessionScripts();
+ }
+
+ public Map<String,Object> createSessionScriptVariables() {
+ Map<String,Object> vars = new HashMap<String,Object>(){
+ @Override
+ public void clear() {
+
gameLexers.remove(((ScriptApiImpl)get("gameApi")).getScriptLexer());
+
playerLexers.remove(((ScriptApiImpl)get("playerApi")).getScriptLexer());
+ super.clear();
+ }
+ };
+ ScriptLexer gameLexer = new ScriptLexer();
+ ScriptApi gameApi = new ScriptApiImpl(gameLexer, new
ScriptApiImpl.TextSender() {
+ public void send(String text) throws Exception {
+ nextFilter.messageReceived(ioSession,
ByteBuffer.wrap(text.getBytes()));
+ }
+ });
+ ScriptLexer playerLexer = new ScriptLexer();
+ ScriptApi playerApi = new ScriptApiImpl(playerLexer, new
ScriptApiImpl.TextSender() {
+ public void send(String text) throws Exception {
+ nextFilter.filterWrite(ioSession, new
IoFilter.WriteRequest(ByteBuffer.wrap(text.getBytes())));
+ }
+ });
+ vars.put("gameApi", gameApi);
+ vars.put("playerApi", playerApi);
+ vars.put("session", contextMap);
+ vars.put("sessionScriptRunner", this);
+ gameLexers.add(gameLexer);
+ playerLexers.add(playerLexer);
+ return vars;
+ }
+
+ public void runSessionScripts() {
+
scriptThreads.addAll(scriptManager.startScripts(ScriptType.session.name(),
new SessionScriptVariablesFactory()));
+
+ }
+
+ public Thread run(Script script) {
+ Thread t = scriptManager.startScript(script,
createSessionScriptVariables());
+ scriptThreads.add(t);
+ return t;
+ }
+
+ public List<Thread> runAllInDirectory(String path) {
+ List<Thread> list = scriptManager.startScripts(path, new
SessionScriptVariablesFactory());
+ scriptThreads.addAll(list);
+ return list;
+ }
+
+ public void stop() {
+ for (Thread thread : scriptThreads) {
+ if (thread.isAlive()) {
+ thread.interrupt();
+ }
+ }
+ scriptThreads.clear();
+ }
+
+ public void stopScripts(List<Thread> threads) {
+ for (Thread thread : threads) {
+ if (thread.isAlive()) {
+ thread.interrupt();
+ }
+ }
+ scriptThreads.removeAll(threads);
+ }
+
+ public List<ScriptLexer> getGameLexers() {
+ return gameLexers;
+ }
+
+ public List<ScriptLexer> getPlayerLexers() {
+ return playerLexers;
+ }
+
+ private class SessionScriptVariablesFactory implements
ScriptVariablesFactory {
+
+ public Map<String, Object> create() {
+ return createSessionScriptVariables();
+ }
+ }
+}

Modified:
trunk/twxbbs/src/main/resources/org/twdata/twxbbs/proxy/script/global.js
==============================================================================
---
trunk/twxbbs/src/main/resources/org/twdata/twxbbs/proxy/script/global.js
(original)
+++
trunk/twxbbs/src/main/resources/org/twdata/twxbbs/proxy/script/global.js
Mon Sep 1 05:15:42 2008
@@ -39,5 +39,5 @@
var player = new Api(playerApi);

function stripAnsi(txt) {
- return gameApi.stripAnsi(txt);
+ return new String(gameApi.stripAnsi(txt));
}

Reply all
Reply to author
Forward
0 new messages