From 75601a80ec4256bfde6e9ea7eb67f345454d9af8 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Mon, 23 Nov 2020 19:41:08 -0700 Subject: [PATCH 1/6] WIP --- core/fse.js | 90 ++++++++++++++++++++++++++++++++++++++- core/msg_area_view_fse.js | 3 +- 2 files changed, 90 insertions(+), 3 deletions(-) diff --git a/core/fse.js b/core/fse.js index 690b9cf8..15388e1f 100644 --- a/core/fse.js +++ b/core/fse.js @@ -26,12 +26,19 @@ const { getAddressedToInfo } = require('./mail_util.js'); const Events = require('./events.js'); const UserProps = require('./user_property.js'); const SysProps = require('./system_property.js'); +const FileArea = require('./file_base_area.js'); +const FileEntry = require('./file_entry.js'); +const DownloadQueue = require('./download_queue.js'); // deps const async = require('async'); const assert = require('assert'); const _ = require('lodash'); const moment = require('moment'); +const fse = require('fs-extra'); +const fs = require('graceful-fs'); +const paths = require('path'); +const sanatizeFilename = require('sanitize-filename'); exports.moduleInfo = { name : 'Full Screen Editor (FSE)', @@ -255,7 +262,12 @@ exports.FullScreenEditorModule = exports.getModule = class FullScreenEditorModul viewModeMenuHelp : function(formData, extraArgs, cb) { self.viewControllers.footerView.setFocus(false); return self.displayHelp(cb); - } + }, + + addToDownloadQueue : (formData, extraArgs, cb) => { + this.viewControllers.footerView.setFocus(false); + return this.addToDownloadQueue(cb); + }, }; } @@ -905,6 +917,82 @@ exports.FullScreenEditorModule = exports.getModule = class FullScreenEditorModul ); } + addToDownloadQueue(cb) { + this.client.term.rawWrite(ansi.resetScreen()); + + const sysTempDownloadArea = FileArea.getFileAreaByTag(FileArea.WellKnownAreaTags.TempDownloads); + const sysTempDownloadDir = FileArea.getAreaDefaultStorageDirectory(sysTempDownloadArea); + + const msgInfo = this.getHeaderFormatObj(); + + const outputFileName = paths.join( + sysTempDownloadDir, + sanatizeFilename( + `(${msgInfo.messageId}) ${msgInfo.subject}_(${this.message.modTimestamp.format('YYYY-MM-DD')}).txt`) + ); + + async.waterfall( + [ + (callback) => { + const messageBody = this.viewControllers.body + .getView(MciViewIds.body.message) + .getData( { forceLineTerms : true } ); + + fse.mkdirs(sysTempDownloadDir, err => { + return callback(err, messageBody); + }); + }, + (messageBody, callback) => { + return fs.writeFile(outputFileName, messageBody, 'utf8', callback); + }, + (callback) => { + fs.stat(outputFileName, (err, stats) => { + return callback(err, stats.size); + }); + }, + (fileSize, callback) => { + const newEntry = new FileEntry({ + areaTag : sysTempDownloadArea.areaTag, + fileName : paths.basename(outputFileName), + storageTag : sysTempDownloadArea.storageTags[0], + meta : { + upload_by_username : this.client.user.username, + upload_by_user_id : this.client.user.userId, + byte_size : fileSize, + session_temp_dl : 1, // download is valid until session is over + } + }); + + newEntry.desc = `${msgInfo.messageId} - ${msgInfo.subject}`; + + newEntry.persist(err => { + if(!err) { + // queue it! + DownloadQueue.get(this.client).addTemporaryDownload(newEntry); + } + return callback(err); + }); + }, + (callback) => { + theme.displayThemeArt( + { name : this.menuConfig.config.art.dlQueueAdd || 'msg_add_dl_queue', client : this.client }, + () => { + this.client.waitForKeyPress( () => { + this.redrawScreen( () => { + this.viewControllers[this.getFooterName()].setFocus(true); + return callback(null); + }); + }); + } + ); + } + ], + err => { + return cb(err); + } + ); + } + displayQuoteBuilder() { // // Clear body area diff --git a/core/msg_area_view_fse.js b/core/msg_area_view_fse.js index 1ca5617c..ed057438 100644 --- a/core/msg_area_view_fse.js +++ b/core/msg_area_view_fse.js @@ -102,11 +102,10 @@ exports.getModule = class AreaViewFSEModule extends FullScreenEditorModule { self.client.log(extraArgs, 'Missing extraArgs.menu'); return cb(null); - } + }, }); } - loadMessageByUuid(uuid, cb) { const msg = new Message(); msg.load( { uuid : uuid, user : this.client.user }, () => { From 1e2b6ae934f93d34312d1d2d374b2ea274e63e37 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Tue, 24 Nov 2020 13:05:17 -0700 Subject: [PATCH 2/6] Working --- core/fse.js | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/core/fse.js b/core/fse.js index 15388e1f..1a08f133 100644 --- a/core/fse.js +++ b/core/fse.js @@ -21,6 +21,7 @@ const { isAnsi, stripAnsiControlCodes, insert } = require('./string_util.js'); +const { stripMciColorCodes } = require('./color_codes.js'); const Config = require('./config.js').get; const { getAddressedToInfo } = require('./mail_util.js'); const Events = require('./events.js'); @@ -918,8 +919,6 @@ exports.FullScreenEditorModule = exports.getModule = class FullScreenEditorModul } addToDownloadQueue(cb) { - this.client.term.rawWrite(ansi.resetScreen()); - const sysTempDownloadArea = FileArea.getFileAreaByTag(FileArea.WellKnownAreaTags.TempDownloads); const sysTempDownloadDir = FileArea.getAreaDefaultStorageDirectory(sysTempDownloadArea); @@ -934,16 +933,31 @@ exports.FullScreenEditorModule = exports.getModule = class FullScreenEditorModul async.waterfall( [ (callback) => { - const messageBody = this.viewControllers.body + const header = + `+${'-'.repeat(79)} +| To : ${msgInfo.toUserName} +| From : ${msgInfo.fromUserName} +| When : ${moment(this.message.modTimestamp).format('dddd, MMMM Do YYYY, h:mm:ss a (UTCZ)')} +| Subject : ${msgInfo.subject} +| ID : ${this.message.messageUuid} (${msgInfo.messageId}) ++${'-'.repeat(79)} +`; + const body = this.viewControllers.body .getView(MciViewIds.body.message) .getData( { forceLineTerms : true } ); + const cleanBody = stripMciColorCodes( + stripAnsiControlCodes(body, { all : true } ) + ); + + const exportedMessage = `${header}\r\n${cleanBody}`; + fse.mkdirs(sysTempDownloadDir, err => { - return callback(err, messageBody); + return callback(err, exportedMessage); }); }, - (messageBody, callback) => { - return fs.writeFile(outputFileName, messageBody, 'utf8', callback); + (exportedMessage, callback) => { + return fs.writeFile(outputFileName, exportedMessage, 'utf8', callback); }, (callback) => { fs.stat(outputFileName, (err, stats) => { @@ -974,8 +988,11 @@ exports.FullScreenEditorModule = exports.getModule = class FullScreenEditorModul }); }, (callback) => { - theme.displayThemeArt( - { name : this.menuConfig.config.art.dlQueueAdd || 'msg_add_dl_queue', client : this.client }, + const artSpec = this.menuConfig.config.art.dlQueueAdd || + Buffer.from('Exported message added to download queue'); + this.displayAsset( + artSpec, + { clearScreen : true }, () => { this.client.waitForKeyPress( () => { this.redrawScreen( () => { From c944e97699057b79c9dd881a03d82ff27e30cc40 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Tue, 24 Nov 2020 13:15:22 -0700 Subject: [PATCH 3/6] Add to menu --- .../luciano_blocktronics/mb_export_dl_queue.ans | Bin 0 -> 249 bytes core/fse.js | 4 ++-- misc/menu_templates/message_base.in.hjson | 13 +++++++++---- 3 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 art/themes/luciano_blocktronics/mb_export_dl_queue.ans diff --git a/art/themes/luciano_blocktronics/mb_export_dl_queue.ans b/art/themes/luciano_blocktronics/mb_export_dl_queue.ans new file mode 100644 index 0000000000000000000000000000000000000000..c02f2ec71099c7677417e96449bb7612319dd7d2 GIT binary patch literal 249 zcmb1+Hn27^ur@Z&<>Hc#HncW2$W;IW>1YrQ6|l0h0tr|fo8{)F78fU`rz&J57AqvB zrsgT6RutqHm87O9B<7_k6yzi(1DTn53YGb#ML^xT3Mu*Jc{%xsDGG(9simpX(IE4I y=5a{{JBB*D8W?~qqY^MOFfuSSG%~4XU|?Wm3}9de(m){W>Ex>r=I#jL!ASrFj56;4 literal 0 HcmV?d00001 diff --git a/core/fse.js b/core/fse.js index 1a08f133..ba278a01 100644 --- a/core/fse.js +++ b/core/fse.js @@ -988,8 +988,8 @@ exports.FullScreenEditorModule = exports.getModule = class FullScreenEditorModul }); }, (callback) => { - const artSpec = this.menuConfig.config.art.dlQueueAdd || - Buffer.from('Exported message added to download queue'); + const artSpec = this.menuConfig.config.art.expToDlQueue || + Buffer.from('Exported message has been added to your download queue!'); this.displayAsset( artSpec, { clearScreen : true }, diff --git a/misc/menu_templates/message_base.in.hjson b/misc/menu_templates/message_base.in.hjson index 51bf4a19..c302a57b 100644 --- a/misc/menu_templates/message_base.in.hjson +++ b/misc/menu_templates/message_base.in.hjson @@ -477,10 +477,11 @@ module: msg_area_view_fse config: { art: { - header: MSGVHDR - body: MSGBODY + header: MSGVHDR + body: MSGBODY footerView: MSGVFTR - help: MSGVHLP + help: MSGVHLP + expToDlQueue: mb_export_dl_queue }, editorMode: view editorType: area @@ -525,7 +526,7 @@ mci: { HM1: { // :TODO: (#)Jump/(L)Index (msg list)/Last - items: [ "prev", "next", "reply", "quit", "help" ] + items: [ "prev", "next", "reply", "quit", "download", "help" ] focusItemIndex: 1 } } @@ -552,6 +553,10 @@ } { value: { 1: 4 } + action: @method:addToDownloadQueue + } + { + value: { 1: 5 } action: @method:viewModeMenuHelp } ] From b36845f7a1b8f2ad1f61f30dce011546dc633dbd Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Tue, 24 Nov 2020 13:22:52 -0700 Subject: [PATCH 4/6] Hotkey + WHATSNEW entry --- WHATSNEW.md | 1 + misc/menu_templates/message_base.in.hjson | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/WHATSNEW.md b/WHATSNEW.md index 8d80ea2b..65e44df0 100644 --- a/WHATSNEW.md +++ b/WHATSNEW.md @@ -8,6 +8,7 @@ This document attempts to track **major** changes and additions in ENiGMA½. For * An explicit prompt file previously specified by `general.promptFile` in `config.hjson` is no longer necessary. Instead, this now simply part of the `prompts` section in `menu.hjson`. The default setup still creates a separate prompt HJSON file, but it is `includes`ed in `menu.hjson`. With the removal of prompts the `PromptsChanged` event will no longer be fired. * New `PV` ACS check for arbitrary user properties. See [ACS](./docs/configuration/acs.md) for details. * The `message` arg used by `msg_list` has been deprecated. Please starting using `messageIndex` for this purpose. Support for `message` will be removed in the future. +* Added ability to export/download messages. This is enabled in the default menu. See `messageAreaViewPost` in [the default message base template](./misc/menu_templates/message_base.in.hjson) and look for the download options for details on adding to your system! ## 0.0.11-beta * Upgraded from `alpha` to `beta` -- The software is far along and mature enough at this point! diff --git a/misc/menu_templates/message_base.in.hjson b/misc/menu_templates/message_base.in.hjson index c302a57b..04ad4c04 100644 --- a/misc/menu_templates/message_base.in.hjson +++ b/misc/menu_templates/message_base.in.hjson @@ -581,6 +581,10 @@ keys: [ "escape", "q", "shift + q" ] action: @systemMethod:prevMenu } + { + keys: [ "d", "shift + d" ] + action: @method:addToDownloadQueue + } { keys: [ "?" ] action: @method:viewModeMenuHelp From 6fb8836d6ec0840af89b9b7133d121b291d10aa2 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Tue, 24 Nov 2020 13:25:33 -0700 Subject: [PATCH 5/6] A bit more info --- WHATSNEW.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WHATSNEW.md b/WHATSNEW.md index 65e44df0..ec186f08 100644 --- a/WHATSNEW.md +++ b/WHATSNEW.md @@ -8,7 +8,7 @@ This document attempts to track **major** changes and additions in ENiGMA½. For * An explicit prompt file previously specified by `general.promptFile` in `config.hjson` is no longer necessary. Instead, this now simply part of the `prompts` section in `menu.hjson`. The default setup still creates a separate prompt HJSON file, but it is `includes`ed in `menu.hjson`. With the removal of prompts the `PromptsChanged` event will no longer be fired. * New `PV` ACS check for arbitrary user properties. See [ACS](./docs/configuration/acs.md) for details. * The `message` arg used by `msg_list` has been deprecated. Please starting using `messageIndex` for this purpose. Support for `message` will be removed in the future. -* Added ability to export/download messages. This is enabled in the default menu. See `messageAreaViewPost` in [the default message base template](./misc/menu_templates/message_base.in.hjson) and look for the download options for details on adding to your system! +* Added ability to export/download messages. This is enabled in the default menu. See `messageAreaViewPost` in [the default message base template](./misc/menu_templates/message_base.in.hjson) and look for the download options (`@method:addToDownloadQueue`, etc.) for details on adding to your system! ## 0.0.11-beta * Upgraded from `alpha` to `beta` -- The software is far along and mature enough at this point! From cc95ef80ddee03879f0ffe8f26cb0a0ebf451755 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Tue, 24 Nov 2020 13:28:37 -0700 Subject: [PATCH 6/6] tabs -> spaces --- misc/menu_templates/message_base.in.hjson | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/misc/menu_templates/message_base.in.hjson b/misc/menu_templates/message_base.in.hjson index 04ad4c04..367e1903 100644 --- a/misc/menu_templates/message_base.in.hjson +++ b/misc/menu_templates/message_base.in.hjson @@ -582,9 +582,9 @@ action: @systemMethod:prevMenu } { - keys: [ "d", "shift + d" ] - action: @method:addToDownloadQueue - } + keys: [ "d", "shift + d" ] + action: @method:addToDownloadQueue + } { keys: [ "?" ] action: @method:viewModeMenuHelp