JavaRush /Blog Java /Random-VI /Chúng tôi bổ sung thêm khả năng làm quản trị viên và thốn...
Roman Beekeeper
Mức độ

Chúng tôi bổ sung thêm khả năng làm quản trị viên và thống kê cho anh ấy - “Dự án Java từ A đến Z”

Xuất bản trong nhóm
Xin chào tất cả mọi người, những người bạn thân yêu của tôi. Vì vậy, bot đã hoạt động và gửi thông báo về các bài viết mới. Nếu bạn chưa sử dụng thì đây là link: Javarush Telegram Bot . Chà, hôm nay chúng ta sẽ nói về việc thêm các lệnh chỉ hoạt động đối với quản trị viên. Một trong những lệnh này là bảng thống kê và trợ giúp. Tại sao điều này là cần thiết? Hiện tại, việc mô tả công việc bằng các chú thích trong khuôn khổ nhiệm vụ này sẽ thú vị hơn là nhu cầu thực tế về nó. "Dự án Java từ A đến Z": Bổ sung thêm khả năng làm quản trị viên và thống kê cho anh - 1Chà, vì chúng ta sẽ đến nhóm thống kê, chúng ta có thể mở rộng nó và làm cho nó có nhiều thông tin hơn. Ví dụ: sau MVP, có thể trả về số liệu thống kê cho các tác giả. Nhưng nhiều hơn về điều này sau...)

Hãy hiểu cách thêm quản trị viên và lệnh cho họ

Chúng tôi bắt đầu công việc của mình bằng cách cập nhật nhánh chính và tạo một nhánh mới dựa trên nó - STEP_9_JRTB-10. Để tìm ra lệnh nào áp dụng cho quản trị viên và lệnh nào áp dụng cho mọi người, bạn cần gắn nhãn cho nhóm. Để làm điều này, hãy tạo một chú thích. Nó có nghĩa là gì? Chúng tôi chưa từng làm điều này trước đây. Điều này có thể được chọn khi tạo một lớp trong IDEA. Tôi sẽ chỉ cho bạn bây giờ. Trong gói lệnh, tạo một gói chú thích mới và trong đó chú thích AdminCommand: “Dự án Java từ A đến Z”: Bổ sung thêm khả năng làm quản trị viên và thống kê cho anh ấy.  Phần 1 - 2Bản thân chú thích sẽ như thế này:
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 {
}
Chúng tôi không cần bất cứ điều gì khác ở đây. Tiếp theo, chúng ta thêm nó vào lệnh StatCommand: “Dự án Java từ A đến Z”: Bổ sung thêm khả năng làm quản trị viên và thống kê cho anh ấy.  Phần 1 - 3Bây giờ mọi thứ sẽ hoạt động... Hay không? Không, tất nhiên)) Chúng ta cần dạy CommandContainer của mình cách tạo ra kết quả một cách chính xác. Để thực hiện việc này, hãy cập nhật phương thức RetrieveCommand , phương thức này sẽ đưa ra lệnh để chạy tùy thuộc vào nội dung được truyền cho nó. Chúng tôi sẽ sử dụng tên người dùng của anh ấy trong Telegram làm định danh quản trị viên. Nó độc đáo và dễ đọc hơn chat_id. Làm thế nào để có được nó? Nó nằm trong đối tượng Cập nhật, đi kèm với thông báo:
update.getMessage().getFrom().getUserName()
Tóm tắt tất cả những điều trên, hãy cập nhật phương thức 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));
}
Như bạn có thể thấy ở đây, tôi đã thêm phương thức isAdminCommand để kiểm tra xem có chú thích AdminCommand trên lệnh được cung cấp hay không. Và nếu đó là lệnh chỉ dành cho quản trị viên, chúng tôi sẽ kiểm tra xem liệu chúng tôi có tên người dùng đó trong bộ sưu tập quản trị viên hiện có hay không. Nhân tiện, đây là OOP, trong tất cả vinh quang của nó: chúng tôi chỉ cần chuyển một giao diện, có thể là bất kỳ cách triển khai nào. Nhưng chúng ta chỉ có thể vượt qua lớp thực hiện giao diện Lệnh . Và mọi thứ dường như đã rõ ràng, ngoại trừ một điều: các quản trị viên đến từ đâu? Tôi sẽ chỉ cho bạn bây giờ. Hiện tại tôi muốn chuyển quản trị viên làm biến môi trường để có thể dễ dàng định cấu hình. Biến này sẽ chứa một dòng trong đó tất cả tên người dùng của người dùng điện tín sẽ là quản trị viên được chỉ định, phân tách bằng dấu phẩy. Để thực hiện việc này, hãy thêm vào application.properties:
bot.admins: robeskman,romankh3
Trong hàm tạo CommandContainer, chúng ta sẽ chuyển tập hợp quản trị viên và khởi tạo nó:
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;
Và đã có trong JavaRushTelegramBot sẽ có tất cả sự kỳ diệu của việc lấy một bộ sưu tập từ một chuỗi trong các thuộc tính:
@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);
}
Như bạn có thể thấy từ hàm tạo ở trên, chúng ta lại sử dụng chú thích Giá trị để chuyển logic để tạo bộ sưu tập vào đó. Thế là xong, việc thêm quản trị viên là xong. Bây giờ, khi một người không phải quản trị viên muốn lấy dữ liệu về số liệu thống kê của bot, anh ta sẽ nhận được câu trả lời sau: Tôi không hiểu bạn 😟, hãy viết /help để tìm hiểu xem tôi hiểu gì. Bằng cách này, chúng tôi đã phân biệt vai trò của các lệnh bot.

Thêm lệnh trợ giúp cho quản trị viên

Tiếp theo, sẽ hợp lý hơn nếu tạo một lệnh trợ giúp riêng cho quản trị viên. Trong tương lai, phần này có thể phát triển đáng kể. Thêm giá trị trợ giúp của quản trị viên vào CommandName:
ADMIN_HELP("/ahelp")
Tạo lớp AdminHelpCommand trong gói lệnh:
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);
   }
}
Cho đến nay nó rất đơn giản. Nó có thể phát triển khá tốt trong tương lai. Đối với lệnh này, một bài kiểm tra từ mẫu của chúng tôi:
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);
   }
}
Tất nhiên, lệnh cần được thêm vào CommandContainer trong bản đồ của chúng tôi:
.put(ADMIN_HELP.getCommandName(), new AdminHelpCommand(sendBotMessageService))

Thêm mô tả lệnh vào bot

Các bot Telegram có một tính năng thú vị khác: bạn có thể thêm các giá trị và mô tả về các lệnh mà nó chấp nhận để giúp người dùng sử dụng các lệnh dễ dàng hơn. Nó trông như thế nào? Ví dụ: hãy đến BotFather - bot Telegram quan trọng nhất. Nếu bạn bắt đầu viết tin nhắn bằng dấu gạch chéo /, bot sẽ đưa ra các tùy chọn: “Dự án Java từ A đến Z”: Bổ sung thêm khả năng làm quản trị viên và thống kê cho anh ấy.  Phần 1 - 4Và nếu bạn tiếp tục viết, nó sẽ lọc và hiển thị các tùy chọn liên quan: “Dự án Java từ A đến Z”: Bổ sung thêm khả năng làm quản trị viên và thống kê cho anh ấy.  Phần 1 - 5Chức năng tuyệt vời, phải không? Vì vậy tôi muốn làm điều tương tự ở đây. Tôi sẽ làm điều đó theo cách tốt nhất có thể - thông qua ứng dụng Telegram. Tôi biết điều này có thể được thực hiện theo chương trình. Nhưng tôi không thể. Điều này không cần thiết cho mục đích của loạt bài viết này. Nếu ai biết cách thực hiện việc này, hãy viết thư cho tôi, chúng tôi sẽ bổ sung. Tôi sẽ sẵn lòng chấp nhận bất kỳ sự giúp đỡ nào về việc này. Tôi đã từng đọc rằng điều này có thể được thực hiện thông qua mẫu lệnh phù hợp với chúng tôi. Bây giờ tôi sẽ chỉ cho bạn cách tôi có thể làm điều này: chúng ta cần tìm BotFather trong Telegram, chọn bot mà chúng ta muốn định cấu hình. Tiếp theo chọn chỉnh sửa bot và phần về lệnh. Bây giờ tôi sẽ hiển thị mọi thứ bằng ví dụ về bot thử nghiệm của tôi cho Javarush. Tại BotFather, chúng tôi viết lệnh: /mybots“Dự án Java từ A đến Z”: Bổ sung thêm khả năng làm quản trị viên và thống kê cho anh ấy.  Phần 1 - 6 Tiếp theo, chọn bot chúng tôi cần, trong trường hợp của tôi nó sẽ là test_javarush_community_bot: “Dự án Java từ A đến Z”: Bổ sung thêm khả năng làm quản trị viên và thống kê cho anh ấy.  Phần 1 - 7Như bạn có thể thấy từ danh sách các nút, tại đây bạn có thể xem mã thông báo, xóa bot và chuyển nó sang một người nào khác. Chúng tôi quan tâm đến việc chỉnh sửa bot, vì vậy chúng tôi chọn Chỉnh sửa Bot : “Dự án Java từ A đến Z”: Bổ sung thêm khả năng làm quản trị viên và thống kê cho anh ấy.  Phần 1 - 8Và ở đây chúng tôi chọn Chỉnh sửa lệnh : “Dự án Java từ A đến Z”: Bổ sung thêm khả năng làm quản trị viên và thống kê cho anh ấy.  Phần 1 - 9Chúng tôi chỉ cần cung cấp thông báo ở một định dạng cụ thể và nó sẽ được ghi lại dưới dạng lệnh. Hoặc nếu chúng ta muốn loại bỏ tất cả, hãy viết /empty. Với mục đích này, tôi sẽ tạo một tệp trong thư mục gốc của dự án SET_UP_COMMANDS_BOT_FATHER , trong đó tôi sẽ viết tất cả các lệnh của chúng tôi để dễ dàng khôi phục hoặc cập nhật nếu có điều gì đó xảy ra. SET_UP_COMMANDS_BOT_FATHER:
bắt đầu - bắt đầu/khôi phục công việc với bot dừng - tạm dừng công việc với bot addGroupSub - đăng ký vào một nhóm bài viết deleteGroupSub - hủy đăng ký khỏi một nhóm bài viết listGroupSub - danh sách các nhóm mà bạn đã đăng ký trợ giúp - nhận trợ giúp khi làm việc với tôi
Rõ ràng là chúng tôi không mang lệnh quản trị viên ở đây. Chỉ có quản trị viên mới biết về chúng. Hãy lấy thông báo này và chuyển nó tới BotFather: “Dự án Java từ A đến Z”: Bổ sung thêm khả năng làm quản trị viên và thống kê cho anh ấy.  Phần 1 - 10Như thường lệ, lần đầu tiên nó không thành công. Sau một vài phút suy nghĩ, tôi đã chuyển tất cả các lệnh bằng chữ thường chứ không phải bằng CamelCase như trước và mọi thứ đều diễn ra tốt đẹp. Chúng tôi cập nhật trong tệp của mình: SET_UP_COMMANDS_BOT_FATHER:
bắt đầu - bắt đầu/khôi phục công việc với bot dừng - tạm dừng công việc với bot addgroupsub - đăng ký một nhóm bài viết deletegroupsub - hủy đăng ký khỏi một nhóm bài viết listgroupsub - danh sách các nhóm mà bạn đã đăng ký trợ giúp - nhận trợ giúp khi làm việc với tôi
Bây giờ bạn có thể vào bot của chúng tôi và xem các lệnh đã được tải tự động chưa: “Dự án Java từ A đến Z”: Bổ sung thêm khả năng làm quản trị viên và thống kê cho anh ấy.  Phần 1 - 11Nhìn bây giờ nó đẹp làm sao! Tôi cũng muốn mở rộng chức năng của thống kê trong khuôn khổ bài viết này, nhưng tài liệu đã quá phong phú cả về ý nghĩa và nội dung. Vì vậy, chúng tôi sẽ hoãn việc này lại vào lần sau. Tức là nhiệm vụ của JRTB-10 vẫn chưa hoàn thành: chúng ta sẽ hoàn thành nó ở bài viết tiếp theo. Đồng thời, tôi sẽ thêm tất cả các thay đổi đã tồn tại vào bot chính. Bạn muốn hỗ trợ tác giả, nhưng không biết làm thế nào? Rất đơn giản - hãy đăng ký kênh tg , tài khoản GitHub của tôi và viết ý kiến ​​​​của bạn về chúng trong các bài viết tại đây. Phản hồi này rất quan trọng đối với tôi, vì vậy tôi hiểu rằng họ đã đọc và quan tâm đến chúng.

kết luận

Hãy tóm tắt lại những gì chúng ta đã trải qua ngày hôm nay:
  1. Chúng tôi đã thảo luận về cách thêm chú thích của riêng bạn và cách sử dụng chú thích đó làm điểm đánh dấu để phân định vai trò trong nhóm. Nhân tiện, điều này có thể được thực hiện bằng giao diện. Theo cách tương tự, chúng ta sẽ tạo một giao diện đánh dấu và sau đó kiểm tra xem đối tượng đến có thực hiện giao diện này hay không.
  2. Đã thêm lệnh Trợ giúp cho quản trị viên. Với tôi, đây cũng là một phần quan trọng trong quá trình phát triển của con bot này.
  3. Chúng tôi đã thảo luận về cách thêm mô tả và cửa sổ bật lên của lệnh khi viết chúng trong bot. Tính năng thú vị, chắc chắn có giá trị thêm.
Dựa trên bài viết này, tôi đã tạo một yêu cầu kéo , bạn có thể xem chi tiết về nó. Cảm ơn tất cả các bạn đã quan tâm, như thường lệ: thích - đăng ký - chuông , gắn dấu sao cho dự án của chúng tôi, bình luận và đánh giá bài viết! Hẹn gặp lại bạn ở bài viết tiếp theo!

Danh sách tất cả các tài liệu trong loạt bài này nằm ở đầu bài viết này.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION