From a81812541dc43b301e0ed0067ad9788eb99aaecc Mon Sep 17 00:00:00 2001 From: Jacquelinne Marcano Date: Thu, 10 Jul 2025 10:30:29 -0400 Subject: [PATCH 1/6] v2.0.0 enhancement: Add color for users & sys msgs Made it so it selects a color from the list. This list is based on the stylesh package, and makes sure the selected color is a string to pass as a variable. Currently we're only coloring the border of the user, but could easily do the name itself, or the background of the text. Tried to make it as backwards compatible as possible. --- client/chat.js | 27 ++- package-lock.json | 422 ++++++++++++++++++++++++++++++++++++++++++- package.json | 5 +- server/server.js | 15 +- utils/colorList.json | 143 +++++++++++++++ 5 files changed, 594 insertions(+), 18 deletions(-) create mode 100644 utils/colorList.json diff --git a/client/chat.js b/client/chat.js index a016c4e..1160d3d 100644 --- a/client/chat.js +++ b/client/chat.js @@ -1,26 +1,37 @@ +require("stylesh"); +const { colors } = require("../utils/colorList.json"); +let myColorIndex; const startChat = (name, socket, rl) => { rl.on("line", (input) => { - socket.emit("message", { name, message: input }); + socket.emit("message", { name, message: input, color: myColorIndex ? myColorIndex : 0 }); }); + // Handle messages from server, but also has fallback if using older versions of termtalk by giving them a basic white frame + // if no color is provided to the client, or the server. This also helps indicate that there is something/someone out of date. socket.on("message", (data) => { if (data.name !== name) { - console.log(`${data.name}: ${data.message}`); + console.log(`${data.name}: ${data.message}`.createRoundedBorder(data.color ? colors[data.color].toString() : "white")); + } else { + process.stdout.moveCursor(0, -1); + console.log(`${data.name}: ${data.message}`.createRoundedBorder(myColorIndex ? colors[myColorIndex].toString() : "white")); } }); - socket.on("welcome", (data) => { - if(data.username !== name) { - console.log(`${data.message}`); + socket.on("user-join", (data) => { + if (data.username !== name) { + console.log(`${data.message}`.color("yellow").createDottedBorder("yellow")); + } else if (data.username === name) { + myColorIndex = data.color + console.log(`${data.message}`.color("green").createDottedBorder("green")); } -}); + //User has left chat socket.on("bye-bye", (data) => { - console.log(`${data.message}`); + console.log(`${data.message}`.color("red").createDottedBorder("red")); }); socket.on("disconnect", () => { - console.log("Disconnected from server"); + console.log(`Disconnected from server`.createDashedBorder("green")); rl.close(); }); }; diff --git a/package-lock.json b/package-lock.json index e38bd6c..0773806 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "termtalk", - "version": "2.0.0", + "version": "2.1.0", "lockfileVersion": 3, "requires": true, "packages": { @@ -16,13 +16,37 @@ "portscanner": "^2.2.0", "prompt": "^1.3.0", "socket.io": "^4.7.5", - "socket.io-client": "^4.8.0" + "socket.io-client": "^4.8.0", + "stylesh": "^1.1.1" }, "bin": { "tt-host": "server/server.js", "tt-join": "client/client.js" } }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "optional": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "optional": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@colors/colors": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", @@ -31,6 +55,104 @@ "node": ">=0.1.90" } }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==" + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "25.0.8", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.8.tgz", + "integrity": "sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "11.1.6", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", + "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0||^4.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", + "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", @@ -49,6 +171,11 @@ "@types/node": "*" } }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" + }, "node_modules/@types/node": { "version": "20.14.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.7.tgz", @@ -57,6 +184,11 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" + }, "node_modules/@types/tinycolor2": { "version": "1.4.6", "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.6.tgz", @@ -112,6 +244,11 @@ "follow-redirects": "^1.14.0" } }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, "node_modules/base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", @@ -120,6 +257,14 @@ "node": "^4.5.0 || >= 5.9" } }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/chalk": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", @@ -165,6 +310,11 @@ "node": ">=0.1.90" } }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, "node_modules/cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", @@ -209,6 +359,14 @@ } } }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -263,6 +421,11 @@ "node": ">=6" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, "node_modules/eyes": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", @@ -301,6 +464,32 @@ } } }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -309,6 +498,25 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/gradient-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/gradient-string/-/gradient-string-2.0.2.tgz", @@ -344,6 +552,46 @@ "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -352,6 +600,11 @@ "node": ">=8" } }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, "node_modules/is-number-like": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz", @@ -360,11 +613,25 @@ "lodash.isfinite": "^3.3.2" } }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "optional": true + }, "node_modules/localtunnel": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-2.0.2.tgz", @@ -408,6 +675,14 @@ "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==" }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -427,6 +702,17 @@ "node": ">= 0.6" } }, + "node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -453,11 +739,41 @@ "node": ">=0.10.0" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/openurl": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz", "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==" }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "optional": true + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/portscanner": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.2.0.tgz", @@ -510,6 +826,25 @@ "node": ">=0.10.0" } }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/revalidator": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", @@ -518,6 +853,42 @@ "node": ">= 0.4.0" } }, + "node_modules/rollup": { + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-dts": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.2.1.tgz", + "integrity": "sha512-sR3CxYUl7i2CHa0O7bA45mCrgADyAQ0tVtGSqi3yvH28M+eg1+g5d7kQ9hLvEz5dorK3XVsH5L2jwHLQf72DzA==", + "dependencies": { + "magic-string": "^0.30.17" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/Swatinem" + }, + "optionalDependencies": { + "@babel/code-frame": "^7.26.2" + }, + "peerDependencies": { + "rollup": "^3.29.4 || ^4", + "typescript": "^4.5 || ^5.0" + } + }, "node_modules/socket.io": { "version": "4.7.5", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", @@ -603,6 +974,20 @@ "node": ">=8" } }, + "node_modules/stylesh": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stylesh/-/stylesh-1.1.1.tgz", + "integrity": "sha512-RZLWEbNpnPoMDaM8ci2dTWCtlNnbmnpT/c2iK3pdqWovB/UG+oJdRDyix2iW7Ur6qxBDSgXp4Rj7E42Dd56G4w==", + "dependencies": { + "@rollup/plugin-commonjs": "^25.0.5", + "@rollup/plugin-node-resolve": "^15.2.2", + "@rollup/plugin-typescript": "^11.1.5", + "rollup": "^3.29.4", + "rollup-plugin-dts": "^6.0.2", + "tslib": "^2.6.2", + "typescript": "^5.2.2" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -614,6 +999,17 @@ "node": ">=8" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/tinycolor2": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", @@ -628,6 +1024,23 @@ "tinycolor2": "^1.0.0" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -673,6 +1086,11 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, "node_modules/ws": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", diff --git a/package.json b/package.json index 4143a6f..2475cf3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "termtalk", - "version": "2.0.0", + "version": "2.1.0", "description": "Npm package to securely chat with your friend through your CLI.", "scripts": { "host": "node ./server/server.js", @@ -36,6 +36,7 @@ "portscanner": "^2.2.0", "prompt": "^1.3.0", "socket.io": "^4.7.5", - "socket.io-client": "^4.8.0" + "socket.io-client": "^4.8.0", + "stylesh": "^1.1.1" } } diff --git a/server/server.js b/server/server.js index 121d216..720e021 100755 --- a/server/server.js +++ b/server/server.js @@ -4,9 +4,10 @@ const io = require('socket.io'); const getPortNumber = require('./getPort'); const createTunnel = require('./createTunnel'); +const colorAmt = 140; // check if port is valid getPortNumber(async (PORT) => { - if(PORT) { + if (PORT) { // create socket.io server with user given PORT const server = io(PORT); console.log(`Waiting for server links to generate ...`); @@ -19,15 +20,17 @@ getPortNumber(async (PORT) => { }); socket.on('setUsername', username => { - socket.username = username; // Set the username for the socket - server.emit('welcome', { username, message: `${username} has joined the chat!`}); + socket.username = username; // Set the username for the socket + socket.color = Math.floor(Math.random() * colorAmt); + + server.emit('user-join', { username, message: `${username} has joined the chat!`, color: socket.color }); }); socket.on('disconnect', () => { - console.log('A user disconnected'); - server.emit('bye-bye', { message: `${socket.username} has left the chat.` }); - }); + console.log('A user disconnected'); + server.emit('bye-bye', { message: `${socket.username ? socket.username : "A user"} has left the chat.` }); + }); }); diff --git a/utils/colorList.json b/utils/colorList.json new file mode 100644 index 0000000..ab4dc59 --- /dev/null +++ b/utils/colorList.json @@ -0,0 +1,143 @@ +{ + "colors": [ + "darkRed", + "red", + "firebrick", + "crimson", + "indianRed", + "lightCoral", + "salmon", + "darkSalmon", + "lightSalmon", + "orangeRed", + "tomato", + "darkOrange", + "coral", + "orange", + "darkSlateGray", + "dimGray", + "slateGray", + "gray", + "lightSlateGray", + "darkGray", + "silver", + "lightGray", + "gainsboro", + "maroon", + "brown", + "saddleBrown", + "sienna", + "chocolate", + "darkGoldenrod", + "peru", + "rosyBrown", + "goldenrod", + "sandyBrown", + "tan", + "burlywood", + "wheat", + "navajoWhite", + "bisque", + "blanchedAlmond", + "cornsilk", + "teal", + "darkCyan", + "lightSeaGreen", + "cadetBlue", + "darkTurquoise", + "mediumTurquoise", + "turquoise", + "aqua", + "cyan", + "aquamarine", + "paleTurquoise", + "lightCyan", + "mistyRose", + "antiqueWhite", + "linen", + "beige", + "whiteSmoke", + "lavenderBlush", + "oldLace", + "aliceBlue", + "seashell", + "ghostWhite", + "honeydew", + "floralWhite", + "azure", + "mintCream", + "snow", + "ivory", + "white", + "midnightBlue", + "navy", + "darkBlue", + "mediumBlue", + "blue", + "royalBlue", + "steelBlue", + "dodgerBlue", + "deepSkyBlue", + "cornflowerBlue", + "skyBlue", + "lightSkyBlue", + "lightSteelBlue", + "lightBlue", + "powderBlue", + "darkGreen", + "green", + "darkOliveGreen", + "forestGreen", + "seaGreen", + "olive", + "oliveDrab", + "mediumSeaGreen", + "limeGreen", + "lime", + "springGreen", + "mediumSpringGreen", + "darkSeaGreen", + "mediumAquamarine", + "yellowGreen", + "lawnGreen", + "chartreuse", + "lightGreen", + "greenYellow", + "paleGreen", + "indigo", + "purple", + "darkMagenta", + "darkViolet", + "darkSlateBlue", + "blueViolet", + "darkOrchid", + "fuchsia", + "magenta", + "slateBlue", + "mediumSlateBlue", + "mediumOrchid", + "mediumPurple", + "orchid", + "violet", + "plum", + "thistle", + "lavender", + "mediumVioletRed", + "deepPink", + "paleVioletRed", + "hotPink", + "lightPink", + "pink", + "darkKhaki", + "gold", + "khaki", + "peachPuff", + "yellow", + "paleGoldenrod", + "moccasin", + "papayaWhip", + "lightGoldenrodYellow", + "lemonChiffon", + "lightYellow" + ] +} \ No newline at end of file From 6d281525e587f0fcc6ab920fc01899f60b5f4bf7 Mon Sep 17 00:00:00 2001 From: Jacquelinne Marcano Date: Thu, 10 Jul 2025 10:30:43 -0400 Subject: [PATCH 2/6] Update chat.js --- client/chat.js | 1 + 1 file changed, 1 insertion(+) diff --git a/client/chat.js b/client/chat.js index 1160d3d..dc81b19 100644 --- a/client/chat.js +++ b/client/chat.js @@ -24,6 +24,7 @@ const startChat = (name, socket, rl) => { myColorIndex = data.color console.log(`${data.message}`.color("green").createDottedBorder("green")); } + }); //User has left chat socket.on("bye-bye", (data) => { From 0a2413901aa48f481d56922c92408efe19e1c148 Mon Sep 17 00:00:00 2001 From: Jacquelinne Marcano Date: Thu, 10 Jul 2025 10:43:25 -0400 Subject: [PATCH 3/6] Update chat.js clearing unused text line to help with multiline and text modification. --- client/chat.js | 1 + 1 file changed, 1 insertion(+) diff --git a/client/chat.js b/client/chat.js index dc81b19..46cdb2d 100644 --- a/client/chat.js +++ b/client/chat.js @@ -13,6 +13,7 @@ const startChat = (name, socket, rl) => { console.log(`${data.name}: ${data.message}`.createRoundedBorder(data.color ? colors[data.color].toString() : "white")); } else { process.stdout.moveCursor(0, -1); + process.stdout.clearLine(); console.log(`${data.name}: ${data.message}`.createRoundedBorder(myColorIndex ? colors[myColorIndex].toString() : "white")); } }); From 68e5b8d9e2adef15aca65e506ecbfac28a1da710 Mon Sep 17 00:00:00 2001 From: Jacquelinne Marcano Date: Thu, 10 Jul 2025 10:51:02 -0400 Subject: [PATCH 4/6] Update chat.js Added chat formatter to make chat automatically multiline when above that character count. --- client/chat.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/chat.js b/client/chat.js index 46cdb2d..24090f6 100644 --- a/client/chat.js +++ b/client/chat.js @@ -3,7 +3,8 @@ const { colors } = require("../utils/colorList.json"); let myColorIndex; const startChat = (name, socket, rl) => { rl.on("line", (input) => { - socket.emit("message", { name, message: input, color: myColorIndex ? myColorIndex : 0 }); + const formattedMessage = input.match(/.{1,50}/g).join("<>"); + socket.emit("message", { name, message: formattedMessage, color: myColorIndex ? myColorIndex : 0 }); }); // Handle messages from server, but also has fallback if using older versions of termtalk by giving them a basic white frame From 8194783c6b2a3b8418f9fc25da3518077b0d8cd7 Mon Sep 17 00:00:00 2001 From: Jacquelinne Marcano Date: Thu, 10 Jul 2025 10:53:42 -0400 Subject: [PATCH 5/6] Update chat.js added blocker to send so empty messages don't get sent. --- client/chat.js | 1 + 1 file changed, 1 insertion(+) diff --git a/client/chat.js b/client/chat.js index 24090f6..d16cd7b 100644 --- a/client/chat.js +++ b/client/chat.js @@ -3,6 +3,7 @@ const { colors } = require("../utils/colorList.json"); let myColorIndex; const startChat = (name, socket, rl) => { rl.on("line", (input) => { + if (!input.length > 0) return const formattedMessage = input.match(/.{1,50}/g).join("<>"); socket.emit("message", { name, message: formattedMessage, color: myColorIndex ? myColorIndex : 0 }); }); From d7823b0de04dcfe3f01e05708cf6d17362bb8b8a Mon Sep 17 00:00:00 2001 From: Jacquelinne Marcano Date: Sun, 13 Jul 2025 16:17:30 -0400 Subject: [PATCH 6/6] Updated Socket.io and chalk --- package-lock.json | 60 +++++++++++++++++++++-------------------------- package.json | 4 ++-- 2 files changed, 29 insertions(+), 35 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0773806..d32ebfa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,16 +6,16 @@ "packages": { "": { "name": "termtalk", - "version": "2.0.0", + "version": "2.1.0", "license": "MIT", "dependencies": { - "chalk": "^5.3.0", + "chalk": "^5.4.1", "figlet": "^1.7.0", "gradient-string": "^2.0.2", "localtunnel": "^2.0.2", "portscanner": "^2.2.0", "prompt": "^1.3.0", - "socket.io": "^4.7.5", + "socket.io": "^4.8.1", "socket.io-client": "^4.8.0", "stylesh": "^1.1.1" }, @@ -158,15 +158,10 @@ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" - }, "node_modules/@types/cors": { - "version": "2.8.17", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", - "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dependencies": { "@types/node": "*" } @@ -177,11 +172,11 @@ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==" }, "node_modules/@types/node": { - "version": "20.14.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.7.tgz", - "integrity": "sha512-uTr2m2IbJJucF3KUxgnGOZvYbN0QgkGyWxG6973HCpMYFy2KfcgYuIwkJQMQkt1VbBMlvWRbpshFTLxnxCZjKQ==", + "version": "24.0.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.13.tgz", + "integrity": "sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ==", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~7.8.0" } }, "node_modules/@types/resolve": { @@ -266,9 +261,9 @@ } }, "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -316,9 +311,9 @@ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "engines": { "node": ">= 0.6" } @@ -373,16 +368,15 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/engine.io": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", - "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", "dependencies": { - "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~0.4.1", + "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", @@ -890,15 +884,15 @@ } }, "node_modules/socket.io": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", - "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.5.2", + "engine.io": "~6.6.0", "socket.io-adapter": "~2.5.2", "socket.io-parser": "~4.2.4" }, @@ -1042,9 +1036,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==" }, "node_modules/vary": { "version": "1.1.2", diff --git a/package.json b/package.json index 2475cf3..5935e22 100644 --- a/package.json +++ b/package.json @@ -29,13 +29,13 @@ }, "homepage": "https://github.com/achhayapathak/termtalk#readme", "dependencies": { - "chalk": "^5.3.0", + "chalk": "^5.4.1", "figlet": "^1.7.0", "gradient-string": "^2.0.2", "localtunnel": "^2.0.2", "portscanner": "^2.2.0", "prompt": "^1.3.0", - "socket.io": "^4.7.5", + "socket.io": "^4.8.1", "socket.io-client": "^4.8.0", "stylesh": "^1.1.1" }