1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-11-29 16:43:09 +03:00

Merge pull request #150 from matrix-org/matthew/generic-account-data

Support global account_data
This commit is contained in:
Matthew Hodgson
2016-07-20 16:02:58 +01:00
committed by GitHub
4 changed files with 100 additions and 21 deletions

View File

@@ -903,6 +903,37 @@ MatrixClient.prototype.getUsers = function() {
return this.store.getUsers(); return this.store.getUsers();
}; };
// User Account Data operations
// ============================
/**
* Set account data event for the current user.
* @param {string} eventType The event type
* @param {Object} content the contents object for the event
* @param {module:client.callback} callback Optional.
* @return {module:client.Promise} Resolves: TODO
* @return {module:http-api.MatrixError} Rejects: with an error response.
*/
MatrixClient.prototype.setAccountData = function(eventType, contents, callback) {
var path = utils.encodeUri("/user/$userId/account_data/$type", {
$userId: this.credentials.userId,
$type: eventType,
});
return this._http.authedRequest(
callback, "PUT", path, undefined, contents
);
};
/**
* Get account data event of given type for the current user.
* @param {string} eventType The event type
* @param {module:client.callback} callback Optional.
* @return {?object} The contents of the given account data event
*/
MatrixClient.prototype.getAccountData = function(eventType) {
return this.store.getAccountData(eventType);
};
// Room operations // Room operations
// =============== // ===============
@@ -1086,23 +1117,6 @@ MatrixClient.prototype.deleteRoomTag = function(roomId, tagName, callback) {
); );
}; };
/**
* @param {string} eventType event type to be set
* @param {object} content event content
* @param {module:client.callback} callback Optional.
* @return {module:client.Promise} Resolves: TODO
* @return {module:http-api.MatrixError} Rejects: with an error response.
*/
MatrixClient.prototype.setAccountData = function(eventType, content, callback) {
var path = utils.encodeUri("/user/$userId/account_data/$type", {
$userId: this.credentials.userId,
$type: eventType,
});
return this._http.authedRequest(
callback, "PUT", path, undefined, content
);
};
/** /**
* @param {string} roomId * @param {string} roomId
* @param {string} eventType event type to be set * @param {string} eventType event type to be set
@@ -3991,7 +4005,7 @@ module.exports.CRYPTO_ENABLED = CRYPTO_ENABLED;
* }); * });
*/ */
/** /**
* Fires when a device is marked as verified/unverified/blocked/unblocked by * Fires when a device is marked as verified/unverified/blocked/unblocked by
* {@link module:client~MatrixClient#setDeviceVerified|MatrixClient.setDeviceVerified} or * {@link module:client~MatrixClient#setDeviceVerified|MatrixClient.setDeviceVerified} or
* {@link module:client~MatrixClient#setDeviceBlocked|MatrixClient.setDeviceBlocked}. * {@link module:client~MatrixClient#setDeviceBlocked|MatrixClient.setDeviceBlocked}.
@@ -4001,6 +4015,17 @@ module.exports.CRYPTO_ENABLED = CRYPTO_ENABLED;
* @param {module:client~DeviceInfo} device information about the verified device * @param {module:client~DeviceInfo} device information about the verified device
*/ */
/**
* Fires whenever new user-scoped account_data is added.
* @event module:client~MatrixClient#"Room"
* @param {MatrixEvent} event The event describing the account_data just added
* @example
* matrixClient.on("accountData", function(event){
* myAccountData[event.type] = event.content;
* });
*/
// EventEmitter JSDocs // EventEmitter JSDocs
/** /**

View File

@@ -43,6 +43,9 @@ module.exports.MatrixInMemoryStore = function MatrixInMemoryStore(opts) {
// filterId: Filter // filterId: Filter
// } // }
}; };
this.accountData = {
// type : content
};
this.localStorage = opts.localStorage; this.localStorage = opts.localStorage;
}; };
@@ -244,7 +247,29 @@ module.exports.MatrixInMemoryStore.prototype = {
this.localStorage.setItem("mxjssdk_memory_filter_" + filterName, filterId); this.localStorage.setItem("mxjssdk_memory_filter_" + filterName, filterId);
} }
catch (e) {} catch (e) {}
} },
/**
* Store user-scoped account data events.
* N.B. that account data only allows a single event per type, so multiple
* events with the same type will replace each other.
* @param {Array<MatrixEvent>} events The events to store.
*/
storeAccountDataEvents: function(events) {
var self = this;
events.forEach(function(event) {
self.accountData[event.getType()] = event;
});
},
/**
* Get account data event by event type
* @param {string} eventType The event type being queried
* @return {?MatrixEvent} the user account_data event of given type, if any
*/
getAccountData: function(eventType) {
return this.accountData[eventType];
},
// TODO // TODO
//setMaxHistoryPerRoom: function(maxHistory) {}, //setMaxHistoryPerRoom: function(maxHistory) {},

View File

@@ -162,7 +162,23 @@ StubStore.prototype = {
*/ */
setFilterIdByName: function(filterName, filterId) { setFilterIdByName: function(filterName, filterId) {
} },
/**
* Store user-scoped account data events
* @param {Array<MatrixEvent>} events The events to store.
*/
storeAccountDataEvents: function(events) {
},
/**
* Get account data event by event type
* @param {string} eventType The event type being queried
*/
getAccountData: function(eventType) {
},
// TODO // TODO
//setMaxHistoryPerRoom: function(maxHistory) {}, //setMaxHistoryPerRoom: function(maxHistory) {},

View File

@@ -88,6 +88,7 @@ SyncApi.prototype.createRoom = function(roomId) {
"Room.receipt", "Room.tags", "Room.receipt", "Room.tags",
"Room.timelineReset", "Room.timelineReset",
"Room.localEchoUpdated", "Room.localEchoUpdated",
"Room.accountData",
]); ]);
this._registerStateListeners(room); this._registerStateListeners(room);
return room; return room;
@@ -605,7 +606,19 @@ SyncApi.prototype._processSyncResponse = function(syncToken, data) {
}); });
} }
// the returned json structure is abit crap, so make it into a // handle non-room account_data
if (data.account_data && utils.isArray(data.account_data.events)) {
var events = data.account_data.events.map(client.getEventMapper());
client.store.storeAccountDataEvents(events);
events.forEach(
function(accountDataEvent) {
client.emit("accountData", accountDataEvent);
return accountDataEvent;
}
);
}
// the returned json structure is a bit crap, so make it into a
// nicer form (array) after applying sanity to make sure we don't fail // nicer form (array) after applying sanity to make sure we don't fail
// on missing keys (on the off chance) // on missing keys (on the off chance)
var inviteRooms = []; var inviteRooms = [];