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