|
|
|
@ -6,7 +6,6 @@
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
console.log("Starting up...");
|
|
|
|
|
|
|
|
|
|
import sdk from 'matrix-js-sdk';
|
|
|
|
|
import fs from 'fs';
|
|
|
|
|
import log4js from 'log4js';
|
|
|
|
@ -17,21 +16,16 @@ import { dirname }
|
|
|
|
|
from 'path';
|
|
|
|
|
import request from 'request';
|
|
|
|
|
import FileType from 'file-type';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Load settings from config.json
|
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
|
|
|
const __dirname = dirname(__filename);
|
|
|
|
|
let rawdata = fs.readFileSync(__dirname + '/config.json');
|
|
|
|
|
let settings = JSON.parse(rawdata);
|
|
|
|
|
console.log(__dirname + "/config.json loaded.");
|
|
|
|
|
|
|
|
|
|
var logger = log4js.getLogger();
|
|
|
|
|
logger.level = settings.loglevel;
|
|
|
|
|
logger.info("Log initialized.");
|
|
|
|
|
|
|
|
|
|
var initialsynccomplete = false;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* From https://github.com/stevekinney/node-phone-formatter
|
|
|
|
|
* @param {string} phoneNumber
|
|
|
|
@ -51,7 +45,6 @@ function formatPhoneNumber(phoneNumber, formatString) {
|
|
|
|
|
|
|
|
|
|
function checkSMS() {
|
|
|
|
|
logger.debug("Checking SMS");
|
|
|
|
|
|
|
|
|
|
const options = {
|
|
|
|
|
hostname: 'smsapi.voxtelesys.net',
|
|
|
|
|
port: 443,
|
|
|
|
@ -61,13 +54,11 @@ function checkSMS() {
|
|
|
|
|
"Authorization": "Bearer " + settings.smsapikey
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const req = https.request(options, res => {
|
|
|
|
|
res.on('data', d => {
|
|
|
|
|
try {
|
|
|
|
|
var json = JSON.parse(d);
|
|
|
|
|
var messages = json.results;
|
|
|
|
|
|
|
|
|
|
if (messages.length == 0) {
|
|
|
|
|
logger.debug("No new SMS messages.");
|
|
|
|
|
}
|
|
|
|
@ -89,11 +80,9 @@ function checkSMS() {
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
req.on('error', error => {
|
|
|
|
|
logger.warning(error);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
req.end();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -135,16 +124,37 @@ function createOrJoinSMSRoom(tel, ournumber, callback) {
|
|
|
|
|
// room doesn't exist, create it
|
|
|
|
|
//logger.debug(err);
|
|
|
|
|
logger.debug("Room " + roomName + " does not exist. Creating it now.");
|
|
|
|
|
var userPowerLevels = {};
|
|
|
|
|
for (var i = 0; i < settings.inviteusers.length; i++) {
|
|
|
|
|
userPowerLevels[settings.inviteusers[i]] = 50;
|
|
|
|
|
}
|
|
|
|
|
client.createRoom({
|
|
|
|
|
room_alias_name: "SMS_" + tel + "_" + ournumber,
|
|
|
|
|
preset: "trusted_private_chat",
|
|
|
|
|
visibility: "private",
|
|
|
|
|
invite: settings.inviteusers,
|
|
|
|
|
power_level_content_override: {
|
|
|
|
|
"events": {
|
|
|
|
|
"m.room.name": 50,
|
|
|
|
|
"m.room.power_levels": 50
|
|
|
|
|
},
|
|
|
|
|
"events_default": 0,
|
|
|
|
|
"invite": 50,
|
|
|
|
|
"kick": 50,
|
|
|
|
|
"notifications": {
|
|
|
|
|
"room": 50
|
|
|
|
|
},
|
|
|
|
|
"redact": 50,
|
|
|
|
|
"state_default": 50,
|
|
|
|
|
"users": userPowerLevels,
|
|
|
|
|
"users_default": 0
|
|
|
|
|
},
|
|
|
|
|
is_direct: true,
|
|
|
|
|
name: formatPhoneNumber(tel, "(NNN) NNN-NNNN"),
|
|
|
|
|
topic: "SMS conversation with " + formatPhoneNumber(tel, "(NNN) NNN-NNNN") + " (using " + formatPhoneNumber(ournumber, "(NNN) NNN-NNNN") + ")"
|
|
|
|
|
}).then((room) => {
|
|
|
|
|
logger.debug("Room" + roomName + " created with ID " + room.room_id);
|
|
|
|
|
setSMSRoomPowerLevels(res.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, ournumber, callback);
|
|
|
|
@ -304,7 +314,6 @@ function sendSMS(number, from, body, callback) {
|
|
|
|
|
from: from,
|
|
|
|
|
body: body
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const options = {
|
|
|
|
|
hostname: 'smsapi.voxtelesys.net',
|
|
|
|
|
port: 443,
|
|
|
|
@ -322,12 +331,10 @@ function sendSMS(number, from, body, callback) {
|
|
|
|
|
logger.debug(d.toString('utf8'));
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
req.on('error', error => {
|
|
|
|
|
logger.error(error);
|
|
|
|
|
callback(false);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
req.write(data);
|
|
|
|
|
req.end();
|
|
|
|
|
if (typeof callback == "function") {
|
|
|
|
@ -339,7 +346,6 @@ const client = sdk.createClient(settings.homeserver);
|
|
|
|
|
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;
|
|
|
|
@ -347,8 +353,6 @@ client.login("m.login.password", {"user": settings.matrixuser, "password": setti
|
|
|
|
|
setInterval(checkSMS, settings.smsinterval * 1000);
|
|
|
|
|
checkSMS();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
client.on("Room.timeline", function (event, room) {
|
|
|
|
|
if (!initialsynccomplete) {
|
|
|
|
|
return; // ignore anything while we were offline
|
|
|
|
|