JavaRush /จาวาบล็อก /Random-TH /เราเพิ่มความสามารถในการทำงานเป็นผู้ดูแลระบบและสถิติสำหรับ...
Roman Beekeeper
ระดับ

เราเพิ่มความสามารถในการทำงานเป็นผู้ดูแลระบบและสถิติสำหรับเขา - “โครงการ Java จาก A ถึง Z”

เผยแพร่ในกลุ่ม
สวัสดีทุกคนเพื่อนรักของฉัน บอทจึงทำงานและส่งการแจ้งเตือนเกี่ยวกับบทความใหม่อยู่แล้ว หากคุณยังไม่ได้ใช้ นี่คือลิงค์: 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 ของเราเพื่อสร้างผลลัพธ์อย่างถูกต้อง ในการดำเนินการนี้ เรามาอัปเดต เมธอดgetreCommandซึ่งจะออกคำสั่งให้รันโดยขึ้นอยู่กับสิ่งที่ถูกส่งผ่านไป เราจะใช้ชื่อผู้ใช้ของเขาใน 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 interface เท่านั้น และดูเหมือนทุกอย่างจะชัดเจนแล้ว ยกเว้นเรื่องเดียว แอดมินมาจากไหน? ฉันจะแสดงให้คุณดูตอนนี้ สำหรับตอนนี้ ฉันต้องการส่งผู้ดูแลระบบเป็นตัวแปรสภาพแวดล้อมเพื่อให้สามารถกำหนดค่าได้อย่างง่ายดาย ตัวแปรนี้จะมีบรรทัดที่ระบุชื่อผู้ใช้ทั้งหมดของผู้ใช้โทรเลขซึ่งจะเป็นผู้ดูแลระบบ โดยคั่นด้วยเครื่องหมายจุลภาค เมื่อต้องการทำเช่นนี้ ให้เพิ่มใน 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);
}
ดังที่คุณเห็นจาก Constructor ด้านบน เราใช้ คำอธิบายประกอบ 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))

การเพิ่มคำอธิบายคำสั่งให้กับบอท

บอทโทรเลขมีคุณสมบัติที่น่าสนใจอีกอย่างหนึ่ง: คุณสามารถเพิ่มค่าและคำอธิบายของคำสั่งที่ยอมรับเพื่อให้ผู้ใช้ใช้คำสั่งได้ง่ายขึ้น มันดูเหมือนอะไร? ตัวอย่างเช่นไปที่BotFatherซึ่งเป็นบอท Telegram ที่สำคัญที่สุด หากคุณเริ่มเขียนข้อความด้วยเครื่องหมายทับ / บอทจะเสนอตัวเลือก: “โครงการ Java จาก A ถึง Z”: เพิ่มความสามารถในการทำงานเป็นผู้ดูแลระบบและสถิติให้เขา  ส่วนที่ 1 - 4และหากคุณเขียนต่อ มันจะกรองและแสดงตัวเลือกที่เกี่ยวข้อง: “โครงการ Java จาก A ถึง Z”: เพิ่มความสามารถในการทำงานเป็นผู้ดูแลระบบและสถิติให้เขา  ส่วนที่ 1 - 5ฟังก์ชั่นเจ๋ง ๆ ใช่ไหม? ฉันก็เลยอยากทำเหมือนกันที่นี่ ฉันจะทำให้ดีที่สุดเท่าที่จะทำได้ - ผ่านแอปพลิเคชัน Telegram ฉันรู้ว่าสิ่งนี้สามารถทำได้โดยทางโปรแกรม แต่ฉันไม่สามารถ. สิ่งนี้ไม่จำเป็นสำหรับวัตถุประสงค์ของบทความชุดนี้ หากใครรู้วิธีการทำเช่นนี้เขียนถึงฉันเราจะเพิ่มมัน ฉันยินดีที่จะรับความช่วยเหลือเกี่ยวกับเรื่องนี้ ฉันเคยอ่านมาว่าสิ่งนี้สามารถทำได้ผ่านรูปแบบคำสั่งที่เหมาะกับเรา ตอนนี้ฉันจะแสดงให้คุณเห็นว่าฉันสามารถทำเช่นนี้ได้อย่างไร: เราจำเป็นต้องค้นหา BotFather ใน Telegram เลือกบอทที่เราต้องการกำหนดค่า จากนั้นเลือกการแก้ไขบอทและส่วนเกี่ยวกับคำสั่ง ตอนนี้ฉันจะแสดงทุกอย่างโดยใช้ตัวอย่างบอททดสอบของฉันสำหรับ 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:
start - เริ่ม/กู้คืนงานด้วยบอท หยุด - หยุดทำงานกับบอท addGroupSub ชั่วคราว - สมัครสมาชิกกลุ่มบทความ DeleteGroupSub - ยกเลิกการสมัครจากกลุ่มบทความ listGroupSub - รายชื่อกลุ่มที่คุณสมัครรับความช่วยเหลือ - รับความช่วยเหลือในการทำงานกับฉัน
เห็นได้ชัดว่าเราไม่มีคำสั่งของผู้ดูแลระบบที่นี่ ผู้ดูแลระบบเท่านั้นที่ควรรู้เกี่ยวกับพวกเขา ลองใช้ข้อความนี้แล้วส่งต่อไปยัง BotFather: “โครงการ Java จาก A ถึง Z”: เพิ่มความสามารถในการทำงานเป็นผู้ดูแลระบบและสถิติให้เขา  ส่วนที่ 1 - 10ตามปกติแล้ว มันไม่ได้ผลในครั้งแรก หลังจากคิดไม่กี่นาที ฉันก็ส่งคำสั่งทั้งหมดด้วยตัวพิมพ์เล็ก และไม่ใช่ใน CamelCase เหมือนเมื่อก่อน และทุกอย่างเป็นไปด้วยดี เราอัปเดตในไฟล์ของเรา: SET_UP_COMMANDS_BOT_FATHER:
เริ่ม - เริ่ม/กู้คืนงานด้วยบอท หยุด - หยุดทำงานกับบอท addgroupsub ชั่วคราว - สมัครสมาชิกกลุ่มบทความ Deletegroupsub - ยกเลิกการสมัครจากกลุ่มบทความ listgroupsub - รายชื่อกลุ่มที่คุณสมัครรับความช่วยเหลือ - รับความช่วยเหลือในการทำงานกับฉัน
ตอนนี้คุณสามารถไปที่บอทของเราและดูว่าคำสั่งถูกโหลดโดยอัตโนมัติหรือไม่: “โครงการ Java จาก A ถึง Z”: เพิ่มความสามารถในการทำงานเป็นผู้ดูแลระบบและสถิติให้เขา  ส่วนที่ 1 - 11ดูสิว่ามันสวยงามแค่ไหน! ฉันยังต้องการขยายฟังก์ชันการทำงานของสถิติภายในกรอบของบทความนี้ด้วย แต่เนื้อหานั้นมีมากมายทั้งในด้านความหมายและเนื้อหา ดังนั้นเราจะเลื่อนการดำเนินการนี้ออกไปในครั้งต่อไป นั่นคืองานของ JRTB-10 ยังไม่เสร็จสิ้นสมบูรณ์: เราจะดำเนินการให้เสร็จสิ้นในบทความถัดไป ในเวลาเดียวกัน ฉันจะเพิ่มการเปลี่ยนแปลงทั้งหมดที่มีอยู่แล้วในบอทหลัก อยากสนับสนุนผู้เขียนแต่ไม่รู้จะทำยังไง? ง่ายมาก - สมัครรับข้อมูลช่อง tg ของฉัน บัญชี GitHubของฉันและเขียนความคิดเห็นของคุณเกี่ยวกับสิ่งเหล่านั้นในบทความที่นี่ ข้อเสนอแนะนี้สำคัญสำหรับฉัน ดังนั้นฉันจึงเข้าใจว่าพวกเขาอ่านและสนใจพวกเขา

ข้อสรุป

สรุปสิ่งที่เราผ่านวันนี้:
  1. เราได้พูดคุยถึงวิธีการเพิ่มคำอธิบายประกอบของคุณเอง และวิธีที่สามารถใช้เป็นเครื่องหมายเพื่อแยกแยะบทบาทในทีมได้ อย่างไรก็ตาม สิ่งนี้สามารถทำได้โดยใช้อินเทอร์เฟซ ในทำนองเดียวกัน เราจะสร้างอินเทอร์เฟซมาร์กเกอร์ จากนั้นตรวจสอบว่าออบเจ็กต์ที่มาถึงใช้อินเทอร์เฟซนี้หรือไม่
  2. เพิ่มคำสั่งช่วยเหลือสำหรับผู้ดูแลระบบ สำหรับฉัน นี่เป็นส่วนสำคัญในการพัฒนาบอทนี้เช่นกัน
  3. เราได้พูดคุยถึงวิธีการเพิ่มคำอธิบายและป๊อปอัปของคำสั่งเมื่อเขียนคำสั่งเหล่านั้นในบอท คุณสมบัติที่น่าสนใจคุ้มค่าแก่การเพิ่มอย่างแน่นอน
จากบทความนี้ ฉันได้สร้างคำขอดึงคุณสามารถดูรายละเอียดได้ ขอขอบคุณทุกท่านที่ให้ความสนใจเช่นเคย: กดไลค์ - ติดตาม - กระดิ่งติดดาวสำหรับโครงการของเรา แสดงความคิดเห็นและให้คะแนนบทความ! พบกันในบทความหน้า!

รายการเนื้อหาทั้งหมดในซีรีส์นี้อยู่ที่ตอนต้นของบทความนี้

ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION