From 80d4a65c309c4c8d6386943d544b8cada9cd31c9 Mon Sep 17 00:00:00 2001 From: egorbochkarev Date: Thu, 7 Jun 2018 20:43:41 +0300 Subject: [PATCH 1/3] Add TelegramLongPollingSessionBot with session support --- pom.xml | 1 + telegrambots-chat-session-bot/README.md | 58 ++++ telegrambots-chat-session-bot/pom.xml | 257 ++++++++++++++++++ .../telegrambots/session/ChatIdConverter.java | 10 + .../session/DefaultChatIdConverter.java | 28 ++ .../session/DefaultChatSessionContext.java | 27 ++ .../TelegramLongPollingSessionBot.java | 48 ++++ 7 files changed, 429 insertions(+) create mode 100644 telegrambots-chat-session-bot/README.md create mode 100644 telegrambots-chat-session-bot/pom.xml create mode 100644 telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/ChatIdConverter.java create mode 100644 telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/DefaultChatIdConverter.java create mode 100644 telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/DefaultChatSessionContext.java create mode 100644 telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/TelegramLongPollingSessionBot.java diff --git a/pom.xml b/pom.xml index 4b5ea1dc..8ff4c6fa 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,7 @@ telegrambots-extensions telegrambots-abilities telegrambots-spring-boot-starter + telegrambots-chat-session-bot diff --git a/telegrambots-chat-session-bot/README.md b/telegrambots-chat-session-bot/README.md new file mode 100644 index 00000000..16e9d6af --- /dev/null +++ b/telegrambots-chat-session-bot/README.md @@ -0,0 +1,58 @@ +
+ abilitybots + +[![Build Status](https://travis-ci.org/rubenlagus/TelegramBots.svg?branch=master)](https://travis-ci.org/rubenlagus/TelegramBots) +[![Jitpack](https://jitpack.io/v/rubenlagus/TelegramBots.svg)](https://jitpack.io/#rubenlagus/TelegramBots) +[![JavaDoc](http://svgur.com/i/1Ex.svg)](https://addo37.github.io/AbilityBots/) +[![Telegram](http://trellobot.doomdns.org/telegrambadge.svg)](https://telegram.me/JavaBotsApi) +[![ghit.me](https://ghit.me/badge.svg?repo=rubenlagus/TelegramBots)](https://ghit.me/repo/rubenlagus/TelegramBots) + +
+ +Usage +----- + +**Maven** + +```xml + + org.telegram + telegrambots-chat-session-bot + 3.6.1 + +``` + +Motivation +---------- +Implementation of bot dialogs require saving some data about current state of conversation. +That brings us to idea of chat session management. + +How to use +---------- +`Chat session bot` was implemented by using [`Shiro Apache`](https://shiro.apache.org/) session manager. +That allow to manage and store sessions. + + +To create default Long Polling Session Bot with in-memory store, +you need simply implement `TelegramLongPollingSessionBot` +```java +public class ExampleBotWithSession extends TelegramLongPollingSessionBot { + + @Override + public void onUpdateReceived(Update update, Optional optionalSession) { + //Do some action with update and session + } + + @Override + public String getBotUsername() { + return "ExampleBotWithSessionBot"; + } + + @Override + public String getBotToken() { + return "1234"; + } +} +``` + +Where session is implementation of `org.apache.shiro.session.Session` \ No newline at end of file diff --git a/telegrambots-chat-session-bot/pom.xml b/telegrambots-chat-session-bot/pom.xml new file mode 100644 index 00000000..5c603953 --- /dev/null +++ b/telegrambots-chat-session-bot/pom.xml @@ -0,0 +1,257 @@ + + + 4.0.0 + org.telegram + telegrambots-chat-session-bot + 3.6.1 + jar + + Telegram Bots Chat Session Bot + https://github.com/rubenlagus/TelegramBots + Telegram bot with chat session support + + + https://github.com/rubenlagus/TelegramBots/issues + GitHub Issues + + + + https://github.com/rubenlagus/TelegramBots + scm:git:git://github.com/rubenlagus/TelegramBots.git + scm:git:git@github.com:rubenlagus/TelegramBots.git + + + + https://travis-ci.org/rubenlagus/TelegramBots + Travis + + + + + bochkarevei@gmail.com + Egor Bochkarev + https://github.com/EgorBochkarev + EgorBochkarev + + + + + + MIT License + http://www.opensource.org/licenses/mit-license.php + repo + + + + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + + ossrh + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + + UTF-8 + UTF-8 + 3.6.1 + 1.16.20 + 1.4.0 + + + + + + org.telegram + telegrambots + ${bots.version} + + + + + org.apache.shiro + shiro-core + ${shiro.version} + + + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + org.mockito + mockito-all + 2.0.2-beta + test + + + junit + junit + 4.11 + test + + + + + ${project.basedir}/target + ${project.build.directory}/classes + ${project.artifactId}-${project.version} + ${project.build.directory}/test-classes + ${project.basedir}/src/main/java + + + org.apache.maven.plugins + maven-gpg-plugin + 1.5 + + + sign-artifacts + verify + + sign + + + + + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.6.3 + true + + ossrh + https://oss.sonatype.org/ + true + + + + maven-clean-plugin + 3.0.0 + + + clean-project + clean + + clean + + + + + + maven-assembly-plugin + 2.6 + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.0.0 + + + + jar + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.10.3 + + + + jar + + + -Xdoclint:none + + + + + + org.jacoco + jacoco-maven-plugin + 0.7.7.201606060606 + + + + prepare-agent + + + + report + test + + report + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 1.4.1 + + + enforce-versions + + enforce + + + + + + + + + + + org.apache.maven.plugins + maven-dependency-plugin + 2.4 + + + copy + package + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + UTF-8 + + + + + + \ No newline at end of file diff --git a/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/ChatIdConverter.java b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/ChatIdConverter.java new file mode 100644 index 00000000..45fb94e0 --- /dev/null +++ b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/ChatIdConverter.java @@ -0,0 +1,10 @@ +package org.telegram.telegrambots.session; + +import org.apache.shiro.session.mgt.SessionKey; +import org.apache.shiro.session.mgt.eis.SessionIdGenerator; + +import java.io.Serializable; + +public interface ChatIdConverter extends SessionKey, SessionIdGenerator { + public void setSessionId(Serializable sessionId); +} \ No newline at end of file diff --git a/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/DefaultChatIdConverter.java b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/DefaultChatIdConverter.java new file mode 100644 index 00000000..5056462b --- /dev/null +++ b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/DefaultChatIdConverter.java @@ -0,0 +1,28 @@ +package org.telegram.telegrambots.session; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import org.apache.shiro.session.Session; + +import java.io.Serializable; + +@AllArgsConstructor +@NoArgsConstructor +public class DefaultChatIdConverter implements ChatIdConverter { + private long sessionId; + + @Override + public void setSessionId(Serializable sessionId){ + this.sessionId = (long) sessionId; + }; + + @Override + public Serializable getSessionId() { + return sessionId; + } + + @Override + public Serializable generateId(Session session) { + return getSessionId(); + } +} diff --git a/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/DefaultChatSessionContext.java b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/DefaultChatSessionContext.java new file mode 100644 index 00000000..cb353fc1 --- /dev/null +++ b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/DefaultChatSessionContext.java @@ -0,0 +1,27 @@ +package org.telegram.telegrambots.session; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import org.apache.shiro.session.mgt.SessionContext; + +import java.io.Serializable; +import java.util.HashMap; + +@AllArgsConstructor +public class DefaultChatSessionContext extends HashMap implements SessionContext { + private long sessionId; + @Setter + @Getter + private String host; + + @Override + public Serializable getSessionId() { + return sessionId; + } + + @Override + public void setSessionId(Serializable serializable) { + this.sessionId = (long) serializable; + } +} diff --git a/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/TelegramLongPollingSessionBot.java b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/TelegramLongPollingSessionBot.java new file mode 100644 index 00000000..908b0350 --- /dev/null +++ b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/TelegramLongPollingSessionBot.java @@ -0,0 +1,48 @@ +package org.telegram.telegrambots.session; + +import lombok.Setter; +import org.apache.shiro.session.Session; +import org.apache.shiro.session.UnknownSessionException; +import org.apache.shiro.session.mgt.DefaultSessionManager; +import org.apache.shiro.session.mgt.SessionContext; +import org.apache.shiro.session.mgt.eis.AbstractSessionDAO; +import org.telegram.telegrambots.api.objects.Update; +import org.telegram.telegrambots.bots.TelegramLongPollingBot; + +import java.util.Optional; + +public abstract class TelegramLongPollingSessionBot extends TelegramLongPollingBot { + DefaultSessionManager sessionManager = new DefaultSessionManager(); + + @Setter + ChatIdConverter chatIdConverter = new DefaultChatIdConverter(); + + public TelegramLongPollingSessionBot(){ + this.setChatIdConverter(new DefaultChatIdConverter()); + } + + public TelegramLongPollingSessionBot(ChatIdConverter chatIdConverter){ + this.setChatIdConverter(chatIdConverter); + } + + @Override + public void onUpdateReceived(Update update) { + Optional chatSession; + if (update.hasMessage()) { + chatIdConverter.setSessionId(update.getMessage().getChatId()); + AbstractSessionDAO sessionDAO = (AbstractSessionDAO) sessionManager.getSessionDAO(); + sessionDAO.setSessionIdGenerator(chatIdConverter); + try { + chatSession = Optional.of(sessionManager.getSession(chatIdConverter)); + } catch (UnknownSessionException e) { + SessionContext botSession = new DefaultChatSessionContext(update.getMessage().getChatId(), update.getMessage().getFrom().getUserName()); + chatSession = Optional.of(sessionManager.start(botSession)); + } + } else { + chatSession = Optional.empty(); + } + onUpdateReceived(update, chatSession); + } + + public abstract void onUpdateReceived(Update update, Optional botSession); +} From 5f64fb90ed3500ef5dba025e58aa63c3b3148f24 Mon Sep 17 00:00:00 2001 From: egorbochkarev Date: Fri, 8 Jun 2018 23:12:34 +0300 Subject: [PATCH 2/3] Support callback query --- .../TelegramLongPollingSessionBot.java | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/TelegramLongPollingSessionBot.java b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/TelegramLongPollingSessionBot.java index 908b0350..896a832b 100644 --- a/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/TelegramLongPollingSessionBot.java +++ b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/TelegramLongPollingSessionBot.java @@ -6,43 +6,56 @@ import org.apache.shiro.session.UnknownSessionException; import org.apache.shiro.session.mgt.DefaultSessionManager; import org.apache.shiro.session.mgt.SessionContext; import org.apache.shiro.session.mgt.eis.AbstractSessionDAO; +import org.telegram.telegrambots.api.objects.Message; import org.telegram.telegrambots.api.objects.Update; import org.telegram.telegrambots.bots.TelegramLongPollingBot; import java.util.Optional; public abstract class TelegramLongPollingSessionBot extends TelegramLongPollingBot { - DefaultSessionManager sessionManager = new DefaultSessionManager(); + @Setter + DefaultSessionManager sessionManager; @Setter - ChatIdConverter chatIdConverter = new DefaultChatIdConverter(); + ChatIdConverter chatIdConverter; public TelegramLongPollingSessionBot(){ - this.setChatIdConverter(new DefaultChatIdConverter()); + this(new DefaultChatIdConverter()); } public TelegramLongPollingSessionBot(ChatIdConverter chatIdConverter){ + this.setSessionManager(new DefaultSessionManager()); this.setChatIdConverter(chatIdConverter); + AbstractSessionDAO sessionDAO = (AbstractSessionDAO) sessionManager.getSessionDAO(); + sessionDAO.setSessionIdGenerator(chatIdConverter); } @Override public void onUpdateReceived(Update update) { Optional chatSession; + Message message; if (update.hasMessage()) { - chatIdConverter.setSessionId(update.getMessage().getChatId()); - AbstractSessionDAO sessionDAO = (AbstractSessionDAO) sessionManager.getSessionDAO(); - sessionDAO.setSessionIdGenerator(chatIdConverter); - try { - chatSession = Optional.of(sessionManager.getSession(chatIdConverter)); - } catch (UnknownSessionException e) { - SessionContext botSession = new DefaultChatSessionContext(update.getMessage().getChatId(), update.getMessage().getFrom().getUserName()); - chatSession = Optional.of(sessionManager.start(botSession)); - } + message = update.getMessage(); + } else if (update.hasCallbackQuery()) { + message = update.getCallbackQuery().getMessage(); } else { chatSession = Optional.empty(); + onUpdateReceived(update, chatSession); + return; } + chatIdConverter.setSessionId(message.getChatId()); + chatSession = this.getSession(message); onUpdateReceived(update, chatSession); } + public Optional getSession(Message message){ + try { + return Optional.of(sessionManager.getSession(chatIdConverter)); + } catch (UnknownSessionException e) { + SessionContext botSession = new DefaultChatSessionContext(message.getChatId(), message.getFrom().getUserName()); + return Optional.of(sessionManager.start(botSession)); + } + } + public abstract void onUpdateReceived(Update update, Optional botSession); } From 1c1f340dc92ba9e69a54c80b573bfa19a7802ee1 Mon Sep 17 00:00:00 2001 From: Ruben Bermudez Date: Fri, 27 Jul 2018 00:48:40 +0200 Subject: [PATCH 3/3] Update to version 4.0.0 --- Bots.ipr | 136 ++++++++++++++++++ telegrambots-chat-session-bot/README.md | 5 +- telegrambots-chat-session-bot/pom.xml | 19 ++- .../telegrambots/session/ChatIdConverter.java | 2 +- .../session/DefaultChatIdConverter.java | 14 +- .../session/DefaultChatSessionContext.java | 22 ++- .../TelegramLongPollingSessionBot.java | 16 ++- 7 files changed, 183 insertions(+), 31 deletions(-) diff --git a/Bots.ipr b/Bots.ipr index ee3dd609..992b5bc6 100644 --- a/Bots.ipr +++ b/Bots.ipr @@ -18,6 +18,7 @@ + @@ -33,6 +34,7 @@ + @@ -502,6 +504,7 @@ + @@ -840,6 +843,7 @@ + @@ -980,6 +984,17 @@ + + + + + + + + + + + @@ -991,6 +1006,17 @@ + + + + + + + + + + + @@ -1156,6 +1182,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1541,6 +1666,17 @@ + + + + + + + + + + + diff --git a/telegrambots-chat-session-bot/README.md b/telegrambots-chat-session-bot/README.md index 16e9d6af..e6237511 100644 --- a/telegrambots-chat-session-bot/README.md +++ b/telegrambots-chat-session-bot/README.md @@ -1,11 +1,8 @@
- abilitybots [![Build Status](https://travis-ci.org/rubenlagus/TelegramBots.svg?branch=master)](https://travis-ci.org/rubenlagus/TelegramBots) [![Jitpack](https://jitpack.io/v/rubenlagus/TelegramBots.svg)](https://jitpack.io/#rubenlagus/TelegramBots) -[![JavaDoc](http://svgur.com/i/1Ex.svg)](https://addo37.github.io/AbilityBots/) [![Telegram](http://trellobot.doomdns.org/telegrambadge.svg)](https://telegram.me/JavaBotsApi) -[![ghit.me](https://ghit.me/badge.svg?repo=rubenlagus/TelegramBots)](https://ghit.me/repo/rubenlagus/TelegramBots)
@@ -18,7 +15,7 @@ Usage org.telegram telegrambots-chat-session-bot - 3.6.1 + 4.0.0 ``` diff --git a/telegrambots-chat-session-bot/pom.xml b/telegrambots-chat-session-bot/pom.xml index 5c603953..23050544 100644 --- a/telegrambots-chat-session-bot/pom.xml +++ b/telegrambots-chat-session-bot/pom.xml @@ -5,7 +5,7 @@ 4.0.0 org.telegram telegrambots-chat-session-bot - 3.6.1 + 4.0.0 jar Telegram Bots Chat Session Bot @@ -29,6 +29,12 @@ + + rberlopez@gmail.com + Ruben Bermudez + https://github.com/rubenlagus + rubenlagus + bochkarevei@gmail.com Egor Bochkarev @@ -59,8 +65,7 @@ UTF-8 UTF-8 - 3.6.1 - 1.16.20 + 4.0.0 1.4.0 @@ -79,14 +84,6 @@ ${shiro.version} - - - org.projectlombok - lombok - ${lombok.version} - provided - - org.mockito mockito-all diff --git a/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/ChatIdConverter.java b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/ChatIdConverter.java index 45fb94e0..43d6ab33 100644 --- a/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/ChatIdConverter.java +++ b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/ChatIdConverter.java @@ -6,5 +6,5 @@ import org.apache.shiro.session.mgt.eis.SessionIdGenerator; import java.io.Serializable; public interface ChatIdConverter extends SessionKey, SessionIdGenerator { - public void setSessionId(Serializable sessionId); + void setSessionId(Serializable sessionId); } \ No newline at end of file diff --git a/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/DefaultChatIdConverter.java b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/DefaultChatIdConverter.java index 5056462b..5e5dd571 100644 --- a/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/DefaultChatIdConverter.java +++ b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/DefaultChatIdConverter.java @@ -1,16 +1,22 @@ package org.telegram.telegrambots.session; -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; import org.apache.shiro.session.Session; import java.io.Serializable; -@AllArgsConstructor -@NoArgsConstructor +@SuppressWarnings({"unused", "WeakerAccess"}) public class DefaultChatIdConverter implements ChatIdConverter { private long sessionId; + public DefaultChatIdConverter() { + super(); + } + + public DefaultChatIdConverter(long sessionId) { + this(); + this.sessionId = sessionId; + } + @Override public void setSessionId(Serializable sessionId){ this.sessionId = (long) sessionId; diff --git a/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/DefaultChatSessionContext.java b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/DefaultChatSessionContext.java index cb353fc1..08ef999f 100644 --- a/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/DefaultChatSessionContext.java +++ b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/DefaultChatSessionContext.java @@ -1,20 +1,30 @@ package org.telegram.telegrambots.session; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; import org.apache.shiro.session.mgt.SessionContext; import java.io.Serializable; import java.util.HashMap; -@AllArgsConstructor +@SuppressWarnings("WeakerAccess") public class DefaultChatSessionContext extends HashMap implements SessionContext { private long sessionId; - @Setter - @Getter private String host; + public DefaultChatSessionContext(long sessionId, String host) { + this.sessionId = sessionId; + this.host = host; + } + + @Override + public String getHost() { + return host; + } + + @Override + public void setHost(String host) { + this.host = host; + } + @Override public Serializable getSessionId() { return sessionId; diff --git a/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/TelegramLongPollingSessionBot.java b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/TelegramLongPollingSessionBot.java index 896a832b..8182578e 100644 --- a/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/TelegramLongPollingSessionBot.java +++ b/telegrambots-chat-session-bot/src/main/java/org/telegram/telegrambots/session/TelegramLongPollingSessionBot.java @@ -1,22 +1,20 @@ package org.telegram.telegrambots.session; -import lombok.Setter; import org.apache.shiro.session.Session; import org.apache.shiro.session.UnknownSessionException; import org.apache.shiro.session.mgt.DefaultSessionManager; import org.apache.shiro.session.mgt.SessionContext; import org.apache.shiro.session.mgt.eis.AbstractSessionDAO; -import org.telegram.telegrambots.api.objects.Message; -import org.telegram.telegrambots.api.objects.Update; +import org.telegram.telegrambots.meta.api.objects.Message; +import org.telegram.telegrambots.meta.api.objects.Update; import org.telegram.telegrambots.bots.TelegramLongPollingBot; import java.util.Optional; +@SuppressWarnings({"WeakerAccess", "OptionalUsedAsFieldOrParameterType", "unused"}) public abstract class TelegramLongPollingSessionBot extends TelegramLongPollingBot { - @Setter DefaultSessionManager sessionManager; - @Setter ChatIdConverter chatIdConverter; public TelegramLongPollingSessionBot(){ @@ -30,6 +28,14 @@ public abstract class TelegramLongPollingSessionBot extends TelegramLongPollingB sessionDAO.setSessionIdGenerator(chatIdConverter); } + public void setSessionManager(DefaultSessionManager sessionManager) { + this.sessionManager = sessionManager; + } + + public void setChatIdConverter(ChatIdConverter chatIdConverter) { + this.chatIdConverter = chatIdConverter; + } + @Override public void onUpdateReceived(Update update) { Optional chatSession;