mirror of
https://github.com/NuSkooler/enigma-bbs.git
synced 2025-06-11 07:04:32 +02:00
Pardon the noise. More tab to space conversion!
This commit is contained in:
parent
c3635bb26b
commit
1d8be6b014
128 changed files with 8017 additions and 8017 deletions
|
@ -1,45 +1,45 @@
|
|||
/* jslint node: true */
|
||||
'use strict';
|
||||
|
||||
// ENiGMA½
|
||||
const msgDb = require('./database.js').dbs.message;
|
||||
const Config = require('./config.js').get;
|
||||
const Message = require('./message.js');
|
||||
const Log = require('./logger.js').log;
|
||||
const msgNetRecord = require('./msg_network.js').recordMessage;
|
||||
const sortAreasOrConfs = require('./conf_area_util.js').sortAreasOrConfs;
|
||||
// ENiGMA½
|
||||
const msgDb = require('./database.js').dbs.message;
|
||||
const Config = require('./config.js').get;
|
||||
const Message = require('./message.js');
|
||||
const Log = require('./logger.js').log;
|
||||
const msgNetRecord = require('./msg_network.js').recordMessage;
|
||||
const sortAreasOrConfs = require('./conf_area_util.js').sortAreasOrConfs;
|
||||
|
||||
// deps
|
||||
const async = require('async');
|
||||
const _ = require('lodash');
|
||||
const assert = require('assert');
|
||||
// deps
|
||||
const async = require('async');
|
||||
const _ = require('lodash');
|
||||
const assert = require('assert');
|
||||
|
||||
exports.getAvailableMessageConferences = getAvailableMessageConferences;
|
||||
exports.getSortedAvailMessageConferences = getSortedAvailMessageConferences;
|
||||
exports.getSortedAvailMessageConferences = getSortedAvailMessageConferences;
|
||||
exports.getAvailableMessageAreasByConfTag = getAvailableMessageAreasByConfTag;
|
||||
exports.getSortedAvailMessageAreasByConfTag = getSortedAvailMessageAreasByConfTag;
|
||||
exports.getDefaultMessageConferenceTag = getDefaultMessageConferenceTag;
|
||||
exports.getDefaultMessageAreaTagByConfTag = getDefaultMessageAreaTagByConfTag;
|
||||
exports.getMessageConferenceByTag = getMessageConferenceByTag;
|
||||
exports.getMessageAreaByTag = getMessageAreaByTag;
|
||||
exports.changeMessageConference = changeMessageConference;
|
||||
exports.changeMessageArea = changeMessageArea;
|
||||
exports.tempChangeMessageConfAndArea = tempChangeMessageConfAndArea;
|
||||
exports.getMessageListForArea = getMessageListForArea;
|
||||
exports.getNewMessageCountInAreaForUser = getNewMessageCountInAreaForUser;
|
||||
exports.getNewMessagesInAreaForUser = getNewMessagesInAreaForUser;
|
||||
exports.getMessageIdNewerThanTimestampByArea = getMessageIdNewerThanTimestampByArea;
|
||||
exports.getMessageAreaLastReadId = getMessageAreaLastReadId;
|
||||
exports.updateMessageAreaLastReadId = updateMessageAreaLastReadId;
|
||||
exports.persistMessage = persistMessage;
|
||||
exports.trimMessageAreasScheduledEvent = trimMessageAreasScheduledEvent;
|
||||
exports.getMessageConferenceByTag = getMessageConferenceByTag;
|
||||
exports.getMessageAreaByTag = getMessageAreaByTag;
|
||||
exports.changeMessageConference = changeMessageConference;
|
||||
exports.changeMessageArea = changeMessageArea;
|
||||
exports.tempChangeMessageConfAndArea = tempChangeMessageConfAndArea;
|
||||
exports.getMessageListForArea = getMessageListForArea;
|
||||
exports.getNewMessageCountInAreaForUser = getNewMessageCountInAreaForUser;
|
||||
exports.getNewMessagesInAreaForUser = getNewMessagesInAreaForUser;
|
||||
exports.getMessageIdNewerThanTimestampByArea = getMessageIdNewerThanTimestampByArea;
|
||||
exports.getMessageAreaLastReadId = getMessageAreaLastReadId;
|
||||
exports.updateMessageAreaLastReadId = updateMessageAreaLastReadId;
|
||||
exports.persistMessage = persistMessage;
|
||||
exports.trimMessageAreasScheduledEvent = trimMessageAreasScheduledEvent;
|
||||
|
||||
function getAvailableMessageConferences(client, options) {
|
||||
options = options || { includeSystemInternal : false };
|
||||
|
||||
assert(client || true === options.noClient);
|
||||
|
||||
// perform ACS check per conf & omit system_internal if desired
|
||||
// perform ACS check per conf & omit system_internal if desired
|
||||
return _.omitBy(Config().messageConferences, (conf, confTag) => {
|
||||
if(!options.includeSystemInternal && 'system_internal' === confTag) {
|
||||
return true;
|
||||
|
@ -53,7 +53,7 @@ function getSortedAvailMessageConferences(client, options) {
|
|||
const confs = _.map(getAvailableMessageConferences(client, options), (v, k) => {
|
||||
return {
|
||||
confTag : k,
|
||||
conf : v,
|
||||
conf : v,
|
||||
};
|
||||
});
|
||||
|
||||
|
@ -73,10 +73,10 @@ function getAvailableMessageAreasByConfTag(confTag, options) {
|
|||
const areas = config.messageConferences[confTag].areas;
|
||||
|
||||
if(!options.client || true === options.noAcsCheck) {
|
||||
// everything - no ACS checks
|
||||
// everything - no ACS checks
|
||||
return areas;
|
||||
} else {
|
||||
// perform ACS check per area
|
||||
// perform ACS check per area
|
||||
return _.omitBy(areas, area => {
|
||||
return !options.client.acs.hasMessageAreaRead(area);
|
||||
});
|
||||
|
@ -87,8 +87,8 @@ function getAvailableMessageAreasByConfTag(confTag, options) {
|
|||
function getSortedAvailMessageAreasByConfTag(confTag, options) {
|
||||
const areas = _.map(getAvailableMessageAreasByConfTag(confTag, options), (v, k) => {
|
||||
return {
|
||||
areaTag : k,
|
||||
area : v,
|
||||
areaTag : k,
|
||||
area : v,
|
||||
};
|
||||
});
|
||||
|
||||
|
@ -99,16 +99,16 @@ function getSortedAvailMessageAreasByConfTag(confTag, options) {
|
|||
|
||||
function getDefaultMessageConferenceTag(client, disableAcsCheck) {
|
||||
//
|
||||
// Find the first conference marked 'default'. If found,
|
||||
// inspect |client| against *read* ACS using defaults if not
|
||||
// specified.
|
||||
// Find the first conference marked 'default'. If found,
|
||||
// inspect |client| against *read* ACS using defaults if not
|
||||
// specified.
|
||||
//
|
||||
// If the above fails, just go down the list until we get one
|
||||
// that passes.
|
||||
// If the above fails, just go down the list until we get one
|
||||
// that passes.
|
||||
//
|
||||
// It's possible that we end up with nothing here!
|
||||
// It's possible that we end up with nothing here!
|
||||
//
|
||||
// Note that built in 'system_internal' is always ommited here
|
||||
// Note that built in 'system_internal' is always ommited here
|
||||
//
|
||||
const config = Config();
|
||||
let defaultConf = _.findKey(config.messageConferences, o => o.default);
|
||||
|
@ -170,7 +170,7 @@ function getMessageConfTagByAreaTag(areaTag) {
|
|||
function getMessageAreaByTag(areaTag, optionalConfTag) {
|
||||
const confs = Config().messageConferences;
|
||||
|
||||
// :TODO: this could be cached
|
||||
// :TODO: this could be cached
|
||||
if(_.isString(optionalConfTag)) {
|
||||
if(_.has(confs, [ optionalConfTag, 'areas', areaTag ])) {
|
||||
return confs[optionalConfTag].areas[areaTag];
|
||||
|
@ -204,8 +204,8 @@ function changeMessageConference(client, confTag, cb) {
|
|||
}
|
||||
},
|
||||
function getDefaultAreaInConf(conf, callback) {
|
||||
const areaTag = getDefaultMessageAreaTagByConfTag(client, confTag);
|
||||
const area = getMessageAreaByTag(areaTag, confTag);
|
||||
const areaTag = getDefaultMessageAreaTagByConfTag(client, confTag);
|
||||
const area = getMessageAreaByTag(areaTag, confTag);
|
||||
|
||||
if(area) {
|
||||
callback(null, conf, { areaTag : areaTag, area : area } );
|
||||
|
@ -222,8 +222,8 @@ function changeMessageConference(client, confTag, cb) {
|
|||
},
|
||||
function changeConferenceAndArea(conf, areaInfo, callback) {
|
||||
const newProps = {
|
||||
message_conf_tag : confTag,
|
||||
message_area_tag : areaInfo.areaTag,
|
||||
message_conf_tag : confTag,
|
||||
message_area_tag : areaInfo.areaTag,
|
||||
};
|
||||
client.user.persistProperties(newProps, err => {
|
||||
callback(err, conf, areaInfo);
|
||||
|
@ -242,7 +242,7 @@ function changeMessageConference(client, confTag, cb) {
|
|||
}
|
||||
|
||||
function changeMessageAreaWithOptions(client, areaTag, options, cb) {
|
||||
options = options || {}; // :TODO: this is currently pointless... cb is required...
|
||||
options = options || {}; // :TODO: this is currently pointless... cb is required...
|
||||
|
||||
async.waterfall(
|
||||
[
|
||||
|
@ -284,14 +284,14 @@ function changeMessageAreaWithOptions(client, areaTag, options, cb) {
|
|||
}
|
||||
|
||||
//
|
||||
// Temporairly -- e.g. non-persisted -- change to an area and it's
|
||||
// associated underlying conference. ACS is checked for both.
|
||||
// Temporairly -- e.g. non-persisted -- change to an area and it's
|
||||
// associated underlying conference. ACS is checked for both.
|
||||
//
|
||||
// This is useful for example when doing a new scan
|
||||
// This is useful for example when doing a new scan
|
||||
//
|
||||
function tempChangeMessageConfAndArea(client, areaTag) {
|
||||
const area = getMessageAreaByTag(areaTag);
|
||||
const confTag = getMessageConfTagByAreaTag(areaTag);
|
||||
const area = getMessageAreaByTag(areaTag);
|
||||
const confTag = getMessageConfTagByAreaTag(areaTag);
|
||||
|
||||
if(!area || !confTag) {
|
||||
return false;
|
||||
|
@ -303,7 +303,7 @@ function tempChangeMessageConfAndArea(client, areaTag) {
|
|||
return false;
|
||||
}
|
||||
|
||||
client.user.properties.message_conf_tag = confTag;
|
||||
client.user.properties.message_conf_tag = confTag;
|
||||
client.user.properties.message_area_tag = areaTag;
|
||||
|
||||
return true;
|
||||
|
@ -319,8 +319,8 @@ function getNewMessageCountInAreaForUser(userId, areaTag, cb) {
|
|||
|
||||
const filter = {
|
||||
areaTag,
|
||||
newerThanMessageId : lastMessageId,
|
||||
resultType : 'count',
|
||||
newerThanMessageId : lastMessageId,
|
||||
resultType : 'count',
|
||||
};
|
||||
|
||||
if(Message.isPrivateAreaTag(areaTag)) {
|
||||
|
@ -339,10 +339,10 @@ function getNewMessagesInAreaForUser(userId, areaTag, cb) {
|
|||
|
||||
const filter = {
|
||||
areaTag,
|
||||
resultType : 'messageList',
|
||||
newerThanMessageId : lastMessageId,
|
||||
sort : 'messageId',
|
||||
order : 'ascending',
|
||||
resultType : 'messageList',
|
||||
newerThanMessageId : lastMessageId,
|
||||
sort : 'messageId',
|
||||
order : 'ascending',
|
||||
};
|
||||
|
||||
if(Message.isPrivateAreaTag(areaTag)) {
|
||||
|
@ -356,9 +356,9 @@ function getNewMessagesInAreaForUser(userId, areaTag, cb) {
|
|||
function getMessageListForArea(client, areaTag, cb) {
|
||||
const filter = {
|
||||
areaTag,
|
||||
resultType : 'messageList',
|
||||
sort : 'messageId',
|
||||
order : 'ascending',
|
||||
resultType : 'messageList',
|
||||
sort : 'messageId',
|
||||
order : 'ascending',
|
||||
};
|
||||
|
||||
if(Message.isPrivateAreaTag(areaTag)) {
|
||||
|
@ -373,9 +373,9 @@ function getMessageIdNewerThanTimestampByArea(areaTag, newerThanTimestamp, cb) {
|
|||
{
|
||||
areaTag,
|
||||
newerThanTimestamp,
|
||||
sort : 'modTimestamp',
|
||||
order : 'ascending',
|
||||
limit : 1,
|
||||
sort : 'modTimestamp',
|
||||
order : 'ascending',
|
||||
limit : 1,
|
||||
},
|
||||
(err, id) => {
|
||||
if(err) {
|
||||
|
@ -388,9 +388,9 @@ function getMessageIdNewerThanTimestampByArea(areaTag, newerThanTimestamp, cb) {
|
|||
|
||||
function getMessageAreaLastReadId(userId, areaTag, cb) {
|
||||
msgDb.get(
|
||||
'SELECT message_id ' +
|
||||
'FROM user_message_area_last_read ' +
|
||||
'WHERE user_id = ? AND area_tag = ?;',
|
||||
'SELECT message_id ' +
|
||||
'FROM user_message_area_last_read ' +
|
||||
'WHERE user_id = ? AND area_tag = ?;',
|
||||
[ userId, areaTag.toLowerCase() ],
|
||||
function complete(err, row) {
|
||||
cb(err, row ? row.message_id : 0);
|
||||
|
@ -404,20 +404,20 @@ function updateMessageAreaLastReadId(userId, areaTag, messageId, allowOlder, cb)
|
|||
allowOlder = false;
|
||||
}
|
||||
|
||||
// :TODO: likely a better way to do this...
|
||||
// :TODO: likely a better way to do this...
|
||||
async.waterfall(
|
||||
[
|
||||
function getCurrent(callback) {
|
||||
getMessageAreaLastReadId(userId, areaTag, function result(err, lastId) {
|
||||
lastId = lastId || 0;
|
||||
callback(null, lastId); // ignore errors as we default to 0
|
||||
callback(null, lastId); // ignore errors as we default to 0
|
||||
});
|
||||
},
|
||||
function update(lastId, callback) {
|
||||
if(allowOlder || messageId > lastId) {
|
||||
msgDb.run(
|
||||
'REPLACE INTO user_message_area_last_read (user_id, area_tag, message_id) ' +
|
||||
'VALUES (?, ?, ?);',
|
||||
'REPLACE INTO user_message_area_last_read (user_id, area_tag, message_id) ' +
|
||||
'VALUES (?, ?, ?);',
|
||||
[ userId, areaTag, messageId ],
|
||||
function written(err) {
|
||||
callback(err, true); // true=didUpdate
|
||||
|
@ -459,7 +459,7 @@ function persistMessage(message, cb) {
|
|||
);
|
||||
}
|
||||
|
||||
// method exposed for event scheduler
|
||||
// method exposed for event scheduler
|
||||
function trimMessageAreasScheduledEvent(args, cb) {
|
||||
|
||||
function trimMessageAreaByMaxMessages(areaInfo, cb) {
|
||||
|
@ -469,15 +469,15 @@ function trimMessageAreasScheduledEvent(args, cb) {
|
|||
|
||||
msgDb.run(
|
||||
`DELETE FROM message
|
||||
WHERE message_id IN(
|
||||
SELECT message_id
|
||||
FROM message
|
||||
WHERE area_tag = ?
|
||||
ORDER BY message_id DESC
|
||||
LIMIT -1 OFFSET ${areaInfo.maxMessages}
|
||||
);`,
|
||||
WHERE message_id IN(
|
||||
SELECT message_id
|
||||
FROM message
|
||||
WHERE area_tag = ?
|
||||
ORDER BY message_id DESC
|
||||
LIMIT -1 OFFSET ${areaInfo.maxMessages}
|
||||
);`,
|
||||
[ areaInfo.areaTag.toLowerCase() ],
|
||||
function result(err) { // no arrow func; need this
|
||||
function result(err) { // no arrow func; need this
|
||||
if(err) {
|
||||
Log.error( { areaInfo : areaInfo, error : err.message, type : 'maxMessages' }, 'Error trimming message area');
|
||||
} else {
|
||||
|
@ -495,9 +495,9 @@ function trimMessageAreasScheduledEvent(args, cb) {
|
|||
|
||||
msgDb.run(
|
||||
`DELETE FROM message
|
||||
WHERE area_tag = ? AND modified_timestamp < date('now', '-${areaInfo.maxAgeDays} days');`,
|
||||
WHERE area_tag = ? AND modified_timestamp < date('now', '-${areaInfo.maxAgeDays} days');`,
|
||||
[ areaInfo.areaTag ],
|
||||
function result(err) { // no arrow func; need this
|
||||
function result(err) { // no arrow func; need this
|
||||
if(err) {
|
||||
Log.warn( { areaInfo : areaInfo, error : err.message, type : 'maxAgeDays' }, 'Error trimming message area');
|
||||
} else {
|
||||
|
@ -514,17 +514,17 @@ function trimMessageAreasScheduledEvent(args, cb) {
|
|||
const areaTags = [];
|
||||
|
||||
//
|
||||
// We use SQL here vs API such that no-longer-used tags are picked up
|
||||
// We use SQL here vs API such that no-longer-used tags are picked up
|
||||
//
|
||||
msgDb.each(
|
||||
`SELECT DISTINCT area_tag
|
||||
FROM message;`,
|
||||
FROM message;`,
|
||||
(err, row) => {
|
||||
if(err) {
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
// We treat private mail special
|
||||
// We treat private mail special
|
||||
if(!Message.isPrivateAreaTag(row.area_tag)) {
|
||||
areaTags.push(row.area_tag);
|
||||
}
|
||||
|
@ -537,23 +537,23 @@ function trimMessageAreasScheduledEvent(args, cb) {
|
|||
function prepareAreaInfo(areaTags, callback) {
|
||||
let areaInfos = [];
|
||||
|
||||
// determine maxMessages & maxAgeDays per area
|
||||
// determine maxMessages & maxAgeDays per area
|
||||
const config = Config();
|
||||
areaTags.forEach(areaTag => {
|
||||
|
||||
let maxMessages = config.messageAreaDefaults.maxMessages;
|
||||
let maxAgeDays = config.messageAreaDefaults.maxAgeDays;
|
||||
let maxAgeDays = config.messageAreaDefaults.maxAgeDays;
|
||||
|
||||
const area = getMessageAreaByTag(areaTag); // note: we don't know the conf here
|
||||
const area = getMessageAreaByTag(areaTag); // note: we don't know the conf here
|
||||
if(area) {
|
||||
maxMessages = area.maxMessages || maxMessages;
|
||||
maxAgeDays = area.maxAgeDays || maxAgeDays;
|
||||
maxAgeDays = area.maxAgeDays || maxAgeDays;
|
||||
}
|
||||
|
||||
areaInfos.push( {
|
||||
areaTag : areaTag,
|
||||
maxMessages : maxMessages,
|
||||
maxAgeDays : maxAgeDays,
|
||||
areaTag : areaTag,
|
||||
maxMessages : maxMessages,
|
||||
maxAgeDays : maxAgeDays,
|
||||
} );
|
||||
});
|
||||
|
||||
|
@ -578,13 +578,13 @@ function trimMessageAreasScheduledEvent(args, cb) {
|
|||
},
|
||||
function trimExternalPrivateSentMail(callback) {
|
||||
//
|
||||
// *External* (FTN, email, ...) outgoing is cleaned up *after export*
|
||||
// if it is older than the configured |maxExternalSentAgeDays| days
|
||||
// *External* (FTN, email, ...) outgoing is cleaned up *after export*
|
||||
// if it is older than the configured |maxExternalSentAgeDays| days
|
||||
//
|
||||
// Outgoing externally exported private mail is:
|
||||
// - In the 'private_mail' area
|
||||
// - Marked exported (state_flags0 exported bit set)
|
||||
// - Marked with any external flavor (we don't mark local)
|
||||
// Outgoing externally exported private mail is:
|
||||
// - In the 'private_mail' area
|
||||
// - Marked exported (state_flags0 exported bit set)
|
||||
// - Marked with any external flavor (we don't mark local)
|
||||
//
|
||||
const maxExternalSentAgeDays = _.get(
|
||||
Config,
|
||||
|
@ -594,18 +594,18 @@ function trimMessageAreasScheduledEvent(args, cb) {
|
|||
|
||||
msgDb.run(
|
||||
`DELETE FROM message
|
||||
WHERE message_id IN (
|
||||
SELECT m.message_id
|
||||
FROM message m
|
||||
JOIN message_meta mms
|
||||
ON m.message_id = mms.message_id AND
|
||||
(mms.meta_category='System' AND mms.meta_name='${Message.SystemMetaNames.StateFlags0}' AND (mms.meta_value & ${Message.StateFlags0.Exported} = ${Message.StateFlags0.Exported}))
|
||||
JOIN message_meta mmf
|
||||
ON m.message_id = mmf.message_id AND
|
||||
(mmf.meta_category='System' AND mmf.meta_name='${Message.SystemMetaNames.ExternalFlavor}')
|
||||
WHERE m.area_tag='${Message.WellKnownAreaTags.Private}' AND DATETIME('now') > DATETIME(m.modified_timestamp, '+${maxExternalSentAgeDays} days')
|
||||
);`,
|
||||
function results(err) { // no arrow func; need this
|
||||
WHERE message_id IN (
|
||||
SELECT m.message_id
|
||||
FROM message m
|
||||
JOIN message_meta mms
|
||||
ON m.message_id = mms.message_id AND
|
||||
(mms.meta_category='System' AND mms.meta_name='${Message.SystemMetaNames.StateFlags0}' AND (mms.meta_value & ${Message.StateFlags0.Exported} = ${Message.StateFlags0.Exported}))
|
||||
JOIN message_meta mmf
|
||||
ON m.message_id = mmf.message_id AND
|
||||
(mmf.meta_category='System' AND mmf.meta_name='${Message.SystemMetaNames.ExternalFlavor}')
|
||||
WHERE m.area_tag='${Message.WellKnownAreaTags.Private}' AND DATETIME('now') > DATETIME(m.modified_timestamp, '+${maxExternalSentAgeDays} days')
|
||||
);`,
|
||||
function results(err) { // no arrow func; need this
|
||||
if(err) {
|
||||
Log.warn( { error : err.message }, 'Error trimming private externally sent messages');
|
||||
} else {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue