From 2943db1072a33126207febc71c711cfe054b8979 Mon Sep 17 00:00:00 2001 From: David Baker Date: Mon, 12 Sep 2016 18:32:44 +0100 Subject: [PATCH] Flag incoming DMs as such * Add the 'is_direct' flag to rooms created for DMs * For invites, look for the DM flag when getting the DM user ID for a room * When accepting an invite, look for the flag and mark the room as a DM room if appropriate. --- src/components/structures/RoomView.js | 15 +++++++++++++++ src/createRoom.js | 3 +++ src/utils/DMRoomMap.js | 15 +++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js index 49d171f631..f39a3c6627 100644 --- a/src/components/structures/RoomView.js +++ b/src/components/structures/RoomView.js @@ -36,6 +36,7 @@ var dis = require("../../dispatcher"); var Tinter = require("../../Tinter"); var rate_limited_func = require('../../ratelimitedfunc'); var ObjectUtils = require('../../ObjectUtils'); +var Rooms = require('../../Rooms'); import UserProvider from '../../autocomplete/UserProvider'; @@ -674,6 +675,20 @@ module.exports = React.createClass({ } display_name_promise.then(() => { + // if this is an invite and has the 'direct' hint set, mark it as a DM room now. + if (this.state.room) { + const me = this.state.room.getMember(MatrixClientPeg.get().credentials.userId); + if (me.membership == 'invite') { + // The 'direct' hihnt is there, so declare that this is a DM room for + // whoever invited us. + if (me.events.member.getContent().is_direct) { + return Rooms.setDMRoom(this.state.room.roomId, me.events.member.getSender()); + } + } + } + + return q(); + }).then(() => { var sign_url = this.props.thirdPartyInvite ? this.props.thirdPartyInvite.inviteSignUrl : undefined; return MatrixClientPeg.get().joinRoom(this.props.roomAddress, { inviteSignUrl: sign_url } ) diff --git a/src/createRoom.js b/src/createRoom.js index 4c282ef485..9104f0ff6d 100644 --- a/src/createRoom.js +++ b/src/createRoom.js @@ -57,6 +57,9 @@ function createRoom(opts) { if (opts.dmUserId && createOpts.invite === undefined) { createOpts.invite = [opts.dmUserId]; } + if (opts.dmUserId && createOpts.is_direct === undefined) { + createOpts.is_direct = true; + } // Allow guests by default since the room is private and they'd // need an invite. This means clicking on a 3pid invite email can diff --git a/src/utils/DMRoomMap.js b/src/utils/DMRoomMap.js index 3bcc492a9f..78ace8fb11 100644 --- a/src/utils/DMRoomMap.js +++ b/src/utils/DMRoomMap.js @@ -21,6 +21,7 @@ limitations under the License. */ export default class DMRoomMap { constructor(matrixClient) { + this.matrixClient = matrixClient; this.roomToUser = null; const mDirectEvent = matrixClient.getAccountData('m.direct'); @@ -49,6 +50,20 @@ export default class DMRoomMap { } // Here, we return undefined if the room is not in the map: // the room ID you gave is not a DM room for any user. + if (this.roomToUser[roomId] === undefined) { + // no entry? if the room is an invite, look for the is_direct hint. + const room = this.matrixClient.getRoom(roomId); + if (room) { + const me = room.getMember(this.matrixClient.credentials.userId); + if (me.membership == 'invite') { + // The 'direct' hihnt is there, so declare that this is a DM room for + // whoever invited us. + if (me.events.member.getContent().is_direct) { + return me.events.member.getSender(); + } + } + } + } return this.roomToUser[roomId]; }