From 2262c8d3230d1b3cffa4f5050ed0f0125c8821c1 Mon Sep 17 00:00:00 2001 From: "Alejandro U. Alvarez" Date: Mon, 2 Sep 2019 17:47:54 +0100 Subject: [PATCH 1/6] initial code for #10, testing different methods to call game servers directly --- .vscode/launch.json | 15 ++ package-lock.json | 18 ++ package.json | 4 +- src/index.ts | 16 +- src/lib/npx.ts | 41 ++++ yarn.lock | 488 -------------------------------------------- 6 files changed, 88 insertions(+), 494 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 src/lib/npx.ts delete mode 100644 yarn.lock diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..744fcc7 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Node", + "protocol": "inspector", + "sourceMaps": true, + "args": ["${workspaceFolder}/src/index.ts"], + "runtimeArgs": ["--nolazy", "-r", "ts-node/register"], + "cwd": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 0d8a246..239df1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,11 @@ "integrity": "sha512-Vs55Kq8F+OWvy1RLA31rT+cAyemzgm0EWNeax6BWF8H7QiiOYMJIdcwSDdm5LVgfEkoepsWkS+40+WNb7BUMbg==", "dev": true }, + "@types/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.1.tgz", + "integrity": "sha512-ZrJDWpvg75LTGX4XwuneY9s6bF3OeZcGTpoGh3zDV9ytzcHMFsRrMIaLBRJZQMBoGyKs6unBQfVdrLZiYfb1zQ==" + }, "active-x-obfuscator": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/active-x-obfuscator/-/active-x-obfuscator-0.0.1.tgz", @@ -271,6 +276,11 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -501,6 +511,14 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.2.5.tgz", "integrity": "sha1-tULCx29477NLIAsgF3Y0Mw/3ArY=" }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, "wordwrapjs": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.0.tgz", diff --git a/package.json b/package.json index ddf6b8b..101f1b3 100644 --- a/package.json +++ b/package.json @@ -30,10 +30,12 @@ "homepage": "https://github.com/socialgorithm/uabc#readme", "dependencies": { "@socialgorithm/model": "8.0.1", + "@types/which": "^1.3.1", "command-line-args": "^5.1.1", "command-line-usage": "^6.0.2", "socket.io-client": "^2.2.0", - "socket.io-proxy": "^1.0.3" + "socket.io-proxy": "^1.0.3", + "which": "^1.3.1" }, "devDependencies": { "@types/node": "^12.6.6", diff --git a/src/index.ts b/src/index.ts index 502d0fd..29f88a3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,13 +7,19 @@ * Server available at https://github.com/socialgorithm/tournament-server */ +import * as path from 'path'; + import parseOptions from "./cli/options"; import OnlineClient from "./client/OnlineClient"; +import npx from './lib/npx'; + +console.log('Running npx command'); +npx('@socialgorithm/tic-tac-toe-game-server'); -const options = parseOptions(); +// const options = parseOptions(); -console.info("+-----------------------------------------+"); -console.info("| Ultimate Algorithm Battle Client |"); -console.info("+-----------------------------------------+"); +// console.info("+-----------------------------------------+"); +// console.info("| Ultimate Algorithm Battle Client |"); +// console.info("+-----------------------------------------+"); -const client = new OnlineClient(options); +// const client = new OnlineClient(options); diff --git a/src/lib/npx.ts b/src/lib/npx.ts new file mode 100644 index 0000000..3a99283 --- /dev/null +++ b/src/lib/npx.ts @@ -0,0 +1,41 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import * as which from 'which'; + +// NPM Directories +let GLOBAL_NPM_BIN: string; +let GLOBAL_NPM_PATH: string; + +const throwNotFoundError = () => { + const err: any = new Error("Cannot find module 'npm'") + err.code = 'MODULE_NOT_FOUND' + throw err; +}; + +try { + GLOBAL_NPM_BIN = process.env.GLOBAL_NPM_BIN || fs.realpathSync(which.sync('npm')); +} catch (e) { + console.error(e); + throwNotFoundError(); +} + +GLOBAL_NPM_PATH = process.env.GLOBAL_NPM_PATH || path.join( + GLOBAL_NPM_BIN, + process.platform === 'win32' ? '../node_modules/npm' : '../..' +); + +export default (npmPackage: string, args?: string) => { + try { + const npx = require(GLOBAL_NPM_PATH + '/node_modules/libnpx'); + const NPM_PATH = path.join(GLOBAL_NPM_PATH, 'bin', 'npm-cli.js') + const parsedArgs = npx.parseArgs(['npx', '', npmPackage, args], NPM_PATH); + + return npx(parsedArgs); + } catch (e) { + console.error(e); + if (e.code !== 'MODULE_NOT_FOUND') { + throw e; + } + } + throwNotFoundError(); +}; diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 58d86d5..0000000 --- a/yarn.lock +++ /dev/null @@ -1,488 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@socialgorithm/model@8.0.1": - version "8.0.1" - resolved "https://registry.yarnpkg.com/@socialgorithm/model/-/model-8.0.1.tgz#5038a508d0118374d4147fd98db2385852856490" - integrity sha512-wkJ7VNZ3Bq7MnVwSEwiU8wvnwXkEQkeJevbCOB/hFSQV5Yo9iP14yCTkwCglakgCp09eXD8qkM10gvX1w35HaA== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= - -"@types/node@^12.6.6": - version "12.6.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.6.6.tgz#831587377c35bb28fa33b6fe5f849a26a3f4a412" - integrity sha512-SMgj3x28MkJyHdWaMv/g/ca3LYDi5gR7O8mX0VKazvFOnmlDXctSEdd/8jfSqozjKFK1R9If1QZWkafX7yQTpA== - -"@types/socket.io-client@^1.4.32": - version "1.4.32" - resolved "https://registry.yarnpkg.com/@types/socket.io-client/-/socket.io-client-1.4.32.tgz#988a65a0386c274b1c22a55377fab6a30789ac14" - integrity sha512-Vs55Kq8F+OWvy1RLA31rT+cAyemzgm0EWNeax6BWF8H7QiiOYMJIdcwSDdm5LVgfEkoepsWkS+40+WNb7BUMbg== - -active-x-obfuscator@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/active-x-obfuscator/-/active-x-obfuscator-0.0.1.tgz#089b89b37145ff1d9ec74af6530be5526cae1f1a" - integrity sha1-CJuJs3FF/x2ex0r2UwvlUmyuHxo= - dependencies: - zeparser "0.0.5" - -after@0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" - integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -arg@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.1.tgz#485f8e7c390ce4c5f78257dbea80d4be11feda4c" - integrity sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw== - -array-back@^3.0.1, array-back@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" - integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== - -arraybuffer.slice@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" - integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== - -async-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== - -backo2@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= - -base64-arraybuffer@0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" - integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= - -better-assert@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" - integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= - dependencies: - callsite "1.0.0" - -blob@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" - integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -callsite@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" - integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -command-line-args@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.1.1.tgz#88e793e5bb3ceb30754a86863f0401ac92fd369a" - integrity sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg== - dependencies: - array-back "^3.0.1" - find-replace "^3.0.0" - lodash.camelcase "^4.3.0" - typical "^4.0.0" - -command-line-usage@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.0.2.tgz#b130e3495ae743ce4833e1c9373bbb0898275dda" - integrity sha512-Jr9RQM43qWDwpRJOa0lgZw0LhiU8tgOqoR+xxIcb3eT5vFZi69fBWUODMSBtGUYI1qTlElPl3txFQY6rChVuXQ== - dependencies: - array-back "^3.1.0" - chalk "^2.4.2" - table-layout "^1.0.0" - typical "^5.1.0" - -commander@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.1.0.tgz#d121bbae860d9992a3d517ba96f56588e47c6781" - integrity sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E= - -component-bind@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= - -component-emitter@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= - -component-inherit@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" - integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= - -debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -deep-extend@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deepmerge@^2.0.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.2.1.tgz#5d3ff22a01c00f645405a2fbc17d0778a1801170" - integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA== - -diff@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.1.tgz#0c667cb467ebbb5cea7f14f135cc2dba7780a8ff" - integrity sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q== - -engine.io-client@~3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.3.2.tgz#04e068798d75beda14375a264bb3d742d7bc33aa" - integrity sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ== - dependencies: - component-emitter "1.2.1" - component-inherit "0.0.3" - debug "~3.1.0" - engine.io-parser "~2.1.1" - has-cors "1.1.0" - indexof "0.0.1" - parseqs "0.0.5" - parseuri "0.0.5" - ws "~6.1.0" - xmlhttprequest-ssl "~1.5.4" - yeast "0.1.2" - -engine.io-parser@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" - integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== - dependencies: - after "0.8.2" - arraybuffer.slice "~0.0.7" - base64-arraybuffer "0.1.5" - blob "0.0.5" - has-binary2 "~1.0.2" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -find-replace@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" - integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== - dependencies: - array-back "^3.0.1" - -has-binary2@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" - integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== - dependencies: - isarray "2.0.1" - -has-cors@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= - -isarray@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" - integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - -make-error@^1.1.1: - version "1.3.5" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" - integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== - -minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -nan@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-1.0.0.tgz#ae24f8850818d662fcab5acf7f3b95bfaa2ccf38" - integrity sha1-riT4hQgY1mL8q1rPfzuVv6oszzg= - -object-component@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" - integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= - -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - integrity sha1-7CLTEoBrtT5zF3Pnza788cZDEo8= - -parseqs@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" - integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= - dependencies: - better-assert "~1.0.0" - -parseuri@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" - integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= - dependencies: - better-assert "~1.0.0" - -reduce-flatten@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" - integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== - -socket.io-client@0.9.16: - version "0.9.16" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-0.9.16.tgz#4da7515c5e773041d1b423970415bcc430f35fc6" - integrity sha1-TadRXF53MEHRtCOXBBW8xDDzX8Y= - dependencies: - active-x-obfuscator "0.0.1" - uglify-js "1.2.5" - ws "0.4.x" - xmlhttprequest "1.4.2" - -socket.io-client@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.2.0.tgz#84e73ee3c43d5020ccc1a258faeeb9aec2723af7" - integrity sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA== - dependencies: - backo2 "1.0.2" - base64-arraybuffer "0.1.5" - component-bind "1.0.0" - component-emitter "1.2.1" - debug "~3.1.0" - engine.io-client "~3.3.1" - has-binary2 "~1.0.2" - has-cors "1.1.0" - indexof "0.0.1" - object-component "0.0.3" - parseqs "0.0.5" - parseuri "0.0.5" - socket.io-parser "~3.3.0" - to-array "0.1.4" - -socket.io-parser@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" - integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng== - dependencies: - component-emitter "1.2.1" - debug "~3.1.0" - isarray "2.0.1" - -socket.io-proxy@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/socket.io-proxy/-/socket.io-proxy-1.0.3.tgz#f4e8b46ff4d6da5e4a77a02fc143dbbc04b521fe" - integrity sha1-9Oi0b/TW2l5Kd6AvwUPbvAS1If4= - dependencies: - socket.io-client "0.9.16" - -source-map-support@^0.5.6: - version "0.5.12" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" - integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -table-layout@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.0.tgz#fbca8a8c0e07e9de97591643f2d25a7e32008d25" - integrity sha512-o8V8u943KXX9gLNK/Ss1n6Nn4YhpyY/RRnp3hKv/zTA+SXYiQnzJQlR8CZQf1RqYqgkiWMJ54Mv+Vq9Kfzxz1A== - dependencies: - array-back "^3.1.0" - deep-extend "~0.6.0" - typical "^5.0.0" - wordwrapjs "^4.0.0" - -tinycolor@0.x: - version "0.0.1" - resolved "https://registry.yarnpkg.com/tinycolor/-/tinycolor-0.0.1.tgz#320b5a52d83abb5978d81a3e887d4aefb15a6164" - integrity sha1-MgtaUtg6u1l42Bo+iH1K77FaYWQ= - -to-array@0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" - integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= - -ts-node@^8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.3.0.tgz#e4059618411371924a1fb5f3b125915f324efb57" - integrity sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ== - dependencies: - arg "^4.1.0" - diff "^4.0.1" - make-error "^1.1.1" - source-map-support "^0.5.6" - yn "^3.0.0" - -tsconfig-paths@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.8.0.tgz#4e34202d5b41958f269cf56b01ed95b853d59f72" - integrity sha512-zZEYFo4sjORK8W58ENkRn9s+HmQFkkwydDG7My5s/fnfr2YYCaiyXe/HBUcIgU8epEKOXwiahOO+KZYjiXlWyQ== - dependencies: - "@types/json5" "^0.0.29" - deepmerge "^2.0.1" - json5 "^1.0.1" - minimist "^1.2.0" - strip-bom "^3.0.0" - -typescript@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" - integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== - -typical@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" - integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== - -typical@^5.0.0, typical@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-5.1.0.tgz#7116ca103caf2574985fc84fbaa8fd0ee5ea1684" - integrity sha512-t5Ik8UAwBal1P1XzuVE4dc+RYQZicLUGJdvqr/vdqsED7SQECgsGBylldSsfWZL7RQjxT3xhQcKHWhLaVSR6YQ== - -uglify-js@1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-1.2.5.tgz#b542c2c76f78efb34b200b20177634330ff702b6" - integrity sha1-tULCx29477NLIAsgF3Y0Mw/3ArY= - -wordwrapjs@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.0.tgz#9aa9394155993476e831ba8e59fb5795ebde6800" - integrity sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ== - dependencies: - reduce-flatten "^2.0.0" - typical "^5.0.0" - -ws@0.4.x: - version "0.4.32" - resolved "https://registry.yarnpkg.com/ws/-/ws-0.4.32.tgz#787a6154414f3c99ed83c5772153b20feb0cec32" - integrity sha1-eHphVEFPPJntg8V3IVOyD+sM7DI= - dependencies: - commander "~2.1.0" - nan "~1.0.0" - options ">=0.0.5" - tinycolor "0.x" - -ws@~6.1.0: - version "6.1.4" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" - integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA== - dependencies: - async-limiter "~1.0.0" - -xmlhttprequest-ssl@~1.5.4: - version "1.5.5" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" - integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= - -xmlhttprequest@1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.4.2.tgz#01453a1d9bed1e8f172f6495bbf4c8c426321500" - integrity sha1-AUU6HZvtHo8XL2SVu/TIxCYyFQA= - -yeast@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= - -yn@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.0.tgz#fcbe2db63610361afcc5eb9e0ac91e976d046114" - integrity sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg== - -zeparser@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/zeparser/-/zeparser-0.0.5.tgz#03726561bc268f2e5444f54c665b7fd4a8c029e2" - integrity sha1-A3JlYbwmjy5URPVMZlt/1KjAKeI= From a910cabca1d2050e604019b228d50476b379582f Mon Sep 17 00:00:00 2001 From: "Alejandro U. Alvarez" Date: Tue, 3 Sep 2019 08:58:06 +0100 Subject: [PATCH 2/6] setup linter, and initial practice mode client --- package-lock.json | 248 ++++++++++++++++++++++++++++++++++- package.json | 4 +- src/cli/options.ts | 72 +++++++--- src/client/Client.ts | 11 +- src/client/OnlineClient.ts | 36 ++--- src/client/PracticeClient.ts | 115 ++++++++++++++++ src/index.ts | 24 ++-- src/lib/connect.ts | 14 ++ src/lib/npx.ts | 41 ------ src/lib/practice.ts | 7 + src/load-tester.ts | 4 +- src/logger/ConsoleLogger.ts | 2 +- src/logger/FileLogger.ts | 12 +- src/player/Executable.ts | 5 +- 14 files changed, 483 insertions(+), 112 deletions(-) create mode 100644 src/client/PracticeClient.ts create mode 100644 src/lib/connect.ts delete mode 100644 src/lib/npx.ts create mode 100644 src/lib/practice.ts diff --git a/package-lock.json b/package-lock.json index 239df1c..fd73cd2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,26 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } + }, "@socialgorithm/model": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@socialgorithm/model/-/model-8.0.1.tgz", @@ -30,7 +50,8 @@ "@types/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.1.tgz", - "integrity": "sha512-ZrJDWpvg75LTGX4XwuneY9s6bF3OeZcGTpoGh3zDV9ytzcHMFsRrMIaLBRJZQMBoGyKs6unBQfVdrLZiYfb1zQ==" + "integrity": "sha512-ZrJDWpvg75LTGX4XwuneY9s6bF3OeZcGTpoGh3zDV9ytzcHMFsRrMIaLBRJZQMBoGyKs6unBQfVdrLZiYfb1zQ==", + "dev": true }, "active-x-obfuscator": { "version": "0.0.1", @@ -59,6 +80,15 @@ "integrity": "sha512-SlmP3fEA88MBv0PypnXZ8ZfJhwmDeIE3SP71j37AiXQBXYosPV0x6uISAaHYSlSVhmHOVkomen0tbGk6Anlebw==", "dev": true }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, "array-back": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", @@ -79,6 +109,12 @@ "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, "base64-arraybuffer": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", @@ -97,12 +133,28 @@ "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, "callsite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", @@ -180,6 +232,12 @@ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -240,6 +298,18 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, "find-replace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", @@ -248,6 +318,26 @@ "array-back": "^3.0.1" } }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "has-binary2": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", @@ -271,6 +361,22 @@ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, "isarray": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", @@ -281,6 +387,22 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -301,12 +423,38 @@ "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", "dev": true }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -322,6 +470,15 @@ "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, "options": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", @@ -343,11 +500,38 @@ "better-assert": "~1.0.0" } }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, "reduce-flatten": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==" }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "socket.io-client": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.2.0.tgz", @@ -427,6 +611,12 @@ "source-map": "^0.6.0" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -495,6 +685,56 @@ "strip-bom": "^3.0.0" } }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + }, + "tslint": { + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.19.0.tgz", + "integrity": "sha512-1LwwtBxfRJZnUvoS9c0uj8XQtAnyhWr9KlNvDIdB+oXyT+VpsOAaEhEgKi1HrZ8rq0ki/AAnbGSv4KM6/AfVZw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.0" + }, + "dependencies": { + "commander": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "typescript": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", @@ -535,6 +775,12 @@ } } }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, "ws": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", diff --git a/package.json b/package.json index 101f1b3..b2d1c5e 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "build": "tsc", "build:watch": "tsc --watch", "start": "ts-node -r tsconfig-paths/register --files src/index.ts", + "lint": "tslint --fix -t stylish --project '.'", "test": "echo 'No tests available'" }, "repository": { @@ -30,7 +31,6 @@ "homepage": "https://github.com/socialgorithm/uabc#readme", "dependencies": { "@socialgorithm/model": "8.0.1", - "@types/which": "^1.3.1", "command-line-args": "^5.1.1", "command-line-usage": "^6.0.2", "socket.io-client": "^2.2.0", @@ -40,8 +40,10 @@ "devDependencies": { "@types/node": "^12.6.6", "@types/socket.io-client": "^1.4.32", + "@types/which": "^1.3.1", "ts-node": "^8.3.0", "tsconfig-paths": "^3.8.0", + "tslint": "^5.19.0", "typescript": "^3.5.3" }, "nyc": { diff --git a/src/cli/options.ts b/src/cli/options.ts index a809b3a..604c859 100644 --- a/src/cli/options.ts +++ b/src/cli/options.ts @@ -4,9 +4,8 @@ const commandLineArgs = require("command-line-args"); const getUsage = require("command-line-usage"); const info = require("../../package.json"); -// type safe options export interface IOptions { - file?: string; + files?: string[]; token?: string; lobby?: string; host?: string; @@ -15,16 +14,19 @@ export interface IOptions { help?: boolean; verbose?: boolean; version?: boolean; + practice?: string; + games?: number; } const optionDefinitions = [ { - name: "file", + name: "files", alias: "f", type: String, - typeLabel: "{underline file [file]}", + typeLabel: "{underline file}", defaultOption: true, - description: "Path to the client executable/s. If placed at the end, you don't have to put -f", + multiple: true, + description: "Path to the client executable/s. If placed at the end, you don't have to put -f. You can pass multiple executables when in practice mode.", group: "main", }, { @@ -40,14 +42,14 @@ const optionDefinitions = [ alias: "l", type: String, typeLabel: "{underline lobby}", - description: "Identification token for the lobby you want to play in", + description: "The name of the lobby you want to play in", group: "online", }, { name: "host", type: String, typeLabel: "{underline host:port}", - description: "host:port where the client should connect to. You can specify https:// as well if SSL is required", + description: "host:port where the client should connect to. You can specify https:// as well if SSL is required. Also used by practice mode to override the local game server port.", group: "online", }, { @@ -60,29 +62,43 @@ const optionDefinitions = [ name: "log", type: String, typeLabel: "{underline [file]}", - description: "File where game logs should be stored, defaults to `uabc-[date].log` in the current directory if no file name is specified", - group: "main", + description: "Turn on file logging. It accepts an optional log filename if you want to override the default (`uabc-[date].log` in the current directory)", + group: "helper", }, { - name: "help", - alias: "h", + name: "verbose", type: Boolean, - description: "Print this guide", + description: "Turn on console logging.", group: "helper", }, { name: "version", alias: "v", type: Boolean, - description: "Display the client version", + description: "Displays the uabc client version", group: "helper", }, { - name: "verbose", + name: "help", + alias: "h", type: Boolean, - description: "Log everything to the console", + description: "Print this guide", group: "helper", }, + { + name: "practice", + alias: "p", + type: String, + typeLabel: "{underline game}", + description: "Use uabc in practice mode (playing locally), you must specify here what game to use", + group: "practice", + }, + { + name: "games", + type: Number, + description: "Number of games to play in practice mode (Defaults to 10)", + group: "practice", + }, ]; const sections = [ @@ -103,6 +119,11 @@ const sections = [ optionList: optionDefinitions, group: ["online"], }, + { + header: "Practice (Offline Games)", + optionList: optionDefinitions, + group: ["practice"], + }, { header: "Helpers", optionList: optionDefinitions, @@ -112,7 +133,7 @@ const sections = [ header: "Synopsis", content: [ "$ uabc {bold --host} {underline host:1234} {bold -l} {underline lobby} {bold -t} {underline token} {bold -f} {underline path/to/client/executable}", - "$ uabc {bold --log} {bold -p} {bold -f} {underline path/to/client/executable}", + "$ uabc {bold --log} {bold --practice} {underline tic-tac-toe} {bold -f} {underline \"python player1.py\"} {underline \"node player2.js\"}", "$ uabc {bold --help}", ], }, @@ -127,8 +148,10 @@ export default function parseInput(): IOptions { } }); + console.log("files", options.file); + function isEmpty(map: any) { - return Object.entries(map).length === 0 && map.constructor === Object + return Object.entries(map).length === 0 && map.constructor === Object; } if (options.version) { @@ -136,15 +159,26 @@ export default function parseInput(): IOptions { process.exit(0); } - if (options.help || isEmpty(options) || !options.token) { + const practiceMode = !!options.practice; + + if (options.help || isEmpty(options) || (!options.token && !practiceMode)) { console.log(getUsage(sections)); process.exit(0); } + if (practiceMode && options.practice.length < 1) { + error("You must specify a game when in practice mode."); + process.exit(-1); + } + if (!options.file || options.file.length < 1) { - console.error("uabc error: You must specify an executable.", options); + error("You must specify an executable."); process.exit(-1); } return options; } + +function error(message: string) { + console.error("uabc error:", message); +} diff --git a/src/client/Client.ts b/src/client/Client.ts index 8b79ee2..b78a1b2 100644 --- a/src/client/Client.ts +++ b/src/client/Client.ts @@ -5,8 +5,8 @@ import ExecutablePlayer from "../player/Executable"; import Player from "../player/Player"; export default abstract class Client { - protected playerA: Player; - protected playerB: Player; + protected localPlayer: Player; + protected otherPlayers: Player[] = []; protected firstPlayer: number; protected options: IOptions; protected size: number; @@ -33,7 +33,8 @@ export default abstract class Client { this.loggers.file = new FileLogger(logName); } - this.playerA = new ExecutablePlayer(options.file, this.onPlayerAData.bind(this)); + // Initialise the "main" player, always the first one + this.localPlayer = new ExecutablePlayer(options.files[0], this.onLocalPlayerData.bind(this)); } protected log(writer: string, message: string) { @@ -45,6 +46,6 @@ export default abstract class Client { } } - protected abstract onPlayerAData(data: string): void; - protected abstract onPlayerBData(data: string): void; + protected abstract onLocalPlayerData(data: string): void; + protected abstract onOtherPlayersData(data: string): void; } diff --git a/src/client/OnlineClient.ts b/src/client/OnlineClient.ts index 3b17cff..ea93e9a 100644 --- a/src/client/OnlineClient.ts +++ b/src/client/OnlineClient.ts @@ -1,8 +1,7 @@ -import * as io from "socket.io-client"; -import * as ioProxy from "socket.io-proxy"; - import { EventName, LegacyEvents, Messages } from "@socialgorithm/model"; + import { IOptions } from "../cli/options"; +import connect from "../lib/connect"; import OnlinePlayer from "../player/Online"; import Client from "./Client"; @@ -11,7 +10,7 @@ import Client from "./Client"; * It will connect to the server and send all player commands over the socket */ export default class OnlineClient extends Client { - protected playerB: OnlinePlayer; + protected otherPlayers: OnlinePlayer[]; /** * Main socket for communication with the tournament server @@ -27,7 +26,7 @@ export default class OnlineClient extends Client { super(options); console.log(`Starting Online Mode`); - console.log(`Player A: ${this.options.file}`); + console.log(`Local Player: ${this.options.files[0]}`); console.log(); console.log("Waiting for server..."); @@ -43,7 +42,7 @@ export default class OnlineClient extends Client { query: "token=" + options.token, }; - this.tournamentServerSocket = this.connect(host, socketOptions); + this.tournamentServerSocket = connect(host, options, socketOptions); this.tournamentServerSocket.on("error", (data: any) => { console.error("Error in socket", data); @@ -84,7 +83,7 @@ export default class OnlineClient extends Client { this.gameServerSocket.disconnect(); } - this.gameServerSocket = this.connect(handoffMessage.gameServerAddress, gameServerSocketOptions); + this.gameServerSocket = connect(handoffMessage.gameServerAddress, options, gameServerSocketOptions); this.gameServerSocket.on("error", (data: any) => { console.error("Error in game server socket", data); @@ -98,10 +97,10 @@ export default class OnlineClient extends Client { console.log(`Disconnected from game server (token: ${handoffMessage.token})`); }); - if (!this.playerB) { - this.playerB = new OnlinePlayer(this.gameServerSocket, this.onPlayerBData.bind(this)); + if (!this.otherPlayers[0]) { + this.otherPlayers[0] = new OnlinePlayer(this.gameServerSocket, this.onOtherPlayersData.bind(this)); } else { - this.playerB.setSocket(this.gameServerSocket); + this.otherPlayers[0].setSocket(this.gameServerSocket); } }); @@ -114,7 +113,7 @@ export default class OnlineClient extends Client { } } - public onPlayerAData(payload: string) { + public onLocalPlayerData(payload: string) { this.log("A", payload); const message: Messages.PlayerToGameMessage = { payload, @@ -124,19 +123,8 @@ export default class OnlineClient extends Client { } } - public onPlayerBData(data: string) { + public onOtherPlayersData(data: string) { this.log("B", data); - this.playerA.onDataFromOtherPlayers(data); - } - - private connect(host: string, socketOptions?: any): SocketIOClient.Socket { - if (this.options.proxy || process.env.http_proxy) { - if (this.options.proxy) { - ioProxy.init(this.options.proxy); - } - return ioProxy.connect(host, socketOptions); - } else { - return io.connect(host, socketOptions); - } + this.otherPlayers[0].onDataFromOtherPlayers(data); } } diff --git a/src/client/PracticeClient.ts b/src/client/PracticeClient.ts new file mode 100644 index 0000000..6a0d244 --- /dev/null +++ b/src/client/PracticeClient.ts @@ -0,0 +1,115 @@ +import { ChildProcess } from "child_process"; + +import { IOptions } from "../cli/options"; +import connect from "../lib/connect"; +import exec from "../lib/exec"; +import { GAME_SERVER_BIN } from "../lib/practice"; +import FileLogger from "../logger/FileLogger"; +import ExecutablePlayer from "../player/Executable"; +import Client from "./Client"; + +export default class PracticeClient extends Client { + protected otherPlayers: ExecutablePlayer[]; + + private gameServerProcess: ChildProcess; + private gameServerSocket: SocketIOClient.Socket; + private gameServerLogger: FileLogger; + + constructor(options: IOptions) { + super(options); + + console.log(`Starting Practice Mode: ${options.practice}`); + + if (this.options.log) { + this.gameServerLogger = new FileLogger("gameServer.log"); + } + + this.initGameServer(); + + options.files.forEach(file => { + this.otherPlayers.push( + new ExecutablePlayer(file, this.onOtherPlayersData.bind(this)), + ); + }); + + console.log(); + console.log("Connecting to local game server..."); + console.log(); + + this.initGameServerConnection(); + + // Start a match and games, using all the local players + } + + protected onLocalPlayerData(data: string): void { + throw new Error("Method not implemented."); + } + + protected onOtherPlayersData(data: string): void { + throw new Error("Method not implemented."); + } + + private initGameServer() { + try { + const gameServerBin = GAME_SERVER_BIN[this.options.practice]; + + if (!gameServerBin) { + throw new Error(`Unknown game "${this.options.practice}"`); + } + + this.gameServerProcess = exec(gameServerBin); + + this.gameServerProcess.on("close", (code: string) => { + console.log(`uabc> game server exited with code ${code}`); + }); + + if (this.options.log) { + this.gameServerProcess.stdout.on("data", (data: string) => { + this.gameServerLogger.log(data); + }); + + this.gameServerProcess.stderr.on("data", (data: string) => { + this.gameServerLogger.log("error", data); + }); + } + } catch (e) { + console.error("uabc error:", e); + process.exit(-1); + } + } + + private initGameServerConnection() { + try { + let host = this.options.host || "localhost:5433"; + if (host.substr(0, 4) !== "http") { + host = "http://" + host; + } + const socketOptions = { + query: "token=practice", + }; + + this.gameServerSocket = connect(host, this.options, socketOptions); + + this.gameServerSocket.on("error", (data: any) => { + console.error("Error in socket", data); + }); + + this.gameServerSocket.on("connect", () => { + console.log(`Connected! Initiating games...`); + // TODO: Do something here + }); + + this.gameServerSocket.on("disconnect", () => { + console.log(`Disconnected from game server`); + }); + + this.gameServerSocket.on("exception", (data: any) => { + console.error(data.error); + process.exit(-1); + }); + } catch (e) { + console.error("uabc error:", e); + process.exit(-1); + } + } +} diff --git a/src/index.ts b/src/index.ts index 29f88a3..a6a8c33 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,22 +4,22 @@ * It will execute a given binary and communicate with it over stdin/stdout, * then send the commands to a tournament/game server. * - * Server available at https://github.com/socialgorithm/tournament-server + * Documentation https://socialgorithm.org/docs + * Server https://github.com/socialgorithm/tournament-server */ -import * as path from 'path'; - import parseOptions from "./cli/options"; import OnlineClient from "./client/OnlineClient"; -import npx from './lib/npx'; - -console.log('Running npx command'); -npx('@socialgorithm/tic-tac-toe-game-server'); +import PracticeClient from "./client/PracticeClient"; -// const options = parseOptions(); +const options = parseOptions(); -// console.info("+-----------------------------------------+"); -// console.info("| Ultimate Algorithm Battle Client |"); -// console.info("+-----------------------------------------+"); +console.info("+-----------------------------------------+"); +console.info("| Ultimate Algorithm Battle Client |"); +console.info("+-----------------------------------------+"); -// const client = new OnlineClient(options); +if (options.practice) { + const client = new PracticeClient(options); +} else { + const client = new OnlineClient(options); +} diff --git a/src/lib/connect.ts b/src/lib/connect.ts new file mode 100644 index 0000000..a596b60 --- /dev/null +++ b/src/lib/connect.ts @@ -0,0 +1,14 @@ +import * as ioProxy from "socket.io-proxy"; + +import { IOptions } from "../cli/options"; + +export default (host: string, options: IOptions, socketOptions?: any): SocketIOClient.Socket => { + if (options.proxy || process.env.http_proxy) { + if (options.proxy) { + ioProxy.init(options.proxy); + } + return ioProxy.connect(host, socketOptions); + } else { + return io.connect(host, socketOptions); + } +}; diff --git a/src/lib/npx.ts b/src/lib/npx.ts deleted file mode 100644 index 3a99283..0000000 --- a/src/lib/npx.ts +++ /dev/null @@ -1,41 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import * as which from 'which'; - -// NPM Directories -let GLOBAL_NPM_BIN: string; -let GLOBAL_NPM_PATH: string; - -const throwNotFoundError = () => { - const err: any = new Error("Cannot find module 'npm'") - err.code = 'MODULE_NOT_FOUND' - throw err; -}; - -try { - GLOBAL_NPM_BIN = process.env.GLOBAL_NPM_BIN || fs.realpathSync(which.sync('npm')); -} catch (e) { - console.error(e); - throwNotFoundError(); -} - -GLOBAL_NPM_PATH = process.env.GLOBAL_NPM_PATH || path.join( - GLOBAL_NPM_BIN, - process.platform === 'win32' ? '../node_modules/npm' : '../..' -); - -export default (npmPackage: string, args?: string) => { - try { - const npx = require(GLOBAL_NPM_PATH + '/node_modules/libnpx'); - const NPM_PATH = path.join(GLOBAL_NPM_PATH, 'bin', 'npm-cli.js') - const parsedArgs = npx.parseArgs(['npx', '', npmPackage, args], NPM_PATH); - - return npx(parsedArgs); - } catch (e) { - console.error(e); - if (e.code !== 'MODULE_NOT_FOUND') { - throw e; - } - } - throwNotFoundError(); -}; diff --git a/src/lib/practice.ts b/src/lib/practice.ts new file mode 100644 index 0000000..51f0eb5 --- /dev/null +++ b/src/lib/practice.ts @@ -0,0 +1,7 @@ +type GameServerList = { + [key: string]: string, +}; + +export const GAME_SERVER_BIN: GameServerList = { + "tic-tac-toe": "npx @socialgorithm/tic-tac-toe-game-server", +}; diff --git a/src/load-tester.ts b/src/load-tester.ts index d33ba4d..7b3408a 100755 --- a/src/load-tester.ts +++ b/src/load-tester.ts @@ -25,7 +25,7 @@ for (let lobbyNumber = 1; lobbyNumber <= numberOfLobbies; lobbyNumber++) { host: "localhost:3141", lobby: lobbyName, token: playerName, - file: "node ../tic-tac-toe-player/run_player.js random", + files: ["node ../tic-tac-toe-player/run_player.js random"], }); } @@ -38,7 +38,7 @@ for (let lobbyNumber = 1; lobbyNumber <= numberOfLobbies; lobbyNumber++) { autoPlay: true, numberOfGames: 50, timeout: 100, - type: "DoubleElimination" + type: "DoubleElimination", }, players, }); diff --git a/src/logger/ConsoleLogger.ts b/src/logger/ConsoleLogger.ts index 5dd95d5..b802914 100644 --- a/src/logger/ConsoleLogger.ts +++ b/src/logger/ConsoleLogger.ts @@ -11,7 +11,7 @@ export default class ConsoleLogger extends Logger { console.log("Verbose mode"); } - public log(writer: string, data: string): void { + public log(writer: string, data?: string): void { const time = (new Date()).toTimeString().substr(0, 8); console.log(`[${time} ${writer} ${data}]`); } diff --git a/src/logger/FileLogger.ts b/src/logger/FileLogger.ts index dcf4d79..94a7a86 100644 --- a/src/logger/FileLogger.ts +++ b/src/logger/FileLogger.ts @@ -16,7 +16,7 @@ export default class FileLogger extends Logger { this.file = file; } else { const currentdate = new Date(); - this.file = "UTTT_" + currentdate.getDate() + "-" + this.file = "uabc_" + currentdate.getDate() + "-" + (currentdate.getMonth() + 1) + "-" + currentdate.getFullYear() + "_" + currentdate.getHours() + "-" @@ -28,8 +28,14 @@ export default class FileLogger extends Logger { console.log(`Logging to file: ${this.file}`); } - public log(writer: string, text: string): void { + public log(writer: string, text?: string): void { const time = (new Date()).toTimeString().substr(0, 8); - fs.appendFileSync(this.file, `[${time} ${writer}] ${text}${os.EOL}`); + let prefix = `[${time} ${writer}]`; + let data = text; + if (!text) { + prefix = `[${time}]`; + data = writer; + } + fs.appendFileSync(this.file, `${prefix} ${data}${os.EOL}`); } } diff --git a/src/player/Executable.ts b/src/player/Executable.ts index 3451d8e..0f6927d 100644 --- a/src/player/Executable.ts +++ b/src/player/Executable.ts @@ -1,5 +1,4 @@ import { ChildProcess } from "child_process"; -import * as os from "os"; import exec from "../lib/exec"; import Player from "./Player"; @@ -25,7 +24,7 @@ export default class ExecutablePlayer extends Player { }); this.playerProcess.stdout.on("data", (data: string) => { - const lines = data.split('\n'); + const lines = data.split("\n"); const regex = /^(send:).*/; const output: string[] = []; const gameData: string[] = []; @@ -58,6 +57,6 @@ export default class ExecutablePlayer extends Player { } public onDataFromOtherPlayers(data: string) { - this.playerProcess.stdin.write(data + '\n'); + this.playerProcess.stdin.write(data + "\n"); } } From 28d08f665c300dfd6b456015548488c21b7567f2 Mon Sep 17 00:00:00 2001 From: "Alejandro U. Alvarez" Date: Tue, 3 Sep 2019 09:33:29 +0100 Subject: [PATCH 3/6] practice mode starts and connects to game servers --- dist/cli/options.js | 4 +-- src/cli/options.ts | 8 +++--- src/client/PracticeClient.ts | 50 +++++++++++++++++++++++------------- src/lib/connect.ts | 1 + 4 files changed, 38 insertions(+), 25 deletions(-) diff --git a/dist/cli/options.js b/dist/cli/options.js index 16bc586..1b5df1f 100644 --- a/dist/cli/options.js +++ b/dist/cli/options.js @@ -120,8 +120,8 @@ function parseInput() { console.log(getUsage(sections)); process.exit(0); } - if (!options.file || options.file.length < 1) { - console.error("uabc error: You must specify an executable.", options); + if (!options.files || options.files.length < 1 || options.files[0].length < 1) { + console.error("uabc error: You must specify at least one executable. See the --files option.", options); process.exit(-1); } return options; diff --git a/src/cli/options.ts b/src/cli/options.ts index 604c859..ccad19f 100644 --- a/src/cli/options.ts +++ b/src/cli/options.ts @@ -148,8 +148,6 @@ export default function parseInput(): IOptions { } }); - console.log("files", options.file); - function isEmpty(map: any) { return Object.entries(map).length === 0 && map.constructor === Object; } @@ -171,10 +169,10 @@ export default function parseInput(): IOptions { process.exit(-1); } - if (!options.file || options.file.length < 1) { - error("You must specify an executable."); + if (!options.files || options.files.length < 1 || options.files[0].length < 1) { + error("You must specify at least one executable. See the --files option."); process.exit(-1); - } +} return options; } diff --git a/src/client/PracticeClient.ts b/src/client/PracticeClient.ts index 6a0d244..b844d8f 100644 --- a/src/client/PracticeClient.ts +++ b/src/client/PracticeClient.ts @@ -26,19 +26,21 @@ export default class PracticeClient extends Client { this.initGameServer(); - options.files.forEach(file => { - this.otherPlayers.push( - new ExecutablePlayer(file, this.onOtherPlayersData.bind(this)), - ); - }); + setTimeout(() => { + options.files.forEach(file => { + this.otherPlayers.push( + new ExecutablePlayer(file, this.onOtherPlayersData.bind(this)), + ); + }); - console.log(); - console.log("Connecting to local game server..."); - console.log(); + console.log(); + console.log("Connecting to local game server..."); + console.log(); - this.initGameServerConnection(); + this.initGameServerConnection(); - // Start a match and games, using all the local players + // Start a match and games, using all the local players + }, 3000); } protected onLocalPlayerData(data: string): void { @@ -57,21 +59,33 @@ export default class PracticeClient extends Client { throw new Error(`Unknown game "${this.options.practice}"`); } + console.log("Running game server: ", gameServerBin); + this.gameServerProcess = exec(gameServerBin); + console.log("Started game server"); + this.gameServerProcess.on("close", (code: string) => { console.log(`uabc> game server exited with code ${code}`); }); - if (this.options.log) { - this.gameServerProcess.stdout.on("data", (data: string) => { - this.gameServerLogger.log(data); - }); + this.gameServerProcess.stdout.on("data", (data: string) => { + console.log("gameServer>", data); + }); + + this.gameServerProcess.stderr.on("data", (data: string) => { + console.log("gameServer error>", data); + }); + + // if (this.options.log) { + // this.gameServerProcess.stdout.on("data", (data: string) => { + // this.gameServerLogger.log(data); + // }); - this.gameServerProcess.stderr.on("data", (data: string) => { - this.gameServerLogger.log("error", data); - }); - } + // this.gameServerProcess.stderr.on("data", (data: string) => { + // this.gameServerLogger.log("error", data); + // }); + // } } catch (e) { console.error("uabc error:", e); process.exit(-1); diff --git a/src/lib/connect.ts b/src/lib/connect.ts index a596b60..43455cb 100644 --- a/src/lib/connect.ts +++ b/src/lib/connect.ts @@ -1,3 +1,4 @@ +import * as io from "socket.io-client"; import * as ioProxy from "socket.io-proxy"; import { IOptions } from "../cli/options"; From 7da3f97deea063c6d81cc492b33c4d302d7eb882 Mon Sep 17 00:00:00 2001 From: "Alejandro U. Alvarez" Date: Tue, 10 Sep 2019 11:22:52 +0100 Subject: [PATCH 4/6] cleanup --- src/cli/options.ts | 16 +++- src/client/Client.ts | 3 - src/client/PracticeClient.ts | 169 +++++++++++++++++++++++++---------- tslint.json | 3 +- 4 files changed, 135 insertions(+), 56 deletions(-) diff --git a/src/cli/options.ts b/src/cli/options.ts index ccad19f..3fe823d 100644 --- a/src/cli/options.ts +++ b/src/cli/options.ts @@ -4,6 +4,8 @@ const commandLineArgs = require("command-line-args"); const getUsage = require("command-line-usage"); const info = require("../../package.json"); +import { GAME_SERVER_BIN } from "../lib/practice"; + export interface IOptions { files?: string[]; token?: string; @@ -164,15 +166,21 @@ export default function parseInput(): IOptions { process.exit(0); } - if (practiceMode && options.practice.length < 1) { - error("You must specify a game when in practice mode."); - process.exit(-1); + if (practiceMode && (options.practice.length < 1 || options.practice === true)) { + console.log("You must specify a game when in practice mode."); + console.log(); + console.log("Available games:"); + Object.keys(GAME_SERVER_BIN).forEach(game => { + console.log(" - " + game); + }); + console.log(); + process.exit(0); } if (!options.files || options.files.length < 1 || options.files[0].length < 1) { error("You must specify at least one executable. See the --files option."); process.exit(-1); -} + } return options; } diff --git a/src/client/Client.ts b/src/client/Client.ts index b78a1b2..fcebcae 100644 --- a/src/client/Client.ts +++ b/src/client/Client.ts @@ -7,10 +7,7 @@ import Player from "../player/Player"; export default abstract class Client { protected localPlayer: Player; protected otherPlayers: Player[] = []; - protected firstPlayer: number; protected options: IOptions; - protected size: number; - protected gameStart: [number, number]; protected loggers: { console?: ConsoleLogger, file?: FileLogger, diff --git a/src/client/PracticeClient.ts b/src/client/PracticeClient.ts index b844d8f..bf2039a 100644 --- a/src/client/PracticeClient.ts +++ b/src/client/PracticeClient.ts @@ -1,4 +1,5 @@ import { ChildProcess } from "child_process"; +import { EventName, Game, Match, MatchOptions, Messages } from "@socialgorithm/model"; import { IOptions } from "../cli/options"; import connect from "../lib/connect"; @@ -24,23 +25,13 @@ export default class PracticeClient extends Client { this.gameServerLogger = new FileLogger("gameServer.log"); } - this.initGameServer(); - - setTimeout(() => { - options.files.forEach(file => { - this.otherPlayers.push( - new ExecutablePlayer(file, this.onOtherPlayersData.bind(this)), - ); - }); - - console.log(); - console.log("Connecting to local game server..."); - console.log(); - + if (options.host) { this.initGameServerConnection(); - - // Start a match and games, using all the local players - }, 3000); + } else { + this.initGameServer().then(() => { + this.initGameServerConnection(); + }); + } } protected onLocalPlayerData(data: string): void { @@ -52,54 +43,73 @@ export default class PracticeClient extends Client { } private initGameServer() { - try { - const gameServerBin = GAME_SERVER_BIN[this.options.practice]; + return new Promise((resolve, reject) => { + try { + const gameServerBin = GAME_SERVER_BIN[this.options.practice]; - if (!gameServerBin) { - throw new Error(`Unknown game "${this.options.practice}"`); - } + if (!gameServerBin) { + throw new Error(`Unknown game "${this.options.practice}"`); + } - console.log("Running game server: ", gameServerBin); + console.log("Running game server: ", gameServerBin); - this.gameServerProcess = exec(gameServerBin); + this.gameServerProcess = exec(gameServerBin); - console.log("Started game server"); + console.log("Started game server"); - this.gameServerProcess.on("close", (code: string) => { - console.log(`uabc> game server exited with code ${code}`); - }); + this.gameServerProcess.on("close", (code: string) => { + console.log(`uabc> game server exited with code ${code}`); + }); - this.gameServerProcess.stdout.on("data", (data: string) => { - console.log("gameServer>", data); - }); + // Temporary console logging for the game server - this.gameServerProcess.stderr.on("data", (data: string) => { - console.log("gameServer error>", data); - }); + this.gameServerProcess.stdout.on("data", (data: string) => { + console.log("gameServer>", data); + }); - // if (this.options.log) { - // this.gameServerProcess.stdout.on("data", (data: string) => { - // this.gameServerLogger.log(data); - // }); + this.gameServerProcess.stderr.on("data", (data: string) => { + console.log("gameServer error>", data); + }); - // this.gameServerProcess.stderr.on("data", (data: string) => { - // this.gameServerLogger.log("error", data); - // }); - // } - } catch (e) { - console.error("uabc error:", e); - process.exit(-1); - } + // if (this.options.log) { + // this.gameServerProcess.stdout.on("data", (data: string) => { + // this.gameServerLogger.log(data); + // }); + + // this.gameServerProcess.stderr.on("data", (data: string) => { + // this.gameServerLogger.log("error", data); + // }); + // } + + setTimeout(() => { + resolve(); + }, 3000); + } catch (e) { + console.error("uabc error:", e); + process.exit(-1); + } + }); } private initGameServerConnection() { try { + this.options.files.forEach(file => { + this.otherPlayers.push( + new ExecutablePlayer(file, this.onOtherPlayersData.bind(this)), + ); + }); + + console.log(); + console.log("Connecting to local game server..."); + console.log(); + let host = this.options.host || "localhost:5433"; if (host.substr(0, 4) !== "http") { host = "http://" + host; } - const socketOptions = { - query: "token=practice", + const socketOptions = { + econnection: true, + timeout: 2000 }; this.gameServerSocket = connect(host, this.options, socketOptions); @@ -110,7 +120,8 @@ export default class PracticeClient extends Client { this.gameServerSocket.on("connect", () => { console.log(`Connected! Initiating games...`); - // TODO: Do something here + + this.initMatch(); }); this.gameServerSocket.on("disconnect", () => { @@ -121,9 +132,71 @@ export default class PracticeClient extends Client { console.error(data.error); process.exit(-1); }); + + this.gameServerSocket.on(EventName.MatchCreated, this.onMatchCreated); + this.gameServerSocket.on(EventName.GameEnded, this.onGameEnded); + this.gameServerSocket.on(EventName.MatchEnded, this.onMatchEnded); } catch (e) { console.error("uabc error:", e); process.exit(-1); } } + + private initMatch() { + const matchOptions: MatchOptions = { + maxGames: this.options.games || 10, + timeout: 1000, + autoPlay: true, + }; + + const players = this.options.files.map((file, index) => `player${index}`); + + this.gameServerSocket.emit(EventName.CreateMatch, { players, options: matchOptions }); + } + + private onMatchCreated = (message: Messages.MatchCreatedMessage) => { + // debug("Received match created message %O", message); + // These tokens are recognised on/sent by the game server (e.g. stats updates), save them for later mapping + console.log("player tokens", message.playerTokens); + } + + private onGameEnded = (game: Game) => { + // debug("Finished game, winner %s", game.winner); + // Convert tokens to player names + // game.players = game.players.map(token => this.convertPlayerTokenToPlayerName(token)); + // game.winner = this.convertPlayerTokenToPlayerName(game.winner); + + // this.match.games.push(game); + // this.updateMatchStats(); + + // this.pubSub.publishNamespaced( + // this.tournamentID, + // PubSubEvents.MatchUpdated, + // this.match, + // ); + console.log("game ended, winner ", game.winner); + } + + private onMatchEnded = (match: Match) => { + // debug("Finished game, winner %s", game.winner); + // Convert tokens to player names + // game.players = game.players.map(token => this.convertPlayerTokenToPlayerName(token)); + // game.winner = this.convertPlayerTokenToPlayerName(game.winner); + + // this.match.games.push(game); + // this.updateMatchStats(); + + // this.pubSub.publishNamespaced( + // this.tournamentID, + // PubSubEvents.MatchUpdated, + // this.match, + // ); + console.log("match ended, winner ", match.winner); + + this.gameServerSocket.disconnect(); + + if (this.gameServerProcess) { + this.gameServerProcess.kill(); + } + } } diff --git a/tslint.json b/tslint.json index 9c92c34..94eabb8 100644 --- a/tslint.json +++ b/tslint.json @@ -8,6 +8,7 @@ "arrow-parens": [true, "ban-single-arg-parens"], "interface-over-type-literal": false, "object-literal-sort-keys": false, - "no-console": false + "no-console": false, + "ordered-imports": false } } \ No newline at end of file From d52b46959510ce2e3681cb20ce725e93d8102809 Mon Sep 17 00:00:00 2001 From: "Alejandro U. Alvarez" Date: Tue, 10 Sep 2019 23:10:38 +0100 Subject: [PATCH 5/6] connect all players to game server while in practice mode --- dist/cli/options.d.ts | 4 +- dist/cli/options.js | 67 ++++++--- dist/cli/options.js.map | 2 +- dist/client/Client.d.ts | 11 +- dist/client/Client.js | 3 +- dist/client/Client.js.map | 2 +- dist/client/OnlineClient.d.ts | 7 +- dist/client/OnlineClient.js | 32 ++--- dist/client/OnlineClient.js.map | 2 +- dist/client/PracticeClient.js | 224 ++++++++++++++++++------------- dist/index.js | 8 +- dist/index.js.map | 2 +- dist/load-tester.js | 2 +- dist/load-tester.js.map | 2 +- dist/logger/ConsoleLogger.d.ts | 2 +- dist/logger/ConsoleLogger.js.map | 2 +- dist/logger/FileLogger.d.ts | 2 +- dist/logger/FileLogger.js | 10 +- dist/logger/FileLogger.js.map | 2 +- dist/player/Executable.js | 4 +- dist/player/Executable.js.map | 2 +- src/client/PracticeClient.ts | 45 ++++++- 22 files changed, 273 insertions(+), 164 deletions(-) diff --git a/dist/cli/options.d.ts b/dist/cli/options.d.ts index 24bd12d..e8a2ec0 100644 --- a/dist/cli/options.d.ts +++ b/dist/cli/options.d.ts @@ -1,5 +1,5 @@ export interface IOptions { - file?: string; + files?: string[]; token?: string; lobby?: string; host?: string; @@ -8,5 +8,7 @@ export interface IOptions { help?: boolean; verbose?: boolean; version?: boolean; + practice?: string; + games?: number; } export default function parseInput(): IOptions; diff --git a/dist/cli/options.js b/dist/cli/options.js index 1b5df1f..1601631 100644 --- a/dist/cli/options.js +++ b/dist/cli/options.js @@ -3,14 +3,16 @@ exports.__esModule = true; var commandLineArgs = require("command-line-args"); var getUsage = require("command-line-usage"); var info = require("../../package.json"); +var practice_1 = require("../lib/practice"); var optionDefinitions = [ { - name: "file", + name: "files", alias: "f", type: String, - typeLabel: "{underline file [file]}", + typeLabel: "{underline file}", defaultOption: true, - description: "Path to the client executable/s. If placed at the end, you don't have to put -f", + multiple: true, + description: "Path to the client executable/s. If placed at the end, you don't have to put -f. You can pass multiple executables when in practice mode.", group: "main" }, { @@ -26,14 +28,14 @@ var optionDefinitions = [ alias: "l", type: String, typeLabel: "{underline lobby}", - description: "Identification token for the lobby you want to play in", + description: "The name of the lobby you want to play in", group: "online" }, { name: "host", type: String, typeLabel: "{underline host:port}", - description: "host:port where the client should connect to. You can specify https:// as well if SSL is required", + description: "host:port where the client should connect to. You can specify https:// as well if SSL is required. Also used by practice mode to override the local game server port.", group: "online" }, { @@ -46,29 +48,43 @@ var optionDefinitions = [ name: "log", type: String, typeLabel: "{underline [file]}", - description: "File where game logs should be stored, defaults to `uabc-[date].log` in the current directory if no file name is specified", - group: "main" + description: "Turn on file logging. It accepts an optional log filename if you want to override the default (`uabc-[date].log` in the current directory)", + group: "helper" }, { - name: "help", - alias: "h", + name: "verbose", type: Boolean, - description: "Print this guide", + description: "Turn on console logging.", group: "helper" }, { name: "version", alias: "v", type: Boolean, - description: "Display the client version", + description: "Displays the uabc client version", group: "helper" }, { - name: "verbose", + name: "help", + alias: "h", type: Boolean, - description: "Log everything to the console", + description: "Print this guide", group: "helper" }, + { + name: "practice", + alias: "p", + type: String, + typeLabel: "{underline game}", + description: "Use uabc in practice mode (playing locally), you must specify here what game to use", + group: "practice" + }, + { + name: "games", + type: Number, + description: "Number of games to play in practice mode (Defaults to 10)", + group: "practice" + }, ]; var sections = [ { @@ -88,6 +104,11 @@ var sections = [ optionList: optionDefinitions, group: ["online"] }, + { + header: "Practice (Offline Games)", + optionList: optionDefinitions, + group: ["practice"] + }, { header: "Helpers", optionList: optionDefinitions, @@ -97,7 +118,7 @@ var sections = [ header: "Synopsis", content: [ "$ uabc {bold --host} {underline host:1234} {bold -l} {underline lobby} {bold -t} {underline token} {bold -f} {underline path/to/client/executable}", - "$ uabc {bold --log} {bold -p} {bold -f} {underline path/to/client/executable}", + "$ uabc {bold --log} {bold --practice} {underline tic-tac-toe} {bold -f} {underline \"python player1.py\"} {underline \"node player2.js\"}", "$ uabc {bold --help}", ] }, @@ -116,15 +137,29 @@ function parseInput() { console.log(info.version); process.exit(0); } - if (options.help || isEmpty(options) || !options.token) { + var practiceMode = !!options.practice; + if (options.help || isEmpty(options) || (!options.token && !practiceMode)) { console.log(getUsage(sections)); process.exit(0); } + if (practiceMode && (options.practice.length < 1 || options.practice === true)) { + console.log("You must specify a game when in practice mode."); + console.log(); + console.log("Available games:"); + Object.keys(practice_1.GAME_SERVER_BIN).forEach(function (game) { + console.log(" - " + game); + }); + console.log(); + process.exit(0); + } if (!options.files || options.files.length < 1 || options.files[0].length < 1) { - console.error("uabc error: You must specify at least one executable. See the --files option.", options); + error("You must specify at least one executable. See the --files option."); process.exit(-1); } return options; } exports["default"] = parseInput; +function error(message) { + console.error("uabc error:", message); +} //# sourceMappingURL=options.js.map \ No newline at end of file diff --git a/dist/cli/options.js.map b/dist/cli/options.js.map index d3a45ec..dc77df1 100644 --- a/dist/cli/options.js.map +++ b/dist/cli/options.js.map @@ -1 +1 @@ -{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/client/Client.d.ts b/dist/client/Client.d.ts index 074ebe8..2434ffb 100644 --- a/dist/client/Client.d.ts +++ b/dist/client/Client.d.ts @@ -3,18 +3,15 @@ import ConsoleLogger from "../logger/ConsoleLogger"; import FileLogger from "../logger/FileLogger"; import Player from "../player/Player"; export default abstract class Client { - protected playerA: Player; - protected playerB: Player; - protected firstPlayer: number; + protected localPlayer: Player; + protected otherPlayers: Player[]; protected options: IOptions; - protected size: number; - protected gameStart: [number, number]; protected loggers: { console?: ConsoleLogger; file?: FileLogger; }; constructor(options: IOptions); protected log(writer: string, message: string): void; - protected abstract onPlayerAData(data: string): void; - protected abstract onPlayerBData(data: string): void; + protected abstract onLocalPlayerData(data: string): void; + protected abstract onOtherPlayersData(data: string): void; } diff --git a/dist/client/Client.js b/dist/client/Client.js index 2565550..2f8c66b 100644 --- a/dist/client/Client.js +++ b/dist/client/Client.js @@ -5,6 +5,7 @@ var FileLogger_1 = require("../logger/FileLogger"); var Executable_1 = require("../player/Executable"); var Client = (function () { function Client(options) { + this.otherPlayers = []; this.options = options; this.loggers = {}; if (options.verbose) { @@ -17,7 +18,7 @@ var Client = (function () { } this.loggers.file = new FileLogger_1["default"](logName); } - this.playerA = new Executable_1["default"](options.file, this.onPlayerAData.bind(this)); + this.localPlayer = new Executable_1["default"](options.files[0], this.onLocalPlayerData.bind(this)); } Client.prototype.log = function (writer, message) { if (this.loggers.console) { diff --git a/dist/client/Client.js.map b/dist/client/Client.js.map index 34eefdb..67b5d03 100644 --- a/dist/client/Client.js.map +++ b/dist/client/Client.js.map @@ -1 +1 @@ -{"version":3,"file":"Client.js","sourceRoot":"","sources":["../../src/client/Client.ts"],"names":[],"mappings":";;AACA,yDAAoD;AACpD,mDAA8C;AAC9C,mDAAoD;AAGpD;IAYI,gBAAY,OAAiB;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAElB,IAAI,OAAO,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,0BAAa,EAAE,CAAC;SAC9C;QAED,IAAI,OAAO,CAAC,GAAG,EAAE;YACb,IAAI,OAAO,SAAA,CAAC;YACZ,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;gBACxB,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;aACzB;YACD,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,uBAAU,CAAC,OAAO,CAAC,CAAC;SAC/C;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,uBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACrF,CAAC;IAES,oBAAG,GAAb,UAAc,MAAc,EAAE,OAAe;QACzC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACtB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAC7C;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YACnB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAC1C;IACL,CAAC;IAIL,aAAC;AAAD,CAAC,AA3CD,IA2CC"} \ No newline at end of file +{"version":3,"file":"Client.js","sourceRoot":"","sources":["../../src/client/Client.ts"],"names":[],"mappings":";;AACA,yDAAoD;AACpD,mDAA8C;AAC9C,mDAAoD;AAGpD;IASI,gBAAY,OAAiB;QAPnB,iBAAY,GAAa,EAAE,CAAC;QAQlC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAElB,IAAI,OAAO,CAAC,OAAO,EAAE;YACjB,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,0BAAa,EAAE,CAAC;SAC9C;QAED,IAAI,OAAO,CAAC,GAAG,EAAE;YACb,IAAI,OAAO,SAAA,CAAC;YACZ,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;gBACxB,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC;aACzB;YACD,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,uBAAU,CAAC,OAAO,CAAC,CAAC;SAC/C;QAGD,IAAI,CAAC,WAAW,GAAG,IAAI,uBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjG,CAAC;IAES,oBAAG,GAAb,UAAc,MAAc,EAAE,OAAe;QACzC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YACtB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAC7C;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YACnB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAC1C;IACL,CAAC;IAIL,aAAC;AAAD,CAAC,AAzCD,IAyCC"} \ No newline at end of file diff --git a/dist/client/OnlineClient.d.ts b/dist/client/OnlineClient.d.ts index 32c23b1..6d5776f 100644 --- a/dist/client/OnlineClient.d.ts +++ b/dist/client/OnlineClient.d.ts @@ -2,11 +2,10 @@ import { IOptions } from "../cli/options"; import OnlinePlayer from "../player/Online"; import Client from "./Client"; export default class OnlineClient extends Client { - protected playerB: OnlinePlayer; + protected otherPlayers: OnlinePlayer[]; private tournamentServerSocket; private gameServerSocket; constructor(options: IOptions); - onPlayerAData(payload: string): void; - onPlayerBData(data: string): void; - private connect; + onLocalPlayerData(payload: string): void; + onOtherPlayersData(data: string): void; } diff --git a/dist/client/OnlineClient.js b/dist/client/OnlineClient.js index 9540791..1f8c013 100644 --- a/dist/client/OnlineClient.js +++ b/dist/client/OnlineClient.js @@ -13,9 +13,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); exports.__esModule = true; -var io = require("socket.io-client"); -var ioProxy = require("socket.io-proxy"); var model_1 = require("@socialgorithm/model"); +var connect_1 = require("../lib/connect"); var Online_1 = require("../player/Online"); var Client_1 = require("./Client"); var OnlineClient = (function (_super) { @@ -23,7 +22,7 @@ var OnlineClient = (function (_super) { function OnlineClient(options) { var _this = _super.call(this, options) || this; console.log("Starting Online Mode"); - console.log("Player A: " + _this.options.file); + console.log("Local Player: " + _this.options.files[0]); console.log(); console.log("Waiting for server..."); console.log(); @@ -35,7 +34,7 @@ var OnlineClient = (function (_super) { var socketOptions = { query: "token=" + options.token }; - _this.tournamentServerSocket = _this.connect(host, socketOptions); + _this.tournamentServerSocket = connect_1["default"](host, options, socketOptions); _this.tournamentServerSocket.on("error", function (data) { console.error("Error in socket", data); }); @@ -66,7 +65,7 @@ var OnlineClient = (function (_super) { if (_this.gameServerSocket && _this.gameServerSocket.connected) { _this.gameServerSocket.disconnect(); } - _this.gameServerSocket = _this.connect(handoffMessage.gameServerAddress, gameServerSocketOptions); + _this.gameServerSocket = connect_1["default"](handoffMessage.gameServerAddress, options, gameServerSocketOptions); _this.gameServerSocket.on("error", function (data) { console.error("Error in game server socket", data); }); @@ -76,11 +75,11 @@ var OnlineClient = (function (_super) { _this.gameServerSocket.on("disconnect", function () { console.log("Disconnected from game server (token: " + handoffMessage.token + ")"); }); - if (!_this.playerB) { - _this.playerB = new Online_1["default"](_this.gameServerSocket, _this.onPlayerBData.bind(_this)); + if (!_this.otherPlayers[0]) { + _this.otherPlayers[0] = new Online_1["default"](_this.gameServerSocket, _this.onOtherPlayersData.bind(_this)); } else { - _this.playerB.setSocket(_this.gameServerSocket); + _this.otherPlayers[0].setSocket(_this.gameServerSocket); } }); _this.tournamentServerSocket.on("disconnect", function () { @@ -93,7 +92,7 @@ var OnlineClient = (function (_super) { } return _this; } - OnlineClient.prototype.onPlayerAData = function (payload) { + OnlineClient.prototype.onLocalPlayerData = function (payload) { this.log("A", payload); var message = { payload: payload @@ -102,20 +101,9 @@ var OnlineClient = (function (_super) { this.gameServerSocket.emit(model_1.EventName.Game__Player, message); } }; - OnlineClient.prototype.onPlayerBData = function (data) { + OnlineClient.prototype.onOtherPlayersData = function (data) { this.log("B", data); - this.playerA.onDataFromOtherPlayers(data); - }; - OnlineClient.prototype.connect = function (host, socketOptions) { - if (this.options.proxy || process.env.http_proxy) { - if (this.options.proxy) { - ioProxy.init(this.options.proxy); - } - return ioProxy.connect(host, socketOptions); - } - else { - return io.connect(host, socketOptions); - } + this.otherPlayers[0].onDataFromOtherPlayers(data); }; return OnlineClient; }(Client_1["default"])); diff --git a/dist/client/OnlineClient.js.map b/dist/client/OnlineClient.js.map index 65596db..353ad59 100644 --- a/dist/client/OnlineClient.js.map +++ b/dist/client/OnlineClient.js.map @@ -1 +1 @@ -{"version":3,"file":"OnlineClient.js","sourceRoot":"","sources":["../../src/client/OnlineClient.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"OnlineClient.js","sourceRoot":"","sources":["../../src/client/OnlineClient.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/client/PracticeClient.js b/dist/client/PracticeClient.js index e50680b..9f1b133 100644 --- a/dist/client/PracticeClient.js +++ b/dist/client/PracticeClient.js @@ -1,8 +1,11 @@ "use strict"; var __extends = (this && this.__extends) || (function () { - var extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } @@ -10,111 +13,152 @@ var __extends = (this && this.__extends) || (function () { }; })(); exports.__esModule = true; -var constants_1 = require("@socialgorithm/ultimate-ttt/dist/model/constants"); -var UTTT_1 = require("@socialgorithm/ultimate-ttt/dist/UTTT"); -var Client_1 = require("./model/Client"); +var model_1 = require("@socialgorithm/model"); +var connect_1 = require("../lib/connect"); +var exec_1 = require("../lib/exec"); +var practice_1 = require("../lib/practice"); +var FileLogger_1 = require("../logger/FileLogger"); var Executable_1 = require("../player/Executable"); -var Random_1 = require("../player/Random"); -var funcs_1 = require("../lib/funcs"); +var Client_1 = require("./Client"); var PracticeClient = (function (_super) { __extends(PracticeClient, _super); function PracticeClient(options) { var _this = _super.call(this, options) || this; - _this.size = 3; - var playerBName; - if (_this.options.file.length > 1) { - _this.playerB = new Executable_1["default"](options.file[1], _this.onPlayerBData.bind(_this)); - playerBName = options.file[1]; + _this.onMatchCreated = function (message) { + console.log("player tokens", message.playerTokens); + console.log("Connecting players to game server..."); + _this.playerSockets = []; + Object.keys(message.playerTokens).forEach(function (playerName) { + var token = message.playerTokens[playerName]; + var socket = _this.connectPlayer(token); + _this.playerSockets.push(socket); + socket.on("connect", function () { + console.log(" - " + playerName + " connected"); + }); + }); + }; + _this.connectPlayer = function (token) { + var socketOptions = { + econnection: true, + timeout: 2000, + query: { + token: token + } + }; + return connect_1["default"](_this.gameServerHost, _this.options, socketOptions); + }; + _this.onGameEnded = function (game) { + console.log("game ended, winner ", game.winner); + }; + _this.onMatchEnded = function (match) { + console.log("match ended, winner ", match.winner); + _this.gameServerSocket.disconnect(); + if (_this.gameServerProcess) { + _this.gameServerProcess.kill(); + } + }; + var host = _this.options.host || "localhost:5433"; + if (host.substr(0, 4) !== "http") { + host = "http://" + host; } - else { - _this.playerB = new Random_1["default"](_this.onPlayerBData.bind(_this)); - playerBName = '[Built-in Random Player]'; + _this.gameServerHost = host; + console.log("Starting Practice Mode: " + options.practice); + if (_this.options.log) { + _this.gameServerLogger = new FileLogger_1["default"]("gameServer.log"); } - _this.firstPlayer = Math.round(Math.random()); - console.log("Starting practice mode (" + _this.options.games + " games)"); - console.log("Player A: " + _this.options.file[0]); - console.log("Player B: " + playerBName); - _this.startGame(); - return _this; - } - PracticeClient.prototype.startGame = function () { - this.currentGame = new UTTT_1["default"](); - this.firstPlayer = 1 - this.firstPlayer; - this.log('A', 'init'); - this.playerA.sendData('init'); - this.playerB.sendData('init'); - this.gameStart = process.hrtime(); - this.state.games++; - if (this.firstPlayer === constants_1.ME) { - this.log('A', 'move'); - this.playerA.sendData('move'); + if (options.host) { + _this.initGameServerConnection(); } else { - this.log('B', 'move'); - this.playerB.sendData('move'); + _this.initGameServer().then(function () { + _this.initGameServerConnection(); + }); } + return _this; + } + PracticeClient.prototype.onLocalPlayerData = function (data) { + throw new Error("Method not implemented."); }; - PracticeClient.prototype.nextGame = function () { - var result = this.currentGame.getResult(); - if (result === -1) { - this.state.ties++; - } - else { - this.state.wins[result]++; - } - var hrend = process.hrtime(this.gameStart); - this.state.times.push(funcs_1.convertExecTime(hrend[1])); - if (this.options.verbose) { - var winner = null; - if (result === constants_1.ME) { - winner = 'Player A'; - } - else if (result === constants_1.OPPONENT) { - winner = 'Player B'; + PracticeClient.prototype.onOtherPlayersData = function (data) { + throw new Error("Method not implemented."); + }; + PracticeClient.prototype.initGameServer = function () { + var _this = this; + return new Promise(function (resolve, reject) { + try { + var gameServerBin = practice_1.GAME_SERVER_BIN[_this.options.practice]; + if (!gameServerBin) { + throw new Error("Unknown game \"" + _this.options.practice + "\""); + } + console.log("Running game server: ", gameServerBin); + _this.gameServerProcess = exec_1["default"](gameServerBin); + console.log("Started game server"); + _this.gameServerProcess.on("close", function (code) { + console.log("uabc> game server exited with code " + code); + }); + _this.gameServerProcess.stdout.on("data", function (data) { + console.log("gameServer>", data); + }); + _this.gameServerProcess.stderr.on("data", function (data) { + console.log("gameServer error>", data); + }); + setTimeout(function () { + resolve(); + }, 3000); } - else { - winner = 'Tie'; + catch (e) { + console.error("uabc error:", e); + process.exit(-1); } - console.log('-----------------------'); - console.log("Game " + this.state.games + " Ended (" + funcs_1.convertExecTime(hrend[1]) + "ms)"); - console.log("Winner: " + winner + " (" + result + ")"); - console.log(this.currentGame.prettyPrint()); - console.log(''); - } - if (this.state.games < this.options.games) { - this.startGame(); - return; - } - this.state.printState(); - process.exit(0); + }); }; - PracticeClient.prototype.onPlayerAData = function (data) { - var coords = funcs_1.parseMove(data); - if (!coords) { - console.log('error: received invalid move from player A'); + PracticeClient.prototype.initGameServerConnection = function () { + var _this = this; + try { + this.options.files.forEach(function (file) { + _this.otherPlayers.push(new Executable_1["default"](file, _this.onOtherPlayersData.bind(_this))); + }); + console.log(); + console.log("Connecting to local game server..."); + console.log(); + var socketOptions = { + reconnection: true, + timeout: 2000 + }; + this.gameServerSocket = connect_1["default"](this.gameServerHost, this.options, socketOptions); + this.gameServerSocket.on("error", function (data) { + console.error("Error in socket", data); + }); + this.gameServerSocket.on("connect", function () { + console.log("Connected! Initiating games..."); + _this.initMatch(); + }); + this.gameServerSocket.on("disconnect", function () { + console.log("Disconnected from game server"); + }); + this.gameServerSocket.on("exception", function (data) { + console.error(data.error); + process.exit(-1); + }); + this.gameServerSocket.on(model_1.EventName.MatchCreated, this.onMatchCreated); + this.gameServerSocket.on(model_1.EventName.GameEnded, this.onGameEnded); + this.gameServerSocket.on(model_1.EventName.MatchEnded, this.onMatchEnded); } - this.log('A', data); - this.currentGame = this.currentGame.addMyMove(coords.board, coords.move); - if (this.currentGame.isFinished()) { - this.nextGame(); - return; + catch (e) { + console.error("uabc error:", e); + process.exit(-1); } - this.playerB.sendData("opponent " + data); }; - PracticeClient.prototype.onPlayerBData = function (data) { - var coords = funcs_1.parseMove(data); - if (!coords) { - console.log('error: received invalid move from player B'); - } - var sendMessage = "opponent " + data; - this.log('B', sendMessage); - this.currentGame = this.currentGame.addOpponentMove(coords.board, coords.move); - if (this.currentGame.isFinished()) { - this.nextGame(); - return; - } - this.playerA.sendData(sendMessage); + PracticeClient.prototype.initMatch = function () { + var matchOptions = { + maxGames: this.options.games || 10, + timeout: 1000, + autoPlay: true + }; + var players = this.options.files.map(function (file, index) { return "player" + index; }); + this.gameServerSocket.emit(model_1.EventName.CreateMatch, { players: players, options: matchOptions }); }; return PracticeClient; }(Client_1["default"])); exports["default"] = PracticeClient; +//# sourceMappingURL=PracticeClient.js.map \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index 4cf947b..953017e 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2,9 +2,15 @@ exports.__esModule = true; var options_1 = require("./cli/options"); var OnlineClient_1 = require("./client/OnlineClient"); +var PracticeClient_1 = require("./client/PracticeClient"); var options = options_1["default"](); console.info("+-----------------------------------------+"); console.info("| Ultimate Algorithm Battle Client |"); console.info("+-----------------------------------------+"); -var client = new OnlineClient_1["default"](options); +if (options.practice) { + var client = new PracticeClient_1["default"](options); +} +else { + var client = new OnlineClient_1["default"](options); +} //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index cc2b629..d64933f 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AASA,yCAAyC;AACzC,sDAAiD;AAEjD,IAAM,OAAO,GAAG,oBAAY,EAAE,CAAC;AAE/B,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;AAC5D,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;AAC5D,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;AAE5D,IAAM,MAAM,GAAG,IAAI,yBAAY,CAAC,OAAO,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAUA,yCAAyC;AACzC,sDAAiD;AACjD,0DAAqD;AAErD,IAAM,OAAO,GAAG,oBAAY,EAAE,CAAC;AAE/B,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;AAC5D,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;AAC5D,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;AAE5D,IAAI,OAAO,CAAC,QAAQ,EAAE;IAClB,IAAM,MAAM,GAAG,IAAI,2BAAc,CAAC,OAAO,CAAC,CAAC;CAC9C;KAAM;IACH,IAAM,MAAM,GAAG,IAAI,yBAAY,CAAC,OAAO,CAAC,CAAC;CAC5C"} \ No newline at end of file diff --git a/dist/load-tester.js b/dist/load-tester.js index 8229254..528c5dd 100644 --- a/dist/load-tester.js +++ b/dist/load-tester.js @@ -19,7 +19,7 @@ var _loop_1 = function (lobbyNumber) { host: "localhost:3141", lobby: lobbyName, token: playerName, - file: "node ../tic-tac-toe-player/run_player.js random" + files: ["node ../tic-tac-toe-player/run_player.js random"] }); } setTimeout(function () { diff --git a/dist/load-tester.js.map b/dist/load-tester.js.map index 7285a09..ffb2da9 100644 --- a/dist/load-tester.js.map +++ b/dist/load-tester.js.map @@ -1 +1 @@ -{"version":3,"file":"load-tester.js","sourceRoot":"","sources":["../src/load-tester.ts"],"names":[],"mappings":";;AAAA,qCAAuC;AACvC,sDAAiD;AAEjD,IAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,IAAM,eAAe,GAAG,EAAE,CAAC;wBAElB,WAAW;IAChB,OAAO,CAAC,GAAG,CAAC,oBAAkB,WAAa,CAAC,CAAC;IAC7C,IAAM,eAAe,GAAG,WAAS,WAAW,WAAQ,CAAC;IACrD,IAAM,gBAAgB,GAAG,EAAE,CAAC,OAAO,CAC/B,uBAAuB,EACvB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,CACtD,CAAC;IACF,gBAAgB,CAAC,EAAE,CAAC,eAAe,EAAE,UAAC,IAAS;QAC3C,IAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,mBAAiB,SAAW,CAAC,CAAC;QAE1C,IAAM,OAAO,GAAa,EAAE,CAAC;QAG7B,KAAK,IAAI,YAAY,GAAG,CAAC,EAAE,YAAY,IAAI,eAAe,EAAE,YAAY,EAAE,EAAE;YACxE,IAAM,UAAU,GAAM,SAAS,gBAAW,YAAc,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzB,IAAM,MAAM,GAAG,IAAI,yBAAY,CAAC;gBAC5B,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,UAAU;gBACjB,IAAI,EAAE,iDAAiD;aAC1D,CAAC,CAAC;SACN;QAED,UAAU,CAAC;YACP,gBAAgB,CAAC,IAAI,CAAC,wBAAwB,EAAE;gBAC5C,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE;oBACL,KAAK,EAAE,SAAS;oBAChB,WAAW,EAAE,uBAAuB;oBACpC,QAAQ,EAAE,IAAI;oBACd,aAAa,EAAE,EAAE;oBACjB,OAAO,EAAE,GAAG;oBACZ,IAAI,EAAE,mBAAmB;iBAC5B;gBACD,OAAO,SAAA;aACV,CAAC,CAAC;QACP,CAAC,EAAE,KAAK,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IACH,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;;AAxC1C,KAAK,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,IAAI,eAAe,EAAE,WAAW,EAAE;YAA9D,WAAW;CAyCnB"} \ No newline at end of file +{"version":3,"file":"load-tester.js","sourceRoot":"","sources":["../src/load-tester.ts"],"names":[],"mappings":";;AAAA,qCAAuC;AACvC,sDAAiD;AAEjD,IAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,IAAM,eAAe,GAAG,EAAE,CAAC;wBAElB,WAAW;IAChB,OAAO,CAAC,GAAG,CAAC,oBAAkB,WAAa,CAAC,CAAC;IAC7C,IAAM,eAAe,GAAG,WAAS,WAAW,WAAQ,CAAC;IACrD,IAAM,gBAAgB,GAAG,EAAE,CAAC,OAAO,CAC/B,uBAAuB,EACvB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,CACtD,CAAC;IACF,gBAAgB,CAAC,EAAE,CAAC,eAAe,EAAE,UAAC,IAAS;QAC3C,IAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,mBAAiB,SAAW,CAAC,CAAC;QAE1C,IAAM,OAAO,GAAa,EAAE,CAAC;QAG7B,KAAK,IAAI,YAAY,GAAG,CAAC,EAAE,YAAY,IAAI,eAAe,EAAE,YAAY,EAAE,EAAE;YACxE,IAAM,UAAU,GAAM,SAAS,gBAAW,YAAc,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzB,IAAM,MAAM,GAAG,IAAI,yBAAY,CAAC;gBAC5B,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,SAAS;gBAChB,KAAK,EAAE,UAAU;gBACjB,KAAK,EAAE,CAAC,iDAAiD,CAAC;aAC7D,CAAC,CAAC;SACN;QAED,UAAU,CAAC;YACP,gBAAgB,CAAC,IAAI,CAAC,wBAAwB,EAAE;gBAC5C,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE;oBACL,KAAK,EAAE,SAAS;oBAChB,WAAW,EAAE,uBAAuB;oBACpC,QAAQ,EAAE,IAAI;oBACd,aAAa,EAAE,EAAE;oBACjB,OAAO,EAAE,GAAG;oBACZ,IAAI,EAAE,mBAAmB;iBAC5B;gBACD,OAAO,SAAA;aACV,CAAC,CAAC;QACP,CAAC,EAAE,KAAK,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IACH,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;;AAxC1C,KAAK,IAAI,WAAW,GAAG,CAAC,EAAE,WAAW,IAAI,eAAe,EAAE,WAAW,EAAE;YAA9D,WAAW;CAyCnB"} \ No newline at end of file diff --git a/dist/logger/ConsoleLogger.d.ts b/dist/logger/ConsoleLogger.d.ts index 49321f0..352e3ac 100644 --- a/dist/logger/ConsoleLogger.d.ts +++ b/dist/logger/ConsoleLogger.d.ts @@ -1,5 +1,5 @@ import Logger from "./Logger"; export default class ConsoleLogger extends Logger { constructor(); - log(writer: string, data: string): void; + log(writer: string, data?: string): void; } diff --git a/dist/logger/ConsoleLogger.js.map b/dist/logger/ConsoleLogger.js.map index 78da240..ecc1e90 100644 --- a/dist/logger/ConsoleLogger.js.map +++ b/dist/logger/ConsoleLogger.js.map @@ -1 +1 @@ -{"version":3,"file":"ConsoleLogger.js","sourceRoot":"","sources":["../../src/logger/ConsoleLogger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,mCAA8B;AAM9B;IAA2C,iCAAM;IAE/C;QAAA,YACE,iBAAO,SAER;QADC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;;IAC9B,CAAC;IAEM,2BAAG,GAAV,UAAW,MAAc,EAAE,IAAY;QACrC,IAAM,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,MAAI,IAAI,SAAI,MAAM,SAAI,IAAI,MAAG,CAAC,CAAC;IAC7C,CAAC;IACH,oBAAC;AAAD,CAAC,AAXD,CAA2C,mBAAM,GAWhD"} \ No newline at end of file +{"version":3,"file":"ConsoleLogger.js","sourceRoot":"","sources":["../../src/logger/ConsoleLogger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,mCAA8B;AAM9B;IAA2C,iCAAM;IAE/C;QAAA,YACE,iBAAO,SAER;QADC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;;IAC9B,CAAC;IAEM,2BAAG,GAAV,UAAW,MAAc,EAAE,IAAa;QACtC,IAAM,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,MAAI,IAAI,SAAI,MAAM,SAAI,IAAI,MAAG,CAAC,CAAC;IAC7C,CAAC;IACH,oBAAC;AAAD,CAAC,AAXD,CAA2C,mBAAM,GAWhD"} \ No newline at end of file diff --git a/dist/logger/FileLogger.d.ts b/dist/logger/FileLogger.d.ts index 9af90fe..7576609 100644 --- a/dist/logger/FileLogger.d.ts +++ b/dist/logger/FileLogger.d.ts @@ -2,5 +2,5 @@ import Logger from "./Logger"; export default class FileLogger extends Logger { private file; constructor(file?: string); - log(writer: string, text: string): void; + log(writer: string, text?: string): void; } diff --git a/dist/logger/FileLogger.js b/dist/logger/FileLogger.js index b85b590..35938c4 100644 --- a/dist/logger/FileLogger.js +++ b/dist/logger/FileLogger.js @@ -25,7 +25,7 @@ var FileLogger = (function (_super) { } else { var currentdate = new Date(); - _this.file = "UTTT_" + currentdate.getDate() + "-" + _this.file = "uabc_" + currentdate.getDate() + "-" + (currentdate.getMonth() + 1) + "-" + currentdate.getFullYear() + "_" + currentdate.getHours() + "-" @@ -38,7 +38,13 @@ var FileLogger = (function (_super) { } FileLogger.prototype.log = function (writer, text) { var time = (new Date()).toTimeString().substr(0, 8); - fs.appendFileSync(this.file, "[" + time + " " + writer + "] " + text + os.EOL); + var prefix = "[" + time + " " + writer + "]"; + var data = text; + if (!text) { + prefix = "[" + time + "]"; + data = writer; + } + fs.appendFileSync(this.file, prefix + " " + data + os.EOL); }; return FileLogger; }(Logger_1["default"])); diff --git a/dist/logger/FileLogger.js.map b/dist/logger/FileLogger.js.map index efeff09..a005afd 100644 --- a/dist/logger/FileLogger.js.map +++ b/dist/logger/FileLogger.js.map @@ -1 +1 @@ -{"version":3,"file":"FileLogger.js","sourceRoot":"","sources":["../../src/logger/FileLogger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,uBAAyB;AACzB,uBAAyB;AACzB,mCAA8B;AAO9B;IAAwC,8BAAM;IAG5C,oBAAY,IAAa;QAAzB,YACE,iBAAO,SAeR;QAdC,IAAI,IAAI,EAAE;YACR,KAAI,CAAC,IAAI,GAAG,IAAI,CAAC;SAClB;aAAM;YACL,IAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;YAC/B,KAAI,CAAC,IAAI,GAAG,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG;kBAC3C,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAI,GAAG;kBACnC,WAAW,CAAC,WAAW,EAAE,GAAG,GAAG;kBAC/B,WAAW,CAAC,QAAQ,EAAE,GAAG,GAAG;kBAC5B,WAAW,CAAC,UAAU,EAAE,GAAG,GAAG;kBAC9B,WAAW,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC;SACzC;QAED,EAAE,CAAC,aAAa,CAAC,KAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,sBAAoB,KAAI,CAAC,IAAM,CAAC,CAAC;;IAC/C,CAAC;IAEM,wBAAG,GAAV,UAAW,MAAc,EAAE,IAAY;QACrC,IAAM,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,MAAI,IAAI,SAAI,MAAM,UAAK,IAAI,GAAG,EAAE,CAAC,GAAK,CAAC,CAAC;IACvE,CAAC;IACH,iBAAC;AAAD,CAAC,AAzBD,CAAwC,mBAAM,GAyB7C"} \ No newline at end of file +{"version":3,"file":"FileLogger.js","sourceRoot":"","sources":["../../src/logger/FileLogger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,uBAAyB;AACzB,uBAAyB;AACzB,mCAA8B;AAO9B;IAAwC,8BAAM;IAG5C,oBAAY,IAAa;QAAzB,YACE,iBAAO,SAeR;QAdC,IAAI,IAAI,EAAE;YACR,KAAI,CAAC,IAAI,GAAG,IAAI,CAAC;SAClB;aAAM;YACL,IAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;YAC/B,KAAI,CAAC,IAAI,GAAG,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG;kBAC3C,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,GAAI,GAAG;kBACnC,WAAW,CAAC,WAAW,EAAE,GAAG,GAAG;kBAC/B,WAAW,CAAC,QAAQ,EAAE,GAAG,GAAG;kBAC5B,WAAW,CAAC,UAAU,EAAE,GAAG,GAAG;kBAC9B,WAAW,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC;SACzC;QAED,EAAE,CAAC,aAAa,CAAC,KAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,sBAAoB,KAAI,CAAC,IAAM,CAAC,CAAC;;IAC/C,CAAC;IAEM,wBAAG,GAAV,UAAW,MAAc,EAAE,IAAa;QACtC,IAAM,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtD,IAAI,MAAM,GAAG,MAAI,IAAI,SAAI,MAAM,MAAG,CAAC;QACnC,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC,IAAI,EAAE;YACT,MAAM,GAAG,MAAI,IAAI,MAAG,CAAC;YACrB,IAAI,GAAG,MAAM,CAAC;SACf;QACD,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAK,MAAM,SAAI,IAAI,GAAG,EAAE,CAAC,GAAK,CAAC,CAAC;IAC7D,CAAC;IACH,iBAAC;AAAD,CAAC,AA/BD,CAAwC,mBAAM,GA+B7C"} \ No newline at end of file diff --git a/dist/player/Executable.js b/dist/player/Executable.js index 9298f12..5436dbc 100644 --- a/dist/player/Executable.js +++ b/dist/player/Executable.js @@ -28,7 +28,7 @@ var ExecutablePlayer = (function (_super) { console.log("client> child process exited with code " + code); }); _this.playerProcess.stdout.on("data", function (data) { - var lines = data.split('\n'); + var lines = data.split("\n"); var regex = /^(send:).*/; var output = []; var gameData = []; @@ -59,7 +59,7 @@ var ExecutablePlayer = (function (_super) { return _this; } ExecutablePlayer.prototype.onDataFromOtherPlayers = function (data) { - this.playerProcess.stdin.write(data + '\n'); + this.playerProcess.stdin.write(data + "\n"); }; return ExecutablePlayer; }(Player_1["default"])); diff --git a/dist/player/Executable.js.map b/dist/player/Executable.js.map index 68f1426..c744c15 100644 --- a/dist/player/Executable.js.map +++ b/dist/player/Executable.js.map @@ -1 +1 @@ -{"version":3,"file":"Executable.js","sourceRoot":"","sources":["../../src/player/Executable.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAGA,oCAA+B;AAC/B,mCAA8B;AAK9B;IAA8C,oCAAM;IAGhD,0BAAY,IAAY,EAAE,oBAA4C;QAAtE,YACI,kBAAM,oBAAoB,CAAC,SA4C9B;QA1CG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;SACpB;QAED,KAAI,CAAC,aAAa,GAAG,iBAAI,CAAC,IAAI,CAAC,CAAC;QAEhC,KAAI,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAC,IAAY;YACxC,OAAO,CAAC,GAAG,CAAC,4CAA0C,IAAM,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,KAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAC,IAAY;YAC9C,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAM,KAAK,GAAG,YAAY,CAAC;YAC3B,IAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,UAAA,QAAQ;gBAClB,IAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;oBACjB,OAAO;iBACV;gBACD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE;oBACrC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;iBAC5C;qBAAM;oBACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACrB;YACL,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,OAAO,CAAC,UAAA,IAAI;gBACjB,KAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;aAClC;QACL,CAAC,CAAC,CAAC;QAEH,KAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAC,OAAe;YACjD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;;IACP,CAAC;IAEM,iDAAsB,GAA7B,UAA8B,IAAY;QACtC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAChD,CAAC;IACL,uBAAC;AAAD,CAAC,AArDD,CAA8C,mBAAM,GAqDnD"} \ No newline at end of file +{"version":3,"file":"Executable.js","sourceRoot":"","sources":["../../src/player/Executable.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,oCAA+B;AAC/B,mCAA8B;AAK9B;IAA8C,oCAAM;IAGhD,0BAAY,IAAY,EAAE,oBAA4C;QAAtE,YACI,kBAAM,oBAAoB,CAAC,SA4C9B;QA1CG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;SACpB;QAED,KAAI,CAAC,aAAa,GAAG,iBAAI,CAAC,IAAI,CAAC,CAAC;QAEhC,KAAI,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAC,IAAY;YACxC,OAAO,CAAC,GAAG,CAAC,4CAA0C,IAAM,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,KAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAC,IAAY;YAC9C,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAM,KAAK,GAAG,YAAY,CAAC;YAC3B,IAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,KAAK,CAAC,OAAO,CAAC,UAAA,QAAQ;gBAClB,IAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;oBACjB,OAAO;iBACV;gBACD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE;oBACrC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;iBAC5C;qBAAM;oBACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;iBACrB;YACL,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,OAAO,CAAC,UAAA,IAAI;gBACjB,KAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;gBACnB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;aAClC;QACL,CAAC,CAAC,CAAC;QAEH,KAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAC,OAAe;YACjD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;;IACP,CAAC;IAEM,iDAAsB,GAA7B,UAA8B,IAAY;QACtC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAChD,CAAC;IACL,uBAAC;AAAD,CAAC,AArDD,CAA8C,mBAAM,GAqDnD"} \ No newline at end of file diff --git a/src/client/PracticeClient.ts b/src/client/PracticeClient.ts index bf2039a..3aac7c8 100644 --- a/src/client/PracticeClient.ts +++ b/src/client/PracticeClient.ts @@ -11,7 +11,9 @@ import Client from "./Client"; export default class PracticeClient extends Client { protected otherPlayers: ExecutablePlayer[]; + private playerSockets: SocketIOClient.Socket[]; + private gameServerHost: string; private gameServerProcess: ChildProcess; private gameServerSocket: SocketIOClient.Socket; private gameServerLogger: FileLogger; @@ -19,6 +21,12 @@ export default class PracticeClient extends Client { constructor(options: IOptions) { super(options); + let host = this.options.host || "localhost:5433"; + if (host.substr(0, 4) !== "http") { + host = "http://" + host; + } + this.gameServerHost = host; + console.log(`Starting Practice Mode: ${options.practice}`); if (this.options.log) { @@ -103,16 +111,12 @@ export default class PracticeClient extends Client { console.log("Connecting to local game server..."); console.log(); - let host = this.options.host || "localhost:5433"; - if (host.substr(0, 4) !== "http") { - host = "http://" + host; - } const socketOptions = { - econnection: true, - timeout: 2000 + reconnection: true, + timeout: 2000, }; - this.gameServerSocket = connect(host, this.options, socketOptions); + this.gameServerSocket = connect(this.gameServerHost, this.options, socketOptions); this.gameServerSocket.on("error", (data: any) => { console.error("Error in socket", data); @@ -158,6 +162,33 @@ export default class PracticeClient extends Client { // debug("Received match created message %O", message); // These tokens are recognised on/sent by the game server (e.g. stats updates), save them for later mapping console.log("player tokens", message.playerTokens); + console.log("Connecting players to game server..."); + + // In order to comply with the game server API each player now needs to connect separately + this.playerSockets = []; + Object.keys(message.playerTokens).forEach(playerName => { + const token = message.playerTokens[playerName]; + const socket = this.connectPlayer(token); + this.playerSockets.push(socket); + + socket.on("connect", () => { + console.log(` - ${playerName} connected`); + }); + }); + + // And now...? + } + + private connectPlayer = (token: string): SocketIOClient.Socket => { + const socketOptions = { + econnection: true, + timeout: 2000, + query: { + token, + }, + }; + + return connect(this.gameServerHost, this.options, socketOptions); } private onGameEnded = (game: Game) => { From 439252cdef01a8a693d98eccd2ab9ddcfbf759c7 Mon Sep 17 00:00:00 2001 From: "Alejandro U. Alvarez" Date: Thu, 26 Sep 2019 14:19:04 +0100 Subject: [PATCH 6/6] build --- dist/client/PracticeClient.d.ts | 21 +++++++++++++++++++++ dist/client/PracticeClient.js.map | 1 + dist/lib/connect.d.ts | 4 ++++ dist/lib/connect.js | 16 ++++++++++++++++ dist/lib/connect.js.map | 1 + dist/lib/practice.d.ts | 5 +++++ dist/lib/practice.js | 6 ++++++ dist/lib/practice.js.map | 1 + 8 files changed, 55 insertions(+) create mode 100644 dist/client/PracticeClient.d.ts create mode 100644 dist/client/PracticeClient.js.map create mode 100644 dist/lib/connect.d.ts create mode 100644 dist/lib/connect.js create mode 100644 dist/lib/connect.js.map create mode 100644 dist/lib/practice.d.ts create mode 100644 dist/lib/practice.js create mode 100644 dist/lib/practice.js.map diff --git a/dist/client/PracticeClient.d.ts b/dist/client/PracticeClient.d.ts new file mode 100644 index 0000000..e37c9a8 --- /dev/null +++ b/dist/client/PracticeClient.d.ts @@ -0,0 +1,21 @@ +import { IOptions } from "../cli/options"; +import ExecutablePlayer from "../player/Executable"; +import Client from "./Client"; +export default class PracticeClient extends Client { + protected otherPlayers: ExecutablePlayer[]; + private playerSockets; + private gameServerHost; + private gameServerProcess; + private gameServerSocket; + private gameServerLogger; + constructor(options: IOptions); + protected onLocalPlayerData(data: string): void; + protected onOtherPlayersData(data: string): void; + private initGameServer; + private initGameServerConnection; + private initMatch; + private onMatchCreated; + private connectPlayer; + private onGameEnded; + private onMatchEnded; +} diff --git a/dist/client/PracticeClient.js.map b/dist/client/PracticeClient.js.map new file mode 100644 index 0000000..c6d23d4 --- /dev/null +++ b/dist/client/PracticeClient.js.map @@ -0,0 +1 @@ +{"version":3,"file":"PracticeClient.js","sourceRoot":"","sources":["../../src/client/PracticeClient.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/lib/connect.d.ts b/dist/lib/connect.d.ts new file mode 100644 index 0000000..922b29e --- /dev/null +++ b/dist/lib/connect.d.ts @@ -0,0 +1,4 @@ +/// +import { IOptions } from "../cli/options"; +declare const _default: (host: string, options: IOptions, socketOptions?: any) => SocketIOClient.Socket; +export default _default; diff --git a/dist/lib/connect.js b/dist/lib/connect.js new file mode 100644 index 0000000..9c34634 --- /dev/null +++ b/dist/lib/connect.js @@ -0,0 +1,16 @@ +"use strict"; +exports.__esModule = true; +var io = require("socket.io-client"); +var ioProxy = require("socket.io-proxy"); +exports["default"] = (function (host, options, socketOptions) { + if (options.proxy || process.env.http_proxy) { + if (options.proxy) { + ioProxy.init(options.proxy); + } + return ioProxy.connect(host, socketOptions); + } + else { + return io.connect(host, socketOptions); + } +}); +//# sourceMappingURL=connect.js.map \ No newline at end of file diff --git a/dist/lib/connect.js.map b/dist/lib/connect.js.map new file mode 100644 index 0000000..171bd17 --- /dev/null +++ b/dist/lib/connect.js.map @@ -0,0 +1 @@ +{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/lib/connect.ts"],"names":[],"mappings":";;AAAA,qCAAuC;AACvC,yCAA2C;AAI3C,sBAAe,UAAC,IAAY,EAAE,OAAiB,EAAE,aAAmB;IAChE,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE;QACzC,IAAI,OAAO,CAAC,KAAK,EAAE;YACf,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;SAC/B;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;KAC/C;SAAM;QACH,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;KAC1C;AACL,CAAC,EAAC"} \ No newline at end of file diff --git a/dist/lib/practice.d.ts b/dist/lib/practice.d.ts new file mode 100644 index 0000000..87a9904 --- /dev/null +++ b/dist/lib/practice.d.ts @@ -0,0 +1,5 @@ +declare type GameServerList = { + [key: string]: string; +}; +export declare const GAME_SERVER_BIN: GameServerList; +export {}; diff --git a/dist/lib/practice.js b/dist/lib/practice.js new file mode 100644 index 0000000..bbbd456 --- /dev/null +++ b/dist/lib/practice.js @@ -0,0 +1,6 @@ +"use strict"; +exports.__esModule = true; +exports.GAME_SERVER_BIN = { + "tic-tac-toe": "npx @socialgorithm/tic-tac-toe-game-server" +}; +//# sourceMappingURL=practice.js.map \ No newline at end of file diff --git a/dist/lib/practice.js.map b/dist/lib/practice.js.map new file mode 100644 index 0000000..a1a5c61 --- /dev/null +++ b/dist/lib/practice.js.map @@ -0,0 +1 @@ +{"version":3,"file":"practice.js","sourceRoot":"","sources":["../../src/lib/practice.ts"],"names":[],"mappings":";;AAIa,QAAA,eAAe,GAAmB;IAC3C,aAAa,EAAE,4CAA4C;CAC9D,CAAC"} \ No newline at end of file