|
|
|
@ -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;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|