]> git.basschouten.com Git - openhab-addons.git/blob
133c09c3004003a0e167f120dee56489ea9d6eba
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 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 org.eclipse.jdt.annotation.NonNullByDefault;
19 import org.eclipse.jdt.annotation.Nullable;
20 import org.openhab.binding.pushover.internal.connection.PushoverMessageBuilder;
21 import org.openhab.binding.pushover.internal.handler.PushoverAccountHandler;
22 import org.openhab.core.automation.annotation.ActionInput;
23 import org.openhab.core.automation.annotation.ActionOutput;
24 import org.openhab.core.automation.annotation.RuleAction;
25 import org.openhab.core.thing.binding.ThingActions;
26 import org.openhab.core.thing.binding.ThingActionsScope;
27 import org.openhab.core.thing.binding.ThingHandler;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
30
31 /**
32  * Some automation actions to be used with a {@link PushoverAccountHandler}.
33  *
34  * @author Christoph Weitkamp - Initial contribution
35  */
36 @ThingActionsScope(name = "pushover")
37 @NonNullByDefault
38 public class PushoverActions implements ThingActions {
39
40     private static final String DEFAULT_EMERGENCY_PRIORITY = "2";
41
42     private final Logger logger = LoggerFactory.getLogger(PushoverActions.class);
43
44     private @NonNullByDefault({}) PushoverAccountHandler accountHandler;
45
46     @RuleAction(label = "@text/sendMessageActionLabel", description = "@text/sendMessageActionDescription")
47     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMessage(
48             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
49             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
50             @ActionInput(name = "sound", label = "@text/sendMessageActionInputSoundLabel", description = "@text/sendMessageActionInputSoundDescription", type = "java.lang.String", defaultValue = DEFAULT_SOUND) @Nullable String sound,
51             @ActionInput(name = "url", label = "@text/sendMessageActionInputURLLabel", description = "@text/sendMessageActionInputURLDescription", type = "java.lang.String") @Nullable String url,
52             @ActionInput(name = "urlTitle", label = "@text/sendMessageActionInputURLTitleLabel", description = "@text/sendMessageActionInputURLTitleDescription", type = "java.lang.String") @Nullable String urlTitle,
53             @ActionInput(name = "attachment", label = "@text/sendMessageActionInputAttachmentLabel", description = "@text/sendMessageActionInputAttachmentDescription", type = "java.lang.String") @Nullable String attachment,
54             @ActionInput(name = "contentType", label = "@text/sendMessageActionInputContentTypeLabel", description = "@text/sendMessageActionInputContentTypeDescription", type = "java.lang.String", defaultValue = DEFAULT_CONTENT_TYPE) @Nullable String contentType,
55             @ActionInput(name = "priority", label = "@text/sendMessageActionInputPriorityLabel", description = "@text/sendMessageActionInputPriorityDescription", type = "java.lang.Integer", defaultValue = DEFAULT_EMERGENCY_PRIORITY) @Nullable Integer priority,
56             @ActionInput(name = "device", label = "@text/sendMessageActionInputDeviceLabel", description = "@text/sendMessageActionInputDeviceDescription", type = "java.lang.String") @Nullable String device) {
57         logger.trace(
58                 "ThingAction 'sendMessage' called with value(s): message='{}', title='{}', sound='{}', url='{}', urlTitle='{}', attachment='{}', contentType='{}', priority='{}', device='{}'",
59                 message, title, sound, url, urlTitle, attachment, contentType, priority, device);
60
61         PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message);
62         // add sound, if defined
63         if (sound != null && !DEFAULT_SOUND.equals(sound)) {
64             builder.withSound(sound);
65         }
66         if (url != null) {
67             builder.withUrl(url);
68             if (urlTitle != null) {
69                 builder.withUrlTitle(urlTitle);
70             }
71         }
72         if (attachment != null) {
73             builder.withAttachment(attachment);
74             if (contentType != null) {
75                 builder.withContentType(contentType);
76             }
77         }
78         if (priority != null) {
79             builder.withPriority(priority.intValue());
80         }
81         if (device != null) {
82             builder.withDevice(device);
83         }
84         return send(builder, title);
85     }
86
87     public static Boolean sendMessage(ThingActions actions, String message, @Nullable String title,
88             @Nullable String sound, @Nullable String url, @Nullable String urlTitle, @Nullable String attachment,
89             @Nullable String contentType, @Nullable Integer priority, @Nullable String device) {
90         return ((PushoverActions) actions).sendMessage(message, title, sound, url, urlTitle, attachment, contentType,
91                 priority, device);
92     }
93
94     @RuleAction(label = "@text/sendMessageActionLabel", description = "@text/sendMessageActionDescription")
95     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMessage(
96             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
97             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title) {
98         logger.trace("ThingAction 'sendMessage' called with value(s): message='{}', title='{}'", message, title);
99         return send(getDefaultPushoverMessageBuilder(message), title);
100     }
101
102     public static Boolean sendMessage(ThingActions actions, String message, @Nullable String title) {
103         return ((PushoverActions) actions).sendMessage(message, title);
104     }
105
106     @RuleAction(label = "@text/sendURLMessageActionLabel", description = "@text/sendURLMessageActionDescription")
107     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendURLMessage(
108             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
109             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
110             @ActionInput(name = "url", label = "@text/sendMessageActionInputURLLabel", description = "@text/sendMessageActionInputURLDescription", type = "java.lang.String", required = true) String url,
111             @ActionInput(name = "urlTitle", label = "@text/sendMessageActionInputURLTitleLabel", description = "@text/sendMessageActionInputURLTitleDescription", type = "java.lang.String") @Nullable String urlTitle) {
112         logger.trace(
113                 "ThingAction 'sendURLMessage' called with value(s): message='{}', url='{}', title='{}', urlTitle='{}'",
114                 message, url, title, urlTitle);
115         if (url == null) {
116             throw new IllegalArgumentException("Skip sending message as 'url' is null.");
117         }
118
119         PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message).withUrl(url);
120         if (urlTitle != null) {
121             builder.withUrl(urlTitle);
122         }
123         return send(builder, title);
124     }
125
126     public static Boolean sendURLMessage(ThingActions actions, String message, @Nullable String title, String url,
127             @Nullable String urlTitle) {
128         return ((PushoverActions) actions).sendURLMessage(message, title, url, urlTitle);
129     }
130
131     @RuleAction(label = "@text/sendHTMLMessageActionLabel", description = "@text/sendHTMLMessageActionDescription")
132     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendHtmlMessage(
133             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
134             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title) {
135         logger.trace("ThingAction 'sendHtmlMessage' called with value(s): message='{}', title='{}'", message, title);
136         return send(getDefaultPushoverMessageBuilder(message).withHtmlFormatting(), title);
137     }
138
139     public static Boolean sendHtmlMessage(ThingActions actions, String message, @Nullable String title) {
140         return ((PushoverActions) actions).sendHtmlMessage(message, title);
141     }
142
143     @RuleAction(label = "@text/sendMonospaceMessageActionLabel", description = "@text/sendMonospaceMessageActionDescription")
144     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMonospaceMessage(
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         logger.trace("ThingAction 'sendMonospaceMessage' called with value(s): message='{}', title='{}'", message,
148                 title);
149         return send(getDefaultPushoverMessageBuilder(message).withMonospaceFormatting(), title);
150     }
151
152     public static Boolean sendMonospaceMessage(ThingActions actions, String message, @Nullable String title) {
153         return ((PushoverActions) actions).sendMonospaceMessage(message, title);
154     }
155
156     @RuleAction(label = "@text/sendAttachmentMessageActionLabel", description = "@text/sendAttachmentMessageActionDescription")
157     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendAttachmentMessage(
158             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
159             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
160             @ActionInput(name = "attachment", label = "@text/sendMessageActionInputAttachmentLabel", description = "@text/sendMessageActionInputAttachmentDescription", type = "java.lang.String", required = true) String attachment,
161             @ActionInput(name = "contentType", label = "@text/sendMessageActionInputContentTypeLabel", description = "@text/sendMessageActionInputContentTypeDescription", type = "java.lang.String", defaultValue = DEFAULT_CONTENT_TYPE) @Nullable String contentType) {
162         logger.trace(
163                 "ThingAction 'sendAttachmentMessage' called with value(s): message='{}', title='{}', attachment='{}', contentType='{}'",
164                 message, title, attachment, contentType);
165         if (attachment == null) {
166             throw new IllegalArgumentException("Skip sending message as 'attachment' is null.");
167         }
168
169         PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message).withAttachment(attachment);
170         if (contentType != null) {
171             builder.withContentType(contentType);
172         }
173         return send(builder, title);
174     }
175
176     public static Boolean sendAttachmentMessage(ThingActions actions, String message, @Nullable String title,
177             String attachment, @Nullable String contentType) {
178         return ((PushoverActions) actions).sendAttachmentMessage(message, title, attachment, contentType);
179     }
180
181     @RuleAction(label = "@text/sendPriorityMessageActionLabel", description = "@text/sendPriorityMessageActionDescription")
182     public @ActionOutput(name = "receipt", label = "@text/sendPriorityMessageActionOutputLabel", description = "@text/sendPriorityMessageActionOutputDescription", type = "java.lang.String") String sendPriorityMessage(
183             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
184             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title,
185             @ActionInput(name = "priority", label = "@text/sendMessageActionInputPriorityLabel", description = "@text/sendMessageActionInputPriorityDescription", type = "java.lang.Integer", defaultValue = DEFAULT_EMERGENCY_PRIORITY) @Nullable Integer priority) {
186         logger.trace("ThingAction 'sendPriorityMessage' called with value(s): message='{}', title='{}', priority='{}'",
187                 message, title, priority);
188         PushoverMessageBuilder builder = getDefaultPushoverMessageBuilder(message)
189                 .withPriority(priority == null ? EMERGENCY_PRIORITY : priority.intValue());
190
191         if (title != null) {
192             builder.withTitle(title);
193         }
194         return accountHandler.sendPriorityMessage(builder);
195     }
196
197     public static String sendPriorityMessage(ThingActions actions, String message, @Nullable String title,
198             @Nullable Integer priority) {
199         return ((PushoverActions) actions).sendPriorityMessage(message, title, priority);
200     }
201
202     @RuleAction(label = "@text/cancelPriorityMessageActionLabel", description = "@text/cancelPriorityMessageActionDescription")
203     public @ActionOutput(name = "canceled", label = "@text/cancelPriorityMessageActionOutputLabel", description = "@text/cancelPriorityMessageActionOutputDescription", type = "java.lang.Boolean") Boolean cancelPriorityMessage(
204             @ActionInput(name = "receipt", label = "@text/cancelPriorityMessageActionInputReceiptLabel", description = "@text/cancelPriorityMessageActionInputReceiptDescription", type = "java.lang.String", required = true) String receipt) {
205         logger.trace("ThingAction 'cancelPriorityMessage' called with value(s): '{}'", receipt);
206         if (accountHandler == null) {
207             throw new RuntimeException("PushoverAccountHandler is null!");
208         }
209
210         if (receipt == null) {
211             throw new IllegalArgumentException("Skip canceling message as 'receipt' is null.");
212         }
213
214         return accountHandler.cancelPriorityMessage(receipt);
215     }
216
217     public static Boolean cancelPriorityMessage(ThingActions actions, String receipt) {
218         return ((PushoverActions) actions).cancelPriorityMessage(receipt);
219     }
220
221     @RuleAction(label = "@text/sendMessageToDeviceActionLabel", description = "@text/sendMessageToDeviceActionDescription")
222     public @ActionOutput(name = "sent", label = "@text/sendMessageActionOutputLabel", description = "@text/sendMessageActionOutputDescription", type = "java.lang.Boolean") Boolean sendMessageToDevice(
223             @ActionInput(name = "device", label = "@text/sendMessageActionInputDeviceLabel", description = "@text/sendMessageActionInputDeviceDescription", type = "java.lang.String", required = true) String device,
224             @ActionInput(name = "message", label = "@text/sendMessageActionInputMessageLabel", description = "@text/sendMessageActionInputMessageDescription", type = "java.lang.String", required = true) String message,
225             @ActionInput(name = "title", label = "@text/sendMessageActionInputTitleLabel", description = "@text/sendMessageActionInputTitleDescription", type = "java.lang.String", defaultValue = DEFAULT_TITLE) @Nullable String title) {
226         logger.trace("ThingAction 'sendMessageToDevice' called with value(s): device='{}', message='{}', title='{}'",
227                 device, message, title);
228         if (device == null) {
229             throw new IllegalArgumentException("Skip sending message as 'device' is null.");
230         }
231
232         return send(getDefaultPushoverMessageBuilder(message).withDevice(device), title);
233     }
234
235     public static Boolean sendMessageToDevice(ThingActions actions, String device, String message,
236             @Nullable String title) {
237         return ((PushoverActions) actions).sendMessageToDevice(device, message, title);
238     }
239
240     private PushoverMessageBuilder getDefaultPushoverMessageBuilder(String message) {
241         if (accountHandler == null) {
242             throw new RuntimeException("PushoverAccountHandler is null!");
243         }
244
245         if (message == null) {
246             throw new IllegalArgumentException("Skip sending message as 'message' is null.");
247         }
248
249         return accountHandler.getDefaultPushoverMessageBuilder(message);
250     }
251
252     private Boolean send(PushoverMessageBuilder builder, @Nullable String title) {
253         if (title != null) {
254             builder.withTitle(title);
255         }
256         return accountHandler.sendMessage(builder);
257     }
258
259     @Override
260     public void setThingHandler(@Nullable ThingHandler handler) {
261         this.accountHandler = (PushoverAccountHandler) handler;
262     }
263
264     @Override
265     public @Nullable ThingHandler getThingHandler() {
266         return accountHandler;
267     }
268 }