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