summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--synapse/rest/room.py3
-rw-r--r--webclient/components/matrix/event-handler-service.js4
-rw-r--r--webclient/components/matrix/matrix-service.js47
-rw-r--r--webclient/home/home-controller.js2
-rw-r--r--webclient/room/room-controller.js13
-rw-r--r--webclient/room/room.html2
6 files changed, 24 insertions, 47 deletions
diff --git a/synapse/rest/room.py b/synapse/rest/room.py
index a07e031984..2d681bd893 100644
--- a/synapse/rest/room.py
+++ b/synapse/rest/room.py
@@ -318,7 +318,8 @@ class RoomMemberListRestServlet(RestServlet):
             user_id=user.to_string())
 
         for event in members["chunk"]:
-            target_user = self.hs.parse_userid(event["state_key"])
+            # FIXME: should probably be state_key here, not user_id
+            target_user = self.hs.parse_userid(event["user_id"])
             # Presence is an optional cache; don't fail if we can't fetch it
             try:
                 presence_state = yield self.handlers.presence_handler.get_state(
diff --git a/webclient/components/matrix/event-handler-service.js b/webclient/components/matrix/event-handler-service.js
index b5eb73d92b..6ea0f58bc5 100644
--- a/webclient/components/matrix/event-handler-service.js
+++ b/webclient/components/matrix/event-handler-service.js
@@ -54,10 +54,6 @@ angular.module('eventHandlerService', [])
     }
     
     var handleMessage = function(event, isLiveEvent) {
-        if ("membership_target" in event.content) {
-            event.user_id = event.content.membership_target;
-        }
-        
         initRoom(event.room_id);
         
         if (isLiveEvent) {
diff --git a/webclient/components/matrix/matrix-service.js b/webclient/components/matrix/matrix-service.js
index d5738e01c8..b5b1815cf9 100644
--- a/webclient/components/matrix/matrix-service.js
+++ b/webclient/components/matrix/matrix-service.js
@@ -115,19 +115,7 @@ angular.module('matrixService', [])
 
         // Joins a room
         join: function(room_id) {
-            // The REST path spec
-            var path = "/rooms/$room_id/members/$user_id/state";
-
-            // Like the cmd client, escape room ids
-            room_id = encodeURIComponent(room_id);
-
-            // Customize it
-            path = path.replace("$room_id", room_id);
-            path = path.replace("$user_id", config.user_id);
-
-            return doRequest("PUT", path, undefined, {
-                 membership: "join"
-            });
+            return this.membershipChange(room_id, config.user_id, "join");
         },
 
         joinAlias: function(room_alias) {
@@ -141,34 +129,23 @@ angular.module('matrixService', [])
 
         // Invite a user to a room
         invite: function(room_id, user_id) {
-            // The REST path spec
-            var path = "/rooms/$room_id/members/$user_id/state";
-
-            // Like the cmd client, escape room ids
-            room_id = encodeURIComponent(room_id);
-
-            // Customize it
-            path = path.replace("$room_id", room_id);
-            path = path.replace("$user_id", user_id);
-
-            return doRequest("PUT", path, undefined, {
-                 membership: "invite"
-            });
+            return this.membershipChange(room_id, user_id, "invite");
         },
 
         // Leaves a room
         leave: function(room_id) {
-            // The REST path spec
-            var path = "/rooms/$room_id/members/$user_id/state";
-
-            // Like the cmd client, escape room ids
-            room_id = encodeURIComponent(room_id);
+            return this.membershipChange(room_id, config.user_id, "leave");
+        },
 
-            // Customize it
-            path = path.replace("$room_id", room_id);
-            path = path.replace("$user_id", config.user_id);
+        membershipChange: function(room_id, user_id, membershipValue) {
+            // The REST path spec
+            var path = "/rooms/$room_id/state/m.room.member/$user_id";
+            path = path.replace("$room_id", encodeURIComponent(room_id));
+            path = path.replace("$user_id", encodeURIComponent(user_id));
 
-            return doRequest("DELETE", path, undefined, undefined);
+            return doRequest("PUT", path, undefined, {
+                 membership: membershipValue
+            });
         },
 
         // Retrieves the room ID corresponding to a room alias
diff --git a/webclient/home/home-controller.js b/webclient/home/home-controller.js
index 35d0ef1654..a5576759fa 100644
--- a/webclient/home/home-controller.js
+++ b/webclient/home/home-controller.js
@@ -41,7 +41,7 @@ angular.module('HomeController', ['matrixService', 'mFileInput', 'mFileUpload',
     
     $scope.$on(eventHandlerService.MEMBER_EVENT, function(ngEvent, event, isLive) {
         var config = matrixService.config();
-        if (event.target_user_id === config.user_id && event.content.membership === "invite") {
+        if (event.state_key === config.user_id && event.content.membership === "invite") {
             console.log("Invited to room " + event.room_id);
             // FIXME push membership to top level key to match /im/sync
             event.membership = event.content.membership;
diff --git a/webclient/room/room-controller.js b/webclient/room/room-controller.js
index 3311618825..f49deaa489 100644
--- a/webclient/room/room-controller.js
+++ b/webclient/room/room-controller.js
@@ -154,7 +154,10 @@ angular.module('RoomController', ['ngSanitize', 'mUtilities'])
     var updateMemberList = function(chunk) {
         if (chunk.room_id != $scope.room_id) return;
 
-        var isNewMember = !(chunk.target_user_id in $scope.members);
+        // set target_user_id to keep things clear
+        var target_user_id = chunk.state_key;
+
+        var isNewMember = !(target_user_id in $scope.members);
         if (isNewMember) {
             // FIXME: why are we copying these fields around inside chunk?
             if ("state" in chunk.content) {
@@ -172,7 +175,7 @@ angular.module('RoomController', ['ngSanitize', 'mUtilities'])
             if ("avatar_url" in chunk.content) {
                 chunk.avatar_url = chunk.content.avatar_url;
             }
-            $scope.members[chunk.target_user_id] = chunk;
+            $scope.members[target_user_id] = chunk;
 
 /*
             // Stale code for explicitly hammering the homeserver for every displayname & avatar_url
@@ -202,13 +205,13 @@ angular.module('RoomController', ['ngSanitize', 'mUtilities'])
             });
 */            
 
-            if (chunk.target_user_id in $rootScope.presence) {
-                updatePresence($rootScope.presence[chunk.target_user_id]);
+            if (target_user_id in $rootScope.presence) {
+                updatePresence($rootScope.presence[target_user_id]);
             }
         }
         else {
             // selectively update membership else it will nuke the picture and displayname too :/
-            var member = $scope.members[chunk.target_user_id];
+            var member = $scope.members[target_user_id];
             member.content.membership = chunk.content.membership;
         }
     }
diff --git a/webclient/room/room.html b/webclient/room/room.html
index 06ca63d2ea..c167819f15 100644
--- a/webclient/room/room.html
+++ b/webclient/room/room.html
@@ -44,7 +44,7 @@
                         <span ng-hide='msg.type !== "m.room.member"'>
                             {{ members[msg.user_id].displayname || msg.user_id }}
                             {{ {"join": "joined", "leave": "left", "invite": "invited"}[msg.content.membership] }}
-                            {{ msg.content.target_id || '' }}
+                            {{ msg.content.membership === "invite" ? (msg.state_key || '') : '' }}
                         </span>
                         <span ng-hide='msg.content.msgtype !== "m.emote"' ng-bind-html="'* ' + (members[msg.user_id].displayname || msg.user_id) + ' ' + msg.content.body | linky:'_blank'"/>
                         <span ng-hide='msg.content.msgtype !== "m.text"' ng-bind-html="((msg.content.msgtype === 'm.text') ? msg.content.body : '') | linky:'_blank'"/>