From 5907c1d024ff0aa2e96256db730b041f6b4eab16 Mon Sep 17 00:00:00 2001 From: Bryan Ashby Date: Sun, 12 Jul 2015 22:56:33 -0600 Subject: [PATCH] * Very early work on FidoNet, Messages, etc. --- core/database.js | 38 ++++++++++------ core/message.js | 111 +++++++++++++++++++++++++++++++++++++++-------- mods/fse.js | 24 +++++++++- mods/menu.json | 12 +++-- 4 files changed, 150 insertions(+), 35 deletions(-) diff --git a/core/database.js b/core/database.js index 377cfaf9..7f8c4f71 100644 --- a/core/database.js +++ b/core/database.js @@ -23,11 +23,12 @@ function initializeDatabases() { dbs.user.serialize(function serialized() { createUserTables(); - createInitialValues(); + createInitialUserValues(); }); dbs.message.serialize(function serialized() { createMessageBaseTables(); + createInitialMessageValues(); }); } @@ -88,17 +89,18 @@ function createMessageBaseTables() { ); dbs.message.run( - 'CREATE TABLE IF NOT EXISTS message (' + - ' message_id INTEGER PRIMARY KEY,' + - ' area_id INTEGER NOT NULL,' + - ' message_uuid VARCHAR(36) NOT NULL,' + - ' reply_to_message_id INTEGER,' + - ' to_user_name VARCHAR NOT NULL,' + - ' from_user_name VARCHAR NOT NULL,' + - ' subject,' + // FTS @ message_fts - ' message,' + // FTS @ message_fts - ' modified_timestamp DATETIME NOT NULL,' + - ' UNIQUE(message_uuid),' + + 'CREATE TABLE IF NOT EXISTS message (' + + ' message_id INTEGER PRIMARY KEY,' + + ' area_id INTEGER NOT NULL,' + + ' message_uuid VARCHAR(36) NOT NULL,' + + ' reply_to_message_id INTEGER,' + + ' to_user_name VARCHAR NOT NULL,' + + ' from_user_name VARCHAR NOT NULL,' + + ' subject,' + // FTS @ message_fts + ' message,' + // FTS @ message_fts + ' modified_timestamp DATETIME NOT NULL,' + + ' view_count INTEGER NOT NULL DEFAULT 0,' + + ' UNIQUE(message_uuid),' + ' FOREIGN KEY(area_id) REFERENCES message_area(area_id)' + ');' ); @@ -153,7 +155,17 @@ function createMessageBaseTables() { ); } -function createInitialValues() { +function createInitialMessageValues() { + // + // Area ID 1: Private / Local + // + dbs.message.run( + 'INSERT OR IGNORE INTO message_area ' + + 'VALUES(1, "Local Private Messages");' + ); +} + +function createInitialUserValues() { dbs.user.run( 'INSERT OR IGNORE INTO user_group ' + 'VALUES(1, "users");' diff --git a/core/message.js b/core/message.js index b5c1c24b..fe7e6b95 100644 --- a/core/message.js +++ b/core/message.js @@ -6,23 +6,26 @@ var msgDb = require('./database.js').dbs.message; var uuid = require('node-uuid'); var async = require('async'); var _ = require('lodash'); +var assert = require('assert'); + +exports.Message = Message; function Message(options) { + this.messageId = options.messageId || 0; // always generated @ persist + this.areaId = options.areaId || Message.WellKnownAreaIds.Invalid; // 0 = invalid; 1 = private; Everything else is user defined + this.uuid = uuid.v1(); + this.replyToMsgId = options.replyToMsgId || 0; + this.toUserName = options.toUserName || ''; + this.fromUserName = options.fromUserName || ''; + this.subject = options.subject || ''; + this.message = options.message || ''; + this.modTimestamp = options.modTimestamp || ''; // blank = set @ persist + this.viewCount = options.viewCount || 0; + this.meta = options.meta || {}; + this.hashTags = options.hashTags || []; - var self = this; - - this.fromExisting = function(opts) { - self.messageId = opts.messageId; - self.areaId = opts.areaId; - self.uuid = opts.uuid; - self.replyToMsgId = opts.replyToMsgId; - self.toUserName = opts.toUserName; - self.fromUserName = opts.fromUserName; - self.subject = opts.subject; - self.message = opts.message; - self.modTimestamp = opts.modTimestamp; - }; + var self = this; this.isValid = function() { // :TODO: validate as much as possible @@ -32,8 +35,72 @@ function Message(options) { this.createMessageTimestamp = function() { return new Date().toISOString(); }; + + /* + Object.defineProperty(this, 'messageId', { + get : function() { + return messageId; + } + }); + + Object.defineProperty(this, 'areaId', { + get : function() { return areaId; }, + set : function(i) { + areaId = i; + } + }); + + */ } +Message.WellKnownAreaIds = { + Invalid : 0, + Private : 1, +}; + +Message.MetaNames = { + // + // FidoNet: http://ftsc.org/docs/fts-0001.016 + // + FidoNetCost : 'fidonet_cost', + FidoNetOrigNode : 'fidonet_orig_node', + FidoNetDestNode : 'fidonet_dest_node', + FidoNetOrigNetwork : 'fidonet_orig_network', + FidoNetDestNetwork : 'fidonet_dest_network', + FidoNetOrigZone : 'fidonet_orig_zone', + FidoNetDestZone : 'fidonet_dest_zone', + FidoNetOrigPoint : 'fidonet_orig_point', + FidoNetDestPoint : 'fidonet_dest_point', + FidoNetAttribute : 'fidonet_attribute', + + FidoNetProgramID : 'fidonet_program_id', // "PID" http://ftsc.org/docs/fsc-0046.005 + + FidoNetMsgID : 'fidonet_msg_id', // "MSGID" http://ftsc.org/docs/fsc-0070.002 + + FidoNetMessageID : 'fidonet_message_id', // "MESSAGE-ID" http://ftsc.org/docs/fsc-0030.001 + FidoNetInReplyTo : 'fidonet_in_reply_to', // "IN-REPLY-TO" http://ftsc.org/docs/fsc-0030.001 + + FidoNetTearLineBanner : 'fidonet_tear_line_banner', // FTN style tear line http://ftsc.org/docs/fts-0004.001 + FidoNetOrigin : 'fidonet_origin', // FTN style "* Origin..." http://ftsc.org/docs/fts-0004.001 + FidoNetSeenBy : 'fidonet_seen_by', // FTN style "SEEN-BY" http://ftsc.org/docs/fts-0004.001 + FidoNetPath : 'fidonet_path', // FTN style "PATH" http://ftsc.org/docs/fts-0004.001 + + LocalToUserID : 'local_to_user_id', + LocalFromUserID : 'local_from_user_id', + + // :TODO: Search further: + // https://www.npmjs.com/package/fidonet-jam + +}; + +Message.prototype.setLocalToUserId = function(userId) { + this.meta.LocalToUserID = userId; +}; + +Message.prototype.setLocalFromUserId = function(userId) { + this.meta.LocalFromUserID = userId; +}; + Message.prototype.persist = function(cb) { if(!this.isValid()) { @@ -51,9 +118,11 @@ Message.prototype.persist = function(cb) { }); }, function storeMessage(callback) { + var modTs = self.modTimestamp || self.createMessageTimestamp(); + msgDb.run( 'INSERT INTO message (area_id, message_uuid, reply_to_message_id, to_user_name, from_user_name, subject, message, modified_timestamp) ' + - 'VALUES (?, ?, ?, ?, ?, ?, ?, ?);', [ self.areaId, self.uuid, self.replyToMsgId, self.toUserName, self.fromUserName, self.subject, self.message, self.createMessageTimestamp() ], + 'VALUES (?, ?, ?, ?, ?, ?, ?, ?);', [ self.areaId, self.uuid, self.replyToMsgId, self.toUserName, self.fromUserName, self.subject, self.message, modTs ], function msgInsert(err) { if(!err) { self.messageId = this.lastID; @@ -73,7 +142,7 @@ Message.prototype.persist = function(cb) { 'VALUES (?, ?, ?);'); async.each(Object.keys(self.meta), function meta(metaName, next) { - metaStmt.run(self.messageId, metaName, self.meta[metaName], function insRan(err) { + metaStmt.run(self.messageId, metaName, self.meta[metaName], function inserted(err) { next(err); }); }, function complete(err) { @@ -86,8 +155,16 @@ Message.prototype.persist = function(cb) { } }); } + }, + function storeHashTags(callback) { + // :TODO: hash tag support + callback(null); } - ] + ], + function complete(err) { + msgDb.run(err ? 'ROLLBACK;' : 'COMMIT;', function transEnd(err) { + cb(err, self.messageId); + }); + } ); - }; \ No newline at end of file diff --git a/mods/fse.js b/mods/fse.js index 772c01c7..6b0b3123 100644 --- a/mods/fse.js +++ b/mods/fse.js @@ -6,6 +6,7 @@ var ViewController = require('../core/view_controller.js').ViewController; var ansi = require('../core/ansi_term.js'); var theme = require('../core/theme.js'); var MultiLineEditTextView = require('../core/multi_line_edit_text_view.js').MultiLineEditTextView; +var Message = require('../core/message.js').Message; var async = require('async'); var assert = require('assert'); @@ -47,6 +48,27 @@ function FullScreenEditorModule(options) { }[name]; }; + this.getMessage = function() { + var headerForm = self.viewControllers.header.getFormData(); + console.log(headerForm) + + var messageOpts = { + areaId : Message.WellKnownAreaIds.Private, + toUserName : headerForm.to, + fromUserName : headerForm.from, + subject : headerForm.subject, + message : 'This is the message', + }; + + console.log(messageOpts); + + /*var msg = new Message(messageOpts); + msg.persist(function persisted(err, msgId) { + + }); +*/ + }; + this.redrawFooter = function(options, cb) { async.waterfall( [ @@ -366,7 +388,7 @@ function FullScreenEditorModule(options) { }); }, editModeMenuSave : function(formData, extraArgs) { - + self.getMessage(); }, editModeMenuQuote : function(formData, extraArgs) { diff --git a/mods/menu.json b/mods/menu.json index 02b67e25..7b918993 100644 --- a/mods/menu.json +++ b/mods/menu.json @@ -514,15 +514,18 @@ // :TODO: from/to may be set by args // :TODO: focus may change dep on view vs edit "width" : 36, - "focus" : true + "focus" : true, + "argName" : "to" }, "ET2" : { - "width" : 36 + "width" : 36, + "argName" : "from" }, "ET3" : { "width" : 65, "maxLength" : 72, - "submit" : [ "enter" ] + "submit" : [ "enter" ], + "argName" : "subject" } }, "submit" : { @@ -541,7 +544,8 @@ "MT1" : { "width" : 79, "height" : 17, - "text" : "" // :TODO: should not be req. + "text" : "", // :TODO: should not be req. + "argName" : "message" } }, "submit" : {