mirror of
https://mau.dev/maunium/synapse.git
synced 2024-12-14 08:33:48 +01:00
Add notification-service.js to handle binging/notifications. Shift logic to this service.
This commit is contained in:
parent
188de756be
commit
ac2a177070
5 changed files with 108 additions and 70 deletions
|
@ -30,6 +30,7 @@ var matrixWebClient = angular.module('matrixWebClient', [
|
|||
'MatrixCall',
|
||||
'eventStreamService',
|
||||
'eventHandlerService',
|
||||
'notificationService',
|
||||
'infinite-scroll',
|
||||
'ui.bootstrap',
|
||||
'monospaced.elastic'
|
||||
|
|
|
@ -27,8 +27,8 @@ Typically, this service will store events or broadcast them to any listeners
|
|||
if typically all the $on method would do is update its own $scope.
|
||||
*/
|
||||
angular.module('eventHandlerService', [])
|
||||
.factory('eventHandlerService', ['matrixService', '$rootScope', '$q', '$timeout', 'mPresence',
|
||||
function(matrixService, $rootScope, $q, $timeout, mPresence) {
|
||||
.factory('eventHandlerService', ['matrixService', '$rootScope', '$q', '$timeout', 'mPresence', 'notificationService',
|
||||
function(matrixService, $rootScope, $q, $timeout, mPresence, notificationService) {
|
||||
var ROOM_CREATE_EVENT = "ROOM_CREATE_EVENT";
|
||||
var MSG_EVENT = "MSG_EVENT";
|
||||
var MEMBER_EVENT = "MEMBER_EVENT";
|
||||
|
@ -45,71 +45,6 @@ function(matrixService, $rootScope, $q, $timeout, mPresence) {
|
|||
var eventMap = {};
|
||||
|
||||
$rootScope.presence = {};
|
||||
|
||||
// TODO: This is attached to the rootScope so .html can just go containsBingWord
|
||||
// for determining classes so it is easy to highlight bing messages. It seems a
|
||||
// bit strange to put the impl in this service though, but I can't think of a better
|
||||
// file to put it in.
|
||||
$rootScope.containsBingWord = function(content) {
|
||||
if (!content || $.type(content) != "string") {
|
||||
return false;
|
||||
}
|
||||
var bingWords = matrixService.config().bingWords;
|
||||
var shouldBing = false;
|
||||
|
||||
// case-insensitive name check for user_id OR display_name if they exist
|
||||
var userRegex = "";
|
||||
var myUserId = matrixService.config().user_id;
|
||||
if (myUserId) {
|
||||
var localpart = getLocalPartFromUserId(myUserId);
|
||||
if (localpart) {
|
||||
localpart = localpart.toLocaleLowerCase();
|
||||
userRegex += "\\b" + localpart + "\\b";
|
||||
}
|
||||
}
|
||||
var myDisplayName = matrixService.config().display_name;
|
||||
if (myDisplayName) {
|
||||
myDisplayName = myDisplayName.toLocaleLowerCase();
|
||||
if (userRegex.length > 0) {
|
||||
userRegex += "|";
|
||||
}
|
||||
userRegex += "\\b" + myDisplayName + "\\b";
|
||||
}
|
||||
|
||||
var r = new RegExp(userRegex, 'i');
|
||||
if (content.search(r) >= 0) {
|
||||
shouldBing = true;
|
||||
}
|
||||
|
||||
if ( (myDisplayName && content.toLocaleLowerCase().indexOf(myDisplayName) != -1) ||
|
||||
(myUserId && content.toLocaleLowerCase().indexOf(myUserId) != -1) ) {
|
||||
shouldBing = true;
|
||||
}
|
||||
|
||||
// bing word list check
|
||||
if (bingWords && !shouldBing) {
|
||||
for (var i=0; i<bingWords.length; i++) {
|
||||
var re = RegExp(bingWords[i]);
|
||||
if (content.search(re) != -1) {
|
||||
shouldBing = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return shouldBing;
|
||||
};
|
||||
|
||||
var getLocalPartFromUserId = function(user_id) {
|
||||
if (!user_id) {
|
||||
return null;
|
||||
}
|
||||
var localpartRegex = /@(.*):\w+/i
|
||||
var results = localpartRegex.exec(user_id);
|
||||
if (results && results.length == 2) {
|
||||
return results[1];
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
var initialSyncDeferred;
|
||||
|
||||
|
@ -228,7 +163,12 @@ function(matrixService, $rootScope, $q, $timeout, mPresence) {
|
|||
}
|
||||
|
||||
if (window.Notification && event.user_id != matrixService.config().user_id) {
|
||||
var shouldBing = $rootScope.containsBingWord(event.content.body);
|
||||
var shouldBing = notificationService.containsBingWord(
|
||||
matrixService.config().user_id,
|
||||
matrixService.config().display_name,
|
||||
matrixService.config().bingWords,
|
||||
event.content.body
|
||||
);
|
||||
|
||||
// Ideally we would notify only when the window is hidden (i.e. document.hidden = true).
|
||||
//
|
||||
|
|
86
webclient/components/matrix/notification-service.js
Normal file
86
webclient/components/matrix/notification-service.js
Normal file
|
@ -0,0 +1,86 @@
|
|||
/*
|
||||
Copyright 2014 OpenMarket Ltd
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
/*
|
||||
This service manages notifications: enabling, creating and showing them. This
|
||||
also contains 'bing word' logic.
|
||||
*/
|
||||
angular.module('notificationService', [])
|
||||
.factory('notificationService', function($rootScope) {
|
||||
|
||||
var getLocalPartFromUserId = function(user_id) {
|
||||
if (!user_id) {
|
||||
return null;
|
||||
}
|
||||
var localpartRegex = /@(.*):\w+/i
|
||||
var results = localpartRegex.exec(user_id);
|
||||
if (results && results.length == 2) {
|
||||
return results[1];
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
return {
|
||||
|
||||
containsBingWord: function(userId, displayName, bingWords, content) {
|
||||
// case-insensitive name check for user_id OR display_name if they exist
|
||||
var userRegex = "";
|
||||
if (userId) {
|
||||
var localpart = getLocalPartFromUserId(userId);
|
||||
if (localpart) {
|
||||
localpart = localpart.toLocaleLowerCase();
|
||||
userRegex += "\\b" + localpart + "\\b";
|
||||
}
|
||||
}
|
||||
if (displayName) {
|
||||
displayName = displayName.toLocaleLowerCase();
|
||||
if (userRegex.length > 0) {
|
||||
userRegex += "|";
|
||||
}
|
||||
userRegex += "\\b" + displayName + "\\b";
|
||||
}
|
||||
|
||||
var regexList = [new RegExp(userRegex, 'i')];
|
||||
|
||||
// bing word list check
|
||||
if (bingWords && bingWords.length > 0) {
|
||||
for (var i=0; i<bingWords.length; i++) {
|
||||
var re = RegExp(bingWords[i], 'i');
|
||||
regexList.push(re);
|
||||
}
|
||||
}
|
||||
return this.hasMatch(regexList, content);
|
||||
},
|
||||
|
||||
hasMatch: function(regExps, content) {
|
||||
if (!content || $.type(content) != "string") {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (regExps && regExps.length > 0) {
|
||||
for (var i=0; i<regExps.length; i++) {
|
||||
if (content.search(regExps[i]) != -1) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
});
|
|
@ -41,6 +41,7 @@
|
|||
<script src="components/matrix/matrix-phone-service.js"></script>
|
||||
<script src="components/matrix/event-stream-service.js"></script>
|
||||
<script src="components/matrix/event-handler-service.js"></script>
|
||||
<script src="components/matrix/notification-service.js"></script>
|
||||
<script src="components/matrix/presence-service.js"></script>
|
||||
<script src="components/fileInput/file-input-directive.js"></script>
|
||||
<script src="components/fileUpload/file-upload-service.js"></script>
|
||||
|
|
|
@ -15,11 +15,21 @@ limitations under the License.
|
|||
*/
|
||||
|
||||
angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput'])
|
||||
.controller('RoomController', ['$modal', '$filter', '$scope', '$timeout', '$routeParams', '$location', '$rootScope', 'matrixService', 'mPresence', 'eventHandlerService', 'mFileUpload', 'matrixPhoneService', 'MatrixCall',
|
||||
function($modal, $filter, $scope, $timeout, $routeParams, $location, $rootScope, matrixService, mPresence, eventHandlerService, mFileUpload, matrixPhoneService, MatrixCall) {
|
||||
.controller('RoomController', ['$modal', '$filter', '$scope', '$timeout', '$routeParams', '$location', '$rootScope', 'matrixService', 'mPresence', 'eventHandlerService', 'mFileUpload', 'matrixPhoneService', 'MatrixCall', 'notificationService',
|
||||
function($modal, $filter, $scope, $timeout, $routeParams, $location, $rootScope, matrixService, mPresence, eventHandlerService, mFileUpload, matrixPhoneService, MatrixCall, notificationService) {
|
||||
'use strict';
|
||||
var MESSAGES_PER_PAGINATION = 30;
|
||||
var THUMBNAIL_SIZE = 320;
|
||||
|
||||
// .html needs this
|
||||
$scope.containsBingWord = function(content) {
|
||||
return notificationService.containsBingWord(
|
||||
matrixService.config().user_id,
|
||||
matrixService.config().display_name,
|
||||
matrixService.config().bingWords,
|
||||
content
|
||||
);
|
||||
};
|
||||
|
||||
// Room ids. Computed and resolved in onInit
|
||||
$scope.room_id = undefined;
|
||||
|
|
Loading…
Reference in a new issue