JavaRush /Java Blog /Random-KO /관리자로 일할 수 있는 기능과 그를 위한 통계 기능을 추가합니다 - "A부터 Z까지의 Java 프로젝트...
Roman Beekeeper
레벨 35

관리자로 일할 수 있는 기능과 그를 위한 통계 기능을 추가합니다 - "A부터 Z까지의 Java 프로젝트"

Random-KO 그룹에 게시되었습니다
안녕하세요 여러분, 사랑하는 친구 여러분. 따라서 봇은 이미 작동하고 있으며 새 기사에 대한 알림을 보내고 있습니다. 아직 사용하지 않으셨다면 Javarush Telegram Bot 링크를 참조하세요 . 자, 오늘은 관리자에게만 작동하는 명령을 추가하는 방법에 대해 이야기하겠습니다. 이러한 명령 중 하나는 통계 및 도움말 게시판입니다. 이것이 왜 필요한가요? 현재로서는 실제 필요성보다 이 작업의 프레임워크 내에서 주석을 사용하여 작업을 설명하는 것이 더 흥미롭습니다. "A부터 Z까지의 Java 프로젝트": 그를 위한 관리자 및 통계 작업 기능 추가 - 1뭐, 통계팀으로 가니까 확장해서 좀 더 유익하게 만들 수 있겠네요. 예를 들어 MVP 후에는 작성자에 대한 통계를 반환할 수 있습니다. 하지만 자세한 내용은 나중에...)

관리자와 명령을 추가하는 방법을 이해해 보겠습니다.

메인 브랜치를 업데이트하고 이를 기반으로 새 브랜치인 STEP_9_JRTB-10을 생성하여 작업을 시작합니다. 관리자에게 적용되는 명령과 모든 사람에게 적용되는 명령을 파악하려면 팀에 레이블을 지정해야 합니다. 이를 위해 주석을 만들어 보겠습니다. 무슨 뜻이에요? 우리는 전에 이것을 해본 적이 없습니다. IDEA에서 클래스를 생성할 때 선택할 수 있습니다. 지금 보여 드리겠습니다. 명령 패키지에서 새 주석 패키지를 만들고 여기에 AdminCommand 주석을 추가합니다. "A부터 Z까지의 Java 프로젝트": 그를 위한 관리자 및 통계 작업 기능을 추가합니다.  파트 1 - 2주석 자체는 다음과 같습니다.
package com.github.javarushcommunity.jrtb.command.annotation;

import com.github.javarushcommunity.jrtb.command.Command;

import java.lang.annotation.Retention;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
* Mark if {@link Command} can be viewed only by admins.
*/
@Retention(RUNTIME)
public @interface AdminCommand {
}
여기서는 다른 것이 필요하지 않습니다. 다음으로 이를 StatCommand 명령에 추가합니다. "A부터 Z까지의 Java 프로젝트": 그를 위한 관리자 및 통계 작업 기능을 추가합니다.  파트 1 - 3이제 모든 것이 작동해야 합니다... 아니면 안 될까요? 물론 아닙니다.)) 결과를 올바르게 생성하려면 CommandContainer를 가르쳐야 합니다. 이를 위해 전달된 내용에 따라 실행할 명령을 실행하는 retrieveCommand 메서드를 업데이트하겠습니다. Telegram에서 그의 사용자 이름을 관리자 식별자로 사용합니다. chat_id보다 고유하고 읽기 쉽습니다. 그것을 얻는 방법? 이는 다음 메시지와 함께 제공되는 Update 개체에 있습니다.
update.getMessage().getFrom().getUserName()
위의 내용을 모두 요약하여 CommandContainer#retrieveCommand 메서드 를 업데이트해 보겠습니다 .
public Command retrieveCommand(String commandIdentifier, String username) {
   Command orDefault = commandMap.getOrDefault(commandIdentifier, unknownCommand);
   if (isAdminCommand(orDefault)) {
       if (admins.contains(username)) {
           return orDefault;
       } else {
           return unknownCommand;
       }
   }
   return orDefault;
}

private boolean isAdminCommand(Command command) {
   return nonNull(command.getClass().getAnnotation(AdminCommand.class));
}
여기에서 볼 수 있듯이 제공된 명령에 AdminCommand 주석이 있는지 확인하는 isAdminCommand 메서드를 추가했습니다. 관리자 전용 명령인 경우 사용 가능한 관리자 컬렉션에 해당 사용자 이름이 있는지 확인합니다. 그건 그렇고, 여기 OOP가 있습니다. 우리는 단순히 어떤 구현이든 될 수 있는 인터페이스를 전달합니다. 그러나 Command 인터페이스 를 구현하는 클래스만 전달할 수 있습니다 . 그리고 한 가지를 제외하고 모든 것이 명확한 것 같습니다. 관리자는 어디에서 왔습니까? 지금 보여 드리겠습니다. 지금은 쉽게 구성할 수 있도록 관리자를 환경 변수로 전달하고 싶습니다. 이 변수에는 관리자가 될 텔레그램 사용자의 모든 사용자 이름이 쉼표로 구분되어 표시되는 줄이 포함됩니다. 이렇게 하려면 application.properties에 다음을 추가하세요.
bot.admins: robeskman,romankh3
CommandContainer 생성자에서 관리자 컬렉션을 전달하고 초기화합니다.
public class CommandContainer {

   private final ImmutableMap<String, Command> commandMap;
   private final Command unknownCommand;
   private final List<String> admins;

   public CommandContainer(SendBotMessageService sendBotMessageService, TelegramUserService telegramUserService,
                           JavaRushGroupClient javaRushGroupClient, GroupSubService groupSubService,
                           List<String> admins) {

       this.admins = admins;
그리고 이미 JavaRushTelegramBot에는 속성의 문자열에서 컬렉션을 가져오는 모든 마법이 있습니다.
@Autowired
public JavarushTelegramBot(TelegramUserService telegramUserService, JavaRushGroupClient groupClient, GroupSubService groupSubService,
                          @Value("#{'${bot.admins}'.split(',')}") List<String> admins) {
   this.commandContainer =
           new CommandContainer(new SendBotMessageServiceImpl(this),
                   telegramUserService, groupClient, groupSubService, admins);
}
위의 생성자에서 볼 수 있듯이 컬렉션 생성을 위한 로직을 전달하는 Value 주석을 다시 사용합니다. 이제 관리자 추가가 끝났습니다. 이제 관리자가 아닌 사람이 봇 통계에 대한 데이터를 얻으려고 하면 다음과 같은 답변을 받게 됩니다. 이해가 안 돼요 😟, /help를 작성하여 내가 이해한 내용을 알아보세요. 이런 방식으로 봇 명령의 역할을 차별화했습니다.

관리자를 위한 도움말 명령 추가

다음으로 관리자를 위한 별도의 도움말 명령을 만드는 것이 논리적입니다 . 앞으로는 이 부분이 크게 늘어날 수도 있습니다. CommandName에 관리자 도움말 값을 추가합니다.
ADMIN_HELP("/ahelp")
명령 패키지에 AdminHelpCommand 클래스를 만듭니다 .
package com.github.javarushcommunity.jrtb.command;

import com.github.javarushcommunity.jrtb.service.SendBotMessageService;
import org.telegram.telegrambots.meta.api.objects.Update;

import static com.github.javarushcommunity.jrtb.command.CommandName.STAT;
import static java.lang.String.format;

/**
* Admin Help {@link Command}.
*/
public class AdminHelpCommand implements Command {

   public static final String ADMIN_HELP_MESSAGE = format("✨<b>Доступные команды админа</b>✨\n\n"
                   + "<b>Получить статистику</b>\n"
                   + "%s - статистика бота\n",
           STAT.getCommandName());

   private final SendBotMessageService sendBotMessageService;

   public AdminHelpCommand(SendBotMessageService sendBotMessageService) {
       this.sendBotMessageService = sendBotMessageService;
   }

   @Override
   public void execute(Update update) {
       sendBotMessageService.sendMessage(update.getMessage().getChatId().toString(), ADMIN_HELP_MESSAGE);
   }
}
지금까지는 매우 간단합니다. 앞으로도 꽤 잘 자랄 수 있을 것 같습니다. 이 명령에 대해 템플릿의 테스트는 다음과 같습니다.
package com.github.javarushcommunity.jrtb.command;

import org.junit.jupiter.api.DisplayName;

import static com.github.javarushcommunity.jrtb.command.AdminHelpCommand.ADMIN_HELP_MESSAGE;
import static com.github.javarushcommunity.jrtb.command.CommandName.ADMIN_HELP;

@DisplayName("Unit-level testing for AdminHelpCommand")
public class AdminHelpCommandTest extends AbstractCommandTest {

   @Override
   String getCommandName() {
       return ADMIN_HELP.getCommandName();
   }

   @Override
   String getCommandMessage() {
       return ADMIN_HELP_MESSAGE;
   }

   @Override
   Command getCommand() {
       return new AdminHelpCommand(sendBotMessageService);
   }
}
물론, 맵의 CommandContainer에 명령을 추가해야 합니다.
.put(ADMIN_HELP.getCommandName(), new AdminHelpCommand(sendBotMessageService))

봇에 명령 설명 추가

텔레그램 봇에는 또 다른 흥미로운 기능이 있습니다. 사용자가 명령을 더 쉽게 사용할 수 있도록 허용하는 명령에 대한 값과 설명을 추가할 수 있습니다. 그것은 어떻게 생겼나요? 예를 들어 가장 중요한 Telegram 봇인 BotFather를 살펴보겠습니다 . 슬래시 /를 사용하여 메시지 작성을 시작하면 봇이 옵션을 제공합니다. "A부터 Z까지의 Java 프로젝트": 그를 위한 관리자 및 통계 작업 기능을 추가합니다.  파트 1 - 4계속해서 작성하면 관련 옵션을 필터링하고 표시합니다. "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 5멋진 기능이죠? 그래서 나도 여기서 똑같이 하고 싶다. 텔레그램 애플리케이션을 통해 최선을 다하겠습니다. 나는 이것이 프로그래밍 방식으로 수행될 수 있다는 것을 알고 있습니다. 하지만 나는 못해. 이 기사 시리즈의 목적에는 이것이 필요하지 않습니다. 이 작업을 수행하는 방법을 아는 사람이 있으면 나에게 편지를 보내 주시면 추가하겠습니다. 이에 대한 어떤 도움이라도 기꺼이 받아들이겠습니다. 나는 이것이 우리에게 적합한 명령 패턴을 통해 수행될 수 있다는 것을 읽은 적이 있습니다. 이제 이를 수행하는 방법을 보여 드리겠습니다. Telegram에서 BotFather를 찾고 구성하려는 봇을 선택해야 합니다. 다음으로 봇 편집과 명령에 대한 섹션을 선택합니다. 이제 Javarush용 테스트 봇의 예를 사용하여 모든 것을 보여 드리겠습니다. BotFather에서 다음 명령을 작성합니다: /mybots"Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 6 다음으로 필요한 봇을 선택합니다. 제 경우에는 test_javarush_community_bot입니다. "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 7버튼 목록에서 볼 수 있듯이 여기에서 토큰을 보고, 봇을 삭제하고, 다음으로 전송할 수 있습니다. 다른 사람. 봇 편집에 관심이 있으므로 Edit Bot을 선택합니다 . "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 8여기서는 Edit Commands를 선택합니다 . "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 9특정 형식으로 메시지를 제공하면 명령으로 기록됩니다. 또는 모두 제거하려면 /empty를 작성하십시오. 이를 위해 SET_UP_COMMANDS_BOT_FATHER 프로젝트의 루트에 파일을 생성하겠습니다 . 이 파일에는 문제가 발생할 경우 쉽게 복원하거나 업데이트할 수 있도록 모든 명령을 작성하겠습니다. SET_UP_COMMANDS_BOT_FATHER:
시작 - 봇 작업 시작/복원 중지 - 봇 작업 일시 중지 addGroupSub - 기사 그룹 구독 deleteGroupSub - 기사 그룹 구독 취소 listGroupSub - 구독 중인 그룹 목록 help - 나와 협력하는 데 도움 받기
여기에는 관리 명령이 없다는 것이 분명합니다. 관리자만이 이에 대해 알아야 합니다. 이 메시지를 BotFather에게 전달해 보겠습니다. "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 10일반적으로 그렇듯이 처음에는 제대로 작동하지 않았습니다. 몇 분 동안 생각한 후에 모든 명령을 이전처럼 CamelCase가 아닌 소문자로 전달했고 모든 것이 잘 진행되었습니다. SET_UP_COMMANDS_BOT_FATHER 파일을 업데이트합니다 .
시작 - 봇 작업 시작/복원 중지 - 봇 작업 일시 중지 addgroupsub - 기사 그룹 구독 deletegroupsub - 기사 그룹 구독 취소 listgroupsub - 구독 중인 그룹 목록 help - 나와 협력하는 데 도움 받기
이제 우리 봇으로 가서 명령이 자동으로 로드되었는지 확인할 수 있습니다. "Java-проект от А до Я": Добавляем возможность работы админа и статистику для него. Часть 1 - 11이제 얼마나 아름다운지 보세요! 또한 이 기사의 틀 내에서 통계의 기능을 확장하고 싶었지만 자료는 의미와 내용 모두에서 이미 방대했습니다. 그러므로 다음번으로 미루도록 하겠습니다. 즉, JRTB-10의 작업이 완전히 완료되지 않았습니다. 다음 기사에서 완료하겠습니다. 동시에 이미 존재하는 모든 변경 사항을 메인 봇에 추가하겠습니다. 저자를 지원하고 싶지만 방법을 모르시나요? 매우 간단합니다. 내 tg 채널 , 내 GitHub 계정을 구독 하고 여기 기사에 이에 대한 의견을 적어주세요. 이 피드백은 나에게 중요하므로 그들이 읽고 관심을 갖고 있다는 것을 이해합니다.

결론

오늘 우리가 겪은 일을 요약해 보겠습니다.
  1. 우리는 자신만의 주석을 추가하는 방법과 이를 팀의 역할을 설명하는 표시로 사용하는 방법에 대해 논의했습니다. 그건 그렇고, 이것은 인터페이스를 사용하여 수행될 수 있었습니다. 같은 방식으로 마커 인터페이스를 생성한 다음 도착하는 객체가 이 인터페이스를 구현하는지 여부를 확인합니다.
  2. 관리자를 위한 도움말 명령이 추가되었습니다. 저에게는 이것이 이 봇 개발에 있어서 중요한 부분이기도 합니다.
  3. 봇에 명령어를 작성할 때 명령어에 대한 설명과 팝업을 추가하는 방법에 대해 논의했습니다. 흥미로운 기능은 확실히 추가할 가치가 있습니다.
이 글을 바탕으로 Pull Request를 작성했는데 , 자세한 내용을 보실 수 있습니다. 평소처럼 관심을 가져주신 모든 분들께 감사드립니다. 좋아요 - 구독 - 벨 , 우리 프로젝트에 별표를 표시하고, 기사에 댓글을 달고 평가해 주세요! 다음 글에서 만나요!

시리즈의 모든 자료 목록은 이 기사의 시작 부분에 있습니다.

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION