From 1048f38e2038b176a56477ad1783821e15bc3866 Mon Sep 17 00:00:00 2001 From: ale Date: Wed, 30 Jun 2021 18:13:00 +0200 Subject: [PATCH] initial commit --- README.md | 13 ++++++++++++ config.js | 9 ++++++++ index.js | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 14 +++++++++++++ 4 files changed, 95 insertions(+) create mode 100644 README.md create mode 100644 config.js create mode 100644 index.js create mode 100644 package.json diff --git a/README.md b/README.md new file mode 100644 index 0000000..f462f12 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +# Matrix Gateway Bot written in NodeJS + +## Install + + npm i or yarn + +## Configure + + Edit config.js + +## Run + + node index \ No newline at end of file diff --git a/config.js b/config.js new file mode 100644 index 0000000..875823b --- /dev/null +++ b/config.js @@ -0,0 +1,9 @@ +module.exports = { + nick: 'MatrixBot', + xmppService: 'xmpp://', + xmppUsername: '', + xmppPassword: '', + xmppRoom: '', + matrixServer: '', + matrixRoom: '' +} \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..7937259 --- /dev/null +++ b/index.js @@ -0,0 +1,59 @@ +const { client, xml } = require('@xmpp/client'), + sdk = require('matrix-js-sdk'), + config = require('./config'), + xmpp = client({ + service: config.xmppService, + username: config.xmppUsername, + password: config.xmppPassword + }), + sendMessage = async message => { + await xmpp.send(xml( + 'message', + { type: 'groupchat', to: xmppRoom }, + xml('body', {}, message) + )) + }, + nick = config.nick, + token = config.matrixToken, + matrix = sdk.createClient({ + baseUrl: 'https://' + config.matrixServer, + accessToken: token, + userId: '@' + nick + ':' + config.matrixServer + }), + xmppRoom = config.xmppRoom, + matrixRoom = config.matrixRoom + +xmpp.on('error', err => { + console.error(err) +}) + +xmpp.on('offline', () => { + console.log('Go to offline') +}) + +xmpp.on('stanza', async stanza => { + if (stanza.is('message') && !stanza.getChild('delay')) { + const user = stanza.attrs.from.replace(/.*\//, ''), + message = stanza.getChildText('body') + if (user && user !== nick && message) { + await matrix.sendMessage(matrixRoom, { body: user + ': ' + message, msgtype: 'm.text' }).catch(console.error) + } + } +}) + +xmpp.on('online', async address => { + await xmpp.send(xml('presence', { to: xmppRoom + '/' + nick }, + xml('x', { xmlns: 'http://jabber.org/protocol/muc' } + ))).catch(console.error) + console.log('Connected like: ' + address) + matrix.on('Room.timeline', (event, room, toStartOfTimeline) => { + if (event.event.sender !== '@' + nick + ':' + config.matrixServer && event.getType() === 'm.room.message') { + sendMessage(event.event.sender.replace(/:.*$/, '') + ': ' + event.event.content.body) + } + }) + await matrix.setDisplayName(nick) + await matrix.joinRoom(matrixRoom).catch(console.error) + matrix.startClient() +}) + +xmpp.start().catch(console.error) \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..135b62d --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "matrix-bot", + "version": "1.0.0", + "description": "Matrix Gateway Bot", + "main": "index.js", + "repository": "https://git.manalejandro.com/ale/matrix-bot", + "author": "ale", + "license": "MIT", + "private": true, + "dependencies": { + "@xmpp/client": "*", + "matrix-js-sdk": "*" + } +}