diff --git a/package.json b/package.json index a94b8c6..51e66ed 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,9 @@ "type": "module", "dependencies": { "@types/blessed": "^0.1.17", + "@types/bonjour": "^3.5.8", + "@types/uuid": "^8.3.0", + "bonjour": "^3.5.0", "chalk": "^4.1.1", "faker": "^5.5.3", "frigid": "^1.3.6", @@ -14,6 +17,7 @@ "printable-characters": "^1.0.42", "sisteransi": "^1.0.5", "typescript": "^4.3.2", + "uuid": "^8.3.2", "yarn": "^1.22.10" }, "scripts": { diff --git a/src/Game.ts b/src/Game.ts index 8aa735b..b7d7bbd 100644 --- a/src/Game.ts +++ b/src/Game.ts @@ -70,7 +70,6 @@ export class Game extends Frigid implements Tickable, Renderable { } render() { - log.info('=== [ render ] ==='); this.menu.render(); this.board.render(); } diff --git a/src/Menu.ts b/src/Menu.ts index bcdb489..3fa562b 100644 --- a/src/Menu.ts +++ b/src/Menu.ts @@ -8,6 +8,7 @@ import { ChopTreeTask } from './ChopTreeTask.js'; import { progressbar } from './Progressbar.js'; import { inspect } from 'util'; import { Popup } from './Popup.js'; +import mdns from './mDNS.js'; enum SubMenu { NONE = 'NONE', @@ -17,7 +18,7 @@ enum SubMenu { enum View { PAWNS = 'Pawns', INVENTORY = 'Inventory', - BUILDINGS = 'Buildings', + MULTIPLAYER = 'Multiplayer', }; export class Menu implements Renderable { @@ -142,10 +143,16 @@ export class Menu implements Renderable { switch(this.view) { case View.PAWNS: return this.renderPawns(); case View.INVENTORY: return this.renderInv(); + case View.MULTIPLAYER: return this.renderMultiplayer(); } })()}` } + renderMultiplayer() { + if(mdns.players.length === 0) return `{center}${tags.bright}${tags.black.fg}No friends online{/center}`; + return mdns.players.map(player => player.toString()).join('\n'); + } + renderInv() { return Game.current.inv.render(); } diff --git a/src/index.ts b/src/index.ts index b455d2f..352f568 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,7 @@ import { Game } from './Game.js'; import { render } from './UI.js'; -const game = Game.create('data/world01.json'); +const saveFile = process.argv[2]; + +const game = Game.create(saveFile || 'data/world01.json'); render(game); diff --git a/src/mDNS.ts b/src/mDNS.ts new file mode 100644 index 0000000..bd17fcd --- /dev/null +++ b/src/mDNS.ts @@ -0,0 +1,36 @@ + +import bonjour from 'bonjour'; +import log from './log.js'; +import os from 'os' +import * as uuid from 'uuid'; +const mdns = bonjour(); +const ID = uuid.v4(); +let devices = []; + +type Player = { + name: string, + address: string, + port: number +} + +const network = { + get players() { + return devices; + } +} + +export default network; + +export function ready() { + mdns.publish({ + type: 'dfi', + name: os.hostname() + '-' + ID, + port: 6969 + }); +} + +mdns.find({ + type: 'dfi' +}, (service) => { + log.info('found network device', service); +}); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 9343d7f..1bbddaf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8,16 +8,52 @@ dependencies: "@types/node" "*" +"@types/bonjour@^3.5.8": + version "3.5.8" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.8.tgz#f1dd61fa2c0c660f47624cb899f830229246bf59" + dependencies: + "@types/node" "*" + "@types/node@*": version "15.12.2" resolved "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz" +"@types/uuid@^8.3.0": + version "8.3.0" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.0.tgz#215c231dff736d5ba92410e6d602050cce7e273f" + ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" dependencies: color-convert "^2.0.1" +array-flatten@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + chalk@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz" @@ -35,6 +71,40 @@ color-name@~1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" +deep-equal@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" + dependencies: + is-arguments "^1.0.4" + is-date-object "^1.0.1" + is-regex "^1.0.4" + object-is "^1.0.1" + object-keys "^1.1.1" + regexp.prototype.flags "^1.2.0" + +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + dependencies: + object-keys "^1.0.12" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + +dns-packet@^1.3.1: + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + dependencies: + buffer-indexof "^1.0.0" + faker@^5.5.3: version "5.5.3" resolved "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz" @@ -43,22 +113,98 @@ frigid@^1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/frigid/-/frigid-1.3.6.tgz#45cc8a9ae855263c1a7255c5ccc500ba17097634" +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +get-intrinsic@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + has-flag@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + dependencies: + function-bind "^1.1.1" + +ip@^1.1.0: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + +is-arguments@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" + dependencies: + call-bind "^1.0.0" + +is-date-object@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" + +is-regex@^1.0.4: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.2" + logger@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/logger/-/logger-0.0.1.tgz#cb08171f8a6f6f674b8499dadf50bed4befb72c4" +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + +multicast-dns@^6.0.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + dependencies: + dns-packet "^1.3.1" + thunky "^1.0.2" + neo-blessed@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/neo-blessed/-/neo-blessed-0.2.0.tgz#30f9495fdd104494402b62c6273a9c9b82de4f2b" +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + printable-characters@^1.0.42: version "1.0.42" resolved "https://registry.yarnpkg.com/printable-characters/-/printable-characters-1.0.42.tgz#3f18e977a9bd8eb37fcc4ff5659d7be90868b3d8" +regexp.prototype.flags@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26" + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +safe-buffer@^5.0.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" @@ -69,10 +215,18 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" + typescript@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.2.tgz#399ab18aac45802d6f2498de5054fcbbe716a805" +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + yarn@^1.22.10: version "1.22.10" resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.22.10.tgz#c99daa06257c80f8fa2c3f1490724e394c26b18c"