package com.fotsum; import org.jivesoftware.openfire.PresenceManager; import org.jivesoftware.openfire.XMPPServer; import org.jivesoftware.openfire.container.Plugin; import org.jivesoftware.openfire.container.PluginManager; import org.jivesoftware.openfire.interceptor.InterceptorManager; import org.jivesoftware.openfire.interceptor.PacketInterceptor; import org.jivesoftware.openfire.interceptor.PacketRejectedException; import org.jivesoftware.openfire.session.Session; import org.jivesoftware.openfire.user.User; import org.jivesoftware.openfire.user.UserManager; import org.jivesoftware.openfire.user.UserNotFoundException; import org.jivesoftware.util.JiveGlobals; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xmpp.packet.JID; import org.xmpp.packet.Message; import org.xmpp.packet.Packet; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Response; import java.io.File; import java.util.UUID; import java.util.concurrent.Future; public class CallbackOnOffline implements Plugin, PacketInterceptor { private static final Logger Log = LoggerFactory.getLogger(CallbackOnOffline.class); private boolean debug; private String url; private String token; private InterceptorManager interceptorManager; private UserManager userManager; private PresenceManager presenceManager; private Client client; public void initializePlugin(PluginManager pManager, File pluginDirectory) { debug = JiveGlobals.getBooleanProperty("plugin.callback_on_offline.debug", false); if (debug) { Log.debug("initialize CallbackOnOffline plugin. Start."); } interceptorManager = InterceptorManager.getInstance(); presenceManager = XMPPServer.getInstance().getPresenceManager(); userManager = XMPPServer.getInstance().getUserManager(); client = ClientBuilder.newClient(); url = getProperty("plugin.callback_on_offline.url", "http://localhost:8080/user/offline/callback/url"); token = getProperty("plugin.callback_on_offline.token", UUID.randomUUID().toString()); // register with interceptor manager interceptorManager.addInterceptor(this); if (debug) { Log.debug("initialize CallbackOnOffline plugin. Finish."); } } private String getProperty(String code, String defaultSetValue) { String value = JiveGlobals.getProperty(code, null); if (value == null || value.length() == 0) { JiveGlobals.setProperty(code, defaultSetValue); value = defaultSetValue; } return value; } public void destroyPlugin() { // unregister with interceptor manager interceptorManager.removeInterceptor(this); if (debug) { Log.debug("destroy CallbackOnOffline plugin."); } } public void interceptPacket(Packet packet, Session session, boolean incoming, boolean processed) throws PacketRejectedException { if (processed && incoming && packet instanceof Message && packet.getTo() != null) { Message msg = (Message) packet; if (msg.getType() != Message.Type.chat) { return; } try { JID to = packet.getTo(); User userTo = userManager.getUser(to.getNode()); boolean available = presenceManager.isAvailable(userTo); if (debug) { Log.debug("intercepted message from {} to {}, recipient is available {}", packet.getFrom().toBareJID(), to.toBareJID(), available); } if (!available) { JID from = packet.getFrom(); WebTarget target = client.target(url) .queryParam("token", token) .queryParam("from", from.toBareJID()) .queryParam("to", to.toBareJID()); if (debug) { Log.debug("sending request to url='{}'", target); } Future<Response> responseFuture = target.request().async().get(); if (debug) { try { Response response = responseFuture.get(); Log.debug("got response status url='{}' status='{}'", target, response.getStatus()); } catch (Exception e) { Log.debug("can't get response status url='{}'", target, e); } } } } catch (UserNotFoundException e) { } } } }