sms-forward
Version:
Auto-forward incoming SMS from one mobile phone number to another phone number using a Huawei mobile broadband device (dongles, wingles)
169 lines (156 loc) • 5.52 kB
JavaScript
var fs = require('fs');
var log = require('./lib/logger')._system;
var HuaweiModemClient = require('./lib/HuaweiModemClient.js');
var MacOSAdressBookLookup = require('./lib/MacOSAdressBookLookup.js');
if (!fs.existsSync(__dirname + '/config.json')) {
log
.error("'config.json' does not exist. Please create one by renaming and editing 'config.json.sample'.");
process.exit();
}
var config = require('./config.json');
var smsClient = new HuaweiModemClient(config.huawei_modem_ip, config.huawei_modem_login,
config.huawei_modem_password);
log.info("SMS Forward started");
scanSMS();
function scanSMS() {
var addressBookLookup = new MacOSAdressBookLookup(config.macos_address_book_db_path, config.country);
addressBookLookup.init(function() {
smsClient.authenticate().then(function(result){
log.debug("Scanning SMS");
cleanOldMessages(config.messages_retention_days).then(function() {
if (config.disconnect_data) {
log.debug("Disconnecting modem");
smsClient.dial(0).then(function(result) {
scanMessages(addressBookLookup);
}).catch(function(err){
log.error("Could not disconnect: Error code " + err);
setTimeout(scanSMS, config.sms_scan_frequency * 1000);
});
} else
{
scanMessages(addressBookLookup);
}
}).catch(function(err){
log.error("Could not clean old messages: Error code " + err);
setTimeout(scanSMS, config.sms_scan_frequency * 1000);
});
}).catch(function(err){
//TODO: lookup error code in HuaweiModemErrorCodes
log.error("Could not authenticate: Error code " + err);
setTimeout(scanSMS, config.sms_scan_frequency * 1000);
});
});
}
function cleanOldMessages(nbDays) {
log.debug("Old messages cleanup started");
return new Promise((resolve, reject) => {
if (nbDays !== undefined && nbDays > 0) {
cleanOldMessagesBox(nbDays, 1).then(function(messages) {
if (messages.length > 0) {
log.info(messages.length + " old SMS deleted from inbox");
}
cleanOldMessagesBox(nbDays, 2).then(function(messages) {
if (messages.length > 0) {
log.info(messages.length + " old SMS deleted from outbox");
}
log.debug("Old messages cleanup completed");
resolve();
}).catch(function(err){
log.warn("Could not clean old messages from outbox: Error code " + err);
reject(err);
})
}).catch(function(err){
log.warn("Could not clean old messages from inbox: Error code " + err);
reject(err);
});
}
else {
resolve();
}
});
}
function cleanOldMessagesBox(nbDays, boxType) {
return new Promise((resolve, reject) => {
smsClient.listSMSOlderThan(nbDays, boxType).then(function(messages) {
if (messages.length > 0) {
var deleteMessages = function(i) {
if (i<messages.length) {
smsClient.deleteSMS(messages[i]).then(function(result) {
deleteMessages(i+1);
}).catch(function(err){
log.error("Could not delete old SMS - " + err);
reject(err);
});
} else {
resolve(messages);
}
};
deleteMessages(0);
}
else {
resolve(messages);
}
}).catch(function(err){
log.error("Could not list old messages: " + err);
reject(err);
});
});
}
function scanMessages(addressBookLookup) {
smsClient.listAllUnreadSMS().then(function(messages) {
if (messages.length > 0) {
this.forwardedCount = 0;
var forwardMessages = function(i){
if (i<messages.length) {
forwardMessage(messages[i], addressBookLookup).then(function(result) {
forwardMessages(i+1);
}).catch(function(err){
setTimeout(scanSMS, config.sms_scan_frequency * 1000);
log.error("Could not complete forwarding SMS - " + err);
});
} else {
log.info("SMS scan complete: " + this.forwardedCount + " messages forwarded");
setTimeout(scanSMS, config.sms_scan_frequency * 1000);
}
};
forwardMessages(0);
} else {
log.debug("SMS scan complete - no message to forward");
setTimeout(scanSMS, config.sms_scan_frequency * 1000);
}
}).catch(function(err){
log.error("Could not list unread messages: " + err.stack);
setTimeout(scanSMS, config.sms_scan_frequency * 1000);
});
}
function forwardMessage(message, addressBookLookup) {
return new Promise((resolve, reject) => {
smsClient.sendSMS(config.sms_target_number, getForwardedMessageContent(message, addressBookLookup)).then(function(result) {
// Need to pause between send/setAsRead (error 113018)
setTimeout(function() {
smsClient.setSMSAsRead(message.Index[0]).then(function(result) {
log.debug("Message [" + message.Content[0] + "] from [" + message.Phone[0]
+ "] forwarded to [" + config.sms_target_number + "]");
this.forwardedCount++;
resolve(result);
}).catch(function(err) {
log.error("Could not set SMS as read - " + err);
reject(err);
});
}, 2500);
}).catch(function(err) {
log.error("Could not forward SMS - " + err);
reject(err);
});
});
}
function getForwardedMessageContent(message, addressBookLookup) {
var messageContent = 'From: ' + message.Phone[0];
var contact = addressBookLookup.lookupPhoneNumber(message.Phone[0]);
if (contact) {
messageContent += ` (${contact.ZFIRSTNAME} ${contact.ZLASTNAME})`;
}
messageContent += '\nDate: ' + message.Date[0];
messageContent += '\n' + message.Content[0];
return messageContent;
}