/** * Copyright (c) 2010-2016 by the respective copyright holders. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.openhab.action.xmpp.internal; import java.io.IOException; import java.io.InputStream; import java.net.URL; import org.apache.commons.io.IOUtils; import org.jivesoftware.smack.Chat; import org.jivesoftware.smack.ChatManager; import org.jivesoftware.smack.MessageListener; import org.jivesoftware.smack.SmackException.NotConnectedException; import org.jivesoftware.smack.XMPPConnection; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smack.packet.Message; import org.jivesoftware.smackx.filetransfer.FileTransferManager; import org.jivesoftware.smackx.filetransfer.OutgoingFileTransfer; import org.jivesoftware.smackx.muc.MultiUserChat; import org.openhab.core.scriptengine.action.ActionDoc; import org.openhab.core.scriptengine.action.ParamDoc; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This class contains the methods that are made available in scripts and rules for XMPP. * * @author Kai Kreuzer * @since 1.3.0 */ public class XMPP { private static final Logger logger = LoggerFactory.getLogger(XMPP.class); // provide public static methods here /** * Sends a message to an XMPP user. * * @param to the XMPP address to send the message to * @param message the message to send * * @return <code>true</code>, if sending the message has been successful and * <code>false</code> in all other cases. */ @ActionDoc(text = "Sends a message to an XMPP user.") static public boolean sendXMPP(@ParamDoc(name = "to") String to, @ParamDoc(name = "message") String message) { boolean success = false; try { XMPPConnection conn = XMPPConnect.getConnection(); ChatManager chatmanager = ChatManager.getInstanceFor(conn); Chat newChat = chatmanager.createChat(to, null); try { while (message.length() >= 2000) { newChat.sendMessage(message.substring(0, 2000)); message = message.substring(2000); } newChat.sendMessage(message); logger.debug("Sent message '{}' to '{}'.", message, to); success = true; } catch (XMPPException e) { logger.warn("Error Delivering block", e); } catch (NotConnectedException e) { logger.warn("Error Delivering block", e); } } catch (NotInitializedException e) { logger.warn("Could not send XMPP message as connection is not correctly initialized!"); } return success; } /** * Sends a message with an attachment to an XMPP user. * * @param to the XMPP address to send the message to * @param message the message to send * @param attachmentUrl a URL string of which the content should be send to the user * * @return <code>true</code>, if sending the message has been successful and * <code>false</code> in all other cases. */ @ActionDoc(text = "Sends a message with an attachment to an XMPP user.") static public boolean sendXMPP(@ParamDoc(name = "to") String to, @ParamDoc(name = "message") String message, @ParamDoc(name = "attachmentUrl") String attachmentUrl) { boolean success = false; try { XMPPConnection conn = XMPPConnect.getConnection(); if (attachmentUrl == null) { // send a normal message without an attachment ChatManager chatmanager = ChatManager.getInstanceFor(conn); Chat newChat = chatmanager.createChat(to, new MessageListener() { @Override public void processMessage(Chat chat, Message message) { logger.debug("Received message on XMPP: {}", message.getBody()); } }); try { newChat.sendMessage(message); logger.debug("Sent message '{}' to '{}'.", message, to); success = true; } catch (XMPPException e) { logger.error("Error sending message '{}'", message, e); } catch (NotConnectedException e) { logger.error("Error sending message '{}'", message, e); } } else { // Create the file transfer manager FileTransferManager manager = new FileTransferManager(conn); // Create the outgoing file transfer OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(to); InputStream is = null; try { URL url = new URL(attachmentUrl); // Send the file is = url.openStream(); OutgoingFileTransfer.setResponseTimeout(10000); transfer.sendStream(is, url.getFile(), is.available(), message); logger.debug("Sent message '{}' with attachment '{}' to '{}'.", (Object[]) new String[] { message, attachmentUrl, to }); success = true; } catch (IOException e) { logger.error("Could not open url '{}' for sending it via XMPP", attachmentUrl, e); } finally { IOUtils.closeQuietly(is); } } } catch (NotInitializedException e) { logger.warn("Could not send XMPP message as connection is not correctly initialized!"); } return success; } /** * Sends a message to an XMPP multi user chat. * * @param message the message to send * * @return <code>true</code>, if sending the message has been successful and * <code>false</code> in all other cases. */ @ActionDoc(text = "Sends a message to an XMPP multi user chat.") static public boolean chatXMPP(@ParamDoc(name = "message") String message) { boolean success = false; try { MultiUserChat chat = XMPPConnect.getChat(); try { while (message.length() >= 2000) { chat.sendMessage(message.substring(0, 2000)); message = message.substring(2000); } chat.sendMessage(message); logger.debug("Sent message '{}' to multi user chat.", message); success = true; } catch (XMPPException e) { logger.warn("Error Delivering block", e); } catch (NotConnectedException e) { logger.warn("Error Delivering block", e); } } catch (NotInitializedException e) { logger.warn("Could not send XMPP message as connection is not correctly initialized!"); } return success; } }