forked-synapse/syweb/webclient/components/matrix/matrix-filter.js

173 lines
6.9 KiB
JavaScript

/*
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';
angular.module('matrixFilter', [])
// Compute the room name according to information we have
// TODO: It would be nice if this was stateless and had no dependencies. That would
// make the business logic here a lot easier to see.
.filter('mRoomName', ['$rootScope', 'matrixService', 'modelService', 'mUserDisplayNameFilter',
function($rootScope, matrixService, modelService, mUserDisplayNameFilter) {
return function(room_id) {
var roomName;
// If there is an alias, use it
// TODO: only one alias is managed for now
var alias = modelService.getRoomIdToAliasMapping(room_id);
var room = modelService.getRoom(room_id).current_room_state;
var room_name_event = room.state("m.room.name");
// Determine if it is a public room
var isPublicRoom = false;
if (room.state("m.room.join_rules") && room.state("m.room.join_rules").content) {
isPublicRoom = ("public" === room.state("m.room.join_rules").content.join_rule);
}
if (room_name_event) {
roomName = room_name_event.content.name;
}
else if (alias) {
roomName = alias;
}
else if (Object.keys(room.members).length > 0 && !isPublicRoom) { // Do not rename public room
var user_id = matrixService.config().user_id;
// this is a "one to one" room and should have the name of the other user.
if (Object.keys(room.members).length === 2) {
for (var i in room.members) {
if (!room.members.hasOwnProperty(i)) continue;
var member = room.members[i].event;
if (member.state_key !== user_id) {
roomName = mUserDisplayNameFilter(member.state_key, room_id);
if (!roomName) {
roomName = member.state_key;
}
break;
}
}
}
else if (Object.keys(room.members).length === 1) {
// this could be just us (self-chat) or could be the other person
// in a room if they have invited us to the room. Find out which.
var otherUserId = Object.keys(room.members)[0];
if (otherUserId === user_id) {
// it's us, we may have been invited to this room or it could
// be a self chat.
if (room.members[otherUserId].event.content.membership === "invite") {
// someone invited us, use the right ID.
roomName = mUserDisplayNameFilter(room.members[otherUserId].event.user_id, room_id);
if (!roomName) {
roomName = room.members[otherUserId].event.user_id;
}
}
else {
roomName = mUserDisplayNameFilter(otherUserId, room_id);
if (!roomName) {
roomName = user_id;
}
}
}
else { // it isn't us, so use their name if we know it.
roomName = mUserDisplayNameFilter(otherUserId, room_id);
if (!roomName) {
roomName = otherUserId;
}
}
}
else if (Object.keys(room.members).length === 0) {
// this shouldn't be possible
console.error("0 members in room >> " + room_id);
}
}
// Always show the alias in the room displayed name
if (roomName && alias && alias !== roomName) {
roomName += " (" + alias + ")";
}
if (undefined === roomName) {
// By default, use the room ID
roomName = room_id;
}
return roomName;
};
}])
// Return the user display name
.filter('mUserDisplayName', ['modelService', 'matrixService', function(modelService, matrixService) {
/**
* Return the display name of an user acccording to data already downloaded
* @param {String} user_id the id of the user
* @param {String} room_id the room id
* @param {boolean} wrap whether to insert whitespace into the userid (if displayname not available) to help it wrap
* @returns {String} A suitable display name for the user.
*/
return function(user_id, room_id, wrap) {
var displayName;
// Get the user display name from the member list of the room
var member = modelService.getMember(room_id, user_id);
if (member) {
member = member.event;
}
if (member && member.content.displayname) { // Do not consider null displayname
displayName = member.content.displayname;
// Disambiguate users who have the same displayname in the room
if (user_id !== matrixService.config().user_id) {
var room = modelService.getRoom(room_id);
for (var member_id in room.current_room_state.members) {
if (room.current_room_state.members.hasOwnProperty(member_id) && member_id !== user_id) {
var member2 = room.current_room_state.members[member_id].event;
if (member2.content.displayname && member2.content.displayname === displayName) {
displayName = displayName + " (" + user_id + ")";
break;
}
}
}
}
}
// The user may not have joined the room yet. So try to resolve display name from presence data
// Note: This data may not be available
if (undefined === displayName) {
var usr = modelService.getUser(user_id);
if (usr) {
displayName = usr.event.content.displayname;
}
}
if (undefined === displayName) {
// By default, use the user ID
if (wrap && user_id.indexOf(':') >= 0) {
displayName = user_id.substr(0, user_id.indexOf(':')) + " " + user_id.substr(user_id.indexOf(':'));
}
else {
displayName = user_id;
}
}
return displayName;
};
}]);