Skip to content

Commit

Permalink
Merge branch 'nypi:main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
Xentention authored Dec 12, 2022
2 parents 05e6c73 + 79b492b commit 28536c4
Show file tree
Hide file tree
Showing 53 changed files with 2,516 additions and 64 deletions.
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,24 @@ Learn It — сервис, помогающий в изучении иностр
* **Тест: вставить пропущенное слово в предложение или фразу**

Описание в процессе заполнения. Реализует - Дажук А. С.

* **Тест: грамматика английского языка**

Описание в процессе заполнения. Реализует - Петроченко Н.А.

* **рекомендации: по заданной тематике сформировать список фильмов для просмотра**

Можно выбрать жанры, сделать описание и высятятся рекомендации. Все опционально.
Реализует - Алина Бурыкина

* **Сервис по сохранению и поиску картинок в базе данных**

Данный микросервис позволяет сохранять картинку к тексту, чтобы потом была возможность по слову посмотреть, в каком контексте оно было использовано. Реализует - Михайлов П.А.

* **Отслеживание прогресса изучения: сохранение метрик по пользователям**

Описание в процессе заполнения. Реализует - Бакленев А.В.

* **...добавляйте свои сервисы...**

## Требования к сервисам
Expand Down
1 change: 0 additions & 1 deletion chatbot/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,5 @@ build/
/src/main/resources/schema.sql
/src/main/resources/data.sql
/src/main/resources/application.properties
/.mvn/
/mvnw
/mvnw.cmd
2 changes: 1 addition & 1 deletion chatbot/.mvn/wrapper/maven-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
30 changes: 25 additions & 5 deletions chatbot/README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,35 @@
# Телеграм чат-бот 🤖
# Телеграм чат-бот (LearnItTesterBot) 🤖

*Автор - [Дронов Егор](https://github.com/dSofarts)*
*Автор - **[Дронов Егор](https://github.com/dSofarts)***

Данный микросервис реализует работу телеграм чат-бота, который помогает в изучении английского
языка. В данном чат-боте можно проходить тесты на знания слов.

## Возможности
Telegram бот [расположен по ссылке](https://t.me/LearnItTesterBot):

Данный раздел еще не написан
https://t.me/LearnItTesterBot

## Руководство по запуску

Данный раздел еще не написан
Для запуска данного микросервиса Вам необходимо [скачать **.jar** файл](https://github.com/nypi/learnit/blob/main/chatbot/chatbot-0.0.1-SNAPSHOT.jar?raw=true) расположенный по адресу:

https://github.com/nypi/learnit/blob/main/chatbot/chatbot-0.0.1-SNAPSHOT.jar

После загрузки файла вам нужно открыть консоль на вашей OC (терминал), в которой вам нужно ввести:

java -jar chatbot-0.0.1-SNAPSHOT.jar

Или ссылку на файл, например:

java -jar /Users/User/Downloads/chatbot-0.0.1-SNAPSHOT.jar

## Возможности

* На данный момент в чат-боте реализован один вариант тестов: **выбрать правильный перевод слова**. При этом реализована возможность для добавления новых тестов.
* Вся статистика решеных тестов сохраняется в базе данных. Вопросы для тестов беруться от туда же.
* На данный момент в базе данных 40 вопросов, которые могут легко дополняться.
* Все реализованные команды чат-бота:

/statistics - Моя статистика
/quiz - Запустить тест
/help - Помощь
Binary file added chatbot/chatbot-0.0.1-SNAPSHOT.jar
Binary file not shown.
6 changes: 6 additions & 0 deletions chatbot/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,12 @@
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.5</version>
</dependency>
</dependencies>

<build>
Expand Down
132 changes: 121 additions & 11 deletions chatbot/src/main/java/ru/croc/chatbot/CommandLine.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,16 @@
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
import ru.croc.chatbot.quizzes.translation.TranslationQuestion;
import ru.croc.chatbot.quizzes.translation.TranslatorQuiz;

@Component
public class CommandLine {
Expand All @@ -19,24 +24,130 @@ public class CommandLine {

@Autowired
private DataSource dataSource;
@Autowired
private TranslatorQuiz translatorQuiz;

private final Map<Long, List<TranslationQuestion>> questions = new HashMap<>();
private final Map<Long, TranslationQuestion> oldQuestion = new HashMap<>();

/**
* Получить тест
* @param chatId chatID
*/
public void getQuiz(long chatId)
throws TelegramApiException, SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
questions.put(chatId, translatorQuiz.getQuestions());
nextQuestion(chatId);
}

/**
* Добавить правильный ответ в БД
* @param chatId chatID
*/
public void addRightAnswer(long chatId) throws SQLException {
int rightAnswers = 0;
long chat = 0;
try (Connection connection = dataSource.getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(
"SELECT * FROM USERS u WHERE u.chatId = ?")) {
statement.setLong(1, chatId);
try (ResultSet result = statement.executeQuery()) {
while (result.next()) {
rightAnswers = result.getInt("countRightAnswer");
chat = result.getLong("chatId");
}
}
}
if (chat != chatId) {
addNewUser(connection, chatId);
}
try (PreparedStatement statement = connection.prepareStatement(
"UPDATE USERS SET countRightAnswer=? WHERE chatId=?;")) {
statement.setInt(1, rightAnswers + 1);
statement.setLong(2, chatId);
statement.execute();
}
}
}

/**
* Добавить пользователя в статистику
* @param connection соединение
* @param chatId chatID
*/
public void addNewUser(Connection connection, long chatId) throws SQLException {
try (PreparedStatement statement = connection.prepareStatement(
"INSERT INTO USERS(chatId) VALUES (?);")) {
statement.setLong(1, chatId);
statement.execute();
}
}

/**
* Выдать вопрос
* @param chatId chatID
*/
public void nextQuestion(long chatId)
throws TelegramApiException, SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
if (!questions.get(chatId).isEmpty()) {
TranslationQuestion translationQuestion = questions.get(chatId).iterator().next();
questions.get(chatId).remove(translationQuestion);
oldQuestion.put(chatId, translationQuestion);
translatorQuiz.start(chatId, translationQuestion);
} else {
oldQuestion.remove(chatId);
questions.remove(chatId);
int countQuiz = 0;
try (Connection connection = dataSource.getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(
"SELECT * FROM USERS u WHERE u.chatId = ?")) {
statement.setLong(1, chatId);
try (ResultSet result = statement.executeQuery()) {
while (result.next()) {
countQuiz = result.getInt("countQuiz");
}
}
}
try (PreparedStatement statement = connection.prepareStatement(
"UPDATE USERS SET countQuiz=? WHERE chatId=?;")) {
statement.setInt(1, countQuiz + 1);
statement.setLong(2, chatId);
statement.execute();
}
}
getStats(chatId);
}
}

/**
* Проверить ответ
* @param chatId chatID
* @param answer ответ
*/
public boolean checkAnswer(long chatId, String answer) {
if (oldQuestion.get(chatId).getRight().equals(answer)) {
return true;
}
return false;
}

/**
* Посмотреть статистику
* @param chatId charID
* @param userName Имя пользователя
*/
public void getStats(long chatId, String userName)
public void getStats(long chatId)
throws InstantiationException, IllegalAccessException, SQLException, TelegramApiException, ClassNotFoundException {
int count = 0;
int rightAnswer = 0;
double average = 0;
try (Connection connection = dataSource.getConnection()) {
try (PreparedStatement statement = connection.prepareStatement(
"SELECT * FROM USERS u WHERE u.USERNAME = ?")) {
statement.setString(1, userName);
"SELECT * FROM USERS u WHERE u.chatId = ?")) {
statement.setLong(1, chatId);
try (ResultSet result = statement.executeQuery()) {
while (result.next()) {
count = result.getInt("count");
average = result.getDouble("average");
count = result.getInt("countQuiz");
rightAnswer = result.getInt("countRightAnswer");
}
}
}
Expand All @@ -45,8 +156,8 @@ public void getStats(long chatId, String userName)
sendMessage(chatId, "У вас еще нет статистики!\nПроверь себя - /quiz \uD83D\uDE09");
} else {
sendMessage(chatId, "Твоя статистика \uD83D\uDCC8:");
sendMessage(chatId, "Всего пройдено тестов: \uD83D\uDD8B" + count);
sendMessage(chatId, "Средний балл: \uD83D\uDCAF" + average);
sendMessage(chatId, "Всего пройдено тестов \uD83D\uDD8B:" + count);
sendMessage(chatId, "Всего правильных ответов \uD83D\uDC4D:" + rightAnswer);
}
}

Expand All @@ -55,7 +166,7 @@ public void getStats(long chatId, String userName)
* @param chatId chatID
*/
public void getHelp(long chatId) throws TelegramApiException {
sendMessage(chatId, "Я бот Learn It \uD83D\uDC23! Я помогу тебе в изучении английского языка!\n\n"
sendMessage(chatId, "Я бот Learn It \uD83D\uDC23! Я помогу тебе в изучении английского языка!\uD83C\uDDEC\uD83C\uDDE7\n"
+ "Что я могу:\n/statistics - Моя статистика\n/quiz - Запустить тест\n/help - Помощь");
}

Expand All @@ -65,7 +176,6 @@ public void getHelp(long chatId) throws TelegramApiException {
* @param message тест сообщения
*/
private void sendMessage(long chatId, String message) throws TelegramApiException {
learnitTelegramBot.sendMessage(chatId, message);
learnitTelegramBot.sendMessage(learnitTelegramBot.getMessage(), chatId, message);
}

}
76 changes: 52 additions & 24 deletions chatbot/src/main/java/ru/croc/chatbot/LearnitTelegramBot.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,29 +22,48 @@ public class LearnitTelegramBot extends TelegramLongPollingBot {

@Override
public void onUpdateReceived(Update update) {
try {
long chatId = update.getMessage().getChatId();
String userText = update.getMessage().getText();
switch (userText) {
case "/start":
sendMessage(chatId, "Привет!");
break;
case "/statistics":
commandLine.getStats(chatId, update.getMessage().getFrom().getUserName());
break;
case "/quiz":
sendMessage(chatId, "Опрос");
break;
case "/help":
commandLine.getHelp(chatId);
break;
default:
sendMessage(chatId, "Я не понимаю эту команду \uD83D\uDE22\nВведите /help - для помощи");
break;
if (update.hasMessage() && update.getMessage().hasText()) {
try {
long chatId = update.getMessage().getChatId();
String userText = update.getMessage().getText();
switch (userText) {
case "/start":
sendMessage(getMessage(), chatId, "Привет! Я бот Learn It! \uD83D\uDC23\nВведите /help - для помощи");
break;
case "/statistics":
commandLine.getStats(chatId);
break;
case "/quiz":
sendMessage(getMessage(), chatId, "Данный тест позволяет проверить свой словарный запас!\n"
+ "Вам будут выпадать разный слова, а вы должны указать их перевод.\n"
+ "Удачи! Чтобы начать пиши /ready \uD83D\uDE09");
break;
case "/help":
commandLine.getHelp(chatId);
break;
case "/ready":
commandLine.getQuiz(chatId);
break;
default:
sendMessage(getMessage(), chatId, "Я не понимаю эту команду \uD83D\uDE22\nВведите /help - для помощи");
break;
}
} catch (TelegramApiException | InstantiationException | IllegalAccessException |
SQLException | ClassNotFoundException exception) {
throw new RuntimeException(exception);
}
} else if (update.hasCallbackQuery()) {
try {
String callBackData = update.getCallbackQuery().getData();
long chatId = update.getCallbackQuery().getMessage().getChatId();
if (commandLine.checkAnswer(chatId, callBackData)) {
commandLine.addRightAnswer(chatId);
}
commandLine.nextQuestion(chatId);
} catch (SQLException | TelegramApiException | ClassNotFoundException |
InstantiationException | IllegalAccessException exception) {
throw new RuntimeException(exception);
}
} catch (TelegramApiException | InstantiationException | IllegalAccessException |
SQLException | ClassNotFoundException exception) {
throw new RuntimeException(exception);
}
}

Expand All @@ -60,13 +79,22 @@ public String getBotToken() {

/**
* Отправить сообщение
* @param message SendMessage
* @param chatId chatID
* @param textMessage текст сообщения
*/
public void sendMessage(long chatId, String textMessage) throws TelegramApiException {
SendMessage message = new SendMessage();
public void sendMessage(SendMessage message, long chatId, String textMessage)
throws TelegramApiException {
message.setChatId(chatId);
message.setText(textMessage);
execute(message);
}

/**
* Получить SendMessage
* @return SendMessage
*/
public SendMessage getMessage() {
return new SendMessage();
}
}
5 changes: 5 additions & 0 deletions chatbot/src/main/java/ru/croc/chatbot/quizzes/Question.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.croc.chatbot.quizzes;

public interface Question {

}
9 changes: 9 additions & 0 deletions chatbot/src/main/java/ru/croc/chatbot/quizzes/Quiz.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package ru.croc.chatbot.quizzes;

import org.telegram.telegrambots.meta.exceptions.TelegramApiException;
import ru.croc.chatbot.quizzes.translation.TranslationQuestion;

public interface Quiz {
void start(long chatId, TranslationQuestion translationQuestion) throws TelegramApiException;
int getResult();
}
Loading

0 comments on commit 28536c4

Please sign in to comment.