aboutsummaryrefslogtreecommitdiff
path: root/juick-xmpp/src/main
diff options
context:
space:
mode:
authorGravatar Vitaly Takmazov2016-12-07 14:28:31 +0300
committerGravatar Vitaly Takmazov2016-12-07 15:15:34 +0300
commiteea7abf829ed9b011d34d6ac8131fe3057b1b6f6 (patch)
tree648e4acce0cb2556b97a72c460ed5309259adc08 /juick-xmpp/src/main
parentb2a65a6b63e8691b0101f4652705fab79dc26d99 (diff)
juick-xmpp: JuickBot is now Bean
Diffstat (limited to 'juick-xmpp/src/main')
-rw-r--r--juick-xmpp/src/main/java/com/juick/components/XMPPServer.java32
-rw-r--r--juick-xmpp/src/main/java/com/juick/components/configuration/XmppAppConfiguration.java5
-rw-r--r--juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java11
-rw-r--r--juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionIn.java24
-rw-r--r--juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionOut.java7
-rw-r--r--juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionRouter.java6
-rw-r--r--juick-xmpp/src/main/java/com/juick/components/s2s/JuickBot.java52
-rw-r--r--juick-xmpp/src/main/java/com/juick/components/s2s/StanzaListener.java10
8 files changed, 90 insertions, 57 deletions
diff --git a/juick-xmpp/src/main/java/com/juick/components/XMPPServer.java b/juick-xmpp/src/main/java/com/juick/components/XMPPServer.java
index caa4c200..e057a9ea 100644
--- a/juick-xmpp/src/main/java/com/juick/components/XMPPServer.java
+++ b/juick-xmpp/src/main/java/com/juick/components/XMPPServer.java
@@ -33,7 +33,6 @@ public class XMPPServer implements AutoCloseable {
public ExecutorService service;
private ConnectionRouter router;
- public JuickBot bot;
public String HOSTNAME, componentName;
public String keystore;
@@ -44,6 +43,7 @@ public class XMPPServer implements AutoCloseable {
private final List<ConnectionIn> inConnections = Collections.synchronizedList(new ArrayList<>());
private final List<ConnectionOut> outConnections = Collections.synchronizedList(new ArrayList<>());
private final List<CacheEntry> outCache = Collections.synchronizedList(new ArrayList<>());
+ private final List<StanzaListener> stanzaListeners = Collections.synchronizedList(new ArrayList<>());
final public HashMap<String, StanzaChild> childParsers = new HashMap<>();
@@ -58,6 +58,7 @@ public class XMPPServer implements AutoCloseable {
@Inject
public SubscriptionService subscriptionService;
+ private JID jid;
public XMPPServer(Environment env, ExecutorService service) {
this.service = service;
@@ -68,12 +69,11 @@ public class XMPPServer implements AutoCloseable {
componentName = env.getProperty("componentname");
int componentPort = NumberUtils.toInt(env.getProperty("component_port"), 5347);
int s2sPort = NumberUtils.toInt(env.getProperty("s2s_port"), 5269);
- JID Jid = new JID(env.getProperty("xmppbot_jid"));
keystore = env.getProperty("keystore");
keystorePassword = env.getProperty("keystore_password");
brokenSSLhosts = Arrays.asList(env.getProperty("broken_ssl_hosts", "").split(","));
bannedHosts = Arrays.asList(env.getProperty("banned_hosts", "").split(","));
- bot = new JuickBot(this, Jid);
+ jid = new JID(env.getProperty("xmppbot_jid"));
boolean disabled = BooleanUtils.toBoolean(env.getProperty("xmpp_disabled", "false"));
childParsers.put(JuickMessage.XMLNS, new JuickMessage());
@@ -88,7 +88,7 @@ public class XMPPServer implements AutoCloseable {
while (true) {
try {
Socket socket = listener.accept();
- ConnectionIn client = new ConnectionIn(this, bot, socket);
+ ConnectionIn client = new ConnectionIn(this, socket);
addConnectionIn(client);
service.submit(client);
} catch (Exception e) {
@@ -206,12 +206,7 @@ public class XMPPServer implements AutoCloseable {
}
}
if (connOut != null) {
- try {
- connOut.sendStanza(xml);
- } catch (IOException e) {
- logger.warn("stream to {} {} error: {}",
- connOut.to, connOut.streamID, e);
- }
+ connOut.sendStanza(xml);
return;
}
@@ -266,4 +261,21 @@ public class XMPPServer implements AutoCloseable {
}
}
+ public List<StanzaListener> getStanzaListeners() {
+ return stanzaListeners;
+ }
+
+ public void addStanzaListener(StanzaListener listener) {
+ synchronized (stanzaListeners) {
+ stanzaListeners.add(listener);
+ }
+ }
+
+ public void onStanzaReceived(String type, Stanza xmlValue) {
+ stanzaListeners.forEach(l -> l.stanzaReceived(type, xmlValue));
+ }
+
+ public JID getJid() {
+ return jid;
+ }
}
diff --git a/juick-xmpp/src/main/java/com/juick/components/configuration/XmppAppConfiguration.java b/juick-xmpp/src/main/java/com/juick/components/configuration/XmppAppConfiguration.java
index a10e6553..50bce7b9 100644
--- a/juick-xmpp/src/main/java/com/juick/components/configuration/XmppAppConfiguration.java
+++ b/juick-xmpp/src/main/java/com/juick/components/configuration/XmppAppConfiguration.java
@@ -6,6 +6,7 @@ package com.juick.components.configuration;
import com.juick.components.XMPPServer;
import com.juick.components.s2s.CleaningUp;
+import com.juick.components.s2s.JuickBot;
import com.juick.configuration.DataConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -39,4 +40,8 @@ public class XmppAppConfiguration {
public CleaningUp cleaningUp() {
return new CleaningUp();
}
+ @Bean
+ public JuickBot bot() {
+ return new JuickBot(xmpp());
+ }
}
diff --git a/juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java b/juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java
index b6052fc8..e54a1548 100644
--- a/juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java
+++ b/juick-xmpp/src/main/java/com/juick/components/s2s/Connection.java
@@ -83,12 +83,17 @@ public class Connection {
logger.trace(tag);
}
- public void sendStanza(String xml) throws IOException {
+ public void sendStanza(String xml) {
if (streamID != null) {
logger.trace("OUT: {}\n", xml);
}
- writer.write(xml);
- writer.flush();
+ try {
+ writer.write(xml);
+ writer.flush();
+ } catch (IOException e) {
+ logger.error("send stanza failed", e);
+ }
+
tsLocalData = System.currentTimeMillis();
bytesLocal += xml.length();
packetsLocal++;
diff --git a/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionIn.java b/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionIn.java
index a6d0549c..25f28ef6 100644
--- a/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionIn.java
+++ b/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionIn.java
@@ -26,11 +26,9 @@ public class ConnectionIn extends Connection implements Runnable {
final public List<String> from = new ArrayList<>();
public long tsRemoteData = 0;
public long packetsRemote = 0;
- JuickBot bot;
- public ConnectionIn(XMPPServer xmpp, JuickBot bot, Socket socket) throws Exception {
+ public ConnectionIn(XMPPServer xmpp, Socket socket) throws Exception {
super(xmpp);
- this.bot = bot;
this.socket = socket;
streamID = UUID.randomUUID().toString();
restartParser();
@@ -101,17 +99,13 @@ public class ConnectionIn extends Connection implements Runnable {
}
} else if (tag.equals("presence") && checkFromTo(parser)) {
Presence p = Presence.parse(parser, null);
- if (p != null && (p.type == null || !p.type.equals(Presence.Type.error))) {
- bot.incomingPresence(p);
- }
+ xmpp.onStanzaReceived("presence", p);
} else if (tag.equals("message") && checkFromTo(parser)) {
updateTsRemoteData();
Message msg = Message.parse(parser, xmpp.childParsers);
if (msg != null && (msg.type == null || !msg.type.equals(Message.Type.error))) {
logger.info("stream {}: {}", streamID, msg);
- if (!bot.incomingMessage(msg)) {
- xmpp.getRouter().sendStanza(msg.toString());
- }
+ xmpp.onStanzaReceived("message", msg);
}
} else if (tag.equals("iq") && checkFromTo(parser)) {
updateTsRemoteData();
@@ -180,14 +174,10 @@ public class ConnectionIn extends Connection implements Runnable {
}
public void sendDialbackResult(String sfrom, String type) {
- try {
- sendStanza("<db:result from='" + xmpp.HOSTNAME + "' to='" + sfrom + "' type='" + type + "'/>");
- if (type.equals("valid")) {
- from.add(sfrom);
- logger.info("stream from {} {} ready", sfrom, streamID);
- }
- } catch (IOException e) {
- logger.warn("stream from {} {} error: {}", sfrom, streamID, e);
+ sendStanza("<db:result from='" + xmpp.HOSTNAME + "' to='" + sfrom + "' type='" + type + "'/>");
+ if (type.equals("valid")) {
+ from.add(sfrom);
+ logger.info("stream from {} {} ready", sfrom, streamID);
}
}
diff --git a/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionOut.java b/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionOut.java
index 0111601e..87e3cdbd 100644
--- a/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionOut.java
+++ b/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionOut.java
@@ -162,10 +162,7 @@ public class ConnectionOut extends Connection implements Runnable {
}
public void sendDialbackVerify(String sid, String key) {
- try {
- sendStanza("<db:verify from='" + xmpp.HOSTNAME + "' to='" + to + "' id='" + sid + "'>" + key + "</db:verify>");
- } catch (IOException e) {
- logger.warn("stream to {} {} error {}", to, streamID, e);
- }
+ sendStanza("<db:verify from='" + xmpp.HOSTNAME + "' to='" + to + "' id='" + sid + "'>" +
+ key + "</db:verify>");
}
}
diff --git a/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionRouter.java b/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionRouter.java
index 3517462b..b28298a2 100644
--- a/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionRouter.java
+++ b/juick-xmpp/src/main/java/com/juick/components/s2s/ConnectionRouter.java
@@ -163,7 +163,7 @@ public class ConnectionRouter extends Connection implements Runnable {
nick.Nickname = "@" + jmsg.getUser().getName();
com.juick.xmpp.Message msg = new com.juick.xmpp.Message();
- msg.from = xmpp.bot.getJid();
+ msg.from = xmpp.getJid();
msg.body = txt;
msg.type = Message.Type.chat;
msg.thread = "juick-" + jmsg.getMid();
@@ -201,7 +201,7 @@ public class ConnectionRouter extends Connection implements Runnable {
txt += jmsg.getText() + "\n\n" + "#" + jmsg.getMid() + "/" + jmsg.getRid() + " http://juick.com/" + jmsg.getMid() + "#" + jmsg.getRid();
com.juick.xmpp.Message msg = new com.juick.xmpp.Message();
- msg.from = xmpp.bot.getJid();
+ msg.from = xmpp.getJid();
msg.body = txt;
msg.type = Message.Type.chat;
msg.addChild(jmsg);
@@ -241,7 +241,7 @@ public class ConnectionRouter extends Connection implements Runnable {
nick.Nickname = "@" + jmsg.getUser().getName();
com.juick.xmpp.Message msg = new com.juick.xmpp.Message();
- msg.from = xmpp.bot.getJid();
+ msg.from = xmpp.getJid();
msg.body = txt;
msg.type = Message.Type.chat;
msg.thread = "juick-" + jmsg.getMid();
diff --git a/juick-xmpp/src/main/java/com/juick/components/s2s/JuickBot.java b/juick-xmpp/src/main/java/com/juick/components/s2s/JuickBot.java
index 2ed3eaf5..304d365e 100644
--- a/juick-xmpp/src/main/java/com/juick/components/s2s/JuickBot.java
+++ b/juick-xmpp/src/main/java/com/juick/components/s2s/JuickBot.java
@@ -5,9 +5,11 @@ import com.juick.components.XMPPServer;
import com.juick.xmpp.JID;
import com.juick.xmpp.Message;
import com.juick.xmpp.Presence;
+import com.juick.xmpp.Stanza;
import com.juick.xmpp.extensions.Error;
import com.juick.xmpp.extensions.JuickMessage;
+import javax.inject.Inject;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -16,15 +18,16 @@ import java.util.regex.Pattern;
*
* @author ugnich
*/
-public class JuickBot {
+public class JuickBot implements StanzaListener {
+
XMPPServer xmpp;
- public JuickBot(XMPPServer xmpp, JID jid) {
+ @Inject
+ public JuickBot(XMPPServer xmpp) {
this.xmpp = xmpp;
- this.jid = jid;
+ xmpp.addStanzaListener(this);
}
- private final JID jid;
private static final String HELPTEXT =
"@username text - Send private message\n"
+ "*tagname Blah-blah-blah - Post a message with tag 'tagname'\n"
@@ -59,7 +62,7 @@ public class JuickBot {
+ "\n"
+ "Read more: http://juick.com/help/";
- public boolean incomingPresence(Presence p) throws Exception {
+ public boolean incomingPresence(Presence p) {
final String username = p.to.Username.toLowerCase();
final boolean toJuick = username.equals("juick");
@@ -135,7 +138,7 @@ public class JuickBot {
return false;
}
- public boolean incomingMessage(Message msg) throws Exception {
+ public boolean incomingMessage(Message msg) {
if (msg.body == null || msg.body.isEmpty()) {
return false;
}
@@ -220,7 +223,7 @@ public class JuickBot {
}
private static Pattern regexPM = Pattern.compile("^\\@(\\S+)\\s+([\\s\\S]+)$");
- public boolean incomingMessageJuick(User user_from, Message msg) throws Exception {
+ public boolean incomingMessageJuick(User user_from, Message msg) {
String command = msg.body.trim();
int commandlen = command.length();
@@ -257,29 +260,29 @@ public class JuickBot {
return false;
}
- private void commandPing(Message m) throws Exception {
- Presence p = new Presence(jid, m.from);
+ private void commandPing(Message m) {
+ Presence p = new Presence(xmpp.getJid(), m.from);
p.priority = 10;
xmpp.sendOut(p);
- Message reply = new Message(jid, m.from, Message.Type.chat);
+ Message reply = new Message(xmpp.getJid(), m.from, Message.Type.chat);
reply.body = "PONG";
xmpp.sendOut(reply);
}
- private void commandHelp(Message m) throws Exception {
- Message reply = new Message(jid, m.from, Message.Type.chat);
+ private void commandHelp(Message m) {
+ Message reply = new Message(xmpp.getJid(), m.from, Message.Type.chat);
reply.body = HELPTEXT;
xmpp.sendOut(reply);
}
- private void commandLogin(Message m, User user_from) throws Exception {
- Message reply = new Message(jid, m.from, Message.Type.chat);
+ private void commandLogin(Message m, User user_from) {
+ Message reply = new Message(xmpp.getJid(), m.from, Message.Type.chat);
reply.body = "http://juick.com/login?" + xmpp.userService.getHashByUID(user_from.getUid());
xmpp.sendOut(reply);
}
- private void commandPM(Message m, User user_from, String user_to, String body) throws Exception {
+ private void commandPM(Message m, User user_from, String user_to, String body) {
int ret = 0;
int uid_to = 0;
@@ -347,7 +350,7 @@ public class JuickBot {
xmpp.sendOut(reply);
}
- private void commandBLShow(Message m, User user_from) throws Exception {
+ private void commandBLShow(Message m, User user_from) {
List<User> blusers = xmpp.userService.getUserBLUsers(user_from.getUid());
List<String> bltags = xmpp.tagService.getUserBLTags(user_from.getUid());
@@ -370,12 +373,23 @@ public class JuickBot {
txt = "You don't have any users or tags in your blacklist.";
}
- Message reply = new Message(jid, m.from, Message.Type.chat);
+ Message reply = new Message(xmpp.getJid(), m.from, Message.Type.chat);
reply.body = txt;
xmpp.sendOut(reply);
}
- public JID getJid() {
- return jid;
+ @Override
+ public void stanzaReceived(String name, Stanza xmlValue) {
+ if (xmlValue instanceof Presence) {
+ Presence p = (Presence) xmlValue;
+ if (p.type == null || !p.type.equals(Presence.Type.error)) {
+ incomingPresence(p);
+ }
+ } else if (xmlValue instanceof Message) {
+ Message msg = (Message) xmlValue;
+ if (!incomingMessage(msg)) {
+ xmpp.getRouter().sendStanza(msg.toString());
+ }
+ }
}
}
diff --git a/juick-xmpp/src/main/java/com/juick/components/s2s/StanzaListener.java b/juick-xmpp/src/main/java/com/juick/components/s2s/StanzaListener.java
new file mode 100644
index 00000000..72ca72e8
--- /dev/null
+++ b/juick-xmpp/src/main/java/com/juick/components/s2s/StanzaListener.java
@@ -0,0 +1,10 @@
+package com.juick.components.s2s;
+
+import com.juick.xmpp.Stanza;
+
+/**
+ * Created by vitalyster on 07.12.2016.
+ */
+public interface StanzaListener {
+ void stanzaReceived(String name, Stanza xmlValue);
+}