From 64c7d950c517caea600e86c5406cf47ff5886e88 Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Sun, 31 Aug 2025 00:05:10 +0200 Subject: [PATCH] Make it possible to send notifications from lua --- automation_lib/src/lua/traits.rs | 6 +++++ automation_lib/src/ntfy.rs | 38 +++++++++++++++++++++++++------- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/automation_lib/src/lua/traits.rs b/automation_lib/src/lua/traits.rs index cb191d0..69abcc3 100644 --- a/automation_lib/src/lua/traits.rs +++ b/automation_lib/src/lua/traits.rs @@ -81,3 +81,9 @@ pub trait OpenClose { } } impl OpenClose for T where T: google_home::traits::OpenClose {} + +pub trait AddAdditionalMethods { + fn add_methods>(methods: &mut M) + where + Self: Sized + 'static; +} diff --git a/automation_lib/src/ntfy.rs b/automation_lib/src/ntfy.rs index a27c8a2..443f5f9 100644 --- a/automation_lib/src/ntfy.rs +++ b/automation_lib/src/ntfy.rs @@ -3,15 +3,18 @@ use std::convert::Infallible; use async_trait::async_trait; use automation_macro::{LuaDevice, LuaDeviceConfig}; -use serde::Serialize; +use mlua::LuaSerdeExt; +use serde::{Deserialize, Serialize}; use serde_repr::*; use tracing::{error, trace, warn}; use crate::device::{Device, LuaDeviceCreate}; use crate::event::{self, Event, EventChannel, OnNotification, OnPresence}; +use crate::lua::traits::AddAdditionalMethods; -#[derive(Debug, Serialize_repr, Clone, Copy)] +#[derive(Debug, Serialize_repr, Deserialize, Clone, Copy)] #[repr(u8)] +#[serde(rename_all = "snake_case")] pub enum Priority { Min = 1, Low, @@ -20,7 +23,7 @@ pub enum Priority { Max, } -#[derive(Debug, Serialize, Clone)] +#[derive(Debug, Serialize, Deserialize, Clone)] #[serde(rename_all = "snake_case", tag = "action")] pub enum ActionType { Broadcast { @@ -31,7 +34,7 @@ pub enum ActionType { // Http } -#[derive(Debug, Serialize, Clone)] +#[derive(Debug, Serialize, Deserialize, Clone)] pub struct Action { #[serde(flatten)] pub action: ActionType, @@ -39,24 +42,24 @@ pub struct Action { pub clear: Option, } -#[derive(Serialize)] +#[derive(Serialize, Deserialize)] struct NotificationFinal { topic: String, #[serde(flatten)] inner: Notification, } -#[derive(Debug, Serialize, Clone)] +#[derive(Debug, Serialize, Clone, Deserialize)] pub struct Notification { #[serde(skip_serializing_if = "Option::is_none")] title: Option, #[serde(skip_serializing_if = "Option::is_none")] message: Option, - #[serde(skip_serializing_if = "Vec::is_empty")] + #[serde(skip_serializing_if = "Vec::is_empty", default = "Default::default")] tags: Vec, #[serde(skip_serializing_if = "Option::is_none")] priority: Option, - #[serde(skip_serializing_if = "Vec::is_empty")] + #[serde(skip_serializing_if = "Vec::is_empty", default = "Default::default")] actions: Vec, } @@ -120,6 +123,7 @@ pub struct Config { } #[derive(Debug, Clone, LuaDevice)] +#[traits(crate::lua::traits::AddAdditionalMethods)] pub struct Ntfy { config: Config, } @@ -205,3 +209,21 @@ impl OnNotification for Ntfy { self.send(notification).await; } } + +impl AddAdditionalMethods for Ntfy { + fn add_methods>(methods: &mut M) + where + Self: Sized + 'static, + { + methods.add_async_method( + "send_notification", + |lua, this, notification: mlua::Value| async move { + let notification: Notification = lua.from_value(notification)?; + + this.send(notification).await; + + Ok(()) + }, + ); + } +}