สวัสดีทุกคนเพื่อนรักของฉัน บอทจึงทำงานและส่งการแจ้งเตือนเกี่ยวกับบทความใหม่อยู่แล้ว หากคุณยังไม่ได้ใช้ นี่คือลิงค์: Javarush Telegram Bot วันนี้เราจะพูดถึงการเพิ่มคำสั่งที่ใช้ได้เฉพาะกับผู้ดูแลระบบเท่านั้น หนึ่งในคำสั่งเหล่านี้คือสถิติและกระดานช่วยเหลือ เหตุใดจึงจำเป็น? ในขณะนี้ การอธิบายงานที่มีคำอธิบายประกอบภายในกรอบของงานนี้เป็นเรื่องที่น่าสนใจมากกว่าความต้องการที่แท้จริง
เนื่องจากเราจะไปที่ทีมสถิติ เราจึงสามารถขยายและทำให้มีข้อมูลมากขึ้นได้ หลังจาก MVP จะสามารถคืนสถิติให้กับผู้เขียนได้ เป็นต้น แต่จะเพิ่มเติมในภายหลัง...)
คำอธิบายประกอบเองจะเป็นดังนี้:
ตอนนี้ทุกอย่างควรจะทำงานได้... หรือไม่? ไม่แน่นอน)) เราจำเป็นต้องสอน CommandContainer ของเราเพื่อสร้างผลลัพธ์อย่างถูกต้อง ในการดำเนินการนี้ เรามาอัปเดต เมธอดgetreCommandซึ่งจะออกคำสั่งให้รันโดยขึ้นอยู่กับสิ่งที่ถูกส่งผ่านไป เราจะใช้ชื่อผู้ใช้ของเขาใน Telegram เป็นตัวระบุผู้ดูแลระบบ มีเอกลักษณ์และอ่านง่ายกว่า chat_id จะได้รับมันได้อย่างไร? อยู่ในวัตถุ Update ซึ่งมีข้อความ:
และหากคุณเขียนต่อ มันจะกรองและแสดงตัวเลือกที่เกี่ยวข้อง:
ฟังก์ชั่นเจ๋ง ๆ ใช่ไหม? ฉันก็เลยอยากทำเหมือนกันที่นี่ ฉันจะทำให้ดีที่สุดเท่าที่จะทำได้ - ผ่านแอปพลิเคชัน Telegram ฉันรู้ว่าสิ่งนี้สามารถทำได้โดยทางโปรแกรม แต่ฉันไม่สามารถ. สิ่งนี้ไม่จำเป็นสำหรับวัตถุประสงค์ของบทความชุดนี้ หากใครรู้วิธีการทำเช่นนี้เขียนถึงฉันเราจะเพิ่มมัน ฉันยินดีที่จะรับความช่วยเหลือเกี่ยวกับเรื่องนี้ ฉันเคยอ่านมาว่าสิ่งนี้สามารถทำได้ผ่านรูปแบบคำสั่งที่เหมาะกับเรา ตอนนี้ฉันจะแสดงให้คุณเห็นว่าฉันสามารถทำเช่นนี้ได้อย่างไร: เราจำเป็นต้องค้นหา BotFather ใน Telegram เลือกบอทที่เราต้องการกำหนดค่า จากนั้นเลือกการแก้ไขบอทและส่วนเกี่ยวกับคำสั่ง ตอนนี้ฉันจะแสดงทุกอย่างโดยใช้ตัวอย่างบอททดสอบของฉันสำหรับ Javarush ที่ BotFather เราเขียนคำสั่ง: /mybots
ถัดไป เลือกบอทที่เราต้องการ ในกรณีของฉันมันจะเป็น test_javarush_community_bot:
ดังที่คุณเห็นจากรายการปุ่ม ที่นี่คุณสามารถดูโทเค็น ลบบอท และโอนไปที่ คนอื่น เราสนใจที่จะแก้ไขบอท ดังนั้นเราจึงเลือกแก้ไขบอท :
และที่นี่เราเลือกแก้ไขคำสั่ง :
เราเพียงแค่ต้องระบุข้อความในรูปแบบเฉพาะ และมันจะถูกบันทึกเป็นคำสั่ง หรือหากเราต้องการลบทั้งหมด ให้เขียน /empty เพื่อจุดประสงค์นี้ ฉันจะสร้างไฟล์ในรูทของโปรเจ็กต์SET_UP_COMMANDS_BOT_FATHERซึ่งฉันจะเขียนคำสั่งทั้งหมดของเราเพื่อให้สามารถกู้คืนหรืออัปเดตได้ง่ายหากเกิดอะไรขึ้น SET_UP_COMMANDS_BOT_FATHER:
ตามปกติแล้ว มันไม่ได้ผลในครั้งแรก หลังจากคิดไม่กี่นาที ฉันก็ส่งคำสั่งทั้งหมดด้วยตัวพิมพ์เล็ก และไม่ใช่ใน CamelCase เหมือนเมื่อก่อน และทุกอย่างเป็นไปด้วยดี เราอัปเดตในไฟล์ของเรา: SET_UP_COMMANDS_BOT_FATHER:
ดูสิว่ามันสวยงามแค่ไหน! ฉันยังต้องการขยายฟังก์ชันการทำงานของสถิติภายในกรอบของบทความนี้ด้วย แต่เนื้อหานั้นมีมากมายทั้งในด้านความหมายและเนื้อหา ดังนั้นเราจะเลื่อนการดำเนินการนี้ออกไปในครั้งต่อไป นั่นคืองานของ JRTB-10 ยังไม่เสร็จสิ้นสมบูรณ์: เราจะดำเนินการให้เสร็จสิ้นในบทความถัดไป ในเวลาเดียวกัน ฉันจะเพิ่มการเปลี่ยนแปลงทั้งหมดที่มีอยู่แล้วในบอทหลัก อยากสนับสนุนผู้เขียนแต่ไม่รู้จะทำยังไง? ง่ายมาก - สมัครรับข้อมูลช่อง tg ของฉัน บัญชี GitHubของฉันและเขียนความคิดเห็นของคุณเกี่ยวกับสิ่งเหล่านั้นในบทความที่นี่ ข้อเสนอแนะนี้สำคัญสำหรับฉัน ดังนั้นฉันจึงเข้าใจว่าพวกเขาอ่านและสนใจพวกเขา
กดไลค์ - ติดตาม - กระดิ่งติดดาวสำหรับโครงการของเรา แสดงความคิดเห็นและให้คะแนนบทความ! พบกันในบทความหน้า!
มาทำความเข้าใจการเพิ่มผู้ดูแลระบบและคำสั่งให้พวกเขากันดีกว่า
เราเริ่มต้นงานโดยการอัปเดตสาขาหลักและสร้างสาขาใหม่ตามสาขานั้น - STEP_9_JRTB-10 หากต้องการทราบว่าคำสั่งใดมีผลกับผู้ดูแลระบบและคำสั่งใดมีผลกับทุกคน คุณต้องติดป้ายกำกับทีม เมื่อต้องการทำเช่นนี้ เรามาสร้างคำอธิบายประกอบกัน มันหมายความว่าอะไร? เราไม่เคยทำเช่นนี้มาก่อน สามารถเลือกได้เมื่อสร้างคลาสใน IDEA ฉันจะแสดงให้คุณดูตอนนี้ ในแพ็คเกจคำสั่ง ให้สร้าง แพ็คเกจ คำอธิบายประกอบ ใหม่ และในนั้นคำอธิบายประกอบ AdminCommand:
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 ของเรา: 
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 ที่สำคัญที่สุด หากคุณเริ่มเขียนข้อความด้วยเครื่องหมายทับ / บอทจะเสนอตัวเลือก:





start - เริ่ม/กู้คืนงานด้วยบอท หยุด - หยุดทำงานกับบอท addGroupSub ชั่วคราว - สมัครสมาชิกกลุ่มบทความ DeleteGroupSub - ยกเลิกการสมัครจากกลุ่มบทความ listGroupSub - รายชื่อกลุ่มที่คุณสมัครรับความช่วยเหลือ - รับความช่วยเหลือในการทำงานกับฉัน
เห็นได้ชัดว่าเราไม่มีคำสั่งของผู้ดูแลระบบที่นี่ ผู้ดูแลระบบเท่านั้นที่ควรรู้เกี่ยวกับพวกเขา ลองใช้ข้อความนี้แล้วส่งต่อไปยัง BotFather: 
เริ่ม - เริ่ม/กู้คืนงานด้วยบอท หยุด - หยุดทำงานกับบอท addgroupsub ชั่วคราว - สมัครสมาชิกกลุ่มบทความ Deletegroupsub - ยกเลิกการสมัครจากกลุ่มบทความ listgroupsub - รายชื่อกลุ่มที่คุณสมัครรับความช่วยเหลือ - รับความช่วยเหลือในการทำงานกับฉัน
ตอนนี้คุณสามารถไปที่บอทของเราและดูว่าคำสั่งถูกโหลดโดยอัตโนมัติหรือไม่: 
ข้อสรุป
สรุปสิ่งที่เราผ่านวันนี้:- เราได้พูดคุยถึงวิธีการเพิ่มคำอธิบายประกอบของคุณเอง และวิธีที่สามารถใช้เป็นเครื่องหมายเพื่อแยกแยะบทบาทในทีมได้ อย่างไรก็ตาม สิ่งนี้สามารถทำได้โดยใช้อินเทอร์เฟซ ในทำนองเดียวกัน เราจะสร้างอินเทอร์เฟซมาร์กเกอร์ จากนั้นตรวจสอบว่าออบเจ็กต์ที่มาถึงใช้อินเทอร์เฟซนี้หรือไม่
- เพิ่มคำสั่งช่วยเหลือสำหรับผู้ดูแลระบบ สำหรับฉัน นี่เป็นส่วนสำคัญในการพัฒนาบอทนี้เช่นกัน
- เราได้พูดคุยถึงวิธีการเพิ่มคำอธิบายและป๊อปอัปของคำสั่งเมื่อเขียนคำสั่งเหล่านั้นในบอท คุณสมบัติที่น่าสนใจคุ้มค่าแก่การเพิ่มอย่างแน่นอน
GO TO FULL VERSION