i18n is now provided via the rocketlets and load them when a rocketlet is added

pull/9666/head
Bradley Hilton 8 years ago
parent a74db27644
commit 8ddb090526
No known key found for this signature in database
GPG Key ID: 0666B2C24C43C358
  1. 9
      packages/rocketchat-api/server/api.js
  2. 10
      packages/rocketchat-google-vision/.npm/package/npm-shrinkwrap.json
  3. 26
      packages/rocketchat-lib/client/lib/startup/commands.js
  4. 0
      packages/rocketchat-rocketlets/assets/stylesheets/rocketlets.css
  5. 6
      packages/rocketchat-rocketlets/client/admin/rocketlets.html
  6. 21
      packages/rocketchat-rocketlets/client/admin/rocketlets.js
  7. 7
      packages/rocketchat-rocketlets/client/communication/websockets.js
  8. 23
      packages/rocketchat-rocketlets/client/orchestrator.js
  9. 7
      packages/rocketchat-rocketlets/package.js
  10. 35
      packages/rocketchat-rocketlets/server/bridges/activation.js
  11. 7
      packages/rocketchat-rocketlets/server/bridges/bridges.js
  12. 2
      packages/rocketchat-rocketlets/server/bridges/index.js
  13. 23
      packages/rocketchat-rocketlets/server/bridges/settings.js
  14. 25
      packages/rocketchat-rocketlets/server/communication/rest.js
  15. 4
      packages/rocketchat-rocketlets/server/converters/settings.js

@ -66,6 +66,15 @@ class API extends Restivus {
};
}
notFound(msg) {
return {
statusCode: 404,
body: {
success: false,
error: msg ? msg : 'Resource not found'
}
};
}
unauthorized(msg) {
return {

@ -1085,13 +1085,13 @@
"from": "mime@>=1.2.11 <2.0.0"
},
"mime-db": {
"version": "1.29.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz",
"from": "mime-db@>=1.29.0 <1.30.0"
"version": "1.30.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
"from": "mime-db@>=1.30.0 <1.31.0"
},
"mime-types": {
"version": "2.1.16",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz",
"version": "2.1.17",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
"from": "mime-types@>=2.0.8 <3.0.0"
},
"minimatch": {

@ -1,11 +1,17 @@
Meteor.startup(function _loadDynamicallyDefinedCommands() {
// The reason there is a 500 millisecond delay is so that we are
// a little "easier" on the server during start up
setTimeout(() => {
RocketChat.API.v1.get('commands.list').then(function _loadedCommands(result) {
result.commands.forEach((command) => {
RocketChat.slashCommands.commands[command.command] = command;
//Track logins and when they login, get the commands
(() => {
let oldUserId = null;
Meteor.autorun(() => {
const newUserId = Meteor.userId();
if (oldUserId === null && newUserId) {
RocketChat.API.v1.get('commands.list').then(function _loadedCommands(result) {
result.commands.forEach((command) => {
RocketChat.slashCommands.commands[command.command] = command;
});
});
});
}, 500);
});
}
oldUserId = Meteor.userId();
});
})();

@ -9,7 +9,11 @@
</header>
<div class="content">
{{#requiresPermission 'manage-rocketlets'}}
<h1>Hello</h1>
{{#each rocketlets}}
<ul class="sound-info row-link">
<li>{{name}}&nbsp;<i class="icon-play-circled"></i></li>
</ul>
{{/each}}
{{/requiresPermission}}
</div>
</section>

@ -1,3 +1,22 @@
Template.rocketlets.onCreated(function() {
console.log('hello');
const instance = this;
this.ready = new ReactiveVar(false);
this.rocketlets = new ReactiveVar([]);
RocketChat.API.get('rocketlets').then((result) => {
instance.rocketlets.set(result.rocketlets);
});
});
Template.rocketlets.helpers({
isReady() {
if (Template.instance().ready != null) {
return Template.instance().ready.get();
}
return false;
},
rocketlets() {
return Template.instance().rocketlets.get();
}
});

@ -3,12 +3,19 @@ export class RocketletWebsocketReceiver {
this.orch = orch;
this.streamer = new Meteor.Streamer('rocketlets');
this.streamer.on('rocketlet/added', this.onRocketletAdded.bind(this));
this.streamer.on('command/added', this.onCommandAdded.bind(this));
this.streamer.on('command/disabled', this.onCommandDisabled.bind(this));
this.streamer.on('command/updated', this.onCommandUpdated.bind(this));
this.streamer.on('command/removed', this.onCommandDisabled.bind(this));
}
onRocketletAdded(rocketletId) {
RocketChat.API.get(`rocketlets/${ rocketletId }`).then((result) => {
this.orch.parseAndLoadLanguages(result.rocketlet.languages);
});
}
onCommandAdded(command) {
RocketChat.API.v1.get('commands.getOne', { command }).then((result) => {
RocketChat.slashCommands.commands[command] = result.command;

@ -5,6 +5,7 @@ class RocketletClientOrchestrator {
this.ws = new RocketletWebsocketReceiver(this);
this._addAdminMenuOption();
setTimeout(() => this._loadLanguages(), 500);
}
getWsListener() {
@ -20,6 +21,28 @@ class RocketletClientOrchestrator {
}
});
}
_loadLanguages() {
if (!Meteor.user()) {
return;
}
RocketChat.API.get('rocketlets?languagesOnly=true').then((info) => {
info.rocketlets.forEach((rlInfo) => this.parseAndLoadLanguages(rlInfo.languages));
});
}
parseAndLoadLanguages(languages) {
Object.keys(languages).forEach((key) => {
try {
const json = JSON.parse(languages[key]);
TAPi18next.addResourceBundle(key, 'project', json);
} catch (e) {
// Failed to parse the json
}
});
}
}
Meteor.startup(function _rlClientOrch() {

@ -25,6 +25,7 @@ Package.onUse(function(api) {
// Bridges
api.addFiles([
'server/bridges/activation.js',
'server/bridges/bridges.js',
'server/bridges/commands.js',
'server/bridges/environmental.js',
@ -67,6 +68,8 @@ Package.onUse(function(api) {
'client/admin/rocketlets.js'
], 'client');
api.addFiles('assets/stylesheets/rocketlets.css', 'client');
// Client orchestrator
api.addFiles('client/orchestrator.js', 'client');
@ -76,6 +79,6 @@ Package.onUse(function(api) {
Npm.depends({
'busboy': '0.2.13',
'temporary-rocketlets-server': '0.1.23',
'temporary-rocketlets-ts-definition': '0.6.25'
'temporary-rocketlets-server': '0.1.26',
'temporary-rocketlets-ts-definition': '0.6.26'
});

@ -0,0 +1,35 @@
export class RocketletActivationBridge {
constructor(orch) {
this.orch = orch;
}
rocketletEnabled(rocketlet) {
console.log(`The Rocketlet ${ rocketlet.getName() } (${ rocketlet.getID() }) has been enabled.`);
}
rocketletDisabled(rocketlet) {
console.log(`The Rocketlet ${ rocketlet.getName() } (${ rocketlet.getID() }) has been disabled.`);
}
rocketletLoaded(rocketlet, enabled) {
console.log(`The Rocketlet ${ rocketlet.getName() } (${ rocketlet.getID() }) has been loaded and enabled? ${ enabled }`);
if (enabled) {
this.orch.getNotifier().rocketletAdded(rocketlet.getID());
}
}
rocketletUpdated(rocketlet, enabled) {
console.log(`The Rocketlet ${ rocketlet.getName() } (${ rocketlet.getID() }) has been updated and enabled? ${ enabled }`);
if (enabled) {
this.orch.getNotifier().rocketletUpdated(rocketlet.getID());
}
}
rocketletRemoved(rocketlet) {
console.log(`The Rocketlet ${ rocketlet.getName() } (${ rocketlet.getID() }) has been removed.`);
this.orch.getNotifier().rocketletRemoved(rocketlet.getID());
}
}

@ -1,4 +1,6 @@
import { RocketletBridges } from 'temporary-rocketlets-server/server/bridges';
import { RocketletActivationBridge } from './activation';
import { RocketletCommandsBridge } from './commands';
import { RocketletEnvironmentalVariableBridge } from './environmental';
import { RocketletHttpBridge } from './http';
@ -12,6 +14,7 @@ export class RealRocketletBridges extends RocketletBridges {
constructor(orch) {
super();
this._actBridge = new RocketletActivationBridge(orch);
this._cmdBridge = new RocketletCommandsBridge(orch);
this._envBridge = new RocketletEnvironmentalVariableBridge(orch);
this._httpBridge = new RocketletHttpBridge();
@ -42,6 +45,10 @@ export class RealRocketletBridges extends RocketletBridges {
return this._persistBridge;
}
getRocketletActivationBridge() {
return this._actBridge;
}
getRoomBridge() {
return this._roomBridge;
}

@ -1,4 +1,5 @@
import { RealRocketletBridges } from './bridges';
import { RocketletActivationBridge } from './activation';
import { RocketletCommandsBridge } from './commands';
import { RocketletEnvironmentalVariableBridge } from './environmental';
import { RocketletHttpBridge } from './http';
@ -10,6 +11,7 @@ import { RocketletUserBridge } from './users';
export {
RealRocketletBridges,
RocketletActivationBridge,
RocketletCommandsBridge,
RocketletEnvironmentalVariableBridge,
RocketletHttpBridge,

@ -2,12 +2,29 @@ export class RocketletSettingBridge {
constructor(orch) {
this.orch = orch;
this.allowedGroups = [];
this.allowedSettings = [];
this.disallowedSettings = [
'Accounts_RegistrationForm_SecretURL', 'CROWD_APP_USERNAME', 'CROWD_APP_PASSWORD', 'Direct_Reply_Username',
'Direct_Reply_Password', 'SMTP_Username', 'SMTP_Password', 'FileUpload_S3_AWSAccessKeyId', 'FileUpload_S3_AWSSecretAccessKey',
'FileUpload_S3_BucketURL', 'FileUpload_GoogleStorage_Bucket', 'FileUpload_GoogleStorage_AccessId',
'FileUpload_GoogleStorage_Secret', 'GoogleVision_ServiceAccount', 'Allow_Invalid_SelfSigned_Certs', 'GoogleTagManager_id',
'Bugsnag_api_key', 'LDAP_CA_Cert', 'LDAP_Reject_Unauthorized', 'LDAP_Domain_Search_User', 'LDAP_Domain_Search_Password',
'Livechat_secret_token', 'Livechat_Knowledge_Apiai_Key', 'AutoTranslate_GoogleAPIKey', 'MapView_GMapsAPIKey',
'Meta_fb_app_id', 'Meta_google-site-verification', 'Meta_msvalidate01', 'Accounts_OAuth_Dolphin_secret',
'Accounts_OAuth_Drupal_secret', 'Accounts_OAuth_Facebook_secret', 'Accounts_OAuth_Github_secret', 'API_GitHub_Enterprise_URL',
'Accounts_OAuth_GitHub_Enterprise_secret', 'API_Gitlab_URL', 'Accounts_OAuth_Gitlab_secret', 'Accounts_OAuth_Google_secret',
'Accounts_OAuth_Linkedin_secret', 'Accounts_OAuth_Meteor_secret', 'Accounts_OAuth_Twitter_secret', 'API_Wordpress_URL',
'Accounts_OAuth_Wordpress_secret', 'Push_apn_passphrase', 'Push_apn_key', 'Push_apn_cert', 'Push_apn_dev_passphrase',
'Push_apn_dev_key', 'Push_apn_dev_cert', 'Push_gcm_api_key', 'Push_gcm_project_number', 'SAML_Custom_Default_cert',
'SAML_Custom_Default_private_key', 'SlackBridge_APIToken', 'Smarsh_Email', 'SMS_Twilio_Account_SID', 'SMS_Twilio_authToken'
];
}
getAll(rocketletId) {
console.log(`The Rocketlet ${ rocketletId } is getting all the settings.`);
throw new Error('Method not implemented.');
return RocketChat.models.Settings.find({ _id: { $nin: this.disallowedSettings } }).fetch().map((s) => {
this.orch.getConverters().get('settings').convertToRocketlet(s);
});
}
getOneById(id, rocketletId) {
@ -38,7 +55,7 @@ export class RocketletSettingBridge {
isReadableById(id, rocketletId) {
console.log(`The Rocketlet ${ rocketletId } is checking if they can read the setting ${ id }.`);
return this.allowedSettings.includes(id);
return !this.disallowedSettings.includes(id);
}
updateOne(setting, rocketletId) {

@ -40,7 +40,19 @@ export class RocketletsRestApi {
this.api.addRoute('', { authRequired: true }, {
get() {
const rocketlets = manager.get().map(prl => prl.getInfo());
const rocketlets = manager.get().map(prl => {
if (this.queryParams.languagesOnly) {
return {
id: prl.getID(),
languages: prl.getStorageItem().languageFiles
};
} else {
const info = prl.getInfo();
info.languages = prl.getStorageItem().languageFiles;
return info;
}
});
return { success: true, rocketlets };
},
@ -60,9 +72,16 @@ export class RocketletsRestApi {
this.api.addRoute(':id', { authRequired: true }, {
get() {
console.log('Getting:', this.urlParams.id);
const rocketlet = manager.getOneById(this.urlParams.id).getInfo();
const prl = manager.getOneById(this.urlParams.id);
return { success: true, rocketlet };
if (prl) {
const info = prl.getInfo();
info.languages = prl.getStorageItem().languageFiles;
return { success: true, rocketlet: info };
} else {
return RocketChat.API.v1.notFound(`No Rocketlet found by the id of: ${ this.urlParams.id }`);
}
},
post() {
console.log('Updating:', this.urlParams.id);

@ -8,6 +8,10 @@ export class RocketletSettingsConverter {
convertById(settingId) {
const setting = RocketChat.models.Settings.findOneById(settingId);
return this.convertToRocketlet(setting);
}
convertToRocketlet(setting) {
return {
id: setting._id,
type: this._convertTypeToRocketlet(setting.type),

Loading…
Cancel
Save