443 lines
14 KiB
Java
Raw Normal View History

2015-01-07 13:16:55 +01:00
package de.svenkubiak.jpushover;
2018-01-24 17:00:42 +01:00
import java.io.File;
2015-01-07 13:16:55 +01:00
import java.io.IOException;
import java.util.List;
2015-12-08 22:03:44 +01:00
import java.util.Objects;
2015-01-07 13:16:55 +01:00
import org.apache.commons.io.IOUtils;
2015-01-09 08:22:35 +01:00
import org.apache.commons.lang3.StringUtils;
2015-01-07 13:16:55 +01:00
import org.apache.http.Consts;
2018-01-24 17:00:42 +01:00
import org.apache.http.HttpEntity;
2015-01-07 13:16:55 +01:00
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.fluent.Form;
import org.apache.http.client.fluent.Request;
2018-01-24 17:00:42 +01:00
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
2015-11-29 10:35:32 +01:00
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
2015-01-07 13:16:55 +01:00
import de.svenkubiak.jpushover.enums.Constants;
import de.svenkubiak.jpushover.enums.Priority;
import de.svenkubiak.jpushover.enums.Sound;
2015-01-08 08:12:55 +01:00
/**
2015-11-29 10:35:32 +01:00
*
2015-01-08 08:12:55 +01:00
* @author svenkubiak
*
*/
2015-01-07 13:16:55 +01:00
public class JPushover {
2015-11-29 10:35:32 +01:00
private static final Logger LOG = LogManager.getLogger(JPushover.class);
2015-01-26 08:15:18 +01:00
private static final int HTTP_OK = 200;
2015-01-07 20:11:23 +01:00
private String pushoverToken;
private String pushoverUser;
private String pushoverMessage;
private String pushoverDevice;
private String pushoverTitle;
private String pushoverUrl;
private String pushoverUrlTitle;
private String pushoverTimestamp;
2015-01-09 07:56:01 +01:00
private String pushoverRetry;
private String pushoverExpire;
private String pushoverCallback;
2018-01-24 17:00:42 +01:00
private File pushoverAttachment;
2015-12-08 22:03:44 +01:00
private boolean pushoverHtml;
2015-01-07 20:11:23 +01:00
private Priority pushoverPriority;
private Sound pushoverSound;
2015-01-07 13:16:55 +01:00
2015-12-08 22:03:44 +01:00
public JPushover() {
2016-10-20 08:35:08 +02:00
this.withSound(Sound.PUSHOVER);
this.withPriority(Priority.NORMAL);
2015-12-08 22:03:44 +01:00
}
2015-12-10 11:17:36 +01:00
/**
* Creates a new JPushover instance
* @return JPushover instance
*/
2015-12-08 22:03:44 +01:00
public static JPushover build() {
return new JPushover();
2015-01-07 13:16:55 +01:00
}
/**
* Your application's API token
2015-11-29 10:35:32 +01:00
* (required)
*
2015-01-08 08:12:55 +01:00
* @param token The pushover API token
2015-01-07 13:16:55 +01:00
* @return JPushover instance
*/
2016-10-20 08:35:08 +02:00
public final JPushover withToken(String token) {
2015-01-07 20:11:23 +01:00
this.pushoverToken = token;
2015-01-07 13:16:55 +01:00
return this;
}
/**
* The user/group key (not e-mail address) of your user (or you),
* viewable when logged into the @see <a href="https://pushover.net/login">pushover dashboard</a>
2015-11-29 10:35:32 +01:00
* (required)
*
2015-01-08 08:12:55 +01:00
* @param user The username
2015-01-07 13:16:55 +01:00
* @return JPushover instance
*/
2016-10-20 08:35:08 +02:00
public final JPushover withUser(String user) {
2015-01-07 20:11:23 +01:00
this.pushoverUser = user;
2015-01-07 13:16:55 +01:00
return this;
}
2015-11-29 10:35:32 +01:00
2015-01-09 07:56:01 +01:00
/**
* Specifies how often (in seconds) the Pushover servers will send the same notification to the user.
* Only required if priority is set to emergency.
2015-11-29 10:35:32 +01:00
*
2015-01-09 07:56:01 +01:00
* @param retry Number of seconds
* @return JPushover instance
*/
2016-10-20 08:35:08 +02:00
public final JPushover withRetry(String retry) {
2015-01-09 07:56:01 +01:00
this.pushoverRetry = retry;
return this;
}
2018-01-24 17:00:42 +01:00
/**
* Add a file attachment to be added to the request
*
* @param file The attachment to add
* @return JPushover instance
*/
public final JPushover withAttachment(File attachment) {
this.pushoverAttachment = attachment;
return this;
}
2015-11-29 10:35:32 +01:00
2015-01-09 07:56:01 +01:00
/**
* Specifies how many seconds your notification will continue to be retried for (every retry seconds).
* Only required if priority is set to emergency.
2015-11-29 10:35:32 +01:00
*
2015-01-09 07:56:01 +01:00
* @param expire Number of seconds
* @return JPushover instance
*/
2016-10-20 08:35:08 +02:00
public final JPushover withExpire(String expire) {
2015-01-09 07:56:01 +01:00
this.pushoverExpire = expire;
return this;
}
2015-01-07 13:16:55 +01:00
/**
2015-11-29 10:35:32 +01:00
* Your message
* (required)
*
2015-01-08 08:12:55 +01:00
* @param message The message to sent
2015-01-07 13:16:55 +01:00
* @return JPushover instance
*/
2016-10-20 08:35:08 +02:00
public final JPushover withMessage(String message) {
2015-01-07 20:11:23 +01:00
this.pushoverMessage = message;
2015-01-07 13:16:55 +01:00
return this;
}
/**
* Your user's device name to send the message directly to that device,
* rather than all of the user's devices
* (optional)
2015-11-29 10:35:32 +01:00
*
2015-01-08 08:12:55 +01:00
* @param device The device name
2015-01-07 13:16:55 +01:00
* @return JPushover instance
*/
2016-10-20 08:35:08 +02:00
public final JPushover withDevice(String device) {
2015-01-07 20:11:23 +01:00
this.pushoverDevice = device;
2015-01-07 13:16:55 +01:00
return this;
}
/**
* Your message's title, otherwise your app's name is used
* (optional)
2015-11-29 10:35:32 +01:00
*
2015-01-08 08:12:55 +01:00
* @param title The title
2015-01-07 13:16:55 +01:00
* @return JPushover instance
*/
2016-10-20 08:35:08 +02:00
public final JPushover withTitle(String title) {
2015-01-07 20:11:23 +01:00
this.pushoverTitle = title;
2015-01-07 13:16:55 +01:00
return this;
}
/**
* A supplementary URL to show with your message
* (optional)
2015-11-29 10:35:32 +01:00
*
2015-01-08 08:12:55 +01:00
* @param url The url
2015-01-07 13:16:55 +01:00
* @return JPushover instance
*/
2016-10-20 08:35:08 +02:00
public final JPushover withUrl(String url) {
2015-01-07 20:11:23 +01:00
this.pushoverUrl = url;
2015-01-07 13:16:55 +01:00
return this;
}
2015-12-08 22:03:44 +01:00
/**
* Enables HTML in the pushover message
* (optional)
*
* @return JPushover instance
*/
2016-10-20 08:35:08 +02:00
public final JPushover enableHtml() {
2015-12-08 22:03:44 +01:00
this.pushoverHtml = true;
return this;
}
2015-01-07 13:16:55 +01:00
/**
* A title for your supplementary URL, otherwise just the URL is shown
2015-11-29 10:35:32 +01:00
*
2015-01-08 08:12:55 +01:00
* @param urlTitle The url title
2015-01-07 13:16:55 +01:00
* @return JPushover instance
*/
2016-10-20 08:35:08 +02:00
public final JPushover withUrlTitle(String urlTitle) {
2015-01-07 20:11:23 +01:00
this.pushoverUrlTitle = urlTitle;
2015-01-07 13:16:55 +01:00
return this;
}
/**
* A Unix timestamp of your message's date and time to display to the user,
* rather than the time your message is received by our API
2015-11-29 10:35:32 +01:00
*
2015-01-08 08:12:55 +01:00
* @param timestamp The Unix timestamp
2015-01-07 13:16:55 +01:00
* @return JPushover instance
*/
2016-10-20 08:35:08 +02:00
public final JPushover withTimestamp(String timestamp) {
2015-01-07 20:11:23 +01:00
this.pushoverTimestamp = timestamp;
2015-01-07 13:16:55 +01:00
return this;
}
/**
2015-01-07 20:11:23 +01:00
* Priority of the message based on the @see <a href="https://pushover.net/api#priority">documentation</a>
2015-01-07 13:16:55 +01:00
* (optional)
2015-11-29 10:35:32 +01:00
*
2015-01-08 08:12:55 +01:00
* @param priority The priority enum
2015-01-07 13:16:55 +01:00
* @return JPushover instance
*/
2016-10-20 08:35:08 +02:00
public final JPushover withPriority(Priority priority) {
2015-01-07 20:11:23 +01:00
this.pushoverPriority = priority;
2015-01-07 13:16:55 +01:00
return this;
}
/**
* The name of one of the sounds supported by device clients to override
* the user's default sound choice
* (optional)
2015-11-29 10:35:32 +01:00
*
2015-01-08 08:12:55 +01:00
* @param sound THe sound enum
2015-01-07 13:16:55 +01:00
* @return JPushover instance
*/
2016-10-20 08:35:08 +02:00
public final JPushover withSound(Sound sound) {
2015-01-07 20:11:23 +01:00
this.pushoverSound = sound;
2015-01-07 13:16:55 +01:00
return this;
}
2015-11-29 10:35:32 +01:00
2015-01-09 07:56:01 +01:00
/**
* Callback parameter may be supplied with a publicly-accessible URL that the
2015-12-10 11:17:36 +01:00
* pushover servers will send a request to when the user has acknowledged your
2015-01-09 07:56:01 +01:00
* notification.
* Only required if priority is set to emergency.
2015-11-29 10:35:32 +01:00
*
2015-12-08 22:06:13 +01:00
* @param callback The callback URL
* @return JPushover instance
2015-01-09 07:56:01 +01:00
*/
2016-10-20 08:35:08 +02:00
public final JPushover withCallback(String callback) {
2015-01-09 07:56:01 +01:00
this.pushoverCallback = callback;
return this;
}
2015-11-29 10:35:32 +01:00
2015-01-09 08:22:35 +01:00
/**
* Sends a validation request to pushover ensuring that the token and user
* is correct, that there is at least one active device on the account.
2015-11-29 10:35:32 +01:00
*
2015-01-09 08:22:35 +01:00
* Requires token parameter
* Requires user parameter
* Optional device parameter to check specific device
2015-11-29 10:35:32 +01:00
*
2015-01-09 08:22:35 +01:00
* @return true if token and user are valid and at least on device is on the account, false otherwise
*/
public boolean validate() {
2015-12-08 22:03:44 +01:00
Objects.requireNonNull(this.pushoverToken, "Token is required for validation");
Objects.requireNonNull(this.pushoverUser, "User is required for validation");
2015-11-29 10:35:32 +01:00
final List<NameValuePair> params = Form.form()
2015-12-08 22:03:44 +01:00
.add(Constants.TOKEN.toString(), this.pushoverToken)
.add(Constants.USER.toString(), this.pushoverUser)
.add(Constants.DEVICE.toString(), this.pushoverDevice)
2015-01-09 08:22:35 +01:00
.build();
2015-11-29 10:35:32 +01:00
2015-01-09 08:22:35 +01:00
boolean valid = false;
try {
2017-08-28 15:57:49 +02:00
final HttpResponse httpResponse = Request.Post(Constants.VALIDATION_URL.toString())
.bodyForm(params, Consts.UTF_8)
.execute()
.returnResponse();
2015-11-29 10:35:32 +01:00
2015-01-26 08:15:18 +01:00
if (httpResponse != null && httpResponse.getStatusLine().getStatusCode() == HTTP_OK) {
2016-05-13 14:15:07 +02:00
final String response = IOUtils.toString(httpResponse.getEntity().getContent(), Consts.UTF_8);
2015-01-09 08:22:35 +01:00
if (StringUtils.isNotBlank(response) && response.contains("\"status\":1")) {
valid = true;
}
}
2015-11-29 10:35:32 +01:00
} catch (final IOException e) {
2015-01-09 08:22:35 +01:00
LOG.error("Failed to send validation requeste to pushover", e);
}
2015-11-29 10:35:32 +01:00
2015-01-09 08:22:35 +01:00
return valid;
}
2015-01-07 13:16:55 +01:00
/**
2015-01-09 08:22:35 +01:00
* Sends a message to pushover
2015-11-29 10:35:32 +01:00
*
2015-01-09 08:22:35 +01:00
* @return JPushoverResponse instance
2015-01-07 13:16:55 +01:00
*/
2015-12-10 11:26:58 +01:00
public final JPushoverResponse push() {
2015-12-08 22:03:44 +01:00
Objects.requireNonNull(this.pushoverToken, "Token is required for a message");
Objects.requireNonNull(this.pushoverUser, "User is required for a message");
Objects.requireNonNull(this.pushoverMessage, "Message is required for a message");
2015-11-29 10:35:32 +01:00
2015-01-09 07:56:01 +01:00
if (Priority.EMERGENCY.equals(this.pushoverPriority)) {
2015-12-08 22:03:44 +01:00
Objects.requireNonNull(this.pushoverRetry, "Retry is required on priority emergency");
Objects.requireNonNull(this.pushoverExpire, "Expire is required on priority emergency");
2015-01-09 07:56:01 +01:00
}
2015-11-29 10:35:32 +01:00
2018-01-24 17:00:42 +01:00
HttpPost httpPost = new HttpPost(Constants.MESSAGES_URL.toString());
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody(Constants.TOKEN.toString(), this.pushoverToken);
builder.addTextBody(Constants.USER.toString(), this.pushoverUser);
builder.addTextBody(Constants.MESSAGE.toString(), this.pushoverMessage);
if (StringUtils.isNotBlank(this.pushoverDevice)) {
builder.addTextBody(Constants.DEVICE.toString(), this.pushoverDevice);
}
if (StringUtils.isNotBlank(this.pushoverTitle)) {
builder.addTextBody(Constants.DEVICE.toString(), this.pushoverTitle);
}
if (StringUtils.isNotBlank(this.pushoverTitle)) {
builder.addTextBody(Constants.TITLE.toString(), this.pushoverTitle);
}
if (StringUtils.isNotBlank(this.pushoverUrl)) {
builder.addTextBody(Constants.URL.toString(), this.pushoverUrl);
}
if (StringUtils.isNotBlank(this.pushoverRetry)) {
builder.addTextBody(Constants.RETRY.toString(), this.pushoverRetry);
}
if (StringUtils.isNotBlank(this.pushoverExpire)) {
builder.addTextBody(Constants.EXPIRE.toString(), this.pushoverExpire);
}
if (StringUtils.isNotBlank(this.pushoverCallback)) {
builder.addTextBody(Constants.CALLBACK.toString(), this.pushoverCallback);
}
if (StringUtils.isNotBlank(this.pushoverUrlTitle)) {
builder.addTextBody(Constants.URLTITLE.toString(), this.pushoverUrlTitle);
}
if (StringUtils.isNotBlank(this.pushoverPriority.toString())) {
builder.addTextBody(Constants.PRIORITY.toString(), this.pushoverPriority.toString());
}
if (StringUtils.isNotBlank(this.pushoverTimestamp)) {
builder.addTextBody(Constants.TIMESTAMP.toString(), this.pushoverTimestamp);
}
if (StringUtils.isNotBlank(this.pushoverSound.toString())) {
builder.addTextBody(Constants.SOUND.toString(), this.pushoverSound.toString());
}
2015-11-29 10:35:32 +01:00
2018-01-24 17:00:42 +01:00
if (this.pushoverAttachment != null) {
builder.addBinaryBody(Constants.ATTACHMENT.toString(), this.pushoverAttachment, ContentType.APPLICATION_OCTET_STREAM, "file.ext");
}
builder.addTextBody(Constants.SOUND.toString(), this.pushoverHtml ? "1" : "0");
HttpEntity multipart = builder.build();
httpPost.setEntity(multipart);
2015-12-10 11:26:58 +01:00
JPushoverResponse jPushoverResponse = new JPushoverResponse().isSuccessful(false);
2015-01-07 13:16:55 +01:00
try {
2018-01-24 17:00:42 +01:00
CloseableHttpClient client = HttpClients.createDefault();
CloseableHttpResponse closeableHttpResponse = client.execute(httpPost);
2015-11-29 10:35:32 +01:00
2018-01-24 17:00:42 +01:00
if (closeableHttpResponse != null) {
final int status = closeableHttpResponse.getStatusLine().getStatusCode();
2015-11-29 10:35:32 +01:00
2018-01-24 17:00:42 +01:00
jPushoverResponse = jPushoverResponse.httpStatus(status)
.response(IOUtils.toString(closeableHttpResponse.getEntity().getContent(), Consts.UTF_8))
.isSuccessful((status == HTTP_OK) ? true : false);
2015-01-07 13:16:55 +01:00
}
2018-01-24 17:00:42 +01:00
client.close();
} catch (IOException e) {
2015-01-07 13:16:55 +01:00
LOG.error("Failed to send message to pushover", e);
}
2018-01-24 17:00:42 +01:00
return null;
2015-01-07 13:16:55 +01:00
}
2015-12-10 11:30:21 +01:00
public String getToken() {
return pushoverToken;
}
public String getUser() {
return pushoverUser;
}
public String getMessage() {
return pushoverMessage;
}
public String getDevice() {
return pushoverDevice;
}
public String getTitle() {
return pushoverTitle;
}
public String getUrl() {
return pushoverUrl;
}
public String getUrlTitle() {
return pushoverUrlTitle;
}
public String getTimestamp() {
return pushoverTimestamp;
}
public String getRetry() {
return pushoverRetry;
}
2018-01-24 17:00:42 +01:00
public File getAttachment() {
return pushoverAttachment;
}
2015-12-10 11:30:21 +01:00
public String getExpire() {
return pushoverExpire;
}
public String getCallback() {
return pushoverCallback;
}
public Priority getPriority() {
return pushoverPriority;
}
public Sound getSound() {
return pushoverSound;
}
public boolean isHtml() {
return pushoverHtml;
}
2015-01-07 13:16:55 +01:00
}