aboutsummaryrefslogtreecommitdiff
path: root/juick-xmpp-bot/src/main/java/com/juick/components/XMPPBot.java
diff options
context:
space:
mode:
Diffstat (limited to 'juick-xmpp-bot/src/main/java/com/juick/components/XMPPBot.java')
-rw-r--r--juick-xmpp-bot/src/main/java/com/juick/components/XMPPBot.java91
1 files changed, 91 insertions, 0 deletions
diff --git a/juick-xmpp-bot/src/main/java/com/juick/components/XMPPBot.java b/juick-xmpp-bot/src/main/java/com/juick/components/XMPPBot.java
new file mode 100644
index 00000000..c95c94e3
--- /dev/null
+++ b/juick-xmpp-bot/src/main/java/com/juick/components/XMPPBot.java
@@ -0,0 +1,91 @@
+package com.juick.components;
+
+import com.juick.User;
+import com.juick.server.UserQueries;
+import com.juick.server.helpers.UserInfo;
+import com.juick.server.protocol.JuickProtocol;
+import com.juick.server.protocol.ProtocolReply;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.math.NumberUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.env.Environment;
+import org.springframework.jdbc.core.JdbcTemplate;
+import rocks.xmpp.addr.Jid;
+import rocks.xmpp.core.XmppException;
+import rocks.xmpp.core.stanza.model.Message;
+import rocks.xmpp.extensions.component.accept.ExternalComponent;
+import rocks.xmpp.extensions.vcard.temp.VCardManager;
+import rocks.xmpp.extensions.vcard.temp.model.VCard;
+import rocks.xmpp.extensions.version.SoftwareVersionManager;
+import rocks.xmpp.extensions.version.model.SoftwareVersion;
+
+import javax.inject.Inject;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
+
+/**
+ * Created by vt on 12/11/2016.
+ */
+public class XMPPBot {
+ private static final Logger logger = LoggerFactory.getLogger(XMPPBot.class);
+ @Inject
+ JdbcTemplate jdbc;
+
+ public XMPPBot(Environment env) {
+ ExternalComponent component = ExternalComponent.create(env.getProperty("component_name", "juick.com"),
+ env.getProperty("component_password", "secret"), env.getProperty("component_host", "localhost"),
+ NumberUtils.toInt(env.getProperty("component_port", "5347"), 5347));
+ Jid juickJid = Jid.of(env.getProperty("xmppbot_jid", "juick@juick.com/Juick"));
+ try {
+ SoftwareVersionManager softwareVersionManager = component.getManager(SoftwareVersionManager.class);
+ softwareVersionManager.setSoftwareVersion(new SoftwareVersion("Juick", "git", System.getProperty("os.name", "generic")));
+ VCardManager vCardManager = component.getManager(VCardManager.class);
+ vCardManager.setEnabled(true);
+ VCard ownVCard = new VCard();
+ ownVCard.setNickname("Juick");
+ ownVCard.setUrl(new URL("http://juick.com/"));
+ ownVCard.setPhoto(new VCard.Image("image/png", IOUtils.toByteArray(getClass().getClassLoader().getResourceAsStream("vCard.png"))));
+ vCardManager.setVCard(ownVCard);
+ JuickProtocol protocol = new JuickProtocol(jdbc, "http://juick.com/");
+ component.addInboundMessageListener(e -> {
+ Message message = e.getMessage();
+ if (message.getType().equals(Message.Type.ERROR) || message.getType().equals(Message.Type.GROUPCHAT)) {
+ return;
+ }
+ String text = message.getBody().trim();
+ String command = text.toUpperCase();
+ User user = UserQueries.getUserByJID(jdbc, message.getFrom().asBareJid().toString());
+ if (command.equals("VCARD")) {
+ try {
+ VCard vCard = vCardManager.getVCard(message.getFrom().asBareJid()).getResult();
+ UserInfo info = new UserInfo();
+ info.setFullName(vCard.getFormattedName());
+ info.setCountry(vCard.getAddresses().get(0).getCountry());
+ info.setUrl(vCard.getUrl().toString());
+ UserQueries.updateUserInfo(jdbc, user, info);
+ component.sendMessage(new Message(message.getFrom(), Message.Type.CHAT, "vCard updated"));
+ } catch (XmppException vce) {
+ logger.warn("vcard exception", vce);
+ }
+ } else {
+ try {
+ ProtocolReply reply = protocol.getReply(user, text);
+ Message replyMessage = new Message(message.getFrom(), Message.Type.CHAT);
+ replyMessage.setBody(reply.getDescription());
+ replyMessage.setFrom(juickJid);
+ component.send(replyMessage);
+ } catch (InvocationTargetException | IllegalAccessException | NoSuchMethodException ex) {
+ logger.warn("unhandled error", ex);
+ }
+ }
+ });
+ component.connect();
+ } catch (XmppException e) {
+ logger.error("bot connection error", e);
+ } catch (IOException e) {
+ logger.error("bot initialization error", e);
+ }
+ }
+}