]> git.basschouten.com Git - openhab-addons.git/blob
d3c2c3dbf3e683e5eada51eef9f548b57818e172
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2024 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
7  * This program and the accompanying materials are made available under the
8  * terms of the Eclipse Public License 2.0 which is available at
9  * http://www.eclipse.org/legal/epl-2.0
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.pushover.internal.actions;
14
15 import static org.openhab.binding.pushover.internal.PushoverBindingConstants.*;
16 import static org.openhab.binding.pushover.internal.connection.PushoverMessageBuilder.*;
17
18 import java.time.Duration;
19
20 import org.eclipse.jdt.annotation.NonNullByDefault;
21 import org.eclipse.jdt.annotation.Nullable;
22 import org.openhab.binding.pushover.internal.connection.PushoverMessageBuilder;
23 import org.openhab.binding.pushover.internal.handler.PushoverAccountHandler;
24 import org.openhab.core.automation.annotation.ActionInput;
25 import org.openhab.core.automation.annotation.ActionOutput;
26 import org.openhab.core.automation.annotation.RuleAction;
27 import org.openhab.core.thing.binding.ThingActions;
28 import org.openhab.core.thing.binding.ThingActionsScope;
29 import org.openhab.core.thing.binding.ThingHandler;
30 import org.osgi.service.component.annotations.Component;
31 import org.osgi.service.component.annotations.ServiceScope;
32 import org.slf4j.Logger;
33 import org.slf4j.LoggerFactory;
34
35 /**
36  * Some automation actions to be used with a {@link PushoverAccountHandler}.
37  *
38  * @author Christoph Weitkamp - Initial contribution
39  * @author Jacob Laursen - Added support for Expiring Messages
40  */
41 @Component(scope = ServiceScope.PROTOTYPE, service = PushoverActions.class)
42 @ThingActionsScope(name = "pushover")
43 @NonNullByDefault
44 public class PushoverActions implements ThingActions {
45
46     private static final String DEFAULT_EMERGENCY_PRIORITY = "2";
47
48     private final Logger logger = LoggerFactory.getLogger(PushoverActions.class);
49
50     private @NonNullByDefault({}) PushoverAccountHandler accountHandler;
51
52     @RuleAction(label = "@text/sendMessageActionLabel", description = "@text/sendMessageActionDescription")
53     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMessage(
54             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
55             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
56             @ActionInput(name = "sound", label = "@text/sendMessageActionInputSoundLabel", description = "@text/sendMessageActionInputSoundDescription", type = "java.lang.String", defaultValue = DEFAULT_SOUND) @Nullable String sound,
57             @ActionInput(name = "url", label = "@text/sendMessageActionInputURLLabel", description = "@text/sendMessageActionInputURLDescription", type = "java.lang.String") @Nullable String url,
58             @ActionInput(name = "urlTitle", label = "@text/sendMessageActionInputURLTitleLabel", description = "@text/sendMessageActionInputURLTitleDescription", type = "java.lang.String") @Nullable String urlTitle,
59             @ActionInput(name = "attachment", label = "@text/sendMessageActionInputAttachmentLabel", description = "@text/sendMessageActionInputAttachmentDescription", type = "java.lang.String") @Nullable String attachment,
60             @ActionInput(name = "contentType", label = "@text/sendMessageActionInputContentTypeLabel", description = "@text/sendMessageActionInputContentTypeDescription", type = "java.lang.String", defaultValue = DEFAULT_CONTENT_TYPE) @Nullable String contentType,
61             @ActionInput(name = "priority", label = "@text/sendMessageActionInputPriorityLabel", description = "@text/sendMessageActionInputPriorityDescription", type = "java.lang.Integer", defaultValue = DEFAULT_EMERGENCY_PRIORITY) @Nullable Integer priority,
62             @ActionInput(name = "device", label = "@text/sendMessageActionInputDeviceLabel", description = "@text/sendMessageActionInputDeviceDescription", type = "java.lang.String") @Nullable String device,
63             @ActionInput(name = "ttl", label = "@text/sendMessageActionInputTTLLabel", description = "@text/sendMessageActionInputTTLDescription", type = "java.time.Duration") @Nullable Duration ttl) {
64         logger.trace(
65                 "ThingAction 'sendMessage' called with value(s): message='{}', title='{}', sound='{}', url='{}', urlTitle='{}', attachment='{}', contentType='{}', priority='{}', device='{}'",
66                 message, title, sound, url, urlTitle, attachment, contentType, priority, device);
67
68         PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message);
69         // add sound, if defined
70         if (sound != null && !DEFAULT_SOUND.equals(sound)) {
71             builder.withSound(sound);
72         }
73         if (url != null) {
74             builder.withUrl(url);
75             if (urlTitle != null) {
76                 builder.withUrlTitle(urlTitle);
77             }
78         }
79         if (attachment != null) {
80             builder.withAttachment(attachment);
81             if (contentType != null) {
82                 builder.withContentType(contentType);
83             }
84         }
85         if (priority != null) {
86             builder.withPriority(priority.intValue());
87         }
88         if (device != null) {
89             builder.withDevice(device);
90         }
91         if (ttl != null) {
92             builder.withTTL(ttl);
93         }
94         return send(builder, title);
95     }
96
97     public static Boolean sendMessage(ThingActions actions, String message, @Nullable String title,
98             @Nullable String sound, @Nullable String url, @Nullable String urlTitle, @Nullable String attachment,
99             @Nullable String contentType, @Nullable Integer priority, @Nullable String device, @Nullable Duration ttl) {
100         return ((PushoverActions) actions).sendMessage(message, title, sound, url, urlTitle, attachment, contentType,
101                 priority, device, ttl);
102     }
103
104     @RuleAction(label = "@text/sendMessageActionLabel", description = "@text/sendMessageActionDescription")
105     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMessage(
106             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message) {
107         logger.trace("ThingAction 'sendMessage' called with value(s): message='{}'", message);
108         return send(getDefaultPushoverMessageBuilder(message), null);
109     }
110
111     public static Boolean sendMessage(ThingActions actions, String message) {
112         return ((PushoverActions) actions).sendMessage(message);
113     }
114
115     @RuleAction(label = "@text/sendMessageActionLabel", description = "@text/sendMessageActionDescription")
116     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMessage(
117             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
118             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title) {
119         logger.trace("ThingAction 'sendMessage' called with value(s): message='{}', title='{}'", message, title);
120         return send(getDefaultPushoverMessageBuilder(message), title);
121     }
122
123     public static Boolean sendMessage(ThingActions actions, String message, @Nullable String title) {
124         return ((PushoverActions) actions).sendMessage(message, title);
125     }
126
127     @RuleAction(label = "@text/sendMessageActionLabel", description = "@text/sendMessageActionDescription")
128     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMessage(
129             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
130             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
131             @ActionInput(name = "ttl", label = "@text/sendMessageActionInputTTLLabel", description = "@text/sendMessageActionInputTTLDescription", type = "java.time.Duration") @Nullable Duration ttl) {
132         logger.trace("ThingAction 'sendMessage' called with value(s): message='{}', title='{}', ttl='{}'", message,
133                 title, ttl);
134         PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message);
135         if (ttl != null) {
136             builder.withTTL(ttl);
137         }
138         return send(builder, title);
139     }
140
141     public static Boolean sendMessage(ThingActions actions, String message, @Nullable String title,
142             @Nullable Duration ttl) {
143         return ((PushoverActions) actions).sendMessage(message, title, ttl);
144     }
145
146     @RuleAction(label = "@text/sendURLMessageActionLabel", description = "@text/sendURLMessageActionDescription")
147     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendURLMessage(
148             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
149             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
150             @ActionInput(name = "url", label = "@text/sendMessageActionInputURLLabel", description = "@text/sendMessageActionInputURLDescription", type = "java.lang.String", required = true) @Nullable String url,
151             @ActionInput(name = "urlTitle", label = "@text/sendMessageActionInputURLTitleLabel", description = "@text/sendMessageActionInputURLTitleDescription", type = "java.lang.String") @Nullable String urlTitle) {
152         logger.trace(
153                 "ThingAction 'sendURLMessage' called with value(s): message='{}', url='{}', title='{}', urlTitle='{}'",
154                 message, url, title, urlTitle);
155         if (url == null) {
156             throw new IllegalArgumentException("Skip sending message as 'url' is null.");
157         }
158
159         PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message).withUrl(url);
160         if (urlTitle != null) {
161             builder.withUrl(urlTitle);
162         }
163         return send(builder, title);
164     }
165
166     public static Boolean sendURLMessage(ThingActions actions, String message, @Nullable String title, String url,
167             @Nullable String urlTitle) {
168         return ((PushoverActions) actions).sendURLMessage(message, title, url, urlTitle);
169     }
170
171     @RuleAction(label = "@text/sendURLMessageActionLabel", description = "@text/sendURLMessageActionDescription")
172     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendURLMessage(
173             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
174             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
175             @ActionInput(name = "url", label = "@text/sendMessageActionInputURLLabel", description = "@text/sendMessageActionInputURLDescription", type = "java.lang.String", required = true) @Nullable String url,
176             @ActionInput(name = "urlTitle", label = "@text/sendMessageActionInputURLTitleLabel", description = "@text/sendMessageActionInputURLTitleDescription", type = "java.lang.String") @Nullable String urlTitle,
177             @ActionInput(name = "ttl", label = "@text/sendMessageActionInputTTLLabel", description = "@text/sendMessageActionInputTTLDescription", type = "java.time.Duration") @Nullable Duration ttl) {
178         logger.trace(
179                 "ThingAction 'sendURLMessage' called with value(s): message='{}', url='{}', title='{}', urlTitle='{}', ttl='{}'",
180                 message, url, title, urlTitle, ttl);
181         if (url == null) {
182             throw new IllegalArgumentException("Skip sending message as 'url' is null.");
183         }
184
185         PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message).withUrl(url);
186         if (urlTitle != null) {
187             builder.withUrl(urlTitle);
188         }
189         if (ttl != null) {
190             builder.withTTL(ttl);
191         }
192         return send(builder, title);
193     }
194
195     public static Boolean sendURLMessage(ThingActions actions, String message, @Nullable String title, String url,
196             @Nullable String urlTitle, @Nullable Duration ttl) {
197         return ((PushoverActions) actions).sendURLMessage(message, title, url, urlTitle, ttl);
198     }
199
200     @RuleAction(label = "@text/sendHTMLMessageActionLabel", description = "@text/sendHTMLMessageActionDescription")
201     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendHtmlMessage(
202             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
203             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title) {
204         logger.trace("ThingAction 'sendHtmlMessage' called with value(s): message='{}', title='{}'", message, title);
205         return send(getDefaultPushoverMessageBuilder(message).withHtmlFormatting(), title);
206     }
207
208     public static Boolean sendHtmlMessage(ThingActions actions, String message, @Nullable String title) {
209         return ((PushoverActions) actions).sendHtmlMessage(message, title);
210     }
211
212     @RuleAction(label = "@text/sendHTMLMessageActionLabel", description = "@text/sendHTMLMessageActionDescription")
213     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendHtmlMessage(
214             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
215             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
216             @ActionInput(name = "ttl", label = "@text/sendMessageActionInputTTLLabel", description = "@text/sendMessageActionInputTTLDescription", type = "java.time.Duration") @Nullable Duration ttl) {
217         logger.trace("ThingAction 'sendHtmlMessage' called with value(s): message='{}', title='{}', ttl='{}'", message,
218                 title, ttl);
219         PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message).withHtmlFormatting();
220         if (ttl != null) {
221             builder.withTTL(ttl);
222         }
223         return send(builder, title);
224     }
225
226     public static Boolean sendHtmlMessage(ThingActions actions, String message, @Nullable String title,
227             @Nullable Duration ttl) {
228         return ((PushoverActions) actions).sendHtmlMessage(message, title, ttl);
229     }
230
231     @RuleAction(label = "@text/sendMonospaceMessageActionLabel", description = "@text/sendMonospaceMessageActionDescription")
232     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMonospaceMessage(
233             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
234             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title) {
235         logger.trace("ThingAction 'sendMonospaceMessage' called with value(s): message='{}', title='{}'", message,
236                 title);
237         return send(getDefaultPushoverMessageBuilder(message).withMonospaceFormatting(), title);
238     }
239
240     public static Boolean sendMonospaceMessage(ThingActions actions, String message, @Nullable String title) {
241         return ((PushoverActions) actions).sendMonospaceMessage(message, title);
242     }
243
244     @RuleAction(label = "@text/sendMonospaceMessageActionLabel", description = "@text/sendMonospaceMessageActionDescription")
245     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMonospaceMessage(
246             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
247             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
248             @ActionInput(name = "ttl", label = "@text/sendMessageActionInputTTLLabel", description = "@text/sendMessageActionInputTTLDescription", type = "java.time.Duration") @Nullable Duration ttl) {
249         logger.trace("ThingAction 'sendMonospaceMessage' called with value(s): message='{}', title='{}', ttl='{}'",
250                 message, title, ttl);
251         PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message).withMonospaceFormatting();
252         if (ttl != null) {
253             builder.withTTL(ttl);
254         }
255         return send(builder, title);
256     }
257
258     public static Boolean sendMonospaceMessage(ThingActions actions, String message, @Nullable String title,
259             @Nullable Duration ttl) {
260         return ((PushoverActions) actions).sendMonospaceMessage(message, title, ttl);
261     }
262
263     @RuleAction(label = "@text/sendAttachmentMessageActionLabel", description = "@text/sendAttachmentMessageActionDescription")
264     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendAttachmentMessage(
265             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
266             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
267             @ActionInput(name = "attachment", label = "@text/sendMessageActionInputAttachmentLabel", description = "@text/sendMessageActionInputAttachmentDescription", type = "java.lang.String", required = true) @Nullable String attachment,
268             @ActionInput(name = "contentType", label = "@text/sendMessageActionInputContentTypeLabel", description = "@text/sendMessageActionInputContentTypeDescription", type = "java.lang.String", defaultValue = DEFAULT_CONTENT_TYPE) @Nullable String contentType) {
269         logger.trace(
270                 "ThingAction 'sendAttachmentMessage' called with value(s): message='{}', title='{}', attachment='{}', contentType='{}'",
271                 message, title, attachment, contentType);
272         if (attachment == null) {
273             throw new IllegalArgumentException("Skip sending message as 'attachment' is null.");
274         }
275
276         PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message).withAttachment(attachment);
277         if (contentType != null) {
278             builder.withContentType(contentType);
279         }
280         return send(builder, title);
281     }
282
283     public static Boolean sendAttachmentMessage(ThingActions actions, String message, @Nullable String title,
284             String attachment, @Nullable String contentType) {
285         return ((PushoverActions) actions).sendAttachmentMessage(message, title, attachment, contentType);
286     }
287
288     @RuleAction(label = "@text/sendAttachmentMessageActionLabel", description = "@text/sendAttachmentMessageActionDescription")
289     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendAttachmentMessage(
290             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
291             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
292             @ActionInput(name = "attachment", label = "@text/sendMessageActionInputAttachmentLabel", description = "@text/sendMessageActionInputAttachmentDescription", type = "java.lang.String", required = true) @Nullable String attachment,
293             @ActionInput(name = "contentType", label = "@text/sendMessageActionInputContentTypeLabel", description = "@text/sendMessageActionInputContentTypeDescription", type = "java.lang.String", defaultValue = DEFAULT_CONTENT_TYPE) @Nullable String contentType,
294             @ActionInput(name = "ttl", label = "@text/sendMessageActionInputTTLLabel", description = "@text/sendMessageActionInputTTLDescription", type = "java.time.Duration") @Nullable Duration ttl) {
295         logger.trace(
296                 "ThingAction 'sendAttachmentMessage' called with value(s): message='{}', title='{}', attachment='{}', contentType='{}', ttl='{}'",
297                 message, title, attachment, contentType, ttl);
298         if (attachment == null) {
299             throw new IllegalArgumentException("Skip sending message as 'attachment' is null.");
300         }
301
302         PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message).withAttachment(attachment);
303         if (contentType != null) {
304             builder.withContentType(contentType);
305         }
306         if (ttl != null) {
307             builder.withTTL(ttl);
308         }
309         return send(builder, title);
310     }
311
312     public static Boolean sendAttachmentMessage(ThingActions actions, String message, @Nullable String title,
313             String attachment, @Nullable String contentType, @Nullable Duration ttl) {
314         return ((PushoverActions) actions).sendAttachmentMessage(message, title, attachment, contentType, ttl);
315     }
316
317     @RuleAction(label = "@text/sendPriorityMessageActionLabel", description = "@text/sendPriorityMessageActionDescription")
318     public @ActionOutput(name = "receipt", label = "@text/sendPriorityMessageActionOutputLabel", description = "@text/sendPriorityMessageActionOutputDescription", type = "java.lang.String") String sendPriorityMessage(
319             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
320             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
321             @ActionInput(name = "priority", label = "@text/sendMessageActionInputPriorityLabel", description = "@text/sendMessageActionInputPriorityDescription", type = "java.lang.Integer", defaultValue = DEFAULT_EMERGENCY_PRIORITY) @Nullable Integer priority) {
322         logger.trace("ThingAction 'sendPriorityMessage' called with value(s): message='{}', title='{}', priority='{}'",
323                 message, title, priority);
324         PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message)
325                 .withPriority(priority == null ? EMERGENCY_PRIORITY : priority.intValue());
326
327         if (title != null) {
328             builder.withTitle(title);
329         }
330         return accountHandler.sendPriorityMessage(builder);
331     }
332
333     public static String sendPriorityMessage(ThingActions actions, String message, @Nullable String title,
334             @Nullable Integer priority) {
335         return ((PushoverActions) actions).sendPriorityMessage(message, title, priority);
336     }
337
338     @RuleAction(label = "@text/cancelPriorityMessageActionLabel", description = "@text/cancelPriorityMessageActionDescription")
339     public @ActionOutput(name = "canceled", label = "@text/cancelPriorityMessageActionOutputLabel", description = "@text/cancelPriorityMessageActionOutputDescription", type = "java.lang.Boolean") Boolean cancelPriorityMessage(
340             @ActionInput(name = "receipt", label = "@text/cancelPriorityMessageActionInputReceiptLabel", description = "@text/cancelPriorityMessageActionInputReceiptDescription", type = "java.lang.String", required = true) @Nullable String receipt) {
341         logger.trace("ThingAction 'cancelPriorityMessage' called with value(s): '{}'", receipt);
342         if (accountHandler == null) {
343             throw new IllegalStateException("PushoverAccountHandler is null!");
344         }
345
346         if (receipt == null) {
347             throw new IllegalArgumentException("Skip canceling message as 'receipt' is null.");
348         }
349
350         return accountHandler.cancelPriorityMessage(receipt);
351     }
352
353     public static Boolean cancelPriorityMessage(ThingActions actions, String receipt) {
354         return ((PushoverActions) actions).cancelPriorityMessage(receipt);
355     }
356
357     @RuleAction(label = "@text/sendMessageToDeviceActionLabel", description = "@text/sendMessageToDeviceActionDescription")
358     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMessageToDevice(
359             @ActionInput(name = "device", label = "@text/sendMessageActionInputDeviceLabel", description = "@text/sendMessageActionInputDeviceDescription", type = "java.lang.String", required = true) @Nullable String device,
360             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
361             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title) {
362         logger.trace("ThingAction 'sendMessageToDevice' called with value(s): device='{}', message='{}', title='{}'",
363                 device, message, title);
364         if (device == null) {
365             throw new IllegalArgumentException("Skip sending message as 'device' is null.");
366         }
367
368         return send(getDefaultPushoverMessageBuilder(message).withDevice(device), title);
369     }
370
371     public static Boolean sendMessageToDevice(ThingActions actions, String device, String message,
372             @Nullable String title) {
373         return ((PushoverActions) actions).sendMessageToDevice(device, message, title);
374     }
375
376     @RuleAction(label = "@text/sendMessageToDeviceActionLabel", description = "@text/sendMessageToDeviceActionDescription")
377     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMessageToDevice(
378             @ActionInput(name = "device", label = "@text/sendMessageActionInputDeviceLabel", description = "@text/sendMessageActionInputDeviceDescription", type = "java.lang.String", required = true) @Nullable String device,
379             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
380             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
381             @ActionInput(name = "ttl", label = "@text/sendMessageActionInputTTLLabel", description = "@text/sendMessageActionInputTTLDescription", type = "java.time.Duration") @Nullable Duration ttl) {
382         logger.trace(
383                 "ThingAction 'sendMessageToDevice' called with value(s): device='{}', message='{}', title='{}', ttl='{}'",
384                 device, message, title, ttl);
385         if (device == null) {
386             throw new IllegalArgumentException("Skip sending message as 'device' is null.");
387         }
388         PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message).withDevice(device);
389         if (ttl != null) {
390             builder.withTTL(ttl);
391         }
392
393         return send(builder, title);
394     }
395
396     public static Boolean sendMessageToDevice(ThingActions actions, String device, String message,
397             @Nullable String title, @Nullable Duration ttl) {
398         return ((PushoverActions) actions).sendMessageToDevice(device, message, title, ttl);
399     }
400
401     private PushoverMessageBuilder getDefaultPushoverMessageBuilder(@Nullable String message) {
402         if (accountHandler == null) {
403             throw new IllegalStateException("PushoverAccountHandler is null!");
404         }
405
406         if (message == null) {
407             throw new IllegalArgumentException("Skip sending message as 'message' is null.");
408         }
409
410         return accountHandler.getDefaultPushoverMessageBuilder(message);
411     }
412
413     private Boolean send(PushoverMessageBuilder builder, @Nullable String title) {
414         if (title != null) {
415             builder.withTitle(title);
416         }
417         return accountHandler.sendMessage(builder);
418     }
419
420     @Override
421     public void setThingHandler(@Nullable ThingHandler handler) {
422         this.accountHandler = (PushoverAccountHandler) handler;
423     }
424
425     @Override
426     public @Nullable ThingHandler getThingHandler() {
427         return accountHandler;
428     }
429 }