Added XMPP notifier.

This commit is contained in:
BurnyLlama 2022-05-27 14:13:46 +02:00
parent da33f6c9ac
commit d23154d596
7 changed files with 152 additions and 0 deletions

36
config.default.yml Normal file
View File

@ -0,0 +1,36 @@
# Color can be:
# black, red, green, yellow, blue, magenta, cyan, white, gray, grey
# brightRed, brightGreen, brightYellow, brightBlue, brightMagenta, brightCyan, brightWhite
notifiers:
discord:
enabled: false
api-token: ""
receivers: [ "IDs..." ]
color: "magenta"
email:
enabled: false
smtp:
port: 587
name: "username"
pass: "secret"
host: "example.com"
secure: true # use TLS
receivers: [ "user@example.com" ]
color: "green"
xmpp:
enabled: true
sender:
user: "username"
pass: "secret"
host: "xmpps://hostname:port"
receivers: [ "exampleJID@example.com" ]
color: "yellow"
checkers:
ip-changed:
enabled: true
color: "red"

13
index.js Normal file
View File

@ -0,0 +1,13 @@
import settings from "./libs/settings.js"
import getNotifier from "./libs/getNotifier.js"
import getLogger from "./libs/logger.js"
const log = getLogger("MAIN", "blue")
log("Starting up maintenance-bot...")
log("Starting up notifiers...")
const enabledNotifiers = Object.keys(settings.notifiers).filter(notifier => settings.notifiers[notifier].enabled)
const notifiers = await Promise.all(enabledNotifiers.map(notifier => getNotifier(notifier)))
console.dir(notifiers)

5
libs/getNotifier.js Normal file
View File

@ -0,0 +1,5 @@
export default function getNotifier(notifier) {
return new Promise(
resolve => import(`../modules/notifiers/${notifier}.js`).then(
module => resolve(module.start())))
}

24
libs/logger.js Normal file
View File

@ -0,0 +1,24 @@
import colors from "colors"
import { createWriteStream } from "fs"
const fileLog = createWriteStream('maintenance-bot.log', { encoding: "utf8", flags: "a" })
function makeDate() {
const now = new Date(Date.now())
const date = now.toLocaleDateString("en-GB", { hour12: false })
const time = now.toLocaleTimeString("en-GB", { hour12: false })
return `(${date} -- ${time})`
}
export default function getLogger(prefix, color) {
const clr = colors[color] ?? colors[red]
return function (...args) {
fileLog.write(`[${prefix}] -- ${makeDate()}:\n`)
fileLog.write(`${args.join(", ")}\n\n`)
console.log(`${clr(prefix)} ${colors.grey(makeDate())}:`)
console.log(...args, "\n")
}
}

7
libs/settings.js Normal file
View File

@ -0,0 +1,7 @@
import YAML from "yaml"
import { readFileSync } from "fs"
const yamlData = readFileSync("./config.yml").toString()
const settings = YAML.parse(yamlData)
export default settings

45
modules/notifiers/xmpp.js Normal file
View File

@ -0,0 +1,45 @@
import settings from "../../libs/settings.js"
import { client, jid, xml } from "@xmpp/client"
import debug from "@xmpp/debug"
import getLogger from "../../libs/logger.js"
const log = getLogger("XMPP", settings.notifiers.xmpp.color)
export async function start() {
log("Starting up XMPP notifier...")
const xmpp = client({
service: settings.notifiers.xmpp.sender.host,
username: settings.notifiers.xmpp.sender.user,
password: settings.notifiers.xmpp.sender.pass
})
xmpp.on("error", err => console.error(err))
xmpp.on("offline", () => console.log("OFFLINE!"))
async function sendMessage(msg) {
const receivers = settings.notifiers.xmpp.receivers
const stanzas = receivers.map(
address => xml(
"message",
{ to: address, type: "chat" },
xml(
"body",
null,
msg
)
)
)
await xmpp.sendMany(stanzas).catch(console.error)
}
xmpp.on("online", address => {
log(`Logged in as ${address.toString()}`)
sendMessage("Started up 'maintenance-bot'...")
})
await xmpp.start().catch(console.error)
return sendMessage
}

22
package.json Normal file
View File

@ -0,0 +1,22 @@
{
"name": "maintenance-bot",
"version": "1.0.0",
"description": "",
"main": "index.js",
"type": "module",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"maintenance",
"bot"
],
"author": "BurnyLlama",
"license": "WTFPL",
"dependencies": {
"@xmpp/client": "^0.13.1",
"@xmpp/debug": "^0.13.0",
"colors": "^1.4.0",
"yaml": "^2.1.0"
}
}