Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,6 @@ build/

### VS Code ###
.vscode/

### Env variables ###
.env
9 changes: 7 additions & 2 deletions bot/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

<!-- Tests -->
<dependency>
<groupId>org.springframework.boot</groupId>
Expand All @@ -91,7 +90,7 @@
</dependency>
<dependency>
<groupId>org.wiremock</groupId>
<artifactId>wiremock</artifactId>
<artifactId>wiremock-standalone</artifactId>
<scope>test</scope>
</dependency>
<dependency>
Expand Down Expand Up @@ -124,6 +123,12 @@
<artifactId>kafka</artifactId>
<scope>test</scope>
</dependency>
<!-- Open API -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.3.0</version>
</dependency>
</dependencies>

<build>
Expand Down
56 changes: 56 additions & 0 deletions bot/src/main/java/edu/java/bot/LinkBot.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package edu.java.bot;

import com.pengrad.telegrambot.TelegramBot;
import com.pengrad.telegrambot.UpdatesListener;
import com.pengrad.telegrambot.model.BotCommand;
import com.pengrad.telegrambot.model.Update;
import com.pengrad.telegrambot.request.SetMyCommands;
import edu.java.bot.commands.Command;
import edu.java.bot.configuration.ApplicationConfig;
import edu.java.bot.services.UserMessageProcessor;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Objects;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;



@Component
public class LinkBot extends TelegramBot {
private static final Logger LOGGER = LogManager.getLogger();
private final UserMessageProcessor userMessageProcessor;

@Autowired
public LinkBot(ApplicationConfig config, UserMessageProcessor userMessageProcessor, List<Command> commands) {
super(config.telegramToken());
this.userMessageProcessor = userMessageProcessor;

List<BotCommand> botCommands = commands.stream().map(Command::toApiCommand).toList();
execute(new SetMyCommands(botCommands.toArray(BotCommand[]::new)));
setUpdatesListener(this::processUpdate, e -> {
if (e.response() != null) {
e.response().errorCode();
e.response().description();
} else {
LOGGER.error("Some problem with updates from telegram");
}
});
}

public int processUpdate(List<Update> updates) {
for (Update update : updates) {
if (!Objects.isNull(update.message())) {
try {
execute(userMessageProcessor.process(update));
} catch (URISyntaxException e) {
LOGGER.error("Failed to process update", e);
}
}
}
return UpdatesListener.CONFIRMED_UPDATES_ALL;
}

}
19 changes: 19 additions & 0 deletions bot/src/main/java/edu/java/bot/commands/Command.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package edu.java.bot.commands;

import com.pengrad.telegrambot.model.BotCommand;
import com.pengrad.telegrambot.model.Update;
import com.pengrad.telegrambot.request.SendMessage;
import java.net.URISyntaxException;

public interface Command {
String name();

String description();

SendMessage execute(Update update) throws URISyntaxException;

default BotCommand toApiCommand() {
return new BotCommand(name(), description());
}

}
16 changes: 16 additions & 0 deletions bot/src/main/java/edu/java/bot/commands/CommandDescription.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package edu.java.bot.commands;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum CommandDescription {
START("/start", "зарегистрировать пользователя"),
HELP("/help", "вывести окно с командами"),
TRACK("/track", "начать отслеживание ссылки"),
UNTRACK("/untrack", "прекратить отслеживание ссылки"),
LIST("/list", "показать список отслеживаемых ссылок");
private final String name;
private final String description;
}
37 changes: 37 additions & 0 deletions bot/src/main/java/edu/java/bot/commands/Help.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package edu.java.bot.commands;

import com.pengrad.telegrambot.model.Update;
import com.pengrad.telegrambot.request.SendMessage;
import edu.java.bot.messages.InfoMessage;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class Help implements Command {
private final List<Command> allCommands;
private final CommandDescription info = CommandDescription.HELP;

@Override
public String name() {
return info.getName();
}

@Override
public String description() {
return info.getDescription();
}

@Override
public SendMessage execute(Update update) {
StringBuilder response = new StringBuilder();
response.append(InfoMessage.SUPPORTED_COMMANDS.getMessage());
for (Command botCommand: allCommands) {
response.append(botCommand.name());
response.append(" : ").append(botCommand.description()).append("\n");
}
return new SendMessage(update.message().chat().id(), response.toString());
}

}
56 changes: 56 additions & 0 deletions bot/src/main/java/edu/java/bot/commands/ListCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package edu.java.bot.commands;

import com.pengrad.telegrambot.model.Update;
import com.pengrad.telegrambot.request.SendMessage;
import edu.java.bot.messages.ErrorMessage;
import edu.java.bot.messages.InfoMessage;
import edu.java.bot.services.UserManager;
import java.util.Set;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;



@Component
@RequiredArgsConstructor
public class ListCommand implements Command {
private final UserManager userManager;
private final CommandDescription info = CommandDescription.LIST;

@Override
public String name() {
return info.getName();
}

@Override
public String description() {
return info.getDescription(); }

@Override
public SendMessage execute(Update update) {
StringBuilder response = new StringBuilder();

Long userId = update.message().from().id();
Set<String> githubLinks = userManager.getGithubLinks().get(userId);
Set<String> stackOverflowLinks = userManager.getStackOverflowLinks().get(userId);

if (githubLinks.isEmpty() && stackOverflowLinks.isEmpty()) {
response.append(ErrorMessage.EMPTY_LIST.getMessage());
} else {
response.append(InfoMessage.LINK_LIST.getMessage());
if (!githubLinks.isEmpty()) {
response.append(InfoMessage.GITHUB_LINK.getMessage());
}
for (String link : githubLinks) {
response.append(link).append("\n");
}
if (!stackOverflowLinks.isEmpty()) {
response.append(InfoMessage.STACKOVERFLOW_LINK.getMessage());
}
for (String link : stackOverflowLinks) {
response.append(link).append("\n");
}
}
return new SendMessage(update.message().chat().id(), response.toString());
}
}
39 changes: 39 additions & 0 deletions bot/src/main/java/edu/java/bot/commands/Start.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package edu.java.bot.commands;

import com.pengrad.telegrambot.model.Update;
import com.pengrad.telegrambot.model.User;
import com.pengrad.telegrambot.request.SendMessage;
import edu.java.bot.messages.ErrorMessage;
import edu.java.bot.messages.SuccessMessage;
import edu.java.bot.services.UserManager;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class Start implements Command {
private final UserManager userManager;
private final CommandDescription info = CommandDescription.START;

@Override
public String name() {
return info.getName();
}

@Override
public String description() {
return info.getDescription(); }

@Override
public SendMessage execute(Update update) {
User producer = update.message().from();
String response = "";
if (!userManager.containsUser(producer)) {
userManager.add(update.message().from());
response = SuccessMessage.SIGNUP_SUCCESS.getMessage();
} else {
response = ErrorMessage.ALREADY_EXIST.getMessage();
}
return new SendMessage(update.message().chat().id(), response);
}
}
34 changes: 34 additions & 0 deletions bot/src/main/java/edu/java/bot/commands/Track.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package edu.java.bot.commands;

import com.pengrad.telegrambot.model.Update;
import com.pengrad.telegrambot.request.SendMessage;
import edu.java.bot.services.UserManager;
import java.net.URISyntaxException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;


@Component
@RequiredArgsConstructor
public class Track implements Command {
private final UserManager userManager;
private final CommandDescription info = CommandDescription.TRACK;

@Override
public String name() {
return info.getName();
}

@Override
public String description() {
return info.getDescription();
}

@Override
public SendMessage execute(Update update) throws URISyntaxException {
Long chatId = update.message().chat().id();
String[] messages = update.message().text().split(" +", 2);
String response = userManager.addLink(update.message().from(), messages[messages.length - 1]);
return new SendMessage(chatId, response);
}
}
33 changes: 33 additions & 0 deletions bot/src/main/java/edu/java/bot/commands/Untrack.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package edu.java.bot.commands;

import com.pengrad.telegrambot.model.Update;
import com.pengrad.telegrambot.request.SendMessage;
import edu.java.bot.services.UserManager;
import java.net.URISyntaxException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;


@Component
@RequiredArgsConstructor
public class Untrack implements Command {
private final UserManager userManager;
private final CommandDescription info = CommandDescription.UNTRACK;

@Override
public String name() {
return info.getName();
}

@Override
public String description() {
return info.getDescription(); }

@Override
public SendMessage execute(Update update) throws URISyntaxException {
Long chatId = update.message().chat().id();
String[] messages = update.message().text().split(" +", 2);
String response = userManager.removeLink(update.message().from(), messages[messages.length - 1]);
return new SendMessage(chatId, response);
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package edu.java.bot.configuration;

import jakarta.validation.constraints.NotEmpty;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;

@Validated
@ConfigurationProperties(prefix = "app", ignoreUnknownFields = false)
public record ApplicationConfig(
public record ApplicationConfig(@Value("${APP_TELEGRAM_TOKEN}")
@NotEmpty
String telegramToken
) {
Expand Down
18 changes: 18 additions & 0 deletions bot/src/main/java/edu/java/bot/messages/ErrorMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package edu.java.bot.messages;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum ErrorMessage {
ALREADY_EXIST("Пользователь уже зарегистрирован"),
EMPTY_LIST("Список отслеживаемых ссылок пуст. Воспользуйтесь командой /track для добавления ссылки"),
INVALID_URL("Неверный формат ссылки. Попробуйте еще раз"),
UNKNOWN_ERROR("Неизвестная ошибка"),
UNSUPPORTED_LINK("Бот не поддерживает отслеживание данного ресурса"),
UNKNOWN_LINK("Вы не отслеживаете данную ссылку"),
UNKNOWN_COMMAND("Неизвестная команда. Вопользуйтесь командой /help для просмотра доступных команд"),
NO_SUCH_USER("Для использования бота требуется регистрация. Нажмите /start, чтобы зарегистрироваться");
private final String message;
}
15 changes: 15 additions & 0 deletions bot/src/main/java/edu/java/bot/messages/InfoMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package edu.java.bot.messages;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum InfoMessage {
SUPPORTED_COMMANDS("Список команд:\n"),
SUPPORTED_SOURCE("Сайты доступные для отслеживания:\n"),
LINK_LIST("Список отслеживаемых ссылок:\n"),
GITHUB_LINK("GitHub:\n"),
STACKOVERFLOW_LINK("StackOverflow:\n");
private final String message;
}
13 changes: 13 additions & 0 deletions bot/src/main/java/edu/java/bot/messages/SuccessMessage.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package edu.java.bot.messages;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum SuccessMessage {
SIGNUP_SUCCESS("Вы успешно зарегистрированы в системе. Воспользуйтесь командой /help для вызова справки"),
LINK_ADDED("Ссылка успешно добавлена"),
LINK_REMOVED("Ссылка удалена");
private final String message;
}
Loading