Skip to content

Commit

Permalink
Merge pull request #3851 from alexbrazier/feature/display-name
Browse files Browse the repository at this point in the history
Use real name instead of username for messages and direct messages list
  • Loading branch information
engelgabriel committed Apr 4, 2017
2 parents ddb6428 + cf6f43b commit 890c4a2
Show file tree
Hide file tree
Showing 49 changed files with 213 additions and 65 deletions.
1 change: 1 addition & 0 deletions HISTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
- [FIX] Incoming integrations would break when trying to use the `Store` feature.
- [FIX] Outgoing webhooks which have an error and they're retrying would still retry even if the integration was disabled. (#4835)
- [FIX] Removed Deprecated Package rocketchat:sharedsecret.
- [BREAK] `getUsersOfRoom` API to return array of objects with user and username, instead of array of strings

## 0.54.2 - 2017-Mar-24

Expand Down
2 changes: 1 addition & 1 deletion packages/rocketchat-cas/cas_server.js
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ Accounts.registerLoginHandler(function(options) {
logger.debug('Syncing user attributes');
// Update name
if (int_attrs.name) {
Meteor.users.update(user, { $set: { name: int_attrs.name }});
RocketChat._setRealName(user._id, int_attrs.name);
}

// Update email
Expand Down
5 changes: 4 additions & 1 deletion packages/rocketchat-crowd/server/crowd.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@ const CROWD = class CROWD {

syncDataToUser(crowdUser, id) {
const user = {
name: crowdUser.displayname,
username: crowdUser.username,
emails: [{
address : crowdUser.email,
Expand All @@ -95,6 +94,10 @@ const CROWD = class CROWD {
active: crowdUser.active
};

if (crowdUser.displayname) {
RocketChat._setRealName(id, crowdUser.displayname);
}

Meteor.users.update(id, {
$set: user
});
Expand Down
1 change: 1 addition & 0 deletions packages/rocketchat-i18n/i18n/en.i18n.json
Original file line number Diff line number Diff line change
Expand Up @@ -1525,6 +1525,7 @@
"UI_DisplayRoles": "Display Roles",
"UI_Merge_Channels_Groups": "Merge private groups with channels",
"UI_Use_Name_Avatar": "Use full name initials to generate default avatar",
"UI_Use_Real_Name" : "Use Real Name",
"Unarchive": "Unarchive",
"Unblock_User": "Unblock User",
"Unmute_someone_in_room": "Unmute someone in the room",
Expand Down
2 changes: 1 addition & 1 deletion packages/rocketchat-importer-hipchat/server.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ Importer.HipChat = class Importer.HipChat extends Importer.Base

getRocketUser: (hipchatId) =>
for user in @users.users when user.user_id is hipchatId
return RocketChat.models.Users.findOneById user.rocketId, { fields: { username: 1 }}
return RocketChat.models.Users.findOneById user.rocketId, { fields: { username: 1, name: 1 }}

convertHipChatMessageToRocketChat: (message) =>
if message?
Expand Down
2 changes: 1 addition & 1 deletion packages/rocketchat-importer-slack/server.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,7 @@ Importer.Slack = class Importer.Slack extends Importer.Base

getRocketUser: (slackId) =>
for user in @users.users when user.id is slackId
return RocketChat.models.Users.findOneById user.rocketId, { fields: { username: 1 }}
return RocketChat.models.Users.findOneById user.rocketId, { fields: { username: 1, name: 1 }}

convertSlackMessageToRocketChat: (message) =>
if message?
Expand Down
6 changes: 5 additions & 1 deletion packages/rocketchat-ldap/server/sync.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,13 @@ syncUserData = function syncUserData(user, ldapUser) {

const userData = getDataToSyncUserData(ldapUser, user);
if (user && user._id && userData) {
logger.debug('setting', JSON.stringify(userData, null, 2));
if (userData.name) {
RocketChat._setRealName(user._id, userData.name);
delete userData.name;
}
Meteor.users.update(user._id, { $set: userData });
user = Meteor.users.findOne({_id: user._id});
logger.debug('setting', JSON.stringify(userData, null, 2));
}

if (RocketChat.settings.get('LDAP_Username_Field') !== '') {
Expand Down
1 change: 1 addition & 0 deletions packages/rocketchat-lib/package.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ Package.onUse(function(api) {
api.addFiles('server/functions/settings.coffee', 'server');
api.addFiles('server/functions/setUserAvatar.js', 'server');
api.addFiles('server/functions/setUsername.coffee', 'server');
api.addFiles('server/functions/setRealName.js', 'server');
api.addFiles('server/functions/setEmail.js', 'server');
api.addFiles('server/functions/unarchiveRoom.js', 'server');
api.addFiles('server/functions/updateMessage.js', 'server');
Expand Down
3 changes: 2 additions & 1 deletion packages/rocketchat-lib/server/functions/addUserToRoom.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ RocketChat.addUserToRoom = function(rid, user, inviter, silenced) {
ts: now,
u: {
_id: inviter._id,
username: inviter.username
username: inviter.username,
name: inviter.name
}
});
} else {
Expand Down
8 changes: 4 additions & 4 deletions packages/rocketchat-lib/server/functions/saveUser.js
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,10 @@ RocketChat.saveUser = function(userId, userData) {
RocketChat.setUsername(userData._id, userData.username);
}

if (userData.name) {
RocketChat.setRealName(userData._id, userData.name);
}

if (userData.email) {
RocketChat.setEmail(userData._id, userData.email);
}
Expand All @@ -152,10 +156,6 @@ RocketChat.saveUser = function(userId, userData) {
$set: {}
};

if (userData.name) {
updateUser.$set.name = userData.name;
}

if (userData.roles) {
updateUser.$set.roles = userData.roles;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ RocketChat.sendMessage = (user, message, room, upsert = false) ->
unless message.ts?
message.ts = new Date()

message.u = _.pick user, ['_id','username']
message.u = _.pick user, ['_id','username', 'name']

if not Match.test(message.msg, String)
message.msg = ''
Expand Down
29 changes: 29 additions & 0 deletions packages/rocketchat-lib/server/functions/setRealName.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
RocketChat._setRealName = function(userId, name) {
name = s.trim(name);
if (!userId || !name) {
return false;
}

const user = RocketChat.models.Users.findOneById(userId);

// User already has desired name, return
if (user.name === name) {
return user;
}

const previousName = user.name;

if (previousName) {
RocketChat.models.Messages.updateAllNamesByUserId(user._id, name);
RocketChat.models.Subscriptions.setRealNameForDirectRoomsWithUsername(user.username, name);
}

// Set new name
RocketChat.models.Users.setName(user._id, name);
user.name = name;
return user;
};

RocketChat.setRealName = RocketChat.RateLimiter.limitFunction(RocketChat._setRealName, 1, 60000, {
0() { return !Meteor.userId() || !RocketChat.authz.hasPermission(Meteor.userId(), 'edit-other-user-info'); } // Administrators have permission to change others names, so don't limit those
});
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ RocketChat.callbacks.add('afterSaveMessage', function(message, room) {
}
if ((userOfMention != null) && canBeNotified(userOfMentionId, 'mobile')) {
RocketChat.Notifications.notifyUser(userOfMention._id, 'notification', {
title: `@${ user.username }`,
title: RocketChat.settings.get('UI_Use_Real_Name') ? user.name : `@${ user.username }`,
text: message.msg,
duration: settings.desktopNotificationDurations[userOfMention._id],
payload: {
Expand Down
6 changes: 5 additions & 1 deletion packages/rocketchat-lib/server/methods/setRealName.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,14 @@ Meteor.methods({
name = _.trim(name);
}

if (!RocketChat.models.Users.setName(Meteor.userId(), name)) {
if (!RocketChat.setRealName(Meteor.userId(), name)) {
throw new Meteor.Error('error-could-not-change-name', 'Could not change name', { method: 'setRealName' });
}

return name;
}
});

RocketChat.RateLimiter.limitMethod('setRealName', 1, 1000, {
userId: () => true
});
11 changes: 11 additions & 0 deletions packages/rocketchat-lib/server/models/Messages.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -320,6 +320,16 @@ RocketChat.models.Messages = new class extends RocketChat.models._Base

return @update query, update

updateAllNamesByUserId: (userId, name) ->
query =
'u._id': userId

update =
$set:
"u.name": name

return @update query, update, { multi: true }

updateUserStarById: (_id, userId, starred) ->
query =
_id: _id
Expand Down Expand Up @@ -380,6 +390,7 @@ RocketChat.models.Messages = new class extends RocketChat.models._Base
u:
_id: user._id
username: user.username
name: user.name
groupable: false

_.extend record, extraData
Expand Down
11 changes: 11 additions & 0 deletions packages/rocketchat-lib/server/models/Subscriptions.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,17 @@ class ModelSubscriptions extends RocketChat.models._Base

return @update query, update, { multi: true }

setRealNameForDirectRoomsWithUsername: (username, name) ->
query =
name: username
t: "d"

update =
$set:
fname: name

return @update query, update, { multi: true }

setNameForDirectRoomsWithOldName: (oldName, name) ->
query =
name: oldName
Expand Down
11 changes: 9 additions & 2 deletions packages/rocketchat-lib/server/models/Users.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ class ModelUsers extends RocketChat.models._Base

return @find query, options

findByActiveUsersUsernameExcept: (searchTerm, exceptions = [], options = {}) ->
findByActiveUsersExcept: (searchTerm, exceptions = [], options = {}) ->
if not _.isArray exceptions
exceptions = [ exceptions ]

Expand All @@ -118,7 +118,14 @@ class ModelUsers extends RocketChat.models._Base
$and: [
{
active: true
username: termRegex
$or: [
{
username: termRegex
}
{
name: termRegex
}
]
}
{
username: { $nin: exceptions }
Expand Down
1 change: 1 addition & 0 deletions packages/rocketchat-lib/server/startup/settings.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@ RocketChat.settings.addGroup 'Layout', ->
@add 'UI_DisplayRoles', true, { type: 'boolean', public: true }
@add 'UI_Merge_Channels_Groups', true, { type: 'boolean', public: true }
@add 'UI_Use_Name_Avatar', false, { type: 'boolean', public: true }
@add 'UI_Use_Real_Name', false, { type: 'boolean', public: true }


RocketChat.settings.addGroup 'Logs', ->
Expand Down
7 changes: 3 additions & 4 deletions packages/rocketchat-lib/startup/defaultRoomTypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ RocketChat.roomTypes.add('c', 10, {
},

roomName(roomData) {
return roomData.name;
return { name: roomData.name };
},

condition() {
Expand Down Expand Up @@ -64,8 +64,7 @@ RocketChat.roomTypes.add('d', 20, {
},

roomName(roomData) {
const room = ChatSubscription.findOne({ rid: roomData._id }, { fields: { name: 1 } });
return room && room.name;
return ChatSubscription.findOne({ rid: roomData._id }, { fields: { name: 1, fname: 1 } });
},

condition() {
Expand Down Expand Up @@ -100,7 +99,7 @@ RocketChat.roomTypes.add('p', 30, {
},

roomName(roomData) {
return roomData.name;
return { name: roomData.name };
},

condition() {
Expand Down
5 changes: 4 additions & 1 deletion packages/rocketchat-livechat/server/lib/Livechat.js
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,6 @@ RocketChat.Livechat = {

userId = existingUser._id;
} else {
updateUser.$set.name = name;

const userData = {
username,
Expand Down Expand Up @@ -156,6 +155,10 @@ RocketChat.Livechat = {
];
}

if (name) {
RocketChat._setRealName(userId, name);
}

Meteor.users.update(userId, updateUser);

return userId;
Expand Down
5 changes: 5 additions & 0 deletions packages/rocketchat-theme/client/imports/base.less
Original file line number Diff line number Diff line change
Expand Up @@ -2573,6 +2573,11 @@ label.required::after {
display: inline-block;
}
}

.secondary-name {
color: #666666;
font-size: 15px;
}
}

.message-popup-position {
Expand Down
6 changes: 3 additions & 3 deletions packages/rocketchat-ui-flextab/client/tabs/membersList.html
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ <h2>{{_ "Members_List"}}</h2>
{{else}}
{{#each users}}
<li class='user-image user-card-room status-{{status}}'>
<button data-username="{{username}}" tabindex="0" title="{{username}}">
{{> avatar username=username}}
<p>{{username}} {{utcOffset}}</p>
<button data-username="{{user.username}}" tabindex="0" title="{{displayName}}">
{{> avatar username=user.username}}
<p>{{displayName}} {{utcOffset}}</p>
{{#if muted}}
<i class="icon-mute" title="{{_ "User_muted"}}"></i>
{{/if}}
Expand Down
23 changes: 15 additions & 8 deletions packages/rocketchat-ui-flextab/client/tabs/membersList.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,16 @@ Template.membersList.helpers({

roomUsers() {
const onlineUsers = RoomManager.onlineUsers.get();
const roomUsernames = Template.instance().users.get();
const roomUsers = Template.instance().users.get();
const room = ChatRoom.findOne(this.rid);
const roomMuted = (room != null ? room.muted : undefined) || [];
const userUtcOffset = Meteor.user().utcOffset;
let totalOnline = 0;
let users = roomUsernames.map(function(username) {
let users = roomUsers.map(function(user) {
let utcOffset;
if (onlineUsers[username] != null) {
if (onlineUsers[user.username] != null) {
totalOnline++;
({ utcOffset } = onlineUsers[username]);
({ utcOffset } = onlineUsers[user.username]);

if (utcOffset != null) {
if (utcOffset === userUtcOffset) {
Expand All @@ -46,14 +46,14 @@ Template.membersList.helpers({
}

return {
username,
status: (onlineUsers[username] != null ? onlineUsers[username].status : undefined),
muted: Array.from(roomMuted).includes(username),
user,
status: (onlineUsers[user.username] != null ? onlineUsers[user.username].status : undefined),
muted: Array.from(roomMuted).includes(user.username),
utcOffset
};
});

users = _.sortBy(users, 'username');
users = _.sortBy(users, u => u.user.username);
// show online users first.
// sortBy is stable, so we can do this
users = _.sortBy(users, u => u.status == null);
Expand Down Expand Up @@ -136,6 +136,13 @@ Template.membersList.helpers({
hideAdminControls: ['c', 'p', 'd'].includes(room != null ? room.t : undefined),
video: ['d'].includes(room != null ? room.t : undefined)
};
},
displayName() {
if (RocketChat.settings.get('UI_Use_Real_Name') && this.user.name) {
return this.user.name;
}

return this.user.username;
}});

Template.membersList.events({
Expand Down
4 changes: 2 additions & 2 deletions packages/rocketchat-ui-flextab/client/tabs/userInfo.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
{{> avatar username=username}}
</div>
<div class="info">
<h3 title="{{username}}"><i class="status-{{status}}"></i> {{username}}</h3>
<p class="secondary-font-color">{{name}}</p>
<h3 title="{{name}}"><i class="status-{{status}}"></i> {{name}}</h3>
<p class="secondary-font-color">@{{username}}</p>
<p class="secondary-font-color">
{{#each roleTags}}
<span class="role-tag" data-role="{{description}}">{{description}}</span>
Expand Down
Loading

0 comments on commit 890c4a2

Please sign in to comment.