Skip to content

Commit

Permalink
Add support for generating and downloading flaskbotrc.
Browse files Browse the repository at this point in the history
Flaskbotrc is a file containing config of all active
outgoing webhook bots. It is used to provide configuration
of all active outgoing webhook bots to zulip-bot-server.
  • Loading branch information
vabs22 committed Jun 20, 2017
1 parent 6c72284 commit ae9ef5f
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 0 deletions.
28 changes: 28 additions & 0 deletions frontend_tests/casper_tests/06-settings.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
var common = require('../casper_lib/common.js').common;
var test_credentials = require('../../var/casper/test_credentials.js').test_credentials;
var REALMS_HAVE_SUBDOMAINS = casper.cli.get('subdomains');
var OUTGOING_WEBHOOK_BOT_TYPE = '3';

common.start_and_log_in();

var form_sel = 'form[action^="/json/settings/change"]';
var regex_zuliprc = /^data:application\/octet-stream;charset=utf-8,\[api\]\nemail=.+\nkey=.+\nsite=.+\n$/;
var regex_flaskbotrc = /^data:application\/octet-stream;charset=utf-8,\[.\]\nemail=.+\nkey=.+\nsite=.+\n$/;

casper.then(function () {
var menu_selector = '#settings-dropdown';
Expand Down Expand Up @@ -134,6 +136,32 @@ casper.then(function () {
});
});

casper.then(function create_bot() {
casper.test.info('Filling out the create bot form for outgoing webhook bot');

casper.fill('#create_bot_form',{
bot_name: 'Bot 2',
bot_short_name: '2',
bot_type: OUTGOING_WEBHOOK_BOT_TYPE,
});

casper.test.info('Submitting the create bot form');
casper.click('#create_bot_button');
});

casper.then(function () {
casper.waitUntilVisible('#download_flaskbotrc', function () {
casper.click("#download_flaskbotrc");

casper.waitUntilVisible('#download_flaskbotrc[href^="data:application"]', function () {
casper.test.assertMatch(
decodeURIComponent(casper.getElementsAttribute('#download_flaskbotrc', 'href')),
regex_flaskbotrc,
'Looks like a flaskbotrc file');
});
});
});

casper.then(function () {
casper.waitUntilVisible('.open_edit_bot_form[data-email="' + bot_email + '"]', function open_edit_bot_form() {
casper.test.info('Opening edit bot form');
Expand Down
13 changes: 13 additions & 0 deletions frontend_tests/node_tests/settings_bots.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,16 @@ var settings_bots = require("js/settings_bots.js");

assert.equal(content, expected);
}());

(function test_generate_flaskbotrc_content() {
var user = {
email: "vabstest-bot@zulip.com",
api_key: "nSlA0mUm7G42LP85lMv7syqFTzDE2q34",
};
var content = settings_bots.generate_flaskbotrc_content(user.email, user.api_key);
var expected = "[vabstest]\nemail=vabstest-bot@zulip.com\n" +
"key=nSlA0mUm7G42LP85lMv7syqFTzDE2q34\n" +
"site=https://chat.example.com\n";

assert.equal(content, expected);
}());
1 change: 1 addition & 0 deletions static/js/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ function _setup_page() {
full_name: people.my_full_name(),
page_params: page_params,
zuliprc: 'zuliprc',
flaskbotrc: 'flaskbotrc',
timezones: moment.tz.names(),
});

Expand Down
28 changes: 28 additions & 0 deletions static/js/settings_bots.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,18 @@ exports.generate_zuliprc_content = function (email, api_key) {
"\n";
};

function bot_name_from_email(email) {
return email.substring(0, email.indexOf("-bot@"));
}

exports.generate_flaskbotrc_content = function (email, api_key) {
return "[" + bot_name_from_email(email) + "]" +
"\nemail=" + email +
"\nkey=" + api_key +
"\nsite=" + page_params.realm_uri +
"\n";
};

exports.set_up = function () {
$("#api_key_value").text("");
$("#get_api_key_box").hide();
Expand All @@ -88,6 +100,22 @@ exports.set_up = function () {
$("#api_key_button_box").hide();
});

$('#download_flaskbotrc').click(function () {
var OUTGOING_WEBHOOK_BOT_TYPE = 3;
var content = "";
$("#active_bots_list .bot-information-box").each(function () {
var bot_info = $(this);
var email = bot_info.find(".email .value").text();
var api_key = bot_info.find(".api_key .api-key-value-and-button .value").text();
var bot = bot_data.get(email);

if (bot.bot_type === OUTGOING_WEBHOOK_BOT_TYPE) {
content += exports.generate_flaskbotrc_content(email, api_key);
}
});
$(this).attr("href", "data:application/octet-stream;charset=utf-8," + encodeURIComponent(content));
});

$("#get_api_key_box").hide();
$("#show_api_key_box").hide();
$("#get_api_key_box form").ajaxForm({
Expand Down
7 changes: 7 additions & 0 deletions static/templates/settings/bot-settings.handlebars
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,13 @@
{{/tr}}
</p>

<div>
<span>{{ t 'Download config of all active Outgoing webhook bots in Zulip Botserver format.' }}</span>
<a type="submit" download="{{flaskbotrc}}" id= "download_flaskbotrc" class="btn" title="{{t 'Download flaskbotrc' }}">
<i class="icon-vector-download-alt sea-green"></i>
</a>
</div>

<ul class="nav nav-tabs nav-justified" id="bots_lists_navbar">
<li class="active active-bots-tab"><a>{{t "Active bots" }}</a></li>
<li class="inactive-bots-tab"><a>{{t "Inactive bots" }}</a></li>
Expand Down

0 comments on commit ae9ef5f

Please sign in to comment.