4 changed files with 109 additions and 1 deletions
			
			
		| @ -0,0 +1,89 @@ | |||
| //
 | |||
| //  bark.js
 | |||
| //  UptimeKuma
 | |||
| //
 | |||
| //  Created by Lakr Aream on 2021/10/24.
 | |||
| //  Copyright © 2021 Lakr Aream. All rights reserved.
 | |||
| //
 | |||
| 
 | |||
| const NotificationProvider = require("./notification-provider"); | |||
| const { DOWN, UP } = require("../../src/util"); | |||
| const { default: axios } = require("axios"); | |||
| 
 | |||
| // bark is an APN bridge that sends notifications to Apple devices.
 | |||
| 
 | |||
| const barkNotificationGroup = "UptimeKuma"; | |||
| const barkNotificationAvatar = "https://github.com/louislam/uptime-kuma/raw/master/public/icon.png"; | |||
| const barkNotificationSound = "telegraph"; | |||
| const successMessage = "Successes!"; | |||
| 
 | |||
| class Bark extends NotificationProvider { | |||
|     name = "Bark"; | |||
| 
 | |||
|     async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { | |||
|         try { | |||
|             var barkEndpoint = notification.barkEndpoint; | |||
| 
 | |||
|             // check if the endpoint has a "/" suffix, if so, delete it first
 | |||
|             if (barkEndpoint.endsWith("/")) { | |||
|                 barkEndpoint = barkEndpoint.substring(0, barkEndpoint.length - 1); | |||
|             } | |||
| 
 | |||
|             if (msg != null && heartbeatJSON != null && heartbeatJSON["status"] == UP) { | |||
|                 let title = "UptimeKuma Monitor Up"; | |||
|                 return await this.postNotification(title, msg, barkEndpoint); | |||
|             } | |||
| 
 | |||
|             if (msg != null && heartbeatJSON != null && heartbeatJSON["status"] == DOWN) { | |||
|                 let title = "UptimeKuma Monitor Down"; | |||
|                 return await this.postNotification(title, msg, barkEndpoint); | |||
|             } | |||
| 
 | |||
|             if (msg != null) { | |||
|                 let title = "UptimeKuma Message"; | |||
|                 return await this.postNotification(title, msg, barkEndpoint); | |||
|             } | |||
| 
 | |||
|         } catch (error) { | |||
|             throw error; | |||
|         } | |||
|     } | |||
| 
 | |||
|     // add additional parameter for better on device styles (iOS 15 optimized)
 | |||
|     appendAdditionalParameters(postUrl) { | |||
|         // grouping all our notifications
 | |||
|         postUrl += "?group=" + barkNotificationGroup; | |||
|         // set icon to uptime kuma icon, 11kb should be fine
 | |||
|         postUrl += "&icon=" + barkNotificationAvatar; | |||
|         // picked a sound, this should follow system's mute status when arrival
 | |||
|         postUrl += "&sound=" + barkNotificationSound; | |||
|         return postUrl; | |||
|     } | |||
| 
 | |||
|     // thrown if failed to check result, result code should be in range 2xx
 | |||
|     checkResult(result) { | |||
|         if (result.status == null) { | |||
|             throw new Error("Bark notification failed with invalid response!"); | |||
|         } | |||
|         if (result.status < 200 || result.status >= 300) { | |||
|             throw new Error("Bark notification failed with status code " + result.status); | |||
|         } | |||
|     } | |||
| 
 | |||
|     async postNotification(title, subtitle, endpoint) { | |||
|         // url encode title and subtitle
 | |||
|         title = encodeURIComponent(title); | |||
|         subtitle = encodeURIComponent(subtitle); | |||
|         let postUrl = endpoint + "/" + title + "/" + subtitle; | |||
|         postUrl = this.appendAdditionalParameters(postUrl); | |||
|         let result = await axios.get(postUrl); | |||
|         this.checkResult(result); | |||
|         if (result.statusText != null) { | |||
|             return "Bark notification succeed: " + result.statusText; | |||
|         } | |||
|         // because returned in range 200 ..< 300
 | |||
|         return successMessage; | |||
|     } | |||
| } | |||
| 
 | |||
| module.exports = Bark; | |||
| @ -0,0 +1,15 @@ | |||
| <template> | |||
|     <div class="mb-3"> | |||
|         <label for="Bark Endpoint" class="form-label">{{ $t("Bark Endpoint") }}<span style="color: red;"><sup>*</sup></span></label> | |||
|         <input id="Bark Endpoint" v-model="$parent.notification.barkEndpoint" type="text" class="form-control" required> | |||
|         <div class="form-text"> | |||
|             <p><span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}</p> | |||
|         </div> | |||
|         <i18n-t tag="div" keypath="wayToGetTeamsURL" class="form-text"> | |||
|             <a | |||
|                 href="https://github.com/Finb/Bark" | |||
|                 target="_blank" | |||
|             >{{ $t("here") }}</a> | |||
|         </i18n-t> | |||
|     </div> | |||
| </template> | |||
					Loading…
					
					
				
		Reference in new issue