Commit 47620863 authored by PGoski's avatar PGoski

plugin: callback to url if user is offline, initial commit

parent d9f4a94e
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> Callback on offline Plugin Changelog</title>
<style type="text/css">
BODY {
font-size : 100%;
}
BODY, TD, TH {
font-family : tahoma, verdana, arial, helvetica, sans-serif;
font-size : 0.8em;
}
H2 {
font-size : 10pt;
font-weight : bold;
padding-left : 1em;
}
A:hover {
text-decoration : none;
}
H1 {
font-family : tahoma, arial, helvetica, sans-serif;
font-size : 1.4em;
font-weight: bold;
border-bottom : 1px #ccc solid;
padding-bottom : 2px;
}
TT {
font-family : courier new;
font-weight : bold;
color : #060;
}
PRE {
font-family : courier new;
font-size : 100%;
}
</style>
</head>
<body>
<h1>
Callback on offline Plugin Changelog
</h1>
<p><b>1.0</b> -- August 16, 2015</p>
<ul>
<li>Initial release. </li>
</ul>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
<!-- Main plugin class -->
<class>com.fotsum.CallbackOnOffline</class>
<name>CallbackOnOffline</name>
<description>Url is called when recipient is offline</description>
<author>Pavel Goski</author>
<version>1.0</version>
<date>08/16/2015</date>
<minServerVersion>2.3.0</minServerVersion>
</plugin>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> Callback on offline Plugin Readme</title>
<style type="text/css">
BODY {
font-size : 100%;
}
BODY, TD, TH {
font-family : tahoma, verdana, arial, helvetica, sans-serif;
font-size : 0.8em;
}
H2 {
font-size : 10pt;
font-weight : bold;
}
A:hover {
text-decoration : none;
}
H1 {
font-family : tahoma, arial, helvetica, sans-serif;
font-size : 1.4em;
font-weight: bold;
border-bottom : 1px #ccc solid;
padding-bottom : 2px;
}
TT {
font-family : courier new;
font-weight : bold;
color : #060;
}
PRE {
font-family : courier new;
font-size : 100%;
}
#datatable TH {
color : #fff;
background-color : #2A448C;
text-align : left;
}
#datatable TD {
background-color : #FAF6EF;
}
#datatable .name {
background-color : #DCE2F5;
}
</style>
</head>
<body>
<h1>
Callback on offline Plugin Readme
</h1>
<h2>Overview</h2>
<p>
The plugin loads url from 'plugin.callback_on_offline.url' property, adds 'to' & 'from' parameters and executes GET request. The request is async.
Sample link: http://localhost:8080/user/offline/callback/url?from=1%40fotsum.com&to=2%40fotsum.com
</p>
<p>
If something don't work, set "plugin.callback_on_offline.debug" property to true and check the debug log.
</p>
</body>
</html>
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.concurrent.Future;
public class CallbackOnOffline implements Plugin, PacketInterceptor {
private static final Logger Log = LoggerFactory.getLogger(CallbackOnOffline.class);
private boolean debug;
private String url;
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();
String code = "plugin.callback_on_offline.url";
url = JiveGlobals.getProperty(code, null);
if (url == null || url.length() == 0) {
String url = "http://localhost:8080/user/offline/callback/url"; //default url
JiveGlobals.setProperty(code, url);
}
// register with interceptor manager
interceptorManager.addInterceptor(this);
if (debug) {
Log.debug("initialize CallbackOnOffline plugin. Finish.");
}
}
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("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) {
}
}
}
public static void main(String... args) throws PacketRejectedException {
CallbackOnOffline c = new CallbackOnOffline();
c.initializePlugin(null, null);
c.interceptPacket(null, null, false, false);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment