Notification sounds
This commit is contained in:
		
							parent
							
								
									eb555cf0e1
								
							
						
					
					
						commit
						cb4162bdfe
					
				
					 5 changed files with 143 additions and 3 deletions
				
			
		| 
						 | 
					@ -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);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										48
									
								
								public/js/cryptalk_modules/queue.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								public/js/cryptalk_modules/queue.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
							
								
								
									
										68
									
								
								public/js/cryptalk_modules/sound.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								public/js/cryptalk_modules/sound.js
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -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…
	
	Add table
		
		Reference in a new issue