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