Command history

This commit is contained in:
Hexagon 2014-09-21 14:00:55 +02:00
parent 08e4929af2
commit 1cc2223724
1 changed files with 57 additions and 12 deletions

View File

@ -13,6 +13,9 @@ define('cryptalk', {
hash, hash,
nick, nick,
mute = false, mute = false,
history = [],
history_pos = -1,
history_keep = 4,
// Collection of DOM components // Collection of DOM components
components = { components = {
@ -49,6 +52,9 @@ define('cryptalk', {
clear: function () { clear: function () {
components.chat.html(''); components.chat.html('');
// Clear command history on clearing buffer
history = []; history_pos = -1;
}, },
leave: function () { leave: function () {
@ -123,12 +129,21 @@ define('cryptalk', {
} }
}, },
// Push input buffer to command history
pushHistory = function (b) {
history.push(b);
// Shift oldest buffer if we have more than we should keep
if( history.length > history_keep ) history.shift();
},
// Handler for the document`s keyDown-event. // Handler for the document`s keyDown-event.
onKeyDown = function (e) { onKeyDown = function (e) {
var buffer, var buffer,
parts, parts,
payload, payload,
command; command,
save;
// The Document object is bound to this element. // The Document object is bound to this element.
// If the active element is not the input, focus on it and exit the function. // If the active element is not the input, focus on it and exit the function.
@ -136,11 +151,29 @@ define('cryptalk', {
return components.input.focus(); return components.input.focus();
} }
// Check for escape key, this does nothing but clear the input buffer and reset history position
if ( e.keyCode == 27 ) {
history_pos = -1;
components.input[0].value = '';
}
// Check for up or down-keys, they handle the history position
if( e.keyCode == 38 || e.keyCode == 40) {
if (e.keyCode == 38 ) { history_pos = (history_pos > history.length - 2) ? -1 : history_pos = history_pos + 1; }
else { history_pos = (history_pos <= 0) ? -1 : history_pos = history_pos - 1; }
return components.input[0].value = (history_pos == -1) ? '' : history[history.length-1-history_pos];
}
// Return immediatly if the buffer is empty or if the hit key was not <enter> // Return immediatly if the buffer is empty or if the hit key was not <enter>
if (e.keyCode !== 13 || !(buffer = components.input[0].value)) { if (e.keyCode !== 13 || !(buffer = components.input[0].value)) {
return; return;
} }
// Reset current history position to 0 (last command)
history_pos = -1;
// Handle command // Handle command
if (buffer[0] === '/') { if (buffer[0] === '/') {
parts = $.ssplit(buffer.slice(1), ' '); parts = $.ssplit(buffer.slice(1), ' ');
@ -149,6 +182,7 @@ define('cryptalk', {
// Check that there is an handler for this command // Check that there is an handler for this command
if (!commands[command]) { if (!commands[command]) {
pushHistory(buffer);
return post('error', $.template(templates.messages.unrecognized_command, { commandName: command })); return post('error', $.template(templates.messages.unrecognized_command, { commandName: command }));
} }
@ -158,18 +192,19 @@ define('cryptalk', {
// Clear input field // Clear input field
components.input[0].value = ''; components.input[0].value = '';
} else /* Handle ordinary message */ { // Save to history
if(command !== 'key') {
// Make sure that the user has joined a room pushHistory(buffer);
if (!room) {
components.input[0].value = '';
return post('error', templates.messages.msg_no_room);
} }
// And that a valid key is set } else /* Handle ordinary message */ {
if (!key) {
components.input[0].value = ''; if (!room || !key) {
return post('error', templates.messages.msg_no_key); // Push buffer to history and clear input field
pushHistory(buffer); components.input[0].value = '';
// Make sure that the user has joined a room and the key is set
return (!room) ? post('error', templates.messages.msg_no_room) : post('error', templates.messages.msg_no_key);
} }
// Before sending the message. // Before sending the message.
@ -180,9 +215,15 @@ define('cryptalk', {
nick: (nick && nick != undefined) ? $.AES.encrypt(nick, room + key).toString() : false nick: (nick && nick != undefined) ? $.AES.encrypt(nick, room + key).toString() : false
}); });
// Adn the the buffer // And clear the the buffer
components.input[0].value = ''; components.input[0].value = '';
// Save to history
pushHistory(buffer);
} }
}; };
// Connect to server // Connect to server
@ -209,6 +250,10 @@ define('cryptalk', {
.on('room:left', function () { .on('room:left', function () {
post('info', $.template(templates.messages.left_room, { roomName: room })); post('info', $.template(templates.messages.left_room, { roomName: room }));
// Clear history on leaving room
history = []; history_pos = -1;
room = false; room = false;
}) })