Add preMessageSentPrevent and PostMessageSent listeners

pull/10154/head
Bradley Hilton 7 years ago
parent 6571b8f992
commit 49f20abe44
No known key found for this signature in database
GPG Key ID: 0666B2C24C43C358
  1. 4
      packages/rocketchat-apps/package.js
  2. 6
      packages/rocketchat-apps/server/bridges/bridges.js
  3. 2
      packages/rocketchat-apps/server/bridges/index.js
  4. 15
      packages/rocketchat-apps/server/bridges/listeners.js
  5. 14
      packages/rocketchat-apps/server/communication/methods.js
  6. 13
      packages/rocketchat-apps/server/orchestrator.js
  7. 30
      packages/rocketchat-lib/server/functions/sendMessage.js

@ -87,6 +87,6 @@ Package.onUse(function(api) {
Npm.depends({ Npm.depends({
'busboy': '0.2.13', 'busboy': '0.2.13',
'@rocket.chat/apps-engine': '0.4.0', '@rocket.chat/apps-engine': '0.4.4',
'@rocket.chat/apps-ts-definition': '0.7.6' '@rocket.chat/apps-ts-definition': '0.7.9'
}); });

@ -5,6 +5,7 @@ import { AppDetailChangesBridge } from './details';
import { AppCommandsBridge } from './commands'; import { AppCommandsBridge } from './commands';
import { AppEnvironmentalVariableBridge } from './environmental'; import { AppEnvironmentalVariableBridge } from './environmental';
import { AppHttpBridge } from './http'; import { AppHttpBridge } from './http';
import { AppListenerBridge } from './listeners';
import { AppMessageBridge } from './messages'; import { AppMessageBridge } from './messages';
import { AppPersistenceBridge } from './persistence'; import { AppPersistenceBridge } from './persistence';
import { AppRoomBridge } from './rooms'; import { AppRoomBridge } from './rooms';
@ -20,6 +21,7 @@ export class RealAppBridges extends AppBridges {
this._detBridge = new AppDetailChangesBridge(orch); this._detBridge = new AppDetailChangesBridge(orch);
this._envBridge = new AppEnvironmentalVariableBridge(orch); this._envBridge = new AppEnvironmentalVariableBridge(orch);
this._httpBridge = new AppHttpBridge(); this._httpBridge = new AppHttpBridge();
this._lisnBridge = new AppListenerBridge(orch);
this._msgBridge = new AppMessageBridge(orch); this._msgBridge = new AppMessageBridge(orch);
this._persistBridge = new AppPersistenceBridge(orch); this._persistBridge = new AppPersistenceBridge(orch);
this._roomBridge = new AppRoomBridge(orch); this._roomBridge = new AppRoomBridge(orch);
@ -39,6 +41,10 @@ export class RealAppBridges extends AppBridges {
return this._httpBridge; return this._httpBridge;
} }
getListenerBridge() {
return this._lisnBridge;
}
getMessageBridge() { getMessageBridge() {
return this._msgBridge; return this._msgBridge;
} }

@ -3,6 +3,7 @@ import { AppActivationBridge } from './activation';
import { AppCommandsBridge } from './commands'; import { AppCommandsBridge } from './commands';
import { AppEnvironmentalVariableBridge } from './environmental'; import { AppEnvironmentalVariableBridge } from './environmental';
import { AppHttpBridge } from './http'; import { AppHttpBridge } from './http';
import { AppListenerBridge } from './listeners';
import { AppMessageBridge } from './messages'; import { AppMessageBridge } from './messages';
import { AppPersistenceBridge } from './persistence'; import { AppPersistenceBridge } from './persistence';
import { AppRoomBridge } from './rooms'; import { AppRoomBridge } from './rooms';
@ -15,6 +16,7 @@ export {
AppCommandsBridge, AppCommandsBridge,
AppEnvironmentalVariableBridge, AppEnvironmentalVariableBridge,
AppHttpBridge, AppHttpBridge,
AppListenerBridge,
AppMessageBridge, AppMessageBridge,
AppPersistenceBridge, AppPersistenceBridge,
AppRoomBridge, AppRoomBridge,

@ -0,0 +1,15 @@
export class AppListenerBridge {
constructor(orch) {
this.orch = orch;
}
messageEvent(inte, message) {
const msg = this.orch.getConverters().get('messages').convertMessage(message);
return this.orch.getManager().getListenerManager().executeListener(inte, msg);
}
roomEvent(inte, room) {
const rm = this.orch.getConverters().get('rooms').convertRoom(room);
return this.orch.getManager().getListenerManager().executeListener(inte, rm);
}
}

@ -5,16 +5,24 @@ export class AppMethods {
this._addMethods(); this._addMethods();
} }
isEnabled() {
return typeof this._manager !== 'undefined';
}
isLoaded() {
return typeof this._manager !== 'undefined' && this.manager.areAppsLoaded();
}
_addMethods() { _addMethods() {
const manager = this._manager; const instance = this;
Meteor.methods({ Meteor.methods({
'apps/is-enabled'() { 'apps/is-enabled'() {
return typeof manager !== 'undefined'; return instance.isEnabled();
}, },
'apps/is-loaded'() { 'apps/is-loaded'() {
return typeof manager !== 'undefined' || manager.areAppsLoaded(); return instance.isLoaded();
} }
}); });
} }

@ -64,18 +64,27 @@ class AppServerOrchestrator {
getManager() { getManager() {
return this._manager; return this._manager;
} }
isEnabled() {
return true;
}
isLoaded() {
return this.getManager().areAppsLoaded();
}
} }
Meteor.startup(function _appServerOrchestrator() { Meteor.startup(function _appServerOrchestrator() {
// Ensure that everything is setup // Ensure that everything is setup
if (process.env[AppManager.ENV_VAR_NAME_FOR_ENABLING] !== 'true' && process.env[AppManager.SUPER_FUN_ENV_ENABLEMENT_NAME] !== 'true') { if (process.env[AppManager.ENV_VAR_NAME_FOR_ENABLING] !== 'true' && process.env[AppManager.SUPER_FUN_ENV_ENABLEMENT_NAME] !== 'true') {
return new AppMethods(); global.Apps = new AppMethods();
return;
} }
console.log('Orchestrating the app piece...'); console.log('Orchestrating the app piece...');
global.Apps = new AppServerOrchestrator(); global.Apps = new AppServerOrchestrator();
global.Apps.getManager().load() global.Apps.getManager().load()
.then(() => console.log('...done! ;)')) .then(() => console.log('...done! :)'))
.catch((err) => console.warn('...failed!', err)); .catch((err) => console.warn('...failed!', err));
}); });

@ -4,22 +4,27 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) {
if (!user || !message || !room._id) { if (!user || !message || !room._id) {
return false; return false;
} }
if (message.ts == null) {
message.ts = new Date();
}
message.u = _.pick(user, ['_id', 'username', 'name']);
if (!Match.test(message.msg, String)) { if (!Match.test(message.msg, String)) {
message.msg = ''; message.msg = '';
} }
if (message.ts == null) {
message.ts = new Date();
}
message.rid = room._id; message.rid = room._id;
message.u = _.pick(user, ['_id', 'username', 'name']);
if (!room.usernames || room.usernames.length === 0) { if (!room.usernames || room.usernames.length === 0) {
const updated_room = RocketChat.models.Rooms.findOneById(room._id); const updated_room = RocketChat.models.Rooms.findOneById(room._id);
if (updated_room != null) { if (updated_room) {
room = updated_room; room = updated_room;
} else { } else {
room.usernames = []; room.usernames = [];
} }
} }
if (message.parseUrls !== false) { if (message.parseUrls !== false) {
const urls = message.msg.match(/([A-Za-z]{3,9}):\/\/([-;:&=\+\$,\w]+@{1})?([-A-Za-z0-9\.]+)+:?(\d+)?((\/[-\+=!:~%\/\.@\,\(\)\w]*)?\??([-\+=&!:;%@\/\.\,\w]+)?(?:#([^\s\)]+))?)?/g); const urls = message.msg.match(/([A-Za-z]{3,9}):\/\/([-;:&=\+\$,\w]+@{1})?([-A-Za-z0-9\.]+)+:?(\d+)?((\/[-\+=!:~%\/\.@\,\(\)\w]*)?\??([-\+=&!:;%@\/\.\,\w]+)?(?:#([^\s\)]+))?)?/g);
@ -44,6 +49,17 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) {
sandstormSessionId = message.sandstormSessionId; sandstormSessionId = message.sandstormSessionId;
delete message.sandstormSessionId; delete message.sandstormSessionId;
} }
// For the Rocket.Chat Apps :)
if (Apps && Apps.isLoaded()) {
const prevent = Apps.getBridges().getListenerBridge().messageEvent('IPreMessageSentPrevent', message);
if (prevent) {
return false;
}
// TODO: The rest of the IPreMessageSent events
}
if (message._id && upsert) { if (message._id && upsert) {
const _id = message._id; const _id = message._id;
delete message._id; delete message._id;
@ -56,6 +72,10 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) {
message._id = RocketChat.models.Messages.insert(message); message._id = RocketChat.models.Messages.insert(message);
} }
if (Apps && Apps.isLoaded()) {
Apps.getBridges().getListenerBridge().messageEvent('IPostMessageSent', message);
}
/* /*
Defer other updates as their return is not interesting to the user Defer other updates as their return is not interesting to the user
*/ */

Loading…
Cancel
Save