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({
'busboy': '0.2.13',
'@rocket.chat/apps-engine': '0.4.0',
'@rocket.chat/apps-ts-definition': '0.7.6'
'@rocket.chat/apps-engine': '0.4.4',
'@rocket.chat/apps-ts-definition': '0.7.9'
});

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

@ -3,6 +3,7 @@ import { AppActivationBridge } from './activation';
import { AppCommandsBridge } from './commands';
import { AppEnvironmentalVariableBridge } from './environmental';
import { AppHttpBridge } from './http';
import { AppListenerBridge } from './listeners';
import { AppMessageBridge } from './messages';
import { AppPersistenceBridge } from './persistence';
import { AppRoomBridge } from './rooms';
@ -15,6 +16,7 @@ export {
AppCommandsBridge,
AppEnvironmentalVariableBridge,
AppHttpBridge,
AppListenerBridge,
AppMessageBridge,
AppPersistenceBridge,
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();
}
isEnabled() {
return typeof this._manager !== 'undefined';
}
isLoaded() {
return typeof this._manager !== 'undefined' && this.manager.areAppsLoaded();
}
_addMethods() {
const manager = this._manager;
const instance = this;
Meteor.methods({
'apps/is-enabled'() {
return typeof manager !== 'undefined';
return instance.isEnabled();
},
'apps/is-loaded'() {
return typeof manager !== 'undefined' || manager.areAppsLoaded();
return instance.isLoaded();
}
});
}

@ -64,18 +64,27 @@ class AppServerOrchestrator {
getManager() {
return this._manager;
}
isEnabled() {
return true;
}
isLoaded() {
return this.getManager().areAppsLoaded();
}
}
Meteor.startup(function _appServerOrchestrator() {
// Ensure that everything is setup
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...');
global.Apps = new AppServerOrchestrator();
global.Apps.getManager().load()
.then(() => console.log('...done! ;)'))
.then(() => console.log('...done! :)'))
.catch((err) => console.warn('...failed!', err));
});

@ -4,22 +4,27 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) {
if (!user || !message || !room._id) {
return false;
}
if (message.ts == null) {
message.ts = new Date();
}
message.u = _.pick(user, ['_id', 'username', 'name']);
if (!Match.test(message.msg, String)) {
message.msg = '';
}
if (message.ts == null) {
message.ts = new Date();
}
message.rid = room._id;
message.u = _.pick(user, ['_id', 'username', 'name']);
if (!room.usernames || room.usernames.length === 0) {
const updated_room = RocketChat.models.Rooms.findOneById(room._id);
if (updated_room != null) {
if (updated_room) {
room = updated_room;
} else {
room.usernames = [];
}
}
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);
@ -44,6 +49,17 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) {
sandstormSessionId = 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) {
const _id = message._id;
delete message._id;
@ -56,6 +72,10 @@ RocketChat.sendMessage = function(user, message, room, upsert = false) {
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
*/

Loading…
Cancel
Save