From 80d4a65c309c4c8d6386943d544b8cada9cd31c9 Mon Sep 17 00:00:00 2001 From: egorbochkarev Date: Thu, 7 Jun 2018 20:43:41 +0300 Subject: [PATCH] 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); +}