From b04db8e3e4e215347db16d59179955ed195d021f Mon Sep 17 00:00:00 2001 From: Holden Rohrer Date: Mon, 20 Jan 2020 22:46:19 -0500 Subject: bug statement --- examples/jarvis.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/jarvis.js b/examples/jarvis.js index 04c12db..a95131a 100644 --- a/examples/jarvis.js +++ b/examples/jarvis.js @@ -1,5 +1,9 @@ // A bot which responds to `jarvis` with a box +// BUG: The Scheduler, Search, Claims, ident, AND Write Listener can ALL be +// used as extensions for Socket. This would make the code so much easier to +// understand + const Space = require('../space'); const Socket = require('../socket'); const ms = require('../utils/measurespace'); -- cgit From 8b014c3ce98670abd895789e9e206a828cc95a33 Mon Sep 17 00:00:00 2001 From: Holden Rohrer Date: Fri, 24 Jan 2020 15:31:02 -0500 Subject: Identity function built for .call use In an effort to move jarvis to using one class, MetaSocket, for all of its interactions with the main socket, ident is now only able to be used as id.call(socket); this should simplify the behavior and means that it can use EventEmitter events. --- utils/ident.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/utils/ident.js b/utils/ident.js index 187132f..b4fa8ff 100644 --- a/utils/ident.js +++ b/utils/ident.js @@ -2,32 +2,32 @@ const vec = require('../utils/vec'); -module.exports = function identify(sock, initOnce, init, deinit){ - // `sock` should be Socket instance. +module.exports = function identify(){ + // `this` should be Socket instance. // initOnce and init should be functions that act like they describe; initOnce runs once per program execution and init whenever the socket turns back on - sock.on('open', ()=>{ + let self = this; + + self.on('open', ()=>{ // "Pings" the server with a cursor location which is detected and saved by identity() let coords = [Math.floor(Math.random()*100000+16), Math.floor(Math.random()*1000000+16)]; - sock.cursor(coords); - sock.on('cursor', detect); + self.cursor(coords); + self.on('cursor', detect); function detect(pos, send){ if (vec.equals(pos[0],coords)){ - sock.off('cursor', detect); + self.off('cursor', detect); identity(send); } } }); - sock.on('close', deinit); - // Calls initOnce and init on successful identification. let initialized = false; function identity(send){ if (! initialized){ initialized = true; - initOnce(); + self.emit('initOnce'); } - init(send); + self.emit('init', send); } } -- cgit From 46d56620c3ba385bdd41bc391c975e4934b4c82d Mon Sep 17 00:00:00 2001 From: Holden Rohrer Date: Fri, 24 Jan 2020 15:33:38 -0500 Subject: tools/claim now uses 'fallback' event --- tools/claim.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/claim.js b/tools/claim.js index 721c5ad..b43417b 100644 --- a/tools/claim.js +++ b/tools/claim.js @@ -5,7 +5,7 @@ const ri = require('../utils/rectintersect'); const vec = require('../utils/vec'); const comb = require('../utils/comb'); -module.exports = function(catchall){ +module.exports = function(){ // catchall is called if tileUpdate occurs w/ no relevant claim on a part. let claims = {}; let claimId = 0; @@ -44,6 +44,6 @@ module.exports = function(catchall){ } claim.call(send, diffspace, rellocs, id, claim.space, claim.area); // claim.space should not be modified by the function. it is only present to make functions easier to write } - catchall(send, tilespaces, locs); + this.emit('fallback', send, tilespaces, locs); } } -- cgit From 8cb88f2ccf8d4487af74ba5f6c9e81a7dc306c54 Mon Sep 17 00:00:00 2001 From: Holden Rohrer Date: Fri, 24 Jan 2020 15:34:10 -0500 Subject: wwrap can be used for socket extension --- utils/writewrap.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/utils/writewrap.js b/utils/writewrap.js index 3ca7ede..2e2ae07 100644 --- a/utils/writewrap.js +++ b/utils/writewrap.js @@ -1,12 +1,11 @@ // An EventEmitter wrapper for socket.js writes const EventEmitter = require('events'); -class wwrap extends EventEmitter{ - constructor(socket){ - super(); - socket.on('write', (acc) => { // Assumed that none are rejected because I've never seen it - for (let w of acc) this.emit(w); - }); - } +function wwrap(){ // should be called with wwrap.call(socket) + let self = this; + self.on('write', (acc) => { + for (let w of acc) this.emit(w); + }); } + module.exports = wwrap; -- cgit From 496ee8200fa540663fafd7092f8ca5cce65a0bef Mon Sep 17 00:00:00 2001 From: Holden Rohrer Date: Fri, 24 Jan 2020 15:34:32 -0500 Subject: jarvis integrated new changes --- examples/jarvis.js | 57 +++++++++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/examples/jarvis.js b/examples/jarvis.js index 0dad87e..31a3443 100644 --- a/examples/jarvis.js +++ b/examples/jarvis.js @@ -18,38 +18,43 @@ const wwrap = require('../utils/writewrap'); const Claims = require('../tools/claim'); //// The queue of all writes to be sent to the server @ 200chars/1000ms -var writes = new sched.Queue(1000, 200, (elems) => main.write(elems)); -var main = new Socket(); -var claims = new Claims(detectPrompt); +class MetaSocket extends Socket{ + constructor(world='', delayms=1000){ + super(world); + let self = this; + sched.Queue.call(self, 1000, 200, (elems) => self.write(elems)); + Claims.call(self); + id.call(self); + wwrap.call(self); + self.sender; + self.on('init',(send)=>{ + self.sender = send; + }); + } +} +var main = new MetaSocket('testworld'); // See ident.js for further documentation, but this basically sets up init functions -id(main, initOnce, init, deinit); -writeListen = new wwrap(main); - -var sender; -function init(send){ - sender = send; // tileUpdates require knowledge of the sender - setTimeout(()=>{writes.enable()},1000); // Would fail if a write were added because it would be within a second of cursor send - writes.enqueue(genNotif().towrite()); -} -function deinit(){ - writes.disable(); -} +main.on('init', (send)=>{ + setTimeout(()=>{main.enable()},1000); + main.enqueue(genNotif().towrite()); +}); +main.on('close', ()=>main.disable()); -function initOnce(){ +main.on('initOnce', ()=>{ timect(); main.on('tileUpdate', tileHandler); // Should only be active after the "control space" of the notification has been established -} +}); //// Management utilities // When a tile changes, processes data into usable form and runs every function in `funcs` w/ that data. // Note that functions can edit inputs function tileHandler(send, source, tiles){ - if (send == sender) return; + if (send == main.sender) return; let tiledata = maketiles(tiles); - claims.handle(send, tiledata.tilespaces, tiledata.locs); + main.handle(send, tiledata.tilespaces, tiledata.locs); } //// "userspace" functions for responses, like to tileUpdates @@ -81,14 +86,14 @@ function notifRefresh(){ let diff = newnotif.copy(); if (typeof notif !== 'undefined') diff.comb(notif, comb.sub); notif = newnotif; - if (notifClaim) claims.unclaim(notifClaim); - notifClaim = claims.claim(newnotif, protectArea); + if (notifClaim) main.unclaim(notifClaim); + notifClaim = main.claim(newnotif, protectArea); return (diff.towrite()); } function timect(){ minsUp++; - writes.enqueue(notifRefresh()); + main.enqueue(notifRefresh()); setTimeout(timect, 60*1000); } @@ -99,7 +104,7 @@ function protectArea(send, tiles, locs, id, space, ctrl){ let diff = space.copy(); // Acts as a window for tile (only see relevant data) diff.comb(tile, comb.flip(comb.unmask)); diff.comb(tile, comb.sub); - writes.enqueue(diff.towrite()) + main.enqueue(diff.towrite()) } } @@ -108,7 +113,7 @@ search.adhoc('jarvis'); // The search space is the word jarvis, so whenever that var read = new Search(search); var expire = {}; -function detectPrompt(send, tiles, locs){ // tries to detect the prompt ('jarvis') and calls respond if found. +main.on('fallback', (send, tiles, locs) => { // tries to detect the prompt ('jarvis') and calls respond if found. for (let i=0; i 0) respond(results, send); expire[loc] = setTimeout(() => {read.del(loc); delete expire[loc];}, 30000); } -} +}); let response = new Space(); response.adhoc('yes, my liege'); @@ -131,7 +136,7 @@ function respond(coord, send){ console.log('called at', coord); callct += 1; response.loc = coord; - writes.enqueue(response.towrite().concat(notifRefresh())); + main.enqueue(response.towrite().concat(notifRefresh())); read.update(response); setTimeout(() => {limits.splice(limits.indexOf(send))}, 5*1000); limits.push(send); -- cgit From fdac79c026a2f6a321a1a3846c2f331bede6af02 Mon Sep 17 00:00:00 2001 From: Holden Rohrer Date: Fri, 24 Jan 2020 18:15:09 -0500 Subject: jarvis changed in preparation for search refactor --- examples/jarvis.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/examples/jarvis.js b/examples/jarvis.js index 31a3443..79f0ca6 100644 --- a/examples/jarvis.js +++ b/examples/jarvis.js @@ -30,6 +30,7 @@ class MetaSocket extends Socket{ self.on('init',(send)=>{ self.sender = send; }); + Search.call(this); } } var main = new MetaSocket('testworld'); @@ -110,19 +111,17 @@ function protectArea(send, tiles, locs, id, space, ctrl){ var search = new Space(); search.adhoc('jarvis'); // The search space is the word jarvis, so whenever that's caught, a relevant function can be called. -var read = new Search(search); +var read = new Search(); +read.match(search, respond); var expire = {}; main.on('fallback', (send, tiles, locs) => { // tries to detect the prompt ('jarvis') and calls respond if found. - for (let i=0; i 0) respond(results, send); + read.add(loc, tiles[loc]); expire[loc] = setTimeout(() => {read.del(loc); delete expire[loc];}, 30000); } }); -- cgit From a468d5783fe63f68e679dd7f51d670fc82905131 Mon Sep 17 00:00:00 2001 From: Holden Rohrer Date: Wed, 29 Jan 2020 23:41:42 -0500 Subject: jarvis uses mainworld now --- examples/jarvis.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/jarvis.js b/examples/jarvis.js index 79f0ca6..1a8137f 100644 --- a/examples/jarvis.js +++ b/examples/jarvis.js @@ -33,7 +33,7 @@ class MetaSocket extends Socket{ Search.call(this); } } -var main = new MetaSocket('testworld'); +var main = new MetaSocket(); // See ident.js for further documentation, but this basically sets up init functions -- cgit From 1cc310e20dda4a378aac76b49288e6c8e2361e5e Mon Sep 17 00:00:00 2001 From: Holden Rohrer Date: Wed, 29 Jan 2020 23:42:44 -0500 Subject: generalized tools/search model search.js now provides for a .match and .unmatch method, so it doesn't need to be called every time (in-line with the singleton MetaSocket object model, meaning that callbacks are used and several spaces can be matched at a time) --- tools/search.js | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/tools/search.js b/tools/search.js index 7f681f0..78e0ee7 100644 --- a/tools/search.js +++ b/tools/search.js @@ -12,11 +12,13 @@ function getComp(index){ return (element,needle) => (element[index] - needle[index] || element[1-index] - needle[1-index]) } -function Search(searchBlock){ // searchBlock should be a Space object. +function Search(){ // searchBlock should be a Space object. this.tiles = {}; // Object which stores Spaces. this.sort = [[],[]]; // Vertically/horizontally sorted list of tiles for fast addition, deletion, and searching + this.spaces = []; + this.calls = []; - this.add = function(loc, space){ // loc should be [tileY,tileX] and space Space. + this.add = function(loc, space, send){ // loc should be [tileY,tileX] and space Space. this.tiles[loc] = space; let inds = Array(2); // Records horizontal and vertical indices for insertion. Then actually inserts the item. [0,1].forEach( ind => { // ind chooses y-or-x @@ -29,8 +31,10 @@ function Search(searchBlock){ // searchBlock should be a Space object. block.forEach( (tile) => { searchspace.comb( this.tiles[tile], comb.add ); }); - coords = searchspace.search(searchBlock); // According to space docs, [] on failure and a character location on success - return vec.add(coords, searchspace.loc); + for (let i=0; i