From 5cec22b2e8782d11e55f22ece832a1572d8ba598 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Wed, 16 Jun 2021 14:56:45 -0600 Subject: [PATCH] Add support for multiple texting numbers --- main.js | 54 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/main.js b/main.js index 46b5694..4fc182f 100644 --- a/main.js +++ b/main.js @@ -32,6 +32,20 @@ logger.info("Log initialized."); 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() { logger.debug("Checking SMS"); @@ -59,7 +73,7 @@ function checkSMS() { var msg = messages[i]; if (settings.smsonlyto.length > 0 && settings.smsonlyto.indexOf(msg.to) != -1) { 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); }); } else { @@ -83,13 +97,15 @@ function checkSMS() { /** * Join or create+join a room with alias #SMS_{tel}. If already joined, do nothing. * @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. * @returns {undefined} */ -function createOrJoinSMSRoom(tel, callback) { - logger.debug("Checking if room #SMS_" + tel + ":" + settings.matrixdomain + " exists."); - client.getRoomIdForAlias("#SMS_" + tel + ":" + settings.matrixdomain).then((res) => { - logger.debug("Room #SMS_" + tel + ":" + settings.matrixdomain + " exists!"); +function createOrJoinSMSRoom(tel, ournumber, callback) { + var roomName = "#SMS_" + tel + "_" + ournumber + ":" + settings.matrixdomain; + logger.debug("Checking if room " + roomName + " exists."); + client.getRoomIdForAlias(roomName).then((res) => { + logger.debug("Room " + roomName + " exists!"); var inRoom = false; var rooms = client.getRooms(); for (var i = 0; i < rooms.length; i++) { @@ -100,31 +116,31 @@ function createOrJoinSMSRoom(tel, callback) { } if (inRoom) { // 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); } else { // not in the room, join it client.joinRoom(res.room_id).then((room) => { - logger.debug("Room #SMS_" + tel + ":" + settings.matrixdomain + " joined."); + logger.debug("Room " + roomName + " joined."); callback(room.room_id); }); } }).catch((err) => { // room doesn't exist, create it //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({ - room_alias_name: "SMS_" + tel, + room_alias_name: "SMS_" + tel + "_" + ournumber, visibility: "private", invite: settings.inviteusers, - name: "SMS: " + tel, - topic: "SMS conversation with " + tel + name: formatPhoneNumber(tel), + topic: "SMS conversation with " + tel + " (using " + ournumber + ")" }).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. // 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")) { // capture command to start room for new number 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 ournumber = settings.smsfrom; if (tel.length == 10) { // make it the full number 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() + "."); sendMatrixNotice(event.getRoomId(), "Starting new conversation with " + tel); - createOrJoinSMSRoom(tel, function () { + createOrJoinSMSRoom(tel, ournumber, function () { return; }); }