1import { postText } from "../util/http.js";
2import { replaceVariables } from "../util/helpers.js";
3
4const defaults = {
5 finished: "A speedtest is finished:\nPing: %ping% ms (±%jitter% ms)\nUpload: %upload% Mbps\nDownload: %download% Mbps",
6 failed: "A speedtest has failed. Reason: %error%"
7};
8
9const buildHeaders = ({token, title, tags}, priority) => {
10 const headers = {};
11 if (priority) headers["Priority"] = String(parseInt(priority));
12 if (title) headers["Title"] = title;
13 if (tags) headers["Tags"] = tags;
14 if (token) headers["Authorization"] = "Bearer " + token;
15 return headers;
16};
17
18const send = (config, message, priority, activity) => {
19 const url = config.url.replace(/\/+$/, "");
20 return postText(`${url}/${config.topic}`, message,
21 {headers: buildHeaders(config, priority), activity});
22};
23
24export default (registerEvent) => {
25 registerEvent('testFinished', async ({data: c}, data, activity) => {
26 if (c.send_finished) await send(c,
27 replaceVariables(c.finished_message || defaults.finished, data),
28 c.priority || 3, activity);
29 });
30
31 registerEvent('testFailed', async ({data: c}, error, activity) => {
32 if (c.send_failed) await send(c,
33 replaceVariables(c.error_message || defaults.failed, {error}),
34 c.error_priority || 5, activity);
35 });
36
37 return {
38 icon: "fa-solid fa-bell-concierge",
39 fields: [
40 {name: "url", type: "text", required: true, regex: /^https?:\/\/.+/},
41 {name: "topic", type: "text", required: true, regex: /^[A-Za-z0-9_\-]{1,64}$/},
42 {name: "token", type: "text", required: false},
43 {name: "title", type: "text", required: false},
44 {name: "tags", type: "text", required: false},
45 {name: "priority", type: "text", required: false, regex: /^[1-5]$/},
46 {name: "error_priority", type: "text", required: false, regex: /^[1-5]$/},
47 {name: "send_finished", type: "boolean", required: false},
48 {name: "finished_message", type: "textarea", required: false},
49 {name: "send_failed", type: "boolean", required: false},
50 {name: "error_message", type: "textarea", required: false}
51 ]
52 };
53};
54