JavaRush /Java Blog /Random-TW /我們為他添加了作為管理員和統計的功能 - “Java 專案從 A 到 Z”
Roman Beekeeper
等級 35

我們為他添加了作為管理員和統計的功能 - “Java 專案從 A 到 Z”

在 Random-TW 群組發布
大家好,我親愛的朋友們。因此,該機器人已經開始工作並發送有關新文章的通知。如果您還沒有使用它,請點擊以下連結:Javarush Telegram Bot。好吧,今天我們將討論添加僅適用於管理員的命令。這些命令之一是統計和幫助板。為什麼這是必要的?目前,在這個任務的框架內用註釋來描述工作比實際需要更有趣。《Java 專案從 A 到 Z》:新增作為管理員工作的能力以及他的統計功能 - 1好吧,既然我們要加入統計團隊,我們就可以擴展它並使其提供更多資訊。例如,在 MVP 之後,將可以傳回作者的統計資料。但稍後會詳細介紹...)

讓我們了解為他們添加管理員和命令

我們首先更新主分支並基於它創建一個新分支 - STEP_9_JRTB-10。若要確定哪個命令適用於管理員以及哪個命令適用於所有人,您需要為團隊新增標籤。為此,我們創建一個註釋。這是什麼意思?我們以前沒有這樣做過。在IDEA中建立類別時可以選擇此項。我現在就給你看。在命令包中,建立一個新的註解包,並在其中新增 AdminCommand 註解:「Java 專案從 A 到 Z」:為他新增管理員和統計功能。 第 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 命令中:「Java 專案從 A 到 Z」:為他新增管理員和統計功能。 第 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));
}
正如您在此處看到的,我添加了isAdminCommand方法,該方法檢查所提供的命令上是否有 AdminCommand 註解。如果它是僅限管理員的命令,我們會檢查可用管理員集合中是否有該使用者名稱。 順便說一句,這就是 OOP 的全部榮耀:我們只需傳遞一個接口,它可以是任何實作。但我們只能傳遞實作Command介面的類別。 一切似乎都很清楚,除了一件事:管理員從哪裡來?我現在就給你看。現在我想將 admins 作為環境變數傳遞,以便可以輕鬆配置。該變數將包含一行,其中指示將成為管理員的電報用戶的所有用戶名,並以逗號分隔。為此,請新增至 application.properties:
bot.admins: robeskman,romankh3
在 CommandContainer 建構函式中,我們將傳遞 admins 集合並對其進行初始化:
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——最重要的 Telegram 機器人。如果您開始用斜線 / 編寫訊息,機器人將提供選項:「Java 專案從 A 到 Z」:為他新增管理員和統計功能。 第 1 - 4 部分如果您繼續編寫,它將過濾並顯示相關選項:「Java 專案從 A 到 Z」:為他新增管理員和統計功能。 第 1 - 5 部分很酷的功能,對吧?所以我想在這裡做同樣的事情。我將盡我所能 - 透過 Telegram 應用程式。我知道這可以透過程式設計來完成。但是我不能。對於本系列文章的目的而言,這不是必需的。如果有人知道如何做到這一點,請寫信給我,我們將添加它。我很樂意接受任何有關這方面的幫助。我曾經讀到這可以透過適合我們的命令模式來完成。現在我將向您展示如何做到這一點:我們需要在 Telegram 中找到 BotFather,選擇我們要設定的機器人。接下來,選擇編輯機器人和有關命令的部分。現在我將使用我的 Javarush 測試機器人範例來展示所有內容。在 BotFather 中,我們編寫命令: /mybots「Java 專案從 A 到 Z」:為他新增管理員和統計功能。 第 1 - 6 部分接下來,選擇我們需要的機器人,在我的例子中它將是 test_javarush_community_bot:「Java 專案從 A 到 Z」:為他新增管理員和統計功能。 第 1 - 7 部分正如您從按鈕列表中看到的,在這裡您可以查看令牌,刪除機器人,並將其轉移到其他人。我們對編輯機器人感興趣,所以我們選擇編輯機器人「Java 專案從 A 到 Z」:為他新增管理員和統計功能。 第 1 - 8 部分在這裡我們選擇編輯命令「Java 專案從 A 到 Z」:為他新增管理員和統計功能。 第 1 - 9 部分我們只需要提供特定格式的訊息,它將被記錄為命令。或者,如果我們想將它們全部刪除,請寫/empty。為此,我將在專案的根目錄中建立一個檔案SET_UP_COMMANDS_BOT_FATHER,在其中寫入所有命令,以便在出現問題時可以輕鬆恢復或更新。 SET_UP_COMMANDS_BOT_FATHER:
開始 - 開始/恢復與機器人的工作 停止 - 暫停與機器人的工作 addGroupSub - 訂閱一組文章 deleteGroupSub - 取消訂閱一組文章 listGroupSub - 您訂閱的群組清單 幫助 - 獲取與我一起工作的幫助
很明顯,我們這裡不攜帶管理指令。只有管​​理員應該了解它們。讓我們獲取此訊息並將其傳遞給 BotFather:「Java 專案從 A 到 Z」:為他新增管理員和統計功能。 第 1 - 10 部分與通常的情況一樣,第一次並沒有成功。經過幾分鐘的思考,我以小寫形式傳遞了所有命令,而不是像以前那樣以駝峰命名,一切都很順利。我們在檔案中更新: SET_UP_COMMANDS_BOT_FATHER:
開始 - 開始/恢復與機器人的工作 停止 - 暫停與機器人的工作 addgroupsub - 訂閱一組文章 deletegroupsub - 取消訂閱一組文章 listgroupsub - 您訂閱的群組清單 幫助 - 獲得與我一起工作的幫助
現在您可以轉到我們的機器人,看看命令是否已自動加載:「Java 專案從 A 到 Z」:為他新增管理員和統計功能。 第 1 - 11 部分看看它現在多漂亮!我還想在本文的框架內擴展統計的功能,但材料在意義和內容上都已經很龐大了。因此,我們將推遲到下次。也就是說,JRTB-10的任務還沒有完全完成:我們將在下一篇文章中完成。同時,我會將所有已存在的變更新增至主機器人。 想要支持作者,但不知道如何支持?非常簡單 - 訂閱我的tg 頻道、我的GitHub 帳戶,並在此處的文章中寫下您對它們的看法。這些回饋對我來說很重要,所以我知道他們已閱讀並且對它們感興趣。

結論

讓我們來總結一下今天的經驗:
  1. 我們討論瞭如何添加您自己的註釋以及如何將其用作標記來描述團隊中的角色。順便說一句,這可以使用介面來完成。同樣,我們創建一個標記接口,然後檢查到達的對像是否實現了該接口。
  2. 為管理員新增了幫助命令。對我來說,這也是這個機器人開發過程中的重要部分。
  3. 我們討論了在機器人中編寫命令時如何添加命令的描述和彈出視窗。有趣的功能,絕對值得添加。
基於這篇文章,我創建了一個 Pull request,你可以看到它的詳細資訊。感謝大家一如既往的關注:按讚 - 訂閱 - 響鈴,為我們的專案加星,評論並評論文章!下一篇文章見!

此系列所有資料的清單位於本文開頭。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION