aboutsummaryrefslogtreecommitdiff
path: root/juick-xmpp-bot
diff options
context:
space:
mode:
authorGravatar Vitaly Takmazov2016-11-12 21:39:19 +0300
committerGravatar Vitaly Takmazov2016-11-12 21:39:19 +0300
commitb75258ee5ed84510579050b5dba1edb904a09dfa (patch)
tree004bf34050ea281b88a4e7b6f55072959416a9c1 /juick-xmpp-bot
parent2d9e3878f472743e326dcd82818f7adb94e6f769 (diff)
initial babbler-based xmpp bot
Diffstat (limited to 'juick-xmpp-bot')
-rw-r--r--juick-xmpp-bot/build.gradle33
-rw-r--r--juick-xmpp-bot/src/main/java/com/juick/components/XMPPBot.java91
-rw-r--r--juick-xmpp-bot/src/main/java/com/juick/components/configuration/BotAppConfiguration.java38
-rw-r--r--juick-xmpp-bot/src/main/java/com/juick/components/configuration/BotInitializer.java40
-rw-r--r--juick-xmpp-bot/src/main/java/com/juick/components/configuration/BotMvcConfiguration.java33
-rw-r--r--juick-xmpp-bot/src/main/java/com/juick/components/controllers/StatusController.java30
-rw-r--r--juick-xmpp-bot/src/main/resources/vCard.pngbin0 -> 5558 bytes
7 files changed, 265 insertions, 0 deletions
diff --git a/juick-xmpp-bot/build.gradle b/juick-xmpp-bot/build.gradle
new file mode 100644
index 00000000..2950d081
--- /dev/null
+++ b/juick-xmpp-bot/build.gradle
@@ -0,0 +1,33 @@
+apply plugin: 'java'
+apply plugin: 'war'
+apply plugin: 'org.akhikhl.gretty'
+apply plugin: 'com.github.ben-manes.versions'
+
+repositories {
+ mavenCentral()
+ maven { url "https://jitpack.io" }
+}
+
+def springFrameworkVersion = '4.3.4.RELEASE'
+
+dependencies {
+ compile project(':juick-core')
+ compile "org.springframework:spring-webmvc:${springFrameworkVersion}"
+ compile 'com.mitchellbosecke:pebble-spring4:2.2.3'
+ compile 'org.bitbucket.sco0ter.babbler:xmpp-core-client:279e488e51'
+ compile 'org.bitbucket.sco0ter.babbler:xmpp-extensions-client:279e488e51'
+ providedRuntime 'mysql:mysql-connector-java:5.1.40'
+}
+
+compileJava.options.encoding = 'UTF-8'
+
+gretty {
+ httpPort = 8080
+ contextPath = ''
+ servletContainer = 'tomcat8'
+}
+
+configurations {
+ all*.exclude module: 'commons-logging'
+}
+
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);
+ }
+ }
+}
diff --git a/juick-xmpp-bot/src/main/java/com/juick/components/configuration/BotAppConfiguration.java b/juick-xmpp-bot/src/main/java/com/juick/components/configuration/BotAppConfiguration.java
new file mode 100644
index 00000000..8eb45170
--- /dev/null
+++ b/juick-xmpp-bot/src/main/java/com/juick/components/configuration/BotAppConfiguration.java
@@ -0,0 +1,38 @@
+package com.juick.components.configuration;
+
+import com.juick.components.XMPPBot;
+import com.juick.configuration.DataConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.core.env.Environment;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+import javax.inject.Inject;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * Created by aalexeev on 11/12/16.
+ */
+@Configuration
+@PropertySource("classpath:juick.conf")
+@Import(DataConfiguration.class)
+public class BotAppConfiguration {
+ @Inject
+ private Environment env;
+ @Inject
+ private JdbcTemplate jdbc;
+
+ @Bean
+ public XMPPBot xmpp() {
+ return new XMPPBot(env);
+ }
+
+ @Bean
+ public ExecutorService service() {
+ return Executors.newCachedThreadPool();
+ }
+
+}
diff --git a/juick-xmpp-bot/src/main/java/com/juick/components/configuration/BotInitializer.java b/juick-xmpp-bot/src/main/java/com/juick/components/configuration/BotInitializer.java
new file mode 100644
index 00000000..1b8dd249
--- /dev/null
+++ b/juick-xmpp-bot/src/main/java/com/juick/components/configuration/BotInitializer.java
@@ -0,0 +1,40 @@
+package com.juick.components.configuration;
+
+import com.juick.configuration.DataConfiguration;
+import org.springframework.web.filter.CharacterEncodingFilter;
+import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
+
+import javax.servlet.Filter;
+
+/**
+ * Created by vt on 09/02/16.
+ */
+public class BotInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
+
+ @Override
+ protected Class<?>[] getRootConfigClasses() {
+ return new Class<?>[]{BotAppConfiguration.class, DataConfiguration.class};
+ }
+
+ @Override
+ protected Class<?>[] getServletConfigClasses() {
+ return new Class<?>[]{BotMvcConfiguration.class};
+ }
+
+ @Override
+ protected String[] getServletMappings() {
+ return new String[]{"/"};
+ }
+
+ @Override
+ protected Filter[] getServletFilters() {
+ CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
+ characterEncodingFilter.setEncoding("UTF-8");
+ return new Filter[]{characterEncodingFilter};
+ }
+
+ @Override
+ protected String getServletName() {
+ return "Bot dispatcher servlet";
+ }
+}
diff --git a/juick-xmpp-bot/src/main/java/com/juick/components/configuration/BotMvcConfiguration.java b/juick-xmpp-bot/src/main/java/com/juick/components/configuration/BotMvcConfiguration.java
new file mode 100644
index 00000000..2c55c0ce
--- /dev/null
+++ b/juick-xmpp-bot/src/main/java/com/juick/components/configuration/BotMvcConfiguration.java
@@ -0,0 +1,33 @@
+package com.juick.components.configuration;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+
+import java.util.List;
+
+/**
+ * Created by vitalyster on 28.06.2016.
+ */
+@Configuration
+@ComponentScan(basePackages = {"com.juick.components.controllers"})
+public class BotMvcConfiguration extends WebMvcConfigurationSupport {
+
+ @Override
+ protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
+ Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
+ .serializationInclusion(JsonInclude.Include.NON_DEFAULT)
+ .serializationInclusion(JsonInclude.Include.NON_NULL)
+ .serializationInclusion(JsonInclude.Include.NON_ABSENT)
+ .serializationInclusion(JsonInclude.Include.NON_EMPTY);
+ MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(builder.build());
+ converter.getObjectMapper().registerModule(new Jdk8Module());
+ converters.add(converter);
+ super.configureMessageConverters(converters);
+ }
+}
diff --git a/juick-xmpp-bot/src/main/java/com/juick/components/controllers/StatusController.java b/juick-xmpp-bot/src/main/java/com/juick/components/controllers/StatusController.java
new file mode 100644
index 00000000..d30a906d
--- /dev/null
+++ b/juick-xmpp-bot/src/main/java/com/juick/components/controllers/StatusController.java
@@ -0,0 +1,30 @@
+package com.juick.components.controllers;
+
+import com.juick.components.XMPPBot;
+import com.juick.server.helpers.Status;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.inject.Inject;
+
+/**
+ * Created by vitalyster on 24.10.2016.
+ */
+@Controller
+@ResponseBody
+public class StatusController {
+ @Inject
+ XMPPBot xmpp;
+
+ @RequestMapping(method = RequestMethod.GET, value = "/", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
+ public Status status() {
+ if (xmpp != null) {
+ String status = "OK";
+ return new Status(status);
+ }
+ return new Status("Error");
+ }
+}
diff --git a/juick-xmpp-bot/src/main/resources/vCard.png b/juick-xmpp-bot/src/main/resources/vCard.png
new file mode 100644
index 00000000..5ed5336a
--- /dev/null
+++ b/juick-xmpp-bot/src/main/resources/vCard.png
Binary files differ