diff --git a/src/js/chat.js b/src/js/chat.js index 7d1e7f7..4b6881a 100644 --- a/src/js/chat.js +++ b/src/js/chat.js @@ -34,8 +34,12 @@ export default class Chat { } if (options && options.error) { - $el = $('
  • ').addClass('log').html(message); - } else if (options && options.info) { + $el = $('
  • ').addClass('log').html('ERROR: ' + message); + } else if (options && options.warning) { + $el = $('
  • ').addClass('log').html('WARNING: ' + message); + } else if (options && options.notice) { + $el = $('
  • ').addClass('log').html('NOTICE: ' + message); + } else if (options && options.info) { $el = $('
  • ').addClass('log').html(message); } else { $el = $('
  • ').addClass('log').html(message); @@ -68,9 +72,10 @@ export default class Chat { const COLORS = [ '#e21400', '#ffe400', '#ff8f00', '#58dc00', '#dd9cff', '#4ae8c4', - '#3b88eb', '#f47777', '#d300e7', - '#99FF33', '#99CC33', '#999933', - '#996633', '#993333', '#990033', + '#3b88eb', '#f47777', '#EEACB7', + '#D3FF3E', '#99CC33', '#999933', + '#996633', '#B8D5B8', '#7FFF38', + '#FADBBC', '#FAE2B7', '#EBE8AF', ]; // Compute hash code let hash = 7; @@ -173,7 +178,7 @@ export default class Chat { return this.log('Username must start with a letter.', {error: true}); } - this.darkwire.updateUsername(window.username, newUsername).then((socketData) => { + this.darkwire.updateUsername(newUsername).then((socketData) => { let modifiedSocketData = { username: window.username, newUsername: socketData.username @@ -181,6 +186,8 @@ export default class Chat { this.socket.emit('update user', modifiedSocketData); window.username = username = socketData.username; + }).catch((err) => { + return this.log(err, {error: true}); }); } }, { @@ -194,7 +201,7 @@ export default class Chat { return '/' + command; }); - this.log('Valid commands: ' + validCommands.sort().join(', '), {info: true}); + this.log('Valid commands: ' + validCommands.sort().join(', '), {notice: true}); } }, { command: 'me', diff --git a/src/js/darkwire.js b/src/js/darkwire.js index e344391..6daec6e 100644 --- a/src/js/darkwire.js +++ b/src/js/darkwire.js @@ -53,16 +53,12 @@ export default class Darkwire { return _.findWhere(this._users, {id: id}); } - getUserByName(username) { - return _.findWhere(this._users, {username: username}); - } - updateUser(data) { return new Promise((resolve, reject) => { let user = this.getUserById(data.id); if (!user) { - return reject(); + return reject('User cannot be found'); } let oldUsername = user.username; @@ -105,45 +101,62 @@ export default class Darkwire { return importKeysPromises; } + checkSessionUsernames(username) { + let matches = _.find(this._users, (users) => { + return username.toLowerCase() === users.username.toLowerCase(); + }); + + if (matches && matches.username) { + return matches; + } + + return false; + } + removeUser(data) { this._users = _.without(this._users, _.findWhere(this._users, {id: data.id})); return this._users; } - updateUsername(username, newUsername) { + updateUsername(username) { let user = null; return new Promise((resolve, reject) => { - if (newUsername) { - user = this.getUserByName(username); + if (username) { + user = this.getUserById(this._myUserId); } - if (username) { - if (!user) { - Promise.all([ - this._cryptoUtil.createPrimaryKeys() - ]) - .then((data) => { - this._keys = { - public: data[0].publicKey, - private: data[0].privateKey - }; - return Promise.all([ - this._cryptoUtil.exportKey(data[0].publicKey, 'spki') - ]); - }) - .then((exportedKeys) => { - resolve({ - username: username, - publicKey: exportedKeys[0] - }); - }); - } else { + if (!user) { + Promise.all([ + this._cryptoUtil.createPrimaryKeys() + ]) + .then((data) => { + this._keys = { + public: data[0].publicKey, + private: data[0].privateKey + }; + return Promise.all([ + this._cryptoUtil.exportKey(data[0].publicKey, 'spki') + ]); + }) + .then((exportedKeys) => { resolve({ - username: newUsername, - publicKey: user.publicKey + username: username, + publicKey: exportedKeys[0] }); + }); + } else { + let userExists = this.checkSessionUsernames(username); + if (userExists) { + if (userExists.id !== this._myUserId) { + return reject(username + ' is being used by someone else in this chat session.'); + } } + + return resolve({ + username: username, + publicKey: user.publicKey + }); } }); } diff --git a/src/js/main.js b/src/js/main.js index 9c4ff0b..a5738b3 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -48,7 +48,7 @@ $(function() { fs(window.TEMPORARY, 100, () => { - chat.log('WARNING: Your browser is not in incognito mode!', {error: true}); + chat.log('Your browser is not in incognito mode!', {warning: true}); }); } chat.log(moment().format('MMMM Do YYYY, h:mm:ss a'), {info: true}); diff --git a/src/public/style.css b/src/public/style.css index 606e38b..de53408 100644 --- a/src/public/style.css +++ b/src/public/style.css @@ -313,14 +313,20 @@ html.no-touchevents .chat #input-icons { line-height: 10px; } -.log-info { - color: #FFF; +.log-error, .log-info, .log-warning { font-weight: bold; } .log-error { - color: yellow; - font-weight: bold; + color: #D8D638; +} + +.log-info { + color: #FFF; +} + +.log-warning { + color: #E0873E; } .action {