diff --git a/lib/matrix.js b/lib/matrix.js index dd0d2f3cd..d2c25ff55 100644 --- a/lib/matrix.js +++ b/lib/matrix.js @@ -60,23 +60,61 @@ var init = function(exports){ }, invite: function(roomId, userId, callback) { - return this._membershipChange(roomId, userId, "invite", callback); + return this._membershipChange(roomId, userId, "invite", undefined, + callback); }, leave: function(roomId, callback) { - return this._membershipChange(roomId, undefined, "leave", callback); + return this._membershipChange(roomId, undefined, "leave", undefined, + callback); }, - _membershipChange: function(roomId, userId, membership, callback) { + ban: function(roomId, userId, reason, callback) { + return this._membershipChange(roomId, userId, "ban", reason, + callback); + }, + + unban: function(roomId, userId, callback) { + // unbanning = set their state to leave + return this._setMembershipState( + roomId, userId, "leave", undefined, callback + ); + }, + + kick: function(roomId, userId, reason, callback) { + return this._setMembershipState( + roomId, userId, "leave", reason, callback + ); + }, + + _setMembershipState: function(roomId, userId, membershipValue, reason, + callback) { + if (isFunction(reason)) { callback = reason; reason = undefined; } + + var path = encodeUri( + "/rooms/$roomId/state/m.room.member/$userId", + { $roomId: roomId, $userId: userId} + ); + + return this._doAuthedRequest(callback, "PUT", path, undefined, { + membership : membershipValue, + reason: reason + }); + }, + + _membershipChange: function(roomId, userId, membership, reason, + callback) { + if (isFunction(reason)) { callback = reason; reason = undefined; } + var path = encodeUri("/rooms/$room_id/$membership", { $room_id: roomId, $membership: membership }); - var data = { - user_id: userId // may be undefined e.g. on leave - }; return this._doAuthedRequest( - callback, "POST", path, undefined, data + callback, "POST", path, undefined, { + user_id: userId, // may be undefined e.g. on leave + reason: reason + } ); }, @@ -107,6 +145,19 @@ var init = function(exports){ ); }, + roomInitialSync: function(roomId, limit, callback) { + if (isFunction(limit)) { callback = limit; limit = undefined; } + var path = encodeUri("/rooms/$roomId/initialSync", + {$roomId: roomId} + ); + if (!limit) { + limit = 30; + } + return this._doAuthedRequest( + callback, "GET", path, { limit: limit } + ); + }, + // Internals // ========= @@ -119,6 +170,7 @@ var init = function(exports){ _doRequest: function(callback, method, path, params, data) { var fullUri = this.credentials.baseUrl + PREFIX + path; console.log(" => %s", fullUri); + console.log(" %s", JSON.stringify(data)); if (!params) { params = {}; } return request( @@ -162,6 +214,10 @@ var init = function(exports){ } }; }; + + var isFunction = function(value) { + return Object.prototype.toString.call(value) == "[object Function]"; + }; }; if (typeof exports === 'undefined') {