Registrations currently disabled due to spam. Contact me externally if you need an account

Commit afcf012b authored by Bradley Hilton's avatar Bradley Hilton
Browse files

Several changes to allow for easier Integrations from others.

* getFullUserData now accepts a limit of -1 which will retrieve all of the users, but you only see what you have permission to.
* processWebhookMessage now accepts a roomId for rooms or user, that way integrations don't have to know the name of the channel.
* Fixed the chat.postMessage being broke for messages that contain more than channel and text...whoops!
parent 39b20d13
Loading
Loading
Loading
Loading
+2 −10
Original line number Diff line number Diff line
@@ -2,11 +2,11 @@
RocketChat.API.v1.addRoute('chat.delete', { authRequired: true }, {
	post: function() {
		try {
			check(this.bodyParams, {
			check(this.bodyParams, Match.ObjectIncluding({
				msgId: String,
				roomId: String,
				asUser: Match.Maybe(Boolean)
			});
			}));

			const msg = RocketChat.models.Messages.findOneById(this.bodyParams.msgId, { fields: { u: 1, rid: 1 }});

@@ -35,14 +35,6 @@ RocketChat.API.v1.addRoute('chat.delete', { authRequired: true }, {
RocketChat.API.v1.addRoute('chat.postMessage', { authRequired: true }, {
	post: function() {
		try {
			if (!this.bodyParams.attachments) {
				check(this.bodyParams, {
					channel: String,
					text: String
				});
			}

			//TODO: Completely rewrite this? Seems too "magical"
			const messageReturn = processWebhookMessage(this.bodyParams, this.user)[0];

			if (!messageReturn) {
+7 −1
Original line number Diff line number Diff line
@@ -116,10 +116,16 @@ RocketChat.API.v1.addRoute('users.info', { authRequired: true }, {

RocketChat.API.v1.addRoute('users.list', { authRequired: true }, {
	get: function() {
		let limit = -1;

		if (typeof this.queryParams.limit !== 'undefined') {
			limit = parseInt(limit);
		}

		let result = undefined;
		try {
			Meteor.runAsUser(this.userId, () => {
				result = Meteor.call('getFullUserData', {});
				result = Meteor.call('getFullUserData', { filter: '', limit });
			});
		} catch (e) {
			return RocketChat.API.v1.failure(e.name + ': ' + e.message);
+60 −33
Original line number Diff line number Diff line
function retrieveRoomInfo({ userId, channel, ignoreEmpty=false }) {
	const room = RocketChat.models.Rooms.findOneByIdOrName(channel);
	if (!_.isObject(room) && !ignoreEmpty) {
		throw new Meteor.Error('invalid-channel');
	}

	if (room && room.t === 'c') {
		Meteor.runAsUser(userId, function() {
			return Meteor.call('joinRoom', room._id);
		});
	}

	return room;
}

function retrieveDirectMessageInfo({ userId, channel }) {
	const roomUser = RocketChat.models.Users.findOne({
		$or: [
			{
				_id: channel
			}, {
				username: channel
			}
		]
	}) || {};

	const rid = [userId, roomUser._id].sort().join('');
	let room = RocketChat.models.Rooms.findOneById({$in: [rid, channel]});
	if (!_.isObject(roomUser) && !_.isObject(room)) {
		throw new Meteor.Error('invalid-channel');
	}

	if (!room) {
		Meteor.runAsUser(userId, function() {
			Meteor.call('createDirectMessage', roomUser.username);
			room = RocketChat.models.Rooms.findOneById(rid);
		});
	}

	return room;
}

this.processWebhookMessage = function(messageObj, user, defaultValues) {
	var attachment, channel, channels, channelType, i, len, message, ref, rid, room, roomUser, ret;
	var attachment, channel, channels, channelType, i, len, message, ref, room, ret;
	ret = [];

	if (!defaultValues) {
@@ -11,7 +53,7 @@ this.processWebhookMessage = function(messageObj, user, defaultValues) {
		};
	}

	channel = messageObj.channel || defaultValues.channel;
	channel = messageObj.channel || messageObj.roomId || defaultValues.channel;

	channels = [].concat(channel);

@@ -22,41 +64,26 @@ this.processWebhookMessage = function(messageObj, user, defaultValues) {

		switch (channelType) {
			case '#':
				room = RocketChat.models.Rooms.findOneByIdOrName(channel);
				if (!_.isObject(room)) {
					throw new Meteor.Error('invalid-channel');
				}
				rid = room._id;
				if (room.t === 'c') {
					Meteor.runAsUser(user._id, function() {
						return Meteor.call('joinRoom', room._id);
					});
				}
				room = retrieveRoomInfo({ userId: user._id, channel });
				break;
			case '@':
				roomUser = RocketChat.models.Users.findOne({
					$or: [
						{
							_id: channel
						}, {
							username: channel
						}
					]
				}) || {};
				rid = [user._id, roomUser._id].sort().join('');
				room = RocketChat.models.Rooms.findOneById({$in: [rid, channel]});
				if (!_.isObject(roomUser) && !_.isObject(room)) {
					throw new Meteor.Error('invalid-channel');
				}
				if (!room) {
					Meteor.runAsUser(user._id, function() {
						Meteor.call('createDirectMessage', roomUser.username);
						room = RocketChat.models.Rooms.findOneById(rid);
					});
				}
				room = retrieveDirectMessageInfo({ userId: user._id, channel });
				break;
			default:
				throw new Meteor.Error('invalid-channel-type');
				//Try to find the room by id or name if they didn't include the prefix.
				room = retrieveRoomInfo({ userId: user._id, channel: channelType + channel, ignoreEmpty: true });
				if (room) {
					break;
				}

				//We didn't get a room, let's try finding direct messages
				room = retrieveDirectMessageInfo({ userId: user._id, channel: channelType + channel });
				if (room) {
					break;
				}

				//No room, so throw an error
				throw new Meteor.Error('invalid-channel');
		}

		if (messageObj.attachments && !_.isArray(messageObj.attachments)) {
+1 −1
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ RocketChat.getFullUserData = function({userId, filter, limit}) {
			requirePasswordChangeReason: 1,
			roles: 1
		});
	} else {
	} else if (limit !== -1) {
		limit = 1;
	}