Switch to numeric urgency

This commit is contained in:
niten 2023-05-18 13:44:44 -07:00
parent fa9553ec83
commit db1f07d9f0
2 changed files with 23 additions and 11 deletions

View File

@ -19,7 +19,10 @@
[nil "--mqtt-user USER" "User as which to connect to MQTT server."] [nil "--mqtt-user USER" "User as which to connect to MQTT server."]
[nil "--mqtt-password-file PASSWD_FILE" "File containing password for MQTT user."] [nil "--mqtt-password-file PASSWD_FILE" "File containing password for MQTT user."]
[nil "--notification-topic TOPIC" "MQTT topic to which events should be published."]]) [nil "--notification-topic TOPIC" "MQTT topic to which events should be published."]
[nil "--urgency-threshold THRESHOLD" "Minimum urgency at which to send notification (0 is least and 10 is most)"
:parse-fn #(Integer/parseInt %)
:default 5]])
(defn- msg-quit [status msg] (defn- msg-quit [status msg]
(println msg) (println msg)
@ -42,10 +45,10 @@
(update result :errors concat missing-errors))) (update result :errors concat missing-errors)))
(defn -main [& args] (defn -main [& args]
(let [required-args #{:mqtt-host :mqtt-port :app-name :notification-topic} (let [required-args #{:mqtt-host :mqtt-port :app-name :notification-topic :urgency-threshold}
{:keys [options _ errors summary]} (parse-opts args required-args cli-opts)] {:keys [options _ errors summary]} (parse-opts args required-args cli-opts)]
(when (seq errors) (msg-quit 1 (usage summary errors))) (when (seq errors) (msg-quit 1 (usage summary errors)))
(let [{:keys [mqtt-host mqtt-port mqtt-user mqtt-password-file app-name notification-topic]} options (let [{:keys [mqtt-host mqtt-port mqtt-user mqtt-password-file app-name notification-topic urgency-threshold]} options
catch-shutdown (async/chan) catch-shutdown (async/chan)
mqtt-client (if mqtt-user mqtt-client (if mqtt-user
(mqtt/connect-json! :host mqtt-host (mqtt/connect-json! :host mqtt-host
@ -56,10 +59,11 @@
(str/trim))) (str/trim)))
(mqtt/connect-json! :host mqtt-host :port mqtt-port)) (mqtt/connect-json! :host mqtt-host :port mqtt-port))
logger (log/print-logger)] logger (log/print-logger)]
(tattler/listen! :app app-name (tattler/listen! :app app-name
:mqtt-client mqtt-client :mqtt-client mqtt-client
:topic notification-topic :topic notification-topic
:logger logger) :urgency-threshold urgency-threshold
:logger logger)
(.addShutdownHook (Runtime/getRuntime) (.addShutdownHook (Runtime/getRuntime)
(Thread. (fn [] (>!! catch-shutdown true)))) (Thread. (fn [] (>!! catch-shutdown true))))
(<!! catch-shutdown) (<!! catch-shutdown)

View File

@ -17,15 +17,23 @@
(t/schema [:map (t/schema [:map
[:summary (sized-string 1 80)] [:summary (sized-string 1 80)]
[:body (sized-string 1 256)] [:body (sized-string 1 256)]
[:urgency {:optional true} [:enum "low" "medium" "high"]]])) [:urgency [:and :int [:>= 0] [:<= 10]]]]))
(defn listen! [& {app :app mqtt-client :mqtt-client topic :topic logger :logger}] (defn listen! [& {app :app mqtt-client
:mqtt-client topic
:topic logger
:logger urgency-threshold
:urgency-threshold}]
(let [note-chan (mqtt/subscribe! mqtt-client topic)] (let [note-chan (mqtt/subscribe! mqtt-client topic)]
(go-loop [note-msg (<! note-chan)] (go-loop [note-msg (<! note-chan)]
(if note-msg (if note-msg
(let [note (-> note-msg :payload (update :urgency keyword))] (let [note (:payload note-msg)]
(if (t/validate Notification note) (if (t/validate Notification note)
(notify/send-notification! mqtt-client (assoc note :app app)) (when (>= (:urgency note) urgency-threshold)
(notify/send-notification! mqtt-client (assoc note :app app))
(log/info! logger (format "ignoring low-urgency message (%s): %s"
(:urgency note)
(:summary note))))
(let [err (humanize (t/explain Notification note))] (let [err (humanize (t/explain Notification note))]
(log/error! logger (format "rejecting invalid notification: %s (%s)\n%s" (log/error! logger (format "rejecting invalid notification: %s (%s)\n%s"
(:summary err) (:body err) (:summary err) (:body err)