diff --git a/config.example.json b/config.example.json index 9242425..ee30060 100644 --- a/config.example.json +++ b/config.example.json @@ -4,6 +4,7 @@ "matrixdomain": "matrix.org", "matrixuser": "smsbot", "matrixpass": "hunter2", + "matrixaccesstoken": "", "inviteusers": ["@annoyme:matrix.org"], "smsapikey": "Voxtelesys SMS API key goes here", "smsfrom": "Voxtelesys DID goes here", diff --git a/main.js b/main.js index 97f7e35..b691e3d 100644 --- a/main.js +++ b/main.js @@ -457,208 +457,127 @@ function handleHTTPRequest(req, res) { } } -const client = sdk.createClient({baseUrl: settings.homeserver}); +const client = sdk.createClient({baseUrl: settings.homeserver, userId: settings.matrixuser, accessToken: settings.matrixaccesstoken}); var httpserver = express(); var jsonParser = bodyParser.json(); -client.login("m.login.password", {"user": settings.matrixuser, "password": settings.matrixpass}).then((response) => { - client.startClient(); - logger.info("Plugged into the matrix."); - client.once('sync', function (state, prevState, res) { - logger.debug("Initial sync complete (" + state + ")"); - initialsynccomplete = true; - httpserver.post("*", jsonParser, (req, res) => { - handleHTTPRequest(req, res); - }); - httpserver.get("*", (req, res) => { - handleHTTPRequest(req, res); - }); - httpserver.listen(settings.listenport, () => { - logger.info("HTTP server listening on port " + settings.listenport); - }); - logger.info("Up and running."); - if (settings.smsinterval > 0) { - setInterval(checkSMS, settings.smsinterval * 1000); - checkSMS(); - } +client.startClient({initialSyncLimit: 10}); +logger.info("Plugged into the matrix."); +client.once('sync', function (state, prevState, res) { + logger.debug("Initial sync complete (" + state + ")"); + initialsynccomplete = true; + httpserver.post("*", jsonParser, (req, res) => { + handleHTTPRequest(req, res); }); - client.on("Room.timeline", function (event, room) { - try { - if (!initialsynccomplete) { - return; // ignore anything while we were offline - } - if (event.getType() !== "m.room.message") { - return; // only use messages - } - if (client.getUserId() == event.getSender()) { - return; // skip own messages to prevent loop - } - if (event.getContent() == null || typeof event.getContent().body == "undefined" || event.getContent().body == null) { - // Apparently this can happen? + httpserver.get("*", (req, res) => { + handleHTTPRequest(req, res); + }); + httpserver.listen(settings.listenport, () => { + logger.info("HTTP server listening on port " + settings.listenport); + }); + logger.info("Up and running."); + if (settings.smsinterval > 0) { + setInterval(checkSMS, settings.smsinterval * 1000); + checkSMS(); + } +}); +client.on("Room.timeline", function (event, room) { + try { + if (!initialsynccomplete) { + return; // ignore anything while we were offline + } + if (event.getType() !== "m.room.message") { + return; // only use messages + } + if (client.getUserId() == event.getSender()) { + return; // skip own messages to prevent loop + } + if (event.getContent() == null || typeof event.getContent().body == "undefined" || event.getContent().body == null) { + // Apparently this can happen? + return; + } + + if (event.getContent().body.toLowerCase().startsWith("!sms")) { + // capture command to start room for new number + const matches = event.getContent().body.match(/([1-9]?[0-9]{10})/g); + if (matches == null) { return; } - - if (event.getContent().body.toLowerCase().startsWith("!sms")) { - // capture command to start room for new number - const matches = event.getContent().body.match(/([1-9]?[0-9]{10})/g); - if (matches == null) { - return; + 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 == 1 || matches.length == 2) { - var tel = matches[0]; - var ournumber = settings.smsfrom; - if (tel.length == 10) { + if (matches.length == 2) { + ournumber = matches[1]; + if (ournumber.length == 10) { // make it the full number - tel = "1" + tel; + ournumber = "1" + ournumber; } - 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 + " using " + ournumber + " from " + event.getSender() + "."); - sendMatrixNotice(event.getRoomId(), "Starting conversation with " + tel); - createOrJoinSMSRoom(tel, ournumber, function (roomid) { - //client.setRoomTag(roomid, "u.matrix-bridge-voxtelesys-sms", {tel: tel, ournumber: ournumber}); - }); } - return; - } else if (event.getContent().body.toLowerCase().replace(/\s/g, "").startsWith("!sms")) { - sendMatrixNotice(event.getRoomId(), "Malformed command detected, ignoring."); - sendMatrixNotice(event.getRoomId(), "Hint: there aren't supposed to be any spaces before or in the \"!sms\" part."); - return; + logger.info("Got request to start new SMS conversation with " + tel + " using " + ournumber + " from " + event.getSender() + "."); + sendMatrixNotice(event.getRoomId(), "Starting conversation with " + tel); + createOrJoinSMSRoom(tel, ournumber, function (roomid) { + //client.setRoomTag(roomid, "u.matrix-bridge-voxtelesys-sms", {tel: tel, ournumber: ournumber}); + }); } + return; + } else if (event.getContent().body.toLowerCase().replace(/\s/g, "").startsWith("!sms")) { + sendMatrixNotice(event.getRoomId(), "Malformed command detected, ignoring."); + sendMatrixNotice(event.getRoomId(), "Hint: there aren't supposed to be any spaces before or in the \"!sms\" part."); + return; + } - if (event.getContent().body.toLowerCase().startsWith("!fixusers")) { - sendMatrixNotice(event.getRoomId(), "Inviting missing users across all SMS chats. You may need to run this command several times, there's a server limit to how many invites can be sent at once."); + if (event.getContent().body.toLowerCase().startsWith("!fixusers")) { + sendMatrixNotice(event.getRoomId(), "Inviting missing users across all SMS chats. You may need to run this command several times, there's a server limit to how many invites can be sent at once."); - client.getJoinedRooms().then(function (rooms) { - var roomlist = rooms.joined_rooms; - for (var i = 0; i < roomlist.length; i++) { - (function (roomid) { - client.getJoinedRoomMembers(roomid).then(function (joined) { - var members = Object.keys(joined.joined); - for (var j = 0; j < settings.inviteusers.length; j++) { - if (members.indexOf(settings.inviteusers[j]) == -1) { - logger.info("Inviting missing user " + settings.inviteusers[j] + " to room " + roomid); - client.invite(roomid, settings.inviteusers[j]); - } + client.getJoinedRooms().then(function (rooms) { + var roomlist = rooms.joined_rooms; + for (var i = 0; i < roomlist.length; i++) { + (function (roomid) { + client.getJoinedRoomMembers(roomid).then(function (joined) { + var members = Object.keys(joined.joined); + for (var j = 0; j < settings.inviteusers.length; j++) { + if (members.indexOf(settings.inviteusers[j]) == -1) { + logger.info("Inviting missing user " + settings.inviteusers[j] + " to room " + roomid); + client.invite(roomid, settings.inviteusers[j]); } - }); - })(roomlist[i]); - } - }); + } + }); + })(roomlist[i]); + } + }); - return; - } else if (event.getContent().body.toLowerCase().replace(/\s/g, "").startsWith("!fixusers")) { - sendMatrixNotice(event.getRoomId(), "Malformed command detected, ignoring."); - return; - } + return; + } else if (event.getContent().body.toLowerCase().replace(/\s/g, "").startsWith("!fixusers")) { + sendMatrixNotice(event.getRoomId(), "Malformed command detected, ignoring."); + return; + } - if (event.getContent().body.toLowerCase().replace(/\s/g, "").startsWith("!")) { - sendMatrixNotice(event.getRoomId(), "I'm sorry, but my programming forbids me from sending text messages that start with `!`."); - return; - } + if (event.getContent().body.toLowerCase().replace(/\s/g, "").startsWith("!")) { + sendMatrixNotice(event.getRoomId(), "I'm sorry, but my programming forbids me from sending text messages that start with `!`."); + return; + } - var matches = room.name.match(/SMS_([1-9][0-9]+)(?:_([1-9][0-9]+))?/g); - console.log(event.getRoomId()); - if (matches == null || (matches.length != 1 && matches.length != 2)) { - client.getRoomTags(event.getRoomId()).then((response) => { - console.log(response); - if (typeof response.tags["u.matrix-bridge-voxtelesys-sms"] != "undefined") { - var tel = response.tags["u.matrix-bridge-voxtelesys-sms"].tel; - var from = response.tags["u.matrix-bridge-voxtelesys-sms"].ournumber; - logger.info("Got message for " + tel + " from " + event.getSender() + ", relaying to " + from + "."); - switch (event.getContent().msgtype) { - case "m.image": - case "m.file": - case "m.video": - sendMMS( - tel, - from, - event.getContent().url, - event.getContent().info.mimetype, - function () { - client.sendReadReceipt(event, "m.read"); - }); - break; - case "m.text": - default: - sendSMS( - tel, - from, - event.getContent().body, - function () { - client.sendReadReceipt(event, "m.read"); - }); - break; - } - } else if (typeof response.tags["com.netsyms.matrix-bridge-voxtelesys.sms"] != "undefined") { - var tel = response.tags["com.netsyms.matrix-bridge-voxtelesys.sms"].tel; - var from = response.tags["com.netsyms.matrix-bridge-voxtelesys.sms"].ournumber; - client.setRoomTag(event.getRoomId(), "u.matrix-bridge-voxtelesys-sms", {tel: tel, ournumber: from, order: 0.5}); - logger.info("Got message for " + tel + " from " + event.getSender() + ", relaying to " + from + "."); - switch (event.getContent().msgtype) { - case "m.image": - case "m.file": - case "m.video": - sendMMS( - tel, - from, - event.getContent().url, - event.getContent().info.mimetype, - function () { - client.sendReadReceipt(event, "m.read"); - }); - break; - case "m.text": - default: - sendSMS( - tel, - from, - event.getContent().body, - function () { - client.sendReadReceipt(event, "m.read"); - }); - break; - } - } else { - console.log(response.tags); - sendMatrixNotice(room.roomId, "Error: couldn't determine correct number to send SMS from."); - } - }); - } else { - if (matches.length == 1) { - var tel = matches[0]; - logger.info("Got message for " + tel + " from " + event.getSender() + ", relaying."); - switch (event.getContent().msgtype) { - case "m.image": - case "m.file": - case "m.video": - sendMMS(tel, settings.smsfrom, event.getContent().url, - event.getContent().info.mimetype, - function () { - client.sendReadReceipt(event, "m.read"); - }); - break; - case "m.text": - default: - sendSMS(tel, settings.smsfrom, event.getContent().body, function () { - client.sendReadReceipt(event, "m.read"); - }); - break; - } - } else if (matches.length == 2) { - var tel = matches[0]; - var from = matches[1]; + var matches = room.name.match(/SMS_([1-9][0-9]+)(?:_([1-9][0-9]+))?/g); + console.log(event.getRoomId()); + if (matches == null || (matches.length != 1 && matches.length != 2)) { + client.getRoomTags(event.getRoomId()).then((response) => { + console.log(response); + if (typeof response.tags["u.matrix-bridge-voxtelesys-sms"] != "undefined") { + var tel = response.tags["u.matrix-bridge-voxtelesys-sms"].tel; + var from = response.tags["u.matrix-bridge-voxtelesys-sms"].ournumber; logger.info("Got message for " + tel + " from " + event.getSender() + ", relaying to " + from + "."); switch (event.getContent().msgtype) { case "m.image": case "m.file": case "m.video": - sendMMS(tel, from, event.getContent().url, + sendMMS( + tel, + from, + event.getContent().url, event.getContent().info.mimetype, function () { client.sendReadReceipt(event, "m.read"); @@ -666,15 +585,94 @@ client.login("m.login.password", {"user": settings.matrixuser, "password": setti break; case "m.text": default: - sendSMS(tel, settings.smsfrom, event.getContent().body, function () { - client.sendReadReceipt(event, "m.read"); - }); + sendSMS( + tel, + from, + event.getContent().body, + function () { + client.sendReadReceipt(event, "m.read"); + }); break; } + } else if (typeof response.tags["com.netsyms.matrix-bridge-voxtelesys.sms"] != "undefined") { + var tel = response.tags["com.netsyms.matrix-bridge-voxtelesys.sms"].tel; + var from = response.tags["com.netsyms.matrix-bridge-voxtelesys.sms"].ournumber; + client.setRoomTag(event.getRoomId(), "u.matrix-bridge-voxtelesys-sms", {tel: tel, ournumber: from, order: 0.5}); + logger.info("Got message for " + tel + " from " + event.getSender() + ", relaying to " + from + "."); + switch (event.getContent().msgtype) { + case "m.image": + case "m.file": + case "m.video": + sendMMS( + tel, + from, + event.getContent().url, + event.getContent().info.mimetype, + function () { + client.sendReadReceipt(event, "m.read"); + }); + break; + case "m.text": + default: + sendSMS( + tel, + from, + event.getContent().body, + function () { + client.sendReadReceipt(event, "m.read"); + }); + break; + } + } else { + console.log(response.tags); + sendMatrixNotice(room.roomId, "Error: couldn't determine correct number to send SMS from."); + } + }); + } else { + if (matches.length == 1) { + var tel = matches[0]; + logger.info("Got message for " + tel + " from " + event.getSender() + ", relaying."); + switch (event.getContent().msgtype) { + case "m.image": + case "m.file": + case "m.video": + sendMMS(tel, settings.smsfrom, event.getContent().url, + event.getContent().info.mimetype, + function () { + client.sendReadReceipt(event, "m.read"); + }); + break; + case "m.text": + default: + sendSMS(tel, settings.smsfrom, event.getContent().body, function () { + client.sendReadReceipt(event, "m.read"); + }); + break; + } + } else if (matches.length == 2) { + var tel = matches[0]; + var from = matches[1]; + logger.info("Got message for " + tel + " from " + event.getSender() + ", relaying to " + from + "."); + switch (event.getContent().msgtype) { + case "m.image": + case "m.file": + case "m.video": + sendMMS(tel, from, event.getContent().url, + event.getContent().info.mimetype, + function () { + client.sendReadReceipt(event, "m.read"); + }); + break; + case "m.text": + default: + sendSMS(tel, settings.smsfrom, event.getContent().body, function () { + client.sendReadReceipt(event, "m.read"); + }); + break; } } - } catch (ex) { - logger.error("Error handling incoming event: " + ex); } - }); + } catch (ex) { + logger.error("Error handling incoming event: " + ex); + } }); \ No newline at end of file