Browse Source
Merge pull request #567 from Empty2k12/feature/matrix-notifications
Matrix Notifications
pull/600/head
Louis Lam
3 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with
100 additions and
16 deletions
server/notification-providers/discord.js
server/notification-providers/gotify.js
server/notification-providers/line.js
server/notification-providers/lunasea.js
server/notification-providers/matrix.js
server/notification-providers/mattermost.js
server/notification-providers/octopush.js
server/notification-providers/pushbullet.js
server/notification-providers/pushover.js
server/notification-providers/pushy.js
server/notification-providers/rocket-chat.js
server/notification-providers/signal.js
server/notification-providers/slack.js
server/notification-providers/teams.js
server/notification-providers/telegram.js
server/notification-providers/webhook.js
server/notification.js
src/components/notifications/Matrix.vue
src/components/notifications/index.js
src/languages/en.js
@ -7,7 +7,7 @@ class Discord extends NotificationProvider {
name = "discord" ;
async send ( notification , msg , monitorJSON = null , heartbeatJSON = null ) {
let okMsg = "Sent Successfully. " ;
let okMsg = "Sent Successfully." ;
try {
const discordDisplayName = notification . discordUsername || "Uptime Kuma" ;
@ -6,7 +6,7 @@ class Gotify extends NotificationProvider {
name = "gotify" ;
async send ( notification , msg , monitorJSON = null , heartbeatJSON = null ) {
let okMsg = "Sent Successfully. " ;
let okMsg = "Sent Successfully." ;
try {
if ( notification . gotifyserverurl && notification . gotifyserverurl . endsWith ( "/" ) ) {
notification . gotifyserverurl = notification . gotifyserverurl . slice ( 0 , - 1 ) ;
@ -7,7 +7,7 @@ class Line extends NotificationProvider {
name = "line" ;
async send ( notification , msg , monitorJSON = null , heartbeatJSON = null ) {
let okMsg = "Sent Successfully. " ;
let okMsg = "Sent Successfully." ;
try {
let lineAPIUrl = "https://api.line.me/v2/bot/message/push" ;
let config = {
@ -7,7 +7,7 @@ class LunaSea extends NotificationProvider {
name = "lunasea" ;
async send ( notification , msg , monitorJSON = null , heartbeatJSON = null ) {
let okMsg = "Sent Successfully. " ;
let okMsg = "Sent Successfully." ;
let lunaseadevice = "https://notify.lunasea.app/v1/custom/device/" + notification . lunaseaDevice
try {
@ -0,0 +1,45 @@
const NotificationProvider = require ( "./notification-provider" ) ;
const axios = require ( "axios" ) ;
const Crypto = require ( "crypto" ) ;
const { debug } = require ( "../../src/util" ) ;
class Matrix extends NotificationProvider {
name = "matrix" ;
async send ( notification , msg , monitorJSON = null , heartbeatJSON = null ) {
let okMsg = "Sent Successfully." ;
const size = 20 ;
const randomString = encodeURIComponent (
Crypto
. randomBytes ( size )
. toString ( "base64" )
. slice ( 0 , size )
) ;
debug ( "Random String: " + randomString ) ;
const roomId = encodeURIComponent ( notification . internalRoomId ) ;
debug ( "Matrix Room ID: " + roomId ) ;
try {
let config = {
headers : {
"Authorization" : ` Bearer ${ notification . accessToken } ` ,
}
} ;
let data = {
"msgtype" : "m.text" ,
"body" : msg
} ;
await axios . put ( ` ${ notification . homeserverUrl } /_matrix/client/r0/rooms/ ${ roomId } /send/m.room.message/ ${ randomString } ` , data , config ) ;
return okMsg ;
} catch ( error ) {
this . throwGeneralAxiosError ( error ) ;
}
}
}
module . exports = Matrix ;
@ -7,7 +7,7 @@ class Mattermost extends NotificationProvider {
name = "mattermost" ;
async send ( notification , msg , monitorJSON = null , heartbeatJSON = null ) {
let okMsg = "Sent Successfully. " ;
let okMsg = "Sent Successfully." ;
try {
const mattermostUserName = notification . mattermostusername || "Uptime Kuma" ;
// If heartbeatJSON is null, assume we're testing.
@ -6,7 +6,7 @@ class Octopush extends NotificationProvider {
name = "octopush" ;
async send ( notification , msg , monitorJSON = null , heartbeatJSON = null ) {
let okMsg = "Sent Successfully. " ;
let okMsg = "Sent Successfully." ;
try {
let config = {
@ -8,7 +8,7 @@ class Pushbullet extends NotificationProvider {
name = "pushbullet" ;
async send ( notification , msg , monitorJSON = null , heartbeatJSON = null ) {
let okMsg = "Sent Successfully. " ;
let okMsg = "Sent Successfully." ;
try {
let pushbulletUrl = "https://api.pushbullet.com/v2/pushes" ;
@ -6,7 +6,7 @@ class Pushover extends NotificationProvider {
name = "pushover" ;
async send ( notification , msg , monitorJSON = null , heartbeatJSON = null ) {
let okMsg = "Sent Successfully. " ;
let okMsg = "Sent Successfully." ;
let pushoverlink = "https://api.pushover.net/1/messages.json"
try {
@ -6,7 +6,7 @@ class Pushy extends NotificationProvider {
name = "pushy" ;
async send ( notification , msg , monitorJSON = null , heartbeatJSON = null ) {
let okMsg = "Sent Successfully. " ;
let okMsg = "Sent Successfully." ;
try {
await axios . post ( ` https://api.pushy.me/push?api_key= ${ notification . pushyAPIKey } ` , {
@ -9,7 +9,7 @@ class RocketChat extends NotificationProvider {
name = "rocket.chat" ;
async send ( notification , msg , monitorJSON = null , heartbeatJSON = null ) {
let okMsg = "Sent Successfully. " ;
let okMsg = "Sent Successfully." ;
try {
if ( heartbeatJSON == null ) {
let data = {
@ -6,7 +6,7 @@ class Signal extends NotificationProvider {
name = "signal" ;
async send ( notification , msg , monitorJSON = null , heartbeatJSON = null ) {
let okMsg = "Sent Successfully. " ;
let okMsg = "Sent Successfully." ;
try {
let data = {
@ -25,7 +25,7 @@ class Slack extends NotificationProvider {
}
async send ( notification , msg , monitorJSON = null , heartbeatJSON = null ) {
let okMsg = "Sent Successfully. " ;
let okMsg = "Sent Successfully." ;
try {
if ( heartbeatJSON == null ) {
let data = {
@ -87,7 +87,7 @@ class Teams extends NotificationProvider {
} ;
async send ( notification , msg , monitorJSON = null , heartbeatJSON = null ) {
let okMsg = "Sent Successfully. " ;
let okMsg = "Sent Successfully." ;
try {
if ( heartbeatJSON == null ) {
@ -6,7 +6,7 @@ class Telegram extends NotificationProvider {
name = "telegram" ;
async send ( notification , msg , monitorJSON = null , heartbeatJSON = null ) {
let okMsg = "Sent Successfully. " ;
let okMsg = "Sent Successfully." ;
try {
await axios . get ( ` https://api.telegram.org/bot ${ notification . telegramBotToken } /sendMessage ` , {
@ -7,7 +7,7 @@ class Webhook extends NotificationProvider {
name = "webhook" ;
async send ( notification , msg , monitorJSON = null , heartbeatJSON = null ) {
let okMsg = "Sent Successfully. " ;
let okMsg = "Sent Successfully." ;
try {
let data = {
@ -5,6 +5,7 @@ const Gotify = require("./notification-providers/gotify");
const Line = require ( "./notification-providers/line" ) ;
const LunaSea = require ( "./notification-providers/lunasea" ) ;
const Mattermost = require ( "./notification-providers/mattermost" ) ;
const Matrix = require ( "./notification-providers/matrix" ) ;
const Octopush = require ( "./notification-providers/octopush" ) ;
const Pushbullet = require ( "./notification-providers/pushbullet" ) ;
const Pushover = require ( "./notification-providers/pushover" ) ;
@ -34,6 +35,7 @@ class Notification {
new Line ( ) ,
new LunaSea ( ) ,
new Mattermost ( ) ,
new Matrix ( ) ,
new Octopush ( ) ,
new Pushbullet ( ) ,
new Pushover ( ) ,
@ -0,0 +1,34 @@
< template >
< div class = "mb-3" >
< label for = "homeserver-url" class = "form-label" > Homeserver URL ( with http ( s ) : / / a n d o p t i o n a l l y p o r t ) < / l a b e l > < s p a n s t y l e = " c o l o r : r e d ; " > < s u p > * < / s u p > < / s p a n >
< input id = "homeserver-url" v-model ="$parent.notification.homeserverUrl" type="text" class="form-control" :required ="true" >
< / div >
< div class = "mb-3" >
< label for = "internal-room-id" class = "form-label" > Internal Room Id < / label > < span style = "color: red;" > < sup > * < / sup > < / span >
< input id = "internal-room-id" v-model ="$parent.notification.internalRoomId" type="text" class="form-control" required="true" >
< / div >
< div class = "mb-3" >
< label for = "access-token" class = "form-label" > Access Token < / label > < span style = "color: red;" > < sup > * < / sup > < / span >
< HiddenInput id = "access-token" v-model ="$parent.notification.accessToken" :required="true" autocomplete="one-time-code" :maxlength ="500" > < / HiddenInput >
< / div >
< div class = "form-text" >
< span style = "color: red;" > < sup > * < / sup > < / span > Required
< p style = "margin-top: 8px;" >
You can find the internal room ID by looking in the advanced section of the room settings in your Matrix client . It should look like ! QMdRCpUIfLwsfjxye6 : home . server .
< / p >
< p style = "margin-top: 8px;" >
It is highly recommended you create a new user and do not use your own Matrix user 's access token as it will allow full access to your account and all the rooms you joined. Instead, create a new user and only invite it to the room that you want to receive the notification in. You can get the access token by running <code>curl -XPOST -d ' { "type" : "m.login.password" , "identifier" : { "user" : "botusername" , "type" : "m.id.user" } , "password" : "passwordforuser" } ' "https://home.server/_matrix/client/r0/login" < / code > .
< / p >
< / div >
< / template >
< script >
import HiddenInput from "../HiddenInput.vue" ;
export default {
components : {
HiddenInput ,
} ,
}
< / script >
@ -15,6 +15,7 @@ import Apprise from "./Apprise.vue";
import Pushbullet from "./Pushbullet.vue" ;
import Line from "./Line.vue" ;
import Mattermost from "./Mattermost.vue" ;
import Matrix from "./Matrix.vue" ;
/ * *
* Manage all notification form .
@ -38,7 +39,8 @@ const NotificationFormList = {
"apprise" : Apprise ,
"pushbullet" : Pushbullet ,
"line" : Line ,
"mattermost" : Mattermost
"mattermost" : Mattermost ,
"matrix" : Matrix ,
}
export default NotificationFormList
@ -240,5 +240,6 @@ export default {
pushbullet : "Pushbullet" ,
line : "Line Messenger" ,
mattermost : "Mattermost" ,
"matrix" : "Matrix" ,
// End notification form
} ;