From e312e7bd9912956f1a1609825dad1404cecb5af4 Mon Sep 17 00:00:00 2001 From: Sebastien Hut Date: Sun, 25 Jan 2015 20:21:57 +0100 Subject: [PATCH] Sound Notifications --- clientapp/app.js | 8 +++++++ clientapp/models/contact.js | 2 ++ clientapp/models/me.js | 17 +++++++++++++-- clientapp/models/muc.js | 7 +++++++ clientapp/pages/main.js | 9 ++++++-- clientapp/templates.js | 2 +- clientapp/templates/pages/main.jade | 3 +++ package.json | 2 +- public/css/components/buttons.styl | 5 ----- public/css/otalk.css | 12 +++++++---- public/css/pages/settings.styl | 31 +++++++++++++++++----------- public/sounds/ding.wav | Bin 0 -> 5400 bytes public/sounds/threetone-alert.wav | Bin 0 -> 34156 bytes server.js | 6 ++++++ 14 files changed, 77 insertions(+), 27 deletions(-) create mode 100644 public/sounds/ding.wav create mode 100644 public/sounds/threetone-alert.wav diff --git a/clientapp/app.js b/clientapp/app.js index 9ec1fcc..1543202 100644 --- a/clientapp/app.js +++ b/clientapp/app.js @@ -18,6 +18,8 @@ var Notify = require('notify.js'); var Desktop = require('./helpers/desktop'); var AppCache = require('./helpers/cache'); +var SoundEffectManager = require('sound-effect-manager'); + module.exports = { launch: function () { @@ -39,6 +41,7 @@ module.exports = { async.series([ function (cb) { app.notifications = new Notify(); + app.soundManager = new SoundEffectManager(); app.desktop = new Desktop(); app.cache = new AppCache(); app.storage = new Storage(); @@ -75,6 +78,11 @@ module.exports = { }); self.api.connect(); }, + function (cb) { + app.soundManager.loadFile('/sounds/ding.wav', 'ding'); + app.soundManager.loadFile('/sounds/threetone-alert.wav', 'threetone-alert'); + cb(); + }, function (cb) { function start() { // start our router and show the appropriate page diff --git a/clientapp/models/contact.js b/clientapp/models/contact.js index bdf3609..47017b2 100644 --- a/clientapp/models/contact.js +++ b/clientapp/models/contact.js @@ -263,6 +263,8 @@ module.exports = HumanModel.define({ tag: this.jid, onclick: _.bind(app.navigate, app, '/chat/' + encodeURIComponent(this.jid)) }); + if (me.soundEnabled) + app.soundManager.play('ding'); } var existing = Message.idLookup(message.from[message.type == 'groupchat' ? 'full' : 'bare'], message.mid); diff --git a/clientapp/models/me.js b/clientapp/models/me.js index 9e60e6d..c4c7202 100644 --- a/clientapp/models/me.js +++ b/clientapp/models/me.js @@ -25,6 +25,7 @@ module.exports = HumanModel.define({ this.bind('change:avatarID', this.save, this); this.bind('change:status', this.save, this); this.bind('change:rosterVer', this.save, this); + this.bind('change:soundEnabled', this.save, this); this.contacts.bind('change:unreadCount', this.updateUnreadCount, this); app.state.bind('change:active', this.updateIdlePresence, this); app.state.bind('change:deviceIDReady', this.registerDevice, this); @@ -42,7 +43,8 @@ module.exports = HumanModel.define({ shouldAskForAlertsPermission: ['bool', false, false], hasFocus: ['bool', false, false], _activeContact: 'string', - stream: 'object' + stream: 'object', + soundEnabled: ['bool', false, true], }, collections: { contacts: Contacts, @@ -70,6 +72,12 @@ module.exports = HumanModel.define({ return app.serverConfig().name || 'Otalk'; } }, + soundEnabledClass: { + deps: ['soundEnabled'], + fn: function () { + return this.soundEnabled ? "primary" : "secondary"; + } + }, }, setActiveContact: function (jid) { var prev = this.getContact(this._activeContact); @@ -90,6 +98,9 @@ module.exports = HumanModel.define({ self.avatar = avatar.uri; }); }, + setSoundNotification: function(enable) { + this.soundEnabled = enable; + }, getContact: function (jid, alt) { if (typeof jid === 'string') jid = new client.JID(jid); if (typeof alt === 'string') alt = new client.JID(alt); @@ -134,6 +145,7 @@ module.exports = HumanModel.define({ self.nick = self.jid.local; self.status = profile.status; self.avatarID = profile.avatarID; + self.soundEnabled = profile.soundEnabled; } self.save(); app.storage.roster.getAll(self.jid.bare, function (err, contacts) { @@ -187,7 +199,8 @@ module.exports = HumanModel.define({ jid: this.jid.bare, avatarID: this.avatarID, status: this.status, - rosterVer: this.rosterVer + rosterVer: this.rosterVer, + soundEnabled: this.soundEnabled }; app.storage.profiles.set(data); }, diff --git a/clientapp/models/muc.js b/clientapp/models/muc.js index dd63816..3f116b5 100644 --- a/clientapp/models/muc.js +++ b/clientapp/models/muc.js @@ -98,6 +98,13 @@ module.exports = HumanModel.define({ tag: this.id, onclick: _.bind(app.navigate, app, '/groupchat/' + encodeURIComponent(this.jid)) }); + if (me.soundEnabled) + app.soundManager.play('threetone-alert'); + } + else + { + if (me.soundEnabled) + app.soundManager.play('ding'); } } diff --git a/clientapp/pages/main.js b/clientapp/pages/main.js index 05a11a9..e8495c4 100644 --- a/clientapp/pages/main.js +++ b/clientapp/pages/main.js @@ -9,7 +9,8 @@ var templates = require('../templates'); module.exports = BasePage.extend({ template: templates.pages.main, classBindings: { - shouldAskForAlertsPermission: '.enableAlerts' + shouldAskForAlertsPermission: '.enableAlerts', + soundEnabledClass: '.soundNotifs' }, srcBindings: { avatar: '#avatarChanger img' @@ -20,6 +21,7 @@ module.exports = BasePage.extend({ events: { 'click .enableAlerts': 'enableAlerts', 'click .installFirefox': 'installFirefox', + 'click .soundNotifs': 'handleSoundNotifs', 'dragover': 'handleAvatarChangeDragOver', 'drop': 'handleAvatarChange', 'change #uploader': 'handleAvatarChange' @@ -87,5 +89,8 @@ module.exports = BasePage.extend({ }; fileTracker.readAsDataURL(file); } - } + }, + handleSoundNotifs: function (e) { + this.model.setSoundNotification(!this.model.soundEnabled); + }, }); diff --git a/clientapp/templates.js b/clientapp/templates.js index 7c4eeae..c06229c 100644 --- a/clientapp/templates.js +++ b/clientapp/templates.js @@ -500,7 +500,7 @@ exports.pages.groupchat = function anonymous(locals) { exports.pages.main = function anonymous(locals) { var buf = []; with (locals || {}) { - buf.push('

Change Avatar

Drag and drop a new avatar here

Desktop Integration

'); + buf.push('

Settings

Change Avatar

Drag and drop a new avatar here

Desktop Integration

'); } return buf.join(""); }; diff --git a/clientapp/templates/pages/main.jade b/clientapp/templates/pages/main.jade index b9f79c2..51e733c 100644 --- a/clientapp/templates/pages/main.jade +++ b/clientapp/templates/pages/main.jade @@ -1,5 +1,7 @@ section.page.main + h1#title Settings + div#avatarChanger h4 Change Avatar div.uploadRegion @@ -12,6 +14,7 @@ section.page.main h4 Desktop Integration button.enableAlerts Enable alerts button.primary.installFirefox Install app + button.soundNotifs Sound Notification div button.logout Logout diff --git a/package.json b/package.json index d73db6c..ee58e05 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "notify.js": "0.0.3", "semi-static": "0.0.4", "serve-static": "1.7.1", - "sound-effect-manager": "0.0.5", + "sound-effect-manager": "1.0.0", "stanza.io": "6.10.2", "staydown": "1.0.3", "templatizer": "0.1.2", diff --git a/public/css/components/buttons.styl b/public/css/components/buttons.styl index 39b2d4c..3af07f1 100644 --- a/public/css/components/buttons.styl +++ b/public/css/components/buttons.styl @@ -108,8 +108,3 @@ button &:hover background: lighten($blue-light, 40%) - -// Specific buttons styles - -.installFirefox - margin-left: 5px diff --git a/public/css/otalk.css b/public/css/otalk.css index aad62c7..0e00388 100644 --- a/public/css/otalk.css +++ b/public/css/otalk.css @@ -499,9 +499,6 @@ button.secondary:hover:not(:disabled) { .button-group.outlined.secondary .button:hover { background: #b8e6fa; } -.installFirefox { - margin-left: 5px; -} #connectionOverlay { position: fixed; top: 0px; @@ -1555,9 +1552,12 @@ button.secondary:hover:not(:disabled) { .embed a.source { display: none; } +.main h1 { + padding: 34px 20px 0 20px; + color: #192a47; +} .main > div { padding: 20px; - padding-top: 64px; border-bottom: 1px solid #e0e0e0; } .main > div h4 { @@ -1572,6 +1572,10 @@ button.secondary:hover:not(:disabled) { max-height: 50px; height: auto; } +.main > div .installFirefox, +.main > div .soundNotifs { + margin-left: 5px; +} .uploadRegion { padding: 15px; -moz-border-radius: 3px; diff --git a/public/css/pages/settings.styl b/public/css/pages/settings.styl index b9c5ee8..f4151a9 100644 --- a/public/css/pages/settings.styl +++ b/public/css/pages/settings.styl @@ -2,22 +2,29 @@ @import '../_mixins' // Settings -.main > div - padding: 20px - padding-top: 64px - border-bottom: 1px solid $gray-lighter +.main - h4 + h1 + padding: 34px 20px 0 20px color: $blue-saturated - &:last-of-type - border: none + > div + padding: 20px + border-bottom: 1px solid $gray-lighter + h4 + color: $blue-saturated - .status - overflow: hidden - min-height: 35px - max-height: 50px - height: auto + &:last-of-type + border: none + + .status + overflow: hidden + min-height: 35px + max-height: 50px + height: auto + + .installFirefox, .soundNotifs + margin-left: 5px .uploadRegion padding: 15px diff --git a/public/sounds/ding.wav b/public/sounds/ding.wav new file mode 100644 index 0000000000000000000000000000000000000000..a47bd34816f072c2b0ca12b9cd8dbc1db2b95096 GIT binary patch literal 5400 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 T8-TEXty%-_U%UU4x7GgxlPL;Z literal 0 HcmV?d00001 diff --git a/public/sounds/threetone-alert.wav b/public/sounds/threetone-alert.wav new file mode 100644 index 0000000000000000000000000000000000000000..5f1e49bea1701b834a8727073cc65708156abbd3 GIT binary patch literal 34156 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