Add support for multiple texting numbers

master
Skylar Ittner 3 years ago
parent 3583f61fd7
commit 5cec22b2e8

@ -32,6 +32,20 @@ logger.info("Log initialized.");
var initialsynccomplete = false; var initialsynccomplete = false;
/**
* From https://github.com/stevekinney/node-phone-formatter
* @param {type} phoneNumber
* @param {type} formatString
* @param {type} options
* @returns {unresolved}
*/
function formatPhoneNumber(phoneNumber, formatString) {
for (var i = 0, l = phoneNumber.length; i < l; i++) {
formatString = formatString.replace("N", phoneNumber[i]);
}
return formatString;
}
function checkSMS() { function checkSMS() {
logger.debug("Checking SMS"); logger.debug("Checking SMS");
@ -59,7 +73,7 @@ function checkSMS() {
var msg = messages[i]; var msg = messages[i];
if (settings.smsonlyto.length > 0 && settings.smsonlyto.indexOf(msg.to) != -1) { if (settings.smsonlyto.length > 0 && settings.smsonlyto.indexOf(msg.to) != -1) {
logger.info("Received SMS from " + msg.from + " for " + msg.to + ": " + msg.body); logger.info("Received SMS from " + msg.from + " for " + msg.to + ": " + msg.body);
createOrJoinSMSRoom(msg.from, function (roomid) { createOrJoinSMSRoom(msg.from, msg.to, function (roomid) {
sendMatrix(roomid, msg.body, msg.media); sendMatrix(roomid, msg.body, msg.media);
}); });
} else { } else {
@ -83,13 +97,15 @@ function checkSMS() {
/** /**
* Join or create+join a room with alias #SMS_{tel}. If already joined, do nothing. * Join or create+join a room with alias #SMS_{tel}. If already joined, do nothing.
* @param {string} tel * @param {string} tel
* @param {string} ournumber the phone number Matrix messages will be sent from for this room
* @param {function} callback function with the room ID as an argument. * @param {function} callback function with the room ID as an argument.
* @returns {undefined} * @returns {undefined}
*/ */
function createOrJoinSMSRoom(tel, callback) { function createOrJoinSMSRoom(tel, ournumber, callback) {
logger.debug("Checking if room #SMS_" + tel + ":" + settings.matrixdomain + " exists."); var roomName = "#SMS_" + tel + "_" + ournumber + ":" + settings.matrixdomain;
client.getRoomIdForAlias("#SMS_" + tel + ":" + settings.matrixdomain).then((res) => { logger.debug("Checking if room " + roomName + " exists.");
logger.debug("Room #SMS_" + tel + ":" + settings.matrixdomain + " exists!"); client.getRoomIdForAlias(roomName).then((res) => {
logger.debug("Room " + roomName + " exists!");
var inRoom = false; var inRoom = false;
var rooms = client.getRooms(); var rooms = client.getRooms();
for (var i = 0; i < rooms.length; i++) { for (var i = 0; i < rooms.length; i++) {
@ -100,31 +116,31 @@ function createOrJoinSMSRoom(tel, callback) {
} }
if (inRoom) { if (inRoom) {
// we're already in the room, do nothing // we're already in the room, do nothing
logger.debug("Room #SMS_" + tel + ":" + settings.matrixdomain + " already joined."); logger.debug("Room " + roomName + " already joined.");
callback(res.room_id); callback(res.room_id);
} else { } else {
// not in the room, join it // not in the room, join it
client.joinRoom(res.room_id).then((room) => { client.joinRoom(res.room_id).then((room) => {
logger.debug("Room #SMS_" + tel + ":" + settings.matrixdomain + " joined."); logger.debug("Room " + roomName + " joined.");
callback(room.room_id); callback(room.room_id);
}); });
} }
}).catch((err) => { }).catch((err) => {
// room doesn't exist, create it // room doesn't exist, create it
//logger.debug(err); //logger.debug(err);
logger.debug("Room #SMS_" + tel + ":" + settings.matrixdomain + " does not exist. Creating it now."); logger.debug("Room " + roomName + " does not exist. Creating it now.");
client.createRoom({ client.createRoom({
room_alias_name: "SMS_" + tel, room_alias_name: "SMS_" + tel + "_" + ournumber,
visibility: "private", visibility: "private",
invite: settings.inviteusers, invite: settings.inviteusers,
name: "SMS: " + tel, name: formatPhoneNumber(tel),
topic: "SMS conversation with " + tel topic: "SMS conversation with " + tel + " (using " + ournumber + ")"
}).then((room) => { }).then((room) => {
logger.debug("Room #SMS_" + tel + ":" + settings.matrixdomain + " created with ID " + room.room_id); logger.debug("Room" + roomName + " created with ID " + room.room_id);
// The first message or two we send doesn't go through unless we do this. // The first message or two we send doesn't go through unless we do this.
// It just spits out "Error sending event M_FORBIDDEN: Unknown room" instead. // It just spits out "Error sending event M_FORBIDDEN: Unknown room" instead.
createOrJoinSMSRoom(tel, callback); createOrJoinSMSRoom(tel, ournumber, callback);
}); });
}); });
} }
@ -316,15 +332,23 @@ client.login("m.login.password", {"user": settings.matrixuser, "password": setti
if (event.getContent().body.startsWith("!sms")) { if (event.getContent().body.startsWith("!sms")) {
// capture command to start room for new number // capture command to start room for new number
const matches = event.getContent().body.match(/([1-9]?[0-9]{10})/g); const matches = event.getContent().body.match(/([1-9]?[0-9]{10})/g);
if (matches.length == 1) { if (matches.length == 1 || matches.length == 2) {
var tel = matches[0]; var tel = matches[0];
var ournumber = settings.smsfrom;
if (tel.length == 10) { if (tel.length == 10) {
// make it the full number // make it the full number
tel = "1" + tel; tel = "1" + tel;
} }
if (matches.length == 2) {
ournumber = matches[1];
if (ournumber.length == 10) {
// make it the full number
ournumber = "1" + ournumber;
}
}
logger.info("Got request to start new SMS conversation with " + tel + " from " + event.getSender() + "."); logger.info("Got request to start new SMS conversation with " + tel + " from " + event.getSender() + ".");
sendMatrixNotice(event.getRoomId(), "Starting new conversation with " + tel); sendMatrixNotice(event.getRoomId(), "Starting new conversation with " + tel);
createOrJoinSMSRoom(tel, function () { createOrJoinSMSRoom(tel, ournumber, function () {
return; return;
}); });
} }

Loading…
Cancel
Save