Notification sounds
This commit is contained in:
parent
eb555cf0e1
commit
cb4162bdfe
|
@ -11,6 +11,7 @@ Features
|
||||||
* Random (UUID v4) channel name generation för less guessability
|
* Random (UUID v4) channel name generation för less guessability
|
||||||
* Quick-links (not recommended) using http://server/#Room:Passphrase
|
* Quick-links (not recommended) using http://server/#Room:Passphrase
|
||||||
* Super simple setup
|
* Super simple setup
|
||||||
|
* Notification sounds (mutable)
|
||||||
* ~~Flashing title on new messages~~
|
* ~~Flashing title on new messages~~
|
||||||
|
|
||||||
|
|
||||||
|
@ -50,5 +51,6 @@ Available commands:
|
||||||
/key OurStrongPassphrase Sets encryption key
|
/key OurStrongPassphrase Sets encryption key
|
||||||
/leave Leave the room
|
/leave Leave the room
|
||||||
/clear Clear on-screen buffer
|
/clear Clear on-screen buffer
|
||||||
|
/mute Toggle notification sounds
|
||||||
/help This
|
/help This
|
||||||
```
|
```
|
||||||
|
|
|
@ -5,13 +5,14 @@ define('cryptalk', {
|
||||||
host: ''
|
host: ''
|
||||||
},
|
},
|
||||||
compiles: ['$'],
|
compiles: ['$'],
|
||||||
requires: ['templates']
|
requires: ['templates','sound']
|
||||||
}, function ($, requires, data) {
|
}, function ($, requires, data) {
|
||||||
var socket,
|
var socket,
|
||||||
key,
|
key,
|
||||||
room,
|
room,
|
||||||
hash,
|
hash,
|
||||||
nick,
|
nick,
|
||||||
|
mute = false,
|
||||||
|
|
||||||
// Collection of DOM components
|
// Collection of DOM components
|
||||||
components = {
|
components = {
|
||||||
|
@ -20,7 +21,8 @@ define('cryptalk', {
|
||||||
},
|
},
|
||||||
|
|
||||||
// Shortcut
|
// Shortcut
|
||||||
templates = requires.templates,
|
templates = requires.templates;
|
||||||
|
sound = requires.sound;
|
||||||
|
|
||||||
// Adds a new message to the DOM
|
// Adds a new message to the DOM
|
||||||
post = function (type, text, clearChat, clearBuffer, nick) {
|
post = function (type, text, clearChat, clearBuffer, nick) {
|
||||||
|
@ -93,6 +95,17 @@ define('cryptalk', {
|
||||||
post('info', $.template(templates.messages.nick_set, { nick: nick}));
|
post('info', $.template(templates.messages.nick_set, { nick: nick}));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
mute: function () {
|
||||||
|
// Set nick
|
||||||
|
mute = !mute;
|
||||||
|
|
||||||
|
// Inform that the key has been set
|
||||||
|
if( mute )
|
||||||
|
post('info', $.template(templates.messages.muted ));
|
||||||
|
else
|
||||||
|
post('info', $.template(templates.messages.unmuted ));
|
||||||
|
},
|
||||||
|
|
||||||
join: function (payload) {
|
join: function (payload) {
|
||||||
return (
|
return (
|
||||||
room
|
room
|
||||||
|
@ -204,8 +217,8 @@ define('cryptalk', {
|
||||||
if (!decrypted) {
|
if (!decrypted) {
|
||||||
post('error', templates.messages.unable_to_decrypt);
|
post('error', templates.messages.unable_to_decrypt);
|
||||||
} else {
|
} else {
|
||||||
// Post the message, but do not clear either the chat nor the buffer.
|
|
||||||
post('message', sanitized, false, false, nick);
|
post('message', sanitized, false, false, nick);
|
||||||
|
if( !mute ) sound.playTones(sound.messages.message);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -219,6 +232,10 @@ define('cryptalk', {
|
||||||
} else {
|
} else {
|
||||||
post('server', templates.server[sanitized]);
|
post('server', templates.server[sanitized]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Play sound
|
||||||
|
if (sound.messages[sanitized] !== undefined && !mute ) sound.playTones(sound.messages[sanitized]);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
post('error', templates.server.bogus);
|
post('error', templates.server.bogus);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
define('queue', function(){
|
||||||
|
|
||||||
|
var exports = {};
|
||||||
|
|
||||||
|
queue = [];
|
||||||
|
|
||||||
|
exports.add_function_delayed = function(d,callback,data) {
|
||||||
|
|
||||||
|
queue.push(
|
||||||
|
{
|
||||||
|
func:
|
||||||
|
function(){
|
||||||
|
var finished = callback();
|
||||||
|
},
|
||||||
|
pushed:Date.now(),
|
||||||
|
delay:d,
|
||||||
|
data:data
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.get = function() {
|
||||||
|
return queue;
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.run = function(){
|
||||||
|
|
||||||
|
for(var i=0;i<queue.length;i++){
|
||||||
|
var current = queue[i];
|
||||||
|
if (Date.now() - current.pushed > current.delay) {
|
||||||
|
current.func();
|
||||||
|
queue.splice(i,1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!queue.length) return;
|
||||||
|
|
||||||
|
// Waste a ms to prevent callstack overflow
|
||||||
|
lrt_inner = Date.now();
|
||||||
|
while (Date.now() - lrt_inner < 1) { var a=1+1; };
|
||||||
|
|
||||||
|
exports.run();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return exports;
|
||||||
|
|
||||||
|
});
|
|
@ -0,0 +1,68 @@
|
||||||
|
// Sounds module, used for emitting those annoying bl-up sounds when receiving a message
|
||||||
|
define('sound',{requires: ['queue']}, function (requires) {
|
||||||
|
|
||||||
|
var exports = { messages: {} },
|
||||||
|
queue = requires.queue,
|
||||||
|
|
||||||
|
ac = new (window.AudioContext || window.webkitAudioContext || false);
|
||||||
|
|
||||||
|
// Recursive function for playing tones, takes an array of [tone,start_ms,duration_ms] - entries
|
||||||
|
// i is only used for recursion
|
||||||
|
exports.playTones = function (tones, i) {
|
||||||
|
|
||||||
|
// Parameter defaults
|
||||||
|
i = (i === undefined) ? 0 : i;
|
||||||
|
|
||||||
|
// Stop if we've reached the end of iteration, and require ac
|
||||||
|
if( !(i < Object.keys(tones).length) || !ac ) return;
|
||||||
|
|
||||||
|
// Add tones to execution queue
|
||||||
|
var current_tones = tones[i],
|
||||||
|
freqs = current_tones[0],
|
||||||
|
start = current_tones[1],
|
||||||
|
duration = current_tones[2];
|
||||||
|
|
||||||
|
var o = ac.createOscillator();
|
||||||
|
var g = ac.createGain();
|
||||||
|
o.frequency.value = freqs;
|
||||||
|
o.connect(g);
|
||||||
|
g.gain.value = 0.25;
|
||||||
|
g.connect(ac.destination);
|
||||||
|
queue.add_function_delayed(start,function() { o.noteOn(0); });
|
||||||
|
queue.add_function_delayed(start+duration,function() { o.noteOff(0); });
|
||||||
|
|
||||||
|
// Iterate, or start playing
|
||||||
|
i++;
|
||||||
|
if( i < Object.keys(tones).length ) {
|
||||||
|
exports.playTones(tones,i);
|
||||||
|
} else {
|
||||||
|
queue.run();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.messages = {
|
||||||
|
message: [
|
||||||
|
[261.63*2,0,50],
|
||||||
|
[261.63*3,0,50],
|
||||||
|
[261.63*4,50,50],
|
||||||
|
[261.63*5,50,50]
|
||||||
|
],
|
||||||
|
person_joined: [
|
||||||
|
[261.63*3,0,200],
|
||||||
|
[261.63*1,0,200],
|
||||||
|
[261.63*3,200,500],
|
||||||
|
[261.63*2,200,500]
|
||||||
|
],
|
||||||
|
person_left: [
|
||||||
|
[261.63*3,0,200],
|
||||||
|
[261.63*2,0,200],
|
||||||
|
[261.63*3,200,500],
|
||||||
|
[261.63*1,200,500]
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
return exports;
|
||||||
|
|
||||||
|
});
|
|
@ -28,6 +28,7 @@ define({
|
||||||
' /join RoomId Join a room \n' +
|
' /join RoomId Join a room \n' +
|
||||||
' /count Count participants of room \n' +
|
' /count Count participants of room \n' +
|
||||||
' /nick NickName Sets an optional nick \n' +
|
' /nick NickName Sets an optional nick \n' +
|
||||||
|
' /mute Toggle notification sounds \n' +
|
||||||
' /key OurStrongPassphrase Sets encryption key \n' +
|
' /key OurStrongPassphrase Sets encryption key \n' +
|
||||||
' /leave Leave the room \n' +
|
' /leave Leave the room \n' +
|
||||||
' /clear Clear on-screen buffer \n' +
|
' /clear Clear on-screen buffer \n' +
|
||||||
|
@ -61,6 +62,10 @@ define({
|
||||||
nick_set: 'From now on, you\'re referred to as \'{nick}\'.',
|
nick_set: 'From now on, you\'re referred to as \'{nick}\'.',
|
||||||
leave_from_nowhere: 'How are you supposed to leave, while being nowhere?',
|
leave_from_nowhere: 'How are you supposed to leave, while being nowhere?',
|
||||||
|
|
||||||
|
// Sounds
|
||||||
|
muted: 'Notification sounds is now muted.',
|
||||||
|
unmuted: 'Notifications sounds is now on.',
|
||||||
|
|
||||||
// Available variables: 'commandName'
|
// Available variables: 'commandName'
|
||||||
unrecognized_command: 'Unrecognized command: "{commandName}"',
|
unrecognized_command: 'Unrecognized command: "{commandName}"',
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue