diff --git a/.github/workflows/github-actions.yml b/.github/workflows/github-actions.yml new file mode 100644 index 0000000..e82c5ff --- /dev/null +++ b/.github/workflows/github-actions.yml @@ -0,0 +1,27 @@ +name: Build project +on: + push: + branches: + - master + pull_request: + branches: + - * +jobs: + + Explore-GitHub-Actions: + runs-on: ubuntu-latest + steps: + + - uses: actions/checkout@v4 + + - name: Set up JDK 17 for x64 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'corretto' + architecture: x64 + + + - name: Build & Test + run: + mvn -B clean package \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..8640475 --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +mBuild: + mvn clean -Dmaven.test.skip package -e +run: + java -jar target/knowBot-1.0-SNAPSHOT-jar-with-dependencies.jar +doc: + docker-compose up -d --build \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index f41eff6..6f4f509 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,10 +6,10 @@ services: - SPRING_DATA_MONGODB_DATABASE=${SPRING_DATA_MONGODB_DATABASE} - SPRING_DATA_MONGODB_URI=${SPRING_DATA_MONGODB_URI} - grafana: image: "grafana/grafana-enterprise:10.4.2" ports: - "3000:3000" depends_on: - - bot \ No newline at end of file + - bot + - prometheus \ No newline at end of file diff --git a/src/main/java/org/example/QuizBotListener.java b/src/main/java/org/example/QuizBotListener.java index 89c3c5b..0c70533 100644 --- a/src/main/java/org/example/QuizBotListener.java +++ b/src/main/java/org/example/QuizBotListener.java @@ -38,18 +38,14 @@ public class QuizBotListener implements UpdatesListener { public QuizBotListener(TelegramBot bot, QuizService quizService) { this.bot = bot; this.quizService = quizService; - this.sessionCache = Cache2kBuilder.of(Long.class, QuizBotSession.class).expireAfterWrite(120, TimeUnit.SECONDS).addListener((CacheEntryExpiredListener) (cache, entry) -> { - clearLastMessageKeyboard(cache.get(entry.getKey()), entry.getKey()); - sendMessage(entry.getKey(), "You've been thinking too long, so you'll have to start over." + " Write /start or /choice."); - }).addListener((CacheEntryCreatedListener) (cache, entry) -> sendMessage(entry.getKey(), UserBotConstants.STARTING_MESSAGE)).build(); - } - - private static String getQuizStatText(int quizAmount, int rightAnswerCounter) { - return String.format("❓ Question number: %d" + "\n\n" + "✅ Right answers: %d\\%d" + "\n\n" + "Input " + UserBotConstants.START_QUIZ_COMMAND + " to start quiz or chose quiz another quiz " + UserBotConstants.CHOOSE_TOPIC_COMMAND, quizAmount, rightAnswerCounter, quizAmount); - } - - private static String getCanceledQuizStatText(int questionCount, int rightAnswerCounter) { - return String.format("❓You canceled quiz\n" + "\n" + "The questions were: %d\n\n" + "✅ Right answers: %d\\%d\n" + "\n" + "Input " + UserBotConstants.START_QUIZ_COMMAND + " to start quiz or chose quiz another quiz " + UserBotConstants.CHOOSE_TOPIC_COMMAND, questionCount, rightAnswerCounter, questionCount); + this.sessionCache = Cache2kBuilder.of(Long.class, QuizBotSession.class) + .expireAfterWrite(120, TimeUnit.SECONDS) + .addListener((CacheEntryExpiredListener) (cache, entry) -> { + clearLastMessageKeyboard(cache.get(entry.getKey()), entry.getKey()); + sendMessage(entry.getKey(), "You've been thinking too long, so you'll have " + + "to start over." + " Write /start or /choice."); + }) + .build(); } @Override @@ -101,6 +97,7 @@ public int process(List updates) throws NullPointerException { switch (messageText) { case UserBotConstants.START_BOT_COMMAND -> { clearLastMessageKeyboard(quizBotSession, userId); + sendMessage(userId, UserBotConstants.STARTING_MESSAGE); sessionCache.remove(userId); sessionCache.put(userId, new QuizBotSession(QuizBotSessionMode.SESSION_CREATED)); return UpdatesListener.CONFIRMED_UPDATES_ALL; @@ -129,6 +126,14 @@ public int process(List updates) throws NullPointerException { return UpdatesListener.CONFIRMED_UPDATES_ALL; } + private static String getQuizStatText(int quizAmount, int rightAnswerCounter) { + return String.format("❓ Question number: %d" + "\n\n" + "✅ Right answers: %d\\%d" + "\n\n" + "Input " + UserBotConstants.START_QUIZ_COMMAND + " to start quiz or chose quiz another quiz " + UserBotConstants.CHOOSE_TOPIC_COMMAND, quizAmount, rightAnswerCounter, quizAmount); + } + + private static String getCanceledQuizStatText(int questionCount, int rightAnswerCounter) { + return String.format("❓You canceled quiz\n" + "\n" + "The questions were: %d\n\n" + "✅ Right answers: %d\\%d\n" + "\n" + "Input " + UserBotConstants.START_QUIZ_COMMAND + " to start quiz or chose quiz another quiz " + UserBotConstants.CHOOSE_TOPIC_COMMAND, questionCount, rightAnswerCounter, questionCount); + } + private void setCountOfQuiz(String messageText, Long userId, QuizBotSession quizBotSession) { if (!messageText.matches("^[1-9][0-9]*$")) { sendMessage(userId, "Input a number or input " + UserBotConstants.CANCEL_COMMAND + " for cancel count of question choice"); diff --git a/src/main/java/org/example/configs/MongoDBConfig.java b/src/main/java/org/example/configs/MongoDBConfig.java index edd78e3..432a600 100644 --- a/src/main/java/org/example/configs/MongoDBConfig.java +++ b/src/main/java/org/example/configs/MongoDBConfig.java @@ -71,7 +71,6 @@ public ChangeStreamIterable runEventListener(MongoTemplate mongoTempla } case "delete" -> quizService.updateTopics(); } - }); return changeStream; } diff --git a/src/main/java/org/example/model/PermanentUserInfo.java b/src/main/java/org/example/model/PermanentUserInfo.java index 258fb0e..30024e7 100644 --- a/src/main/java/org/example/model/PermanentUserInfo.java +++ b/src/main/java/org/example/model/PermanentUserInfo.java @@ -8,9 +8,9 @@ public class PermanentUserInfo { @Id @Field(name = "userId") - private Long userId; + private Long userId = 0L; @Field(name = "userName") - private String userName; + private String userName = ""; public PermanentUserInfo() { } diff --git a/src/main/java/org/example/model/Question.java b/src/main/java/org/example/model/Question.java index 421b7fa..ab30262 100644 --- a/src/main/java/org/example/model/Question.java +++ b/src/main/java/org/example/model/Question.java @@ -12,7 +12,7 @@ public class Question { @Id @JsonIgnore - private ObjectId id; + private ObjectId id = new ObjectId(); private String question = ""; private String answerDescription = ""; private List optionList = new ArrayList<>(); diff --git a/src/main/java/org/example/model/QuizBotSession.java b/src/main/java/org/example/model/QuizBotSession.java index c4bec8a..65fff0e 100644 --- a/src/main/java/org/example/model/QuizBotSession.java +++ b/src/main/java/org/example/model/QuizBotSession.java @@ -8,7 +8,7 @@ public class QuizBotSession { private UserQuizSession userQuizSession; private String currentTopicName = ""; private int lastKeyboardBotMessageId = 0; - private String lastKeyboardBotMessageText; + private String lastKeyboardBotMessageText =""; private int countOfQuestion = 0; public QuizBotSession(QuizBotSessionMode botSessionMode) { diff --git a/src/main/java/org/example/services/QuizService.java b/src/main/java/org/example/services/QuizService.java index 445b39a..d1ba491 100644 --- a/src/main/java/org/example/services/QuizService.java +++ b/src/main/java/org/example/services/QuizService.java @@ -33,7 +33,7 @@ public List getTopics() { return topicsCache.get("topics"); } - public synchronized void addTopic(String topicName){ + public void addTopic(String topicName){ lock.lock(); try { List topics = new ArrayList<>(topicsCache.get("topics")); diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index 23c259b..50077b1 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -8,7 +8,7 @@ - + @@ -17,6 +17,5 @@ - diff --git a/src/main/resources/topics b/src/main/resources/topics deleted file mode 100644 index 72581d0..0000000 --- a/src/main/resources/topics +++ /dev/null @@ -1,4 +0,0 @@ -Python Programming -Spring Framework -Java Programming -CSS (Cascading Style Sheets) diff --git a/src/test/java/org/example/QuizQuestionsBotListenerTest.java b/src/test/java/org/example/QuizQuestionsBotListenerTest.java deleted file mode 100644 index 29d8443..0000000 --- a/src/test/java/org/example/QuizQuestionsBotListenerTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.example; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -class QuizQuestionsBotListenerTest { - private QuizBotListener quizBotListener; - - @BeforeEach - void setUp() { - } - - @Test - void process() { - - } - -} \ No newline at end of file diff --git a/src/test/java/org/example/model/QuestionOptionTest.java b/src/test/java/org/example/model/QuestionOptionTest.java deleted file mode 100644 index 30890be..0000000 --- a/src/test/java/org/example/model/QuestionOptionTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.example.model; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -class QuestionOptionTest { - - @Test - void getOptionText() { - } -} \ No newline at end of file diff --git a/src/test/java/org/example/model/QuestionTest.java b/src/test/java/org/example/model/QuestionTest.java deleted file mode 100644 index 4b5c04c..0000000 --- a/src/test/java/org/example/model/QuestionTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.example.model; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -class QuestionTest { - private Question question; - - @BeforeEach - void setUp() { - question = new Question(); - } - - @Test - void getQuestion() { - Assertions.assertNotNull(question.getQuestion()); - } - - @Test - void getAnswerDescription() { - Assertions.assertNotNull(question.getAnswerDescription()); - } - - @Test - void getOptionList() { - Assertions.assertNotNull(question.getOptionList()); - } -} \ No newline at end of file diff --git a/src/test/java/org/example/model/QuizQuestionsTest.java b/src/test/java/org/example/model/QuizQuestionsTest.java deleted file mode 100644 index e1cc12b..0000000 --- a/src/test/java/org/example/model/QuizQuestionsTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.example.model; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -class QuizQuestionsTest { - private QuizQuestions quizQuestions; - - @BeforeEach - void setUp() { - quizQuestions = new QuizQuestions(); - } - - @Test - void getTopicName() { - assertNotNull(quizQuestions.getTopicName()); - } - - @Test - void setTopicName() { - quizQuestions.setTopicName(null); - Assertions.assertNotNull(quizQuestions.getTopicName()); - quizQuestions.setTopicName("java"); - Assertions.assertEquals(quizQuestions.getTopicName(),"java"); - } - - @Test - void getQuestionList() { - assertNotNull(quizQuestions.getQuestionList()); - } - - @Test - void setQuestionList() { - List questionList = new ArrayList<>(); - quizQuestions.setQuestionList(questionList); - Assertions.assertEquals(quizQuestions.getQuestionList(),questionList); - } -} \ No newline at end of file diff --git a/src/test/java/org/example/model/UserQuizQuestionsSessionTest.java b/src/test/java/org/example/model/UserQuizQuestionsSessionTest.java deleted file mode 100644 index 5ca08af..0000000 --- a/src/test/java/org/example/model/UserQuizQuestionsSessionTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.example.model; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.List; - -class UserQuizQuestionsSessionTest { - private UserQuizSession userQuizSession; - private Question question1; - private Question question2; - - @BeforeEach - public void setUp() { - List questionList = new ArrayList<>(); - question1 = new Question("asddsasda",new ArrayList<>(),"asdsdasd"); - question2 = new Question("asddsasdsssa",new ArrayList<>(),"asdsdasd"); - questionList.add(question1); - questionList.add(question2); - QuizQuestions quizQuestions = new QuizQuestions(); - quizQuestions.setQuestionList(questionList); - userQuizSession = new UserQuizSession(quizQuestions); - } - - @Test - void isNextQuestionAvailable(){ - Assertions.assertNotNull(userQuizSession.getNextQuestion()); - } - - - @Test - void incRightCounter() { - Assertions.assertEquals(userQuizSession.getRightAnswerCounter(),0); - userQuizSession.incRightCounter(); - Assertions.assertEquals(userQuizSession.getRightAnswerCounter(),1); - } - - @Test - void getCurrentQuestion() { - - } - - @Test - void getNextQuestion() { - Assertions.assertEquals(userQuizSession.getNextQuestion(), question1); - Assertions.assertEquals(userQuizSession.getNextQuestion(), question2); - } - - @Test - void getQuestionCounter() { - Assertions.assertEquals(userQuizSession.getQuestionCounter(),1); - userQuizSession.getNextQuestion(); - Assertions.assertEquals(userQuizSession.getQuestionCounter(),2); - userQuizSession.getNextQuestion(); - Assertions.assertEquals(userQuizSession.getQuestionCounter(),2); - } - - @Test - void getQuestionAmount() { - Assertions.assertEquals(userQuizSession.getQuestionAmount(),2); - } - - @Test - void getRightAnswerCounter() { - - } -} \ No newline at end of file diff --git a/src/test/java/services/QuizServiceTest.java b/src/test/java/services/QuizServiceTest.java new file mode 100644 index 0000000..04e00ed --- /dev/null +++ b/src/test/java/services/QuizServiceTest.java @@ -0,0 +1,5 @@ +package services; + +public class QuizServiceTest { + +} diff --git a/src/test/java/services/UsersService.java b/src/test/java/services/UsersService.java new file mode 100644 index 0000000..9842eee --- /dev/null +++ b/src/test/java/services/UsersService.java @@ -0,0 +1,4 @@ +package services; + +public class UsersService { +}