From 54f21c9accdae4ff9dcd25883f5a98606fb7cf52 Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Mon, 5 Sep 2016 14:58:16 +0100 Subject: [PATCH 01/11] Expose join rules of a room --- src/ScalarMessaging.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index cc552ba898..e58a5ab21b 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -193,6 +193,11 @@ function getMembershipState(event, roomId, userId) { returnStateEvent(event, roomId, "m.room.member", userId); } +function getJoinRules(event, roomId) { + console.log(`join_rules of ${roomId} requested.`); + returnStateEvent(event, roomId, "m.room.join_rules"); +} + function botOptions(event, roomId, userId) { console.log(`bot_options of ${userId} in room ${roomId} requested.`); returnStateEvent(event, roomId, "m.room.bot.options", "_" + userId); @@ -256,6 +261,9 @@ const onMessage = function(event) { case "set_bot_options": setBotOptions(event, roomId, userId); break; + case "join_rules_state": + getJoinRules(event, roomId); + break; default: console.warn("Unhandled postMessage event with action '" + event.data.action +"'"); break; From 1c29c959901dad1d06bb167f79d811097f23a3c1 Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Mon, 5 Sep 2016 15:13:48 +0100 Subject: [PATCH 02/11] Only current room works with postMessage --- src/ScalarMessaging.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index e58a5ab21b..ee894ac785 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -123,6 +123,7 @@ Example: const SdkConfig = require('./SdkConfig'); const MatrixClientPeg = require("./MatrixClientPeg"); +var dis = require("../../dispatcher"); function sendResponse(event, res) { const data = JSON.parse(JSON.stringify(event.data)); @@ -203,7 +204,6 @@ function botOptions(event, roomId, userId) { returnStateEvent(event, roomId, "m.room.bot.options", "_" + userId); } - function returnStateEvent(event, roomId, eventType, stateKey) { const client = MatrixClientPeg.get(); if (!client) { @@ -223,6 +223,18 @@ function returnStateEvent(event, roomId, eventType, stateKey) { sendResponse(event, stateEvent.getContent()); } +var currentRoomId = null; + +// Listen for when a room is viewed +dis.register(onAction); +function onAction(payload) { + switch (payload.action) { + case 'view_room': + currentRoomId = payload.room_id; + break; + } +} + const onMessage = function(event) { if (!event.origin) { // stupid chrome event.origin = event.originalEvent.origin; @@ -248,6 +260,15 @@ const onMessage = function(event) { sendError(event, "Missing room_id in request"); return; } + if (!currentRoomId) { + sendError(event, "Must be viewing a room"); + return; + } + if (roomId !== currentRoomId) { + sendError(event, "Room not in view"); + return; + } + switch (event.data.action) { case "membership_state": getMembershipState(event, roomId, userId); From efccdab0ad501df35bcb1963d0d086dc7f5d13c9 Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Mon, 5 Sep 2016 15:16:22 +0100 Subject: [PATCH 03/11] Better error message for room not viewed --- src/ScalarMessaging.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index ee894ac785..b8ba474b5f 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -265,7 +265,7 @@ const onMessage = function(event) { return; } if (roomId !== currentRoomId) { - sendError(event, "Room not in view"); + sendError(event, "Room " + roomId + " not in view"); return; } From 310e6602caa20a1392bda3bc8f068f353de9db7f Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Mon, 5 Sep 2016 15:24:05 +0100 Subject: [PATCH 04/11] Fix ref to dispatcher --- src/ScalarMessaging.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index b8ba474b5f..857ef1e3c7 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -123,7 +123,7 @@ Example: const SdkConfig = require('./SdkConfig'); const MatrixClientPeg = require("./MatrixClientPeg"); -var dis = require("../../dispatcher"); +var dis = require("./dispatcher"); function sendResponse(event, res) { const data = JSON.parse(JSON.stringify(event.data)); From fa3387b3267ef2924521f696cedeafc6792b766f Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Tue, 6 Sep 2016 10:29:38 +0100 Subject: [PATCH 05/11] Code review - use an empty state key - swap switch for if - s/not in view/not visible/ --- src/ScalarMessaging.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 857ef1e3c7..840bc3ee86 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -196,7 +196,7 @@ function getMembershipState(event, roomId, userId) { function getJoinRules(event, roomId) { console.log(`join_rules of ${roomId} requested.`); - returnStateEvent(event, roomId, "m.room.join_rules"); + returnStateEvent(event, roomId, "m.room.join_rules", ""); } function botOptions(event, roomId, userId) { @@ -228,11 +228,10 @@ var currentRoomId = null; // Listen for when a room is viewed dis.register(onAction); function onAction(payload) { - switch (payload.action) { - case 'view_room': - currentRoomId = payload.room_id; - break; + if (payload.action !== "view_room") + return; } + currentRoomId = payload.room_id; } const onMessage = function(event) { @@ -265,7 +264,7 @@ const onMessage = function(event) { return; } if (roomId !== currentRoomId) { - sendError(event, "Room " + roomId + " not in view"); + sendError(event, "Room " + roomId + " not visible"); return; } From cb4df84d497a01f84b7fbdc1f73b3893a74a73c5 Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Tue, 6 Sep 2016 10:36:44 +0100 Subject: [PATCH 06/11] Missing curly bracket --- src/ScalarMessaging.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 840bc3ee86..0d753f5356 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -228,7 +228,7 @@ var currentRoomId = null; // Listen for when a room is viewed dis.register(onAction); function onAction(payload) { - if (payload.action !== "view_room") + if (payload.action !== "view_room") { return; } currentRoomId = payload.room_id; From 3977ea0074b85a9327d7f21f6fc76d2950749e2f Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Wed, 7 Sep 2016 09:57:07 +0100 Subject: [PATCH 07/11] Add ability to set power level --- src/ScalarMessaging.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 0d753f5356..8fb0550561 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -189,6 +189,27 @@ function setBotOptions(event, roomId, userId) { }); } +function setBotPower(event, roomId, userId, level) { + if (!(Number.isInteger(level) && level >= 0)) { + sendError(event, "Power level must be positive integer."); + return; + } + + console.log(`Received request to set power level for bot ${userId} in room ${roomId}.`); + const client = MatrixClientPeg.get(); + if (!client) { + sendError(event, "You need to be logged in."); + return; + } + client.setPowerLevel(roomId, userId, level).done(() => { + sendResponse(event, { + success: true, + }); + }, (err) => { + sendError(event, err.message ? err.message : "Failed to send request.", err); + }); +} + function getMembershipState(event, roomId, userId) { console.log(`membership_state of ${userId} in room ${roomId} requested.`); returnStateEvent(event, roomId, "m.room.member", userId); @@ -281,6 +302,9 @@ const onMessage = function(event) { case "set_bot_options": setBotOptions(event, roomId, userId); break; + case "set_bot_power": + setBotPower(event, roomId, userId, event.data.level); + break; case "join_rules_state": getJoinRules(event, roomId); break; From 4bfa57b34eab06e9093694c210ad4132bb913de0 Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Wed, 7 Sep 2016 09:58:48 +0100 Subject: [PATCH 08/11] Getting join rules does not need user ID --- src/ScalarMessaging.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 8fb0550561..1f56239a1c 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -272,10 +272,6 @@ const onMessage = function(event) { const roomId = event.data.room_id; const userId = event.data.user_id; - if (!userId) { - sendError(event, "Missing user_id in request"); - return; - } if (!roomId) { sendError(event, "Missing room_id in request"); return; @@ -289,6 +285,16 @@ const onMessage = function(event) { return; } + // Getting join rules does not require userId + if (event.data.action === "join_rules_state") { + getJoinRules(event, roomId); + return; + } + + if (!userId) { + sendError(event, "Missing user_id in request"); + return; + } switch (event.data.action) { case "membership_state": getMembershipState(event, roomId, userId); @@ -305,9 +311,6 @@ const onMessage = function(event) { case "set_bot_power": setBotPower(event, roomId, userId, event.data.level); break; - case "join_rules_state": - getJoinRules(event, roomId); - break; default: console.warn("Unhandled postMessage event with action '" + event.data.action +"'"); break; From 31d2a819f0d09767c32244019972bb09f0eeb190 Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Wed, 7 Sep 2016 17:06:57 +0100 Subject: [PATCH 09/11] Get power levels before setting them --- src/ScalarMessaging.js | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 1f56239a1c..c994bfe706 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -123,7 +123,8 @@ Example: const SdkConfig = require('./SdkConfig'); const MatrixClientPeg = require("./MatrixClientPeg"); -var dis = require("./dispatcher"); +const MatrixEvent = require("matrix-js-sdk").MatrixEvent; +const dis = require("./dispatcher"); function sendResponse(event, res) { const data = JSON.parse(JSON.stringify(event.data)); @@ -201,12 +202,24 @@ function setBotPower(event, roomId, userId, level) { sendError(event, "You need to be logged in."); return; } - client.setPowerLevel(roomId, userId, level).done(() => { - sendResponse(event, { - success: true, + + client.getStateEvent(roomId, "m.room.power_levels", "").then((rawPowerState) => { + console.log(rawPowerState); + let powerEvent = new MatrixEvent( + { + type: "m.room.power_levels", + content: rawPowerState, + } + ); + + client.setPowerLevel(roomId, userId, level, powerEvent).done(() => { + console.log('Power level has been set'); + sendResponse(event, { + success: true, + }); + }, (err) => { + sendError(event, err.message ? err.message : "Failed to send request.", err); }); - }, (err) => { - sendError(event, err.message ? err.message : "Failed to send request.", err); }); } From ce68a5bfc81758c944480f4376cd0bbd1127a135 Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Wed, 7 Sep 2016 17:08:02 +0100 Subject: [PATCH 10/11] clean up --- src/ScalarMessaging.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index c994bfe706..7399383db8 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -203,17 +203,15 @@ function setBotPower(event, roomId, userId, level) { return; } - client.getStateEvent(roomId, "m.room.power_levels", "").then((rawPowerState) => { - console.log(rawPowerState); + client.getStateEvent(roomId, "m.room.power_levels", "").then((powerLevels) => { let powerEvent = new MatrixEvent( { type: "m.room.power_levels", - content: rawPowerState, + content: powerLevels, } ); client.setPowerLevel(roomId, userId, level, powerEvent).done(() => { - console.log('Power level has been set'); sendResponse(event, { success: true, }); From f605b172a782082867e609d1a8def8f292eed133 Mon Sep 17 00:00:00 2001 From: Luke Barnard Date: Thu, 8 Sep 2016 17:38:51 +0100 Subject: [PATCH 11/11] Better log --- src/ScalarMessaging.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ScalarMessaging.js b/src/ScalarMessaging.js index 7399383db8..952648010c 100644 --- a/src/ScalarMessaging.js +++ b/src/ScalarMessaging.js @@ -196,7 +196,7 @@ function setBotPower(event, roomId, userId, level) { return; } - console.log(`Received request to set power level for bot ${userId} in room ${roomId}.`); + console.log(`Received request to set power level to ${level} for bot ${userId} in room ${roomId}.`); const client = MatrixClientPeg.get(); if (!client) { sendError(event, "You need to be logged in.");