summary refs log tree commit diff
path: root/webclient
diff options
context:
space:
mode:
Diffstat (limited to 'webclient')
-rwxr-xr-xwebclient/app.css7
-rw-r--r--webclient/components/matrix/event-handler-service.js18
-rw-r--r--webclient/components/matrix/matrix-service.js24
-rw-r--r--webclient/room/room-controller.js10
-rw-r--r--webclient/room/room.html1
5 files changed, 60 insertions, 0 deletions
diff --git a/webclient/app.css b/webclient/app.css
index 8685032d72..c27ec797a4 100755
--- a/webclient/app.css
+++ b/webclient/app.css
@@ -268,6 +268,13 @@ a:active  { color: #000; }
     word-break: break-all;
 }
 
+.userAvatar .userPowerLevel {
+    position: absolute;
+    bottom: 20px;
+    height: 1px;
+    background-color: red;
+}
+
 .userPresence {
     text-align: center;
     font-size: 12px;
diff --git a/webclient/components/matrix/event-handler-service.js b/webclient/components/matrix/event-handler-service.js
index b6e5c2eaac..f248116914 100644
--- a/webclient/components/matrix/event-handler-service.js
+++ b/webclient/components/matrix/event-handler-service.js
@@ -95,6 +95,15 @@ angular.module('eventHandlerService', [])
         $rootScope.presence[event.content.user_id] = event;
         $rootScope.$broadcast(PRESENCE_EVENT, event, isLiveEvent);
     };
+    
+    var handlePowerLevels = function(event, isLiveEvent) {
+        initRoom(event.room_id);
+
+       $rootScope.events.rooms[event.room_id][event.type] = event;
+
+        //TODO
+        //$rootScope.$broadcast(PRESENCE_EVENT, event, isLiveEvent);
+    };
 
     var handleCallEvent = function(event, isLiveEvent) {
         $rootScope.$broadcast(CALL_EVENT, event, isLiveEvent);
@@ -118,8 +127,17 @@ angular.module('eventHandlerService', [])
                 case "m.presence":
                     handlePresence(event, isLiveEvent);
                     break;
+                case 'm.room.ops_levels':
+                case 'm.room.send_event_level':
+                case 'm.room.add_state_level':
+                case 'm.room.join_rules':
+                case 'm.room.power_levels':
+                    handlePowerLevels(event, isLiveEvent);
+                    break;
+
                 default:
                     console.log("Unable to handle event type " + event.type);
+                    console.log(JSON.stringify(event, undefined, 4));
                     break;
             }
             if (event.type.indexOf('m.call.') == 0) {
diff --git a/webclient/components/matrix/matrix-service.js b/webclient/components/matrix/matrix-service.js
index d509c20b0f..2ae55bea9f 100644
--- a/webclient/components/matrix/matrix-service.js
+++ b/webclient/components/matrix/matrix-service.js
@@ -484,6 +484,30 @@ angular.module('matrixService', [])
         
         getRoomIdToAliasMapping: function(roomId) {
             return localStorage.getItem(MAPPING_PREFIX+roomId);
+        },
+
+
+        /****** Power levels management ******/
+
+        /**
+         * Return the power level of an user in a particular room
+         * @param {String} room_id the room id
+         * @param {String} user_id the user id
+         * @returns {Number} a value between 0 and 10
+         */
+        getUserPowerLevel: function(room_id, user_id) {
+            var powerLevel = 0;
+            var room = $rootScope.events.rooms[room_id];
+            if (room && room["m.room.power_levels"]) {
+                if (user_id in room["m.room.power_levels"].content) {
+                    powerLevel = room["m.room.power_levels"].content[user_id];
+                }
+                else {
+                    // Use the room default user power
+                    powerLevel = room["m.room.power_levels"].content["default"];
+                }
+            }
+            return powerLevel;
         }
 
     };
diff --git a/webclient/room/room-controller.js b/webclient/room/room-controller.js
index d9ada744eb..1f90472c67 100644
--- a/webclient/room/room-controller.js
+++ b/webclient/room/room-controller.js
@@ -233,6 +233,13 @@ angular.module('RoomController', ['ngSanitize', 'mFileInput'])
         }
     };
 
+    var updateUserPowerLevel = function(user_id) {
+        var member = $scope.members[user_id];
+        if (member) {
+            member.powerLevel = matrixService.getUserPowerLevel($scope.room_id, user_id);
+        }
+    }
+
     $scope.send = function() {
         if ($scope.textInput === "") {
             return;
@@ -382,6 +389,9 @@ angular.module('RoomController', ['ngSanitize', 'mFileInput'])
                 for (var i = 0; i < response.data.chunk.length; i++) {
                     var chunk = response.data.chunk[i];
                     updateMemberList(chunk);
+
+                    // Add his power level
+                    updateUserPowerLevel(chunk.user_id);
                 }
 
                 // Arm list timing update timer
diff --git a/webclient/room/room.html b/webclient/room/room.html
index e25c837aa0..e672b1d7e2 100644
--- a/webclient/room/room.html
+++ b/webclient/room/room.html
@@ -24,6 +24,7 @@
                          title="{{ member.id }}"
                          width="80" height="80"/>
                     <img class="userAvatarGradient" src="img/gradient.png" title="{{ member.id }}" width="80" height="24"/>
+                    <div class="userPowerLevel" ng-style="{'width': (10 * member.powerLevel) +'%'}"></div>
                     <div class="userName">{{ member.displayname || member.id.substr(0, member.id.indexOf(':')) }}<br/>{{ member.displayname ? "" : member.id.substr(member.id.indexOf(':')) }}</div>
                 </td>
                 <td class="userPresence" ng-class="(member.presence === 'online' ? 'online' : (member.presence === 'unavailable' ? 'unavailable' : '')) + ' ' + (member.membership == 'invite' ? 'invited' : '')">