From c055773f679172141d42ac9b2983c51f59992d37 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Mon, 14 Jun 2021 17:22:51 -0600 Subject: [PATCH] Add image support (not just files) --- main.js | 62 ++++++++++++++-------------- package-lock.json | 100 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 3 files changed, 131 insertions(+), 32 deletions(-) diff --git a/main.js b/main.js index 78f913e..0176155 100644 --- a/main.js +++ b/main.js @@ -11,15 +11,18 @@ import sdk from 'matrix-js-sdk'; import fs from 'fs'; import log4js from 'log4js'; import https from 'https'; -import { fileURLToPath } from 'url'; -import { dirname } from 'path'; - +import { fileURLToPath } +from 'url'; +import { dirname } +from 'path'; import request from 'request'; +import FileType from 'file-type'; +import readChunk from 'read-chunk'; // Load settings from config.json const __filename = fileURLToPath(import.meta.url); - const __dirname = dirname(__filename); +const __dirname = dirname(__filename); let rawdata = fs.readFileSync(__dirname + '/config.json'); let settings = JSON.parse(rawdata); console.log(__dirname + "/config.json loaded."); @@ -127,6 +130,8 @@ function getAndUploadFile(url, callback) { logger.info("Downloading MMS media " + url); // download request({url, encoding: null}, (err, resp, buffer) => { + const buffer = readChunk.sync(buffer, 0, 4100); + var mimetype = (await FileType.fromBuffer(buffer)).mime; // upload logger.info("Uploading MMS media to Matrix " + url); client.uploadContent(buffer, { @@ -134,7 +139,7 @@ function getAndUploadFile(url, callback) { rawResponse: false }).then((res) => { if (typeof callback == "function") { - callback(res); + callback(res, mimetype); logger.info("Media URI: " + res); } }).catch((err) => { @@ -162,34 +167,27 @@ function sendMatrix(roomid, body, media, callback) { body = "Attachment"; } - if (typeof media == "string") { - getAndUploadFile(media, function (uri) { - var content = { - body: body, - msgtype: "m.file", - url: uri - } - client.sendEvent(roomid, "m.room.message", content, "").then((res) => { - if (typeof callback == "function") { - callback(true); - } - }).catch((err) => { - if (typeof callback == "function") { - callback(false); - } - if (err.data.error == "Unknown room") { - return; - } - logger.error(err); - }); - }); - } else if (Array.isArray(media)) { + if (Array.isArray(media)) { for (var i = 0; i < media.length; i++) { - getAndUploadFile(media[i], function (uri) { - var content = { - body: body, - msgtype: "m.file", - url: uri + getAndUploadFile(media[i], function (uri, mimetype) { + if (mimetype == "image/jpg" || mimetype == "image/png" || mimetype == "image/gif") { + var content = { + body: body, + msgtype: "m.image", + url: uri, + info: { + mimetype: mimetype + } + }; + } else { + var content = { + body: body, + msgtype: "m.file", + url: uri, + info: { + mimetype: mimetype + } + }; } client.sendEvent(roomid, "m.room.message", content, "").then((res) => { if (typeof callback == "function") { diff --git a/package-lock.json b/package-lock.json index d10a9ee..b87bacd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,30 @@ "regenerator-runtime": "^0.13.4" } }, + "@tokenizer/token": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.1.1.tgz", + "integrity": "sha512-XO6INPbZCxdprl+9qa/AAbFFOMzzwqYxpjPgLICrMD6C2FCw6qfJOPcBk6JqqPLSaZ/Qx87qn4rpPmPMwaAK6w==" + }, + "@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==" + }, + "@types/node": { + "version": "15.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz", + "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==" + }, + "@types/readable-stream": { + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.10.tgz", + "integrity": "sha512-xwSXvAv9x4B9Vj88AMZnFyEVLilz1EBxKvRUhGqIF4nJpRQBSTm7jS236X4Y9Y2qPsVvaMxwrGJlNhLHEahlFQ==", + "requires": { + "@types/node": "*", + "safe-buffer": "*" + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -163,6 +187,16 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "file-type": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.0.tgz", + "integrity": "sha512-OxgWA9tbL8N/WP00GD1z8O0MiwQKFyWRs1q+3FhjdvcGgKqwxcejyGWso3n4/IMU6DdwV+ARZ4A7TTnPkDcSiw==", + "requires": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.0.3", + "token-types": "^2.0.0" + } + }, "flatted": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", @@ -230,6 +264,16 @@ "sshpk": "^1.7.0" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -335,6 +379,11 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, + "peek-readable": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-3.1.3.tgz", + "integrity": "sha512-mpAcysyRJxmICBcBa5IXH7SZPvWkcghm6Fk8RekoS3v+BpbSzlZzuWbMx+GXrlUwESi9qHar4nVEZNMKylIHvg==" + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -355,6 +404,25 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readable-web-to-node-stream": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.1.tgz", + "integrity": "sha512-4zDC6CvjUyusN7V0QLsXVB7pJCD9+vtrM9bYDRv6uBQ+SKfx36rp5AFNPRgh9auKRul/a1iFZJYXcCbwRL+SaA==", + "requires": { + "@types/readable-stream": "^2.3.9", + "readable-stream": "^3.6.0" + } + }, "regenerator-runtime": { "version": "0.13.7", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", @@ -442,6 +510,33 @@ } } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strtok3": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.0.8.tgz", + "integrity": "sha512-QLgv+oiXwXgCgp2PdPPa+Jpp4D9imK9e/0BsyfeFMr6QL6wMVqoVn9+OXQ9I7MZbmUzN6lmitTJ09uwS2OmGcw==", + "requires": { + "@tokenizer/token": "^0.1.1", + "@types/debug": "^4.1.5", + "peek-readable": "^3.1.3" + } + }, + "token-types": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-2.1.1.tgz", + "integrity": "sha512-wnQcqlreS6VjthyHO3Y/kpK/emflxDBNhlNUPfh7wE39KnuDdOituXomIbyI79vBtF0Ninpkh72mcuRHo+RG3Q==", + "requires": { + "@tokenizer/token": "^0.1.1", + "ieee754": "^1.2.1" + } + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -482,6 +577,11 @@ "punycode": "^2.1.0" } }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", diff --git a/package.json b/package.json index 239d845..f41a23c 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "author": "Netsyms Technologies", "contributors": [], "dependencies": { + "file-type": "^16.5.0", "log4js": "^6.3.0", "matrix-js-sdk": "^9.0.1" }