/* What in the heck is a zcommand? A zcommand is basically a specific type of slash command where the client does almost no work and the server just does something pretty simple like flip a setting. The first zcommand we wrote is for "/ping", and the server just responds with a 200 for that. Not all slash commands use zcommand under the hood. For more exotic things like /poll see submessage.js and widgetize.js */ exports.send = function (opts) { const command = opts.command; const on_success = opts.on_success; const data = { command, }; channel.post({ url: "/json/zcommand", data, success(data) { if (on_success) { on_success(data); } }, error() { exports.tell_user("server did not respond"); }, }); }; exports.tell_user = function (msg) { // This is a bit hacky, but we don't have a super easy API now // for just telling users stuff. $("#compose-send-status") .removeClass(common.status_classes) .addClass("alert-error") .stop(true) .fadeTo(0, 1); $("#compose-error-msg").text(msg); }; exports.enter_day_mode = function () { exports.send({ command: "/day", on_success(data) { night_mode.disable(); feedback_widget.show({ populate(container) { const rendered_msg = marked(data.msg).trim(); container.html(rendered_msg); }, on_undo() { exports.send({ command: "/night", }); }, title_text: i18n.t("Day mode"), undo_button_text: i18n.t("Night"), }); }, }); }; exports.enter_night_mode = function () { exports.send({ command: "/night", on_success(data) { night_mode.enable(); feedback_widget.show({ populate(container) { const rendered_msg = marked(data.msg).trim(); container.html(rendered_msg); }, on_undo() { exports.send({ command: "/day", }); }, title_text: i18n.t("Night mode"), undo_button_text: i18n.t("Day"), }); }, }); }; exports.enter_fluid_mode = function () { exports.send({ command: "/fluid-width", on_success(data) { scroll_bar.set_layout_width(); feedback_widget.show({ populate(container) { const rendered_msg = marked(data.msg).trim(); container.html(rendered_msg); }, on_undo() { exports.send({ command: "/fixed-width", }); }, title_text: i18n.t("Fluid width mode"), undo_button_text: i18n.t("Fixed width"), }); }, }); }; exports.enter_fixed_mode = function () { exports.send({ command: "/fixed-width", on_success(data) { scroll_bar.set_layout_width(); feedback_widget.show({ populate(container) { const rendered_msg = marked(data.msg).trim(); container.html(rendered_msg); }, on_undo() { exports.send({ command: "/fluid-width", }); }, title_text: i18n.t("Fixed width mode"), undo_button_text: i18n.t("Fluid width"), }); }, }); }; exports.process = function (message_content) { const content = message_content.trim(); if (content === "/ping") { const start_time = new Date(); exports.send({ command: content, on_success() { const end_time = new Date(); let diff = end_time - start_time; diff = Math.round(diff); const msg = "ping time: " + diff + "ms"; exports.tell_user(msg); }, }); return true; } const day_commands = ["/day", "/light"]; if (day_commands.includes(content)) { exports.enter_day_mode(); return true; } const night_commands = ["/night", "/dark"]; if (night_commands.includes(content)) { exports.enter_night_mode(); return true; } if (content === "/fluid-width") { exports.enter_fluid_mode(); return true; } if (content === "/fixed-width") { exports.enter_fixed_mode(); return true; } if (content === "/settings") { hashchange.go_to_location("settings/your-account"); return true; } // It is incredibly important here to return false // if we don't see an actual zcommand, so that compose.js // knows this is a normal message. return false; }; window.zcommand = exports;